X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=plugins%2Fmouse%2Fmouse.c;h=0a9672058902c23728a69c65ffdec11359453e47;hb=edf98ba134dd2209fce1b77aece3217ad97a5027;hp=0cb6b5c0095213a7bdd423bf5c1062668cfa784b;hpb=029f35d613fbdd5b27d515e5ab7ae07ad6fc8bdd;p=chaz%2Fopenbox diff --git a/plugins/mouse/mouse.c b/plugins/mouse/mouse.c index 0cb6b5c0..0a967205 100644 --- a/plugins/mouse/mouse.c +++ b/plugins/mouse/mouse.c @@ -7,8 +7,15 @@ #include "../../kernel/engine.h" #include "translate.h" #include "mouse.h" +#include "mouserc_parse.h" #include +void plugin_setup_config() +{ +} + +static int drag_threshold = 3; + /* GData of GSList*s of PointerBinding*s. */ static GData *bound_contexts; @@ -270,14 +277,17 @@ static void event(ObEvent *e, void *foo) case Event_X_MotionNotify: if (button) { - drag = TRUE; dx = e->data.x.e->xmotion.x_root - px; dy = e->data.x.e->xmotion.y_root - py; - context = engine_get_context(e->data.x.client, - e->data.x.e->xbutton.window); - fire_motion(MouseAction_Motion, context, - e->data.x.client, e->data.x.e->xmotion.state, - button, cx, cy, cw, ch, dx, dy, FALSE, corner); + if (ABS(dx) >= drag_threshold || ABS(dy) >= drag_threshold) + drag = TRUE; + if (drag) { + context = engine_get_context(e->data.x.client, + e->data.x.e->xbutton.window); + fire_motion(MouseAction_Motion, context, + e->data.x.client, e->data.x.e->xmotion.state, + button, cx, cy, cw, ch, dx, dy, FALSE, corner); + } } break; @@ -286,25 +296,27 @@ static void event(ObEvent *e, void *foo) } } -static gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact, - Action *action) +gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact, + Action *action) { guint state, button; GQuark context; MouseBinding *b; GSList *it; - guint i; if (!translate_button(buttonstr, &state, &button)) { - g_warning("invalid button"); + g_warning("invalid button '%s'", buttonstr); return FALSE; } + contextstr = g_ascii_strdown(contextstr, -1); context = g_quark_try_string(contextstr); if (!context) { - g_warning("invalid context"); + g_warning("invalid context '%s'", contextstr); + g_free(contextstr); return FALSE; } + g_free(contextstr); for (it = g_datalist_id_get_data(&bound_contexts, context); it != NULL; it = it->next){ @@ -323,11 +335,9 @@ static gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact, grab_all_clients(FALSE); /* add the binding */ - b = g_new(MouseBinding, 1); + b = g_new0(MouseBinding, 1); b->state = state; b->button = button; - for (i = 0; i < NUM_MOUSEACTION; ++i) - b->action[i] = NULL; b->action[mact] = action; g_datalist_id_set_data(&bound_contexts, context, g_slist_append(g_datalist_id_get_data(&bound_contexts, context), b)); @@ -337,98 +347,13 @@ static gboolean mbind(char *buttonstr, char *contextstr, MouseAction mact, return TRUE; } -static void binddef() -{ - Action *a; - - /* When creating an Action struct, all of the data elements in the - appropriate struct need to be set, except the Client*, which will be set - at call-time when then action function is used. - - For action_move and action_resize, the 'x', 'y', and 'final' data - elements should not be set, as they are set at call-time. - */ - - a = action_new(action_move); - mbind("1", "titlebar", MouseAction_Motion, a); - a = action_new(action_move); - mbind("1", "handle", MouseAction_Motion, a); - a = action_new(action_move); - mbind("A-1", "frame", MouseAction_Motion, a); - - a = action_new(action_resize); - mbind("1", "blcorner", MouseAction_Motion, a); - a = action_new(action_resize); - mbind("1", "brcorner", MouseAction_Motion, a); - a = action_new(action_resize); - mbind("A-3", "frame", MouseAction_Motion, a); - - a = action_new(action_focusraise); - mbind("1", "titlebar", MouseAction_Press, a); - a = action_new(action_focusraise); - mbind("1", "handle", MouseAction_Press, a); - a = action_new(action_lower); - mbind("2", "titlebar", MouseAction_Press, a); - a = action_new(action_lower); - mbind("2", "handle", MouseAction_Press, a); - a = action_new(action_raise); - mbind("A-1", "frame", MouseAction_Click, a); - a = action_new(action_lower); - mbind("A-3", "frame", MouseAction_Click, a); - - a = action_new(action_focusraise); - mbind("1", "client", MouseAction_Press, a); - - a = action_new(action_toggle_shade); - mbind("1", "titlebar", MouseAction_DClick, a); - a = action_new(action_shade); - mbind("4", "titlebar", MouseAction_Press, a); - a = action_new(action_unshade); - mbind("5", "titlebar", MouseAction_Click, a); - - a = action_new(action_toggle_maximize_full); - mbind("1", "maximize", MouseAction_Click, a); - a = action_new(action_toggle_maximize_vert); - mbind("2", "maximize", MouseAction_Click, a); - a = action_new(action_toggle_maximize_horz); - mbind("3", "maximize", MouseAction_Click, a); - a = action_new(action_iconify); - mbind("1", "iconify", MouseAction_Click, a); - a = action_new(action_close); - mbind("1", "icon", MouseAction_DClick, a); - a = action_new(action_close); - mbind("1", "close", MouseAction_Click, a); - a = action_new(action_toggle_omnipresent); - mbind("1", "alldesktops", MouseAction_Click, a); - - a = action_new(action_next_desktop); - a->data.nextprevdesktop.wrap = TRUE; - mbind("4", "root", MouseAction_Click, a); - a = action_new(action_previous_desktop); - a->data.nextprevdesktop.wrap = TRUE; - mbind("5", "root", MouseAction_Click, a); - a = action_new(action_next_desktop); - a->data.nextprevdesktop.wrap = TRUE; - mbind("A-4", "root", MouseAction_Click, a); - a = action_new(action_previous_desktop); - a->data.nextprevdesktop.wrap = TRUE; - mbind("A-5", "root", MouseAction_Click, a); - a = action_new(action_next_desktop); - a->data.nextprevdesktop.wrap = TRUE; - mbind("A-4", "frame", MouseAction_Click, a); - a = action_new(action_previous_desktop); - a->data.nextprevdesktop.wrap = TRUE; - mbind("A-5", "frame", MouseAction_Click, a); -} - void plugin_startup() { dispatch_register(Event_Client_Mapped | Event_Client_Destroy | Event_X_ButtonPress | Event_X_ButtonRelease | Event_X_MotionNotify, (EventHandler)event, NULL); - /* XXX parse a config */ - binddef(); + mouserc_parse(); } void plugin_shutdown()