From c90da6da781932c2d178bfb7e39ec1d5003543b7 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 12 Aug 2003 07:26:16 +0000 Subject: move the keyboard and mouse plugins into the kernel for mucho sexiness. make workspace changing a grabbed/interactive process like focus cycling is, with the popup and all. this is some hot shit. --- plugins/menu/client_menu.c | 2 +- plugins/mouse/.cvsignore | 6 - plugins/mouse/Makefile | 4 - plugins/mouse/mouse.c | 456 --------------------------------------------- plugins/mouse/mouse.h | 24 --- plugins/mouse/translate.c | 65 ------- plugins/mouse/translate.h | 8 - 7 files changed, 1 insertion(+), 564 deletions(-) delete mode 100644 plugins/mouse/.cvsignore delete mode 100644 plugins/mouse/Makefile delete mode 100644 plugins/mouse/mouse.c delete mode 100644 plugins/mouse/mouse.h delete mode 100644 plugins/mouse/translate.c delete mode 100644 plugins/mouse/translate.h (limited to 'plugins') diff --git a/plugins/menu/client_menu.c b/plugins/menu/client_menu.c index a13d3f38..c45d2a43 100644 --- a/plugins/menu/client_menu.c +++ b/plugins/menu/client_menu.c @@ -52,7 +52,7 @@ void client_send_to_update(ObMenu *self) ob_debug("update\n"); for (i = 0; i < screen_num_desktops; ++i) { ObMenuEntry *e; - Action *a = action_from_string("sendtodesktop"); + ObAction *a = action_from_string("sendtodesktop"); a->data.sendto.desk = i; a->data.sendto.follow = FALSE; e = menu_entry_new(screen_desktop_names[i], a); diff --git a/plugins/mouse/.cvsignore b/plugins/mouse/.cvsignore deleted file mode 100644 index 9d1b8607..00000000 --- a/plugins/mouse/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -mouse.la -.libs -.deps -.dirstamp -plugins_mouse_mouse_la-mouse.lo -plugins_mouse_mouse_la-translate.lo diff --git a/plugins/mouse/Makefile b/plugins/mouse/Makefile deleted file mode 100644 index cfc46539..00000000 --- a/plugins/mouse/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -all clean install: - $(MAKE) -C ../.. -$(MAKEFLAGS) $@ - -.PHONY: all clean install diff --git a/plugins/mouse/mouse.c b/plugins/mouse/mouse.c deleted file mode 100644 index 913a2e4a..00000000 --- a/plugins/mouse/mouse.c +++ /dev/null @@ -1,456 +0,0 @@ -#include "kernel/openbox.h" -#include "kernel/dispatch.h" -#include "kernel/action.h" -#include "kernel/event.h" -#include "kernel/client.h" -#include "kernel/prop.h" -#include "kernel/grab.h" -#include "kernel/frame.h" -#include "parser/parse.h" -#include "translate.h" -#include "mouse.h" -#include - -static int threshold; -static int dclicktime; -/* - - - - - - - -*/ - -static void parse_xml(xmlDocPtr doc, xmlNodePtr node, void *d) -{ - xmlNodePtr n, nbut, nact; - char *buttonstr; - char *contextstr; - MouseAction mact; - Action *action; - - node = node->xmlChildrenNode; - - if ((n = parse_find_node("dragThreshold", node))) - threshold = parse_int(doc, n); - if ((n = parse_find_node("doubleClickTime", node))) - dclicktime = parse_int(doc, n); - - n = parse_find_node("context", node); - while (n) { - if (!parse_attr_string("name", n, &contextstr)) - goto next_n; - nbut = parse_find_node("mousebind", n->xmlChildrenNode); - while (nbut) { - if (!parse_attr_string("button", nbut, &buttonstr)) - goto next_nbut; - if (parse_attr_contains("press", nbut, "action")) - mact = MouseAction_Press; - else if (parse_attr_contains("release", nbut, "action")) - mact = MouseAction_Release; - else if (parse_attr_contains("click", nbut, "action")) - mact = MouseAction_Click; - else if (parse_attr_contains("doubleclick", nbut,"action")) - mact = MouseAction_DClick; - else if (parse_attr_contains("drag", nbut, "action")) - mact = MouseAction_Motion; - else - goto next_nbut; - nact = parse_find_node("action", nbut->xmlChildrenNode); - while (nact) { - if ((action = action_parse(doc, nact))) { - /* validate that its okay for a mouse binding*/ - if (mact == MouseAction_Motion) { - if (action->func != action_moveresize || - action->data.moveresize.corner == - prop_atoms.net_wm_moveresize_move_keyboard || - action->data.moveresize.corner == - prop_atoms.net_wm_moveresize_size_keyboard) { - action_free(action); - action = NULL; - } - } else { - if (action->func == action_moveresize && - action->data.moveresize.corner != - prop_atoms.net_wm_moveresize_move_keyboard && - action->data.moveresize.corner != - prop_atoms.net_wm_moveresize_size_keyboard) { - action_free(action); - action = NULL; - } - } - if (action) - mbind(buttonstr, contextstr, mact, action); - } - nact = parse_find_node("action", nact->next); - } - g_free(buttonstr); - next_nbut: - nbut = parse_find_node("mousebind", nbut->next); - } - g_free(contextstr); - next_n: - n = parse_find_node("context", n->next); - } -} - -void plugin_setup_config() -{ - threshold = 3; - dclicktime = 200; - parse_register("mouse", parse_xml, NULL); -} - -/* Array of GSList*s of PointerBinding*s. */ -static GSList *bound_contexts[OB_FRAME_NUM_CONTEXTS]; - -static void grab_for_client(ObClient *client, gboolean grab) -{ - int i; - GSList *it; - - for (i = 0; i < OB_FRAME_NUM_CONTEXTS; ++i) - for (it = bound_contexts[i]; it != NULL; it = it->next) { - /* grab/ungrab the button */ - MouseBinding *b = it->data; - Window win; - int mode; - unsigned int mask; - - if (i == OB_FRAME_CONTEXT_FRAME) { - win = client->frame->window; - mode = GrabModeAsync; - mask = ButtonPressMask | ButtonMotionMask | ButtonReleaseMask; - } else if (i == OB_FRAME_CONTEXT_CLIENT) { - win = client->frame->plate; - mode = GrabModeSync; /* this is handled in event */ - mask = ButtonPressMask; /* can't catch more than this with Sync - mode the release event is - manufactured in event() */ - } else continue; - - if (grab) - grab_button_full(b->button, b->state, win, mask, mode, None); - else - ungrab_button(b->button, b->state, win); - } -} - -static void grab_all_clients(gboolean grab) -{ - GList *it; - - for (it = client_list; it != NULL; it = it->next) - grab_for_client(it->data, grab); -} - -static void clearall() -{ - int i; - GSList *it; - - for(i = 0; i < OB_FRAME_NUM_CONTEXTS; ++i) { - for (it = bound_contexts[i]; it != NULL; it = it->next) { - int j; - - MouseBinding *b = it->data; - for (j = 0; j < NUM_MOUSEACTION; ++j) { - GSList *it; - for (it = b->actions[j]; it; it = it->next) { - action_free(it->data); - } - g_slist_free(b->actions[j]); - } - g_free(b); - } - g_slist_free(bound_contexts[i]); - } -} - -static void fire_button(MouseAction a, ObFrameContext context, - ObClient *c, guint state, - guint button, int x, int y) -{ - GSList *it; - MouseBinding *b; - - for (it = bound_contexts[context]; it != NULL; it = it->next) { - b = it->data; - if (b->state == state && b->button == button) - break; - } - /* if not bound, then nothing to do! */ - if (it == NULL) return; - - for (it = b->actions[a]; it; it = it->next) { - Action *act = it->data; - if (act->func != NULL) { - act->data.any.c = c; - - g_assert(act->func != action_moveresize); - - if (act->func == action_showmenu) { - act->data.showmenu.x = x; - act->data.showmenu.y = y; - } - - act->func(&act->data); - } - } -} - -static void fire_motion(MouseAction a, ObFrameContext context, ObClient *c, - guint state, guint button, int x_root, int y_root, - guint32 corner) -{ - GSList *it; - MouseBinding *b; - - for (it = bound_contexts[context]; it != NULL; it = it->next) { - b = it->data; - if (b->state == state && b->button == button) - break; - } - /* if not bound, then nothing to do! */ - if (it == NULL) return; - - for (it = b->actions[a]; it; it = it->next) { - Action *act = it->data; - if (act->func != NULL) { - act->data.any.c = c; - - if (act->func == action_moveresize) { - act->data.moveresize.x = x_root; - act->data.moveresize.y = y_root; - act->data.moveresize.button = button; - if (!(act->data.moveresize.corner == - prop_atoms.net_wm_moveresize_move || - act->data.moveresize.corner == - prop_atoms.net_wm_moveresize_move_keyboard || - act->data.moveresize.corner == - prop_atoms.net_wm_moveresize_size_keyboard)) - act->data.moveresize.corner = corner; - } else - g_assert_not_reached(); - - act->func(&act->data); - } - } -} - -static guint32 pick_corner(int x, int y, int cx, int cy, int cw, int ch) -{ - if (x - cx < cw / 2) { - if (y - cy < ch / 2) - return prop_atoms.net_wm_moveresize_size_topleft; - else - return prop_atoms.net_wm_moveresize_size_bottomleft; - } else { - if (y - cy < ch / 2) - return prop_atoms.net_wm_moveresize_size_topright; - else - return prop_atoms.net_wm_moveresize_size_bottomright; - } -} - -static void event(ObEvent *e, void *foo) -{ - static Time ltime; - static guint button = 0, state = 0, lbutton = 0; - static Window lwindow = None; - static int px, py; - gboolean click = FALSE; - gboolean dclick = FALSE; - ObFrameContext context; - - switch (e->type) { - case Event_Client_Mapped: - grab_for_client(e->data.c.client, TRUE); - break; - - case Event_Client_Destroy: - grab_for_client(e->data.c.client, FALSE); - break; - - case Event_X_ButtonPress: - context = frame_context(e->data.x.client, - e->data.x.e->xbutton.window); - - px = e->data.x.e->xbutton.x_root; - py = e->data.x.e->xbutton.y_root; - button = e->data.x.e->xbutton.button; - state = e->data.x.e->xbutton.state; - - fire_button(MouseAction_Press, context, - e->data.x.client, e->data.x.e->xbutton.state, - e->data.x.e->xbutton.button, - e->data.x.e->xbutton.x_root, e->data.x.e->xbutton.y_root); - - if (context == OB_FRAME_CONTEXT_CLIENT) { - /* Replay the event, so it goes to the client*/ - XAllowEvents(ob_display, ReplayPointer, event_lasttime); - /* Fall through to the release case! */ - } else - break; - - case Event_X_ButtonRelease: - context = frame_context(e->data.x.client, - e->data.x.e->xbutton.window); - if (e->data.x.e->xbutton.button == button) { - /* clicks are only valid if its released over the window */ - int junk1, junk2; - Window wjunk; - guint ujunk, b, w, h; - XGetGeometry(ob_display, e->data.x.e->xbutton.window, - &wjunk, &junk1, &junk2, &w, &h, &b, &ujunk); - if (e->data.x.e->xbutton.x >= (signed)-b && - e->data.x.e->xbutton.y >= (signed)-b && - e->data.x.e->xbutton.x < (signed)(w+b) && - e->data.x.e->xbutton.y < (signed)(h+b)) { - click = TRUE; - /* double clicks happen if there were 2 in a row! */ - if (lbutton == button && - lwindow == e->data.x.e->xbutton.window && - e->data.x.e->xbutton.time - dclicktime <= ltime) { - dclick = TRUE; - lbutton = 0; - } else { - lbutton = button; - lwindow = e->data.x.e->xbutton.window; - } - } else { - lbutton = 0; - lwindow = None; - } - - button = 0; - state = 0; - ltime = e->data.x.e->xbutton.time; - } - fire_button(MouseAction_Release, context, - e->data.x.client, e->data.x.e->xbutton.state, - e->data.x.e->xbutton.button, - e->data.x.e->xbutton.x_root, e->data.x.e->xbutton.y_root); - if (click) - fire_button(MouseAction_Click, context, - e->data.x.client, e->data.x.e->xbutton.state, - e->data.x.e->xbutton.button, - e->data.x.e->xbutton.x_root, - e->data.x.e->xbutton.y_root); - if (dclick) - fire_button(MouseAction_DClick, context, - e->data.x.client, e->data.x.e->xbutton.state, - e->data.x.e->xbutton.button, - e->data.x.e->xbutton.x_root, - e->data.x.e->xbutton.y_root); - break; - - case Event_X_MotionNotify: - if (button) { - if (ABS(e->data.x.e->xmotion.x_root - px) >= threshold || - ABS(e->data.x.e->xmotion.y_root - py) >= threshold) { - guint32 corner; - - context = frame_context(e->data.x.client, - e->data.x.e->xmotion.window); - - /* You can't drag on buttons */ - if (context == OB_FRAME_CONTEXT_MAXIMIZE || - context == OB_FRAME_CONTEXT_ALLDESKTOPS || - context == OB_FRAME_CONTEXT_SHADE || - context == OB_FRAME_CONTEXT_ICONIFY || - context == OB_FRAME_CONTEXT_ICON || - context == OB_FRAME_CONTEXT_CLOSE) - break; - - if (!e->data.x.client) - corner = prop_atoms.net_wm_moveresize_size_bottomright; - else - corner = - pick_corner(e->data.x.e->xmotion.x_root, - e->data.x.e->xmotion.y_root, - e->data.x.client->frame->area.x, - e->data.x.client->frame->area.y, - /* use the client size because the frame - can be differently sized (shaded - windows) and we want this based on the - clients size */ - e->data.x.client->area.width + - e->data.x.client->frame->size.left + - e->data.x.client->frame->size.right, - e->data.x.client->area.height + - e->data.x.client->frame->size.top + - e->data.x.client->frame->size.bottom); - fire_motion(MouseAction_Motion, context, - e->data.x.client, state, button, px, py, corner); - button = 0; - state = 0; - } - } - break; - - default: - g_assert_not_reached(); - } -} - -gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact, - Action *action) -{ - guint state, button; - ObFrameContext context; - MouseBinding *b; - GSList *it; - - if (!translate_button(buttonstr, &state, &button)) { - g_warning("invalid button '%s'", buttonstr); - return FALSE; - } - - contextstr = g_ascii_strdown(contextstr, -1); - context = frame_context_from_string(contextstr); - if (!context) { - g_warning("invalid context '%s'", contextstr); - g_free(contextstr); - return FALSE; - } - g_free(contextstr); - - for (it = bound_contexts[context]; it != NULL; it = it->next){ - b = it->data; - if (b->state == state && b->button == button) { - b->actions[mact] = g_slist_append(b->actions[mact], action); - return TRUE; - } - } - - grab_all_clients(FALSE); - - /* add the binding */ - b = g_new0(MouseBinding, 1); - b->state = state; - b->button = button; - b->actions[mact] = g_slist_append(NULL, action); - bound_contexts[context] = g_slist_append(bound_contexts[context], b); - - grab_all_clients(TRUE); - - return TRUE; -} - -void plugin_startup() -{ - dispatch_register(Event_Client_Mapped | Event_Client_Destroy | - Event_X_ButtonPress | Event_X_ButtonRelease | - Event_X_MotionNotify, (EventHandler)event, NULL); -} - -void plugin_shutdown() -{ - dispatch_register(0, (EventHandler)event, NULL); - - grab_all_clients(FALSE); - clearall(); -} diff --git a/plugins/mouse/mouse.h b/plugins/mouse/mouse.h deleted file mode 100644 index 408ae964..00000000 --- a/plugins/mouse/mouse.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef __plugin_mouse_mouse_h -#define __plugin_mouse_mouse_h - -#include "../../kernel/action.h" - -typedef enum { - MouseAction_Press, - MouseAction_Release, - MouseAction_Click, - MouseAction_DClick, - MouseAction_Motion, - NUM_MOUSEACTION -} MouseAction; - -typedef struct { - guint state; - guint button; - GSList *actions[NUM_MOUSEACTION]; /* lists of Action pointers */ -} MouseBinding; - -gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact, - Action *action); - -#endif diff --git a/plugins/mouse/translate.c b/plugins/mouse/translate.c deleted file mode 100644 index aebe5557..00000000 --- a/plugins/mouse/translate.c +++ /dev/null @@ -1,65 +0,0 @@ -#include "kernel/openbox.h" -#include "mouse.h" -#include -#include -#include - -static guint translate_modifier(char *str) -{ - if (!g_ascii_strcasecmp("Mod1", str) || - !g_ascii_strcasecmp("A", str)) return Mod1Mask; - else if (!g_ascii_strcasecmp("Mod2", str)) return Mod2Mask; - else if (!g_ascii_strcasecmp("Mod3", str)) return Mod3Mask; - else if (!g_ascii_strcasecmp("Mod4", str) || - !g_ascii_strcasecmp("W", str)) return Mod4Mask; - else if (!g_ascii_strcasecmp("Mod5", str)) return Mod5Mask; - else if (!g_ascii_strcasecmp("Control", str) || - !g_ascii_strcasecmp("C", str)) return ControlMask; - else if (!g_ascii_strcasecmp("Shift", str) || - !g_ascii_strcasecmp("S", str)) return ShiftMask; - g_warning("Invalid modifier '%s' in binding.", str); - return 0; -} - -gboolean translate_button(char *str, guint *state, guint *button) -{ - char **parsed; - char *l; - int i; - gboolean ret = FALSE; - - parsed = g_strsplit(str, "-", -1); - - /* first, find the button (last token) */ - l = NULL; - for (i = 0; parsed[i] != NULL; ++i) - l = parsed[i]; - if (l == NULL) - goto translation_fail; - - /* figure out the mod mask */ - *state = 0; - for (i = 0; parsed[i] != l; ++i) { - guint m = translate_modifier(parsed[i]); - if (!m) goto translation_fail; - *state |= m; - } - - /* figure out the button */ - if (!g_ascii_strcasecmp("Left", l)) *button = 1; - else if (!g_ascii_strcasecmp("Middle", l)) *button = 2; - else if (!g_ascii_strcasecmp("Right", l)) *button = 3; - else if (!g_ascii_strcasecmp("Up", l)) *button = 4; - else if (!g_ascii_strcasecmp("Down", l)) *button = 5; - else if (!g_ascii_strncasecmp("Button", l, 6)) *button = atoi(l+6); - if (!*button) { - g_warning("Invalid button '%s' in pointer binding.", l); - goto translation_fail; - } - - ret = TRUE; - -translation_fail: - g_strfreev(parsed); - return ret; -} diff --git a/plugins/mouse/translate.h b/plugins/mouse/translate.h deleted file mode 100644 index a2fcfc90..00000000 --- a/plugins/mouse/translate.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __plugin_mouse_translate_h -#define __plugin_mouse_translate_h - -#include - -gboolean translate_button(char *str, guint *state, guint *keycode); - -#endif -- cgit v1.2.3