X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=plugins%2Fmouse%2Fmouse.c;h=ea943f5a2820ac1a838efc4bf5a104ea4a82f660;hb=53882f760966958eca25b3277c8e7db61a8cdf10;hp=f1d872e876fd858c82bd0d891f3bd59dc87bd079;hpb=78e64a0afffc29c3bbe019ee4add563c46d05dca;p=chaz%2Fopenbox diff --git a/plugins/mouse/mouse.c b/plugins/mouse/mouse.c index f1d872e8..ea943f5a 100644 --- a/plugins/mouse/mouse.c +++ b/plugins/mouse/mouse.c @@ -3,11 +3,14 @@ #include "../../kernel/action.h" #include "../../kernel/client.h" #include "../../kernel/frame.h" +#include "../../kernel/grab.h" #include "../../kernel/engine.h" #include "translate.h" #include "mouse.h" #include +static int drag_threshold = 3; + /* GData of GSList*s of PointerBinding*s. */ static GData *bound_contexts; @@ -16,40 +19,33 @@ struct foreach_grab_temp { gboolean grab; }; -static void grab_button(Client *client, guint state, guint button, - GQuark context, gboolean grab) -{ - Window win; - int mode = GrabModeAsync; - unsigned int mask; - - if (context == g_quark_try_string("frame")) { - win = client->frame->window; - mask = ButtonPressMask | ButtonMotionMask | ButtonReleaseMask; - } else if (context == g_quark_try_string("client")) { - win = client->frame->plate; - mode = GrabModeSync; /* this is handled in pointer_event */ - mask = ButtonPressMask; /* can't catch more than this with Sync mode - the release event is manufactured in - pointer_fire */ - } else return; - - if (grab) - /* XXX grab all lock keys */ - XGrabButton(ob_display, button, state, win, FALSE, mask, mode, - GrabModeAsync, None, None); - else - /* XXX ungrab all lock keys */ - XUngrabButton(ob_display, button, state, win); -} - static void foreach_grab(GQuark key, gpointer data, gpointer user_data) { struct foreach_grab_temp *d = user_data; GSList *it; for (it = data; it != NULL; it = it->next) { + /* grab/ungrab the button */ MouseBinding *b = it->data; - grab_button(d->client, b->state, b->button, key, d->grab); + Window win; + int mode; + unsigned int mask; + + if (key == g_quark_try_string("frame")) { + win = d->client->frame->window; + mode = GrabModeAsync; + mask = ButtonPressMask | ButtonMotionMask | ButtonReleaseMask; + } else if (key == g_quark_try_string("client")) { + win = d->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 return; + + if (d->grab) + grab_button(b->button, b->state, win, mask, mode); + else + ungrab_button(b->button, b->state, win); } } @@ -185,6 +181,7 @@ static void event(ObEvent *e, void *foo) static Corner corner = Corner_TopLeft; gboolean click = FALSE; gboolean dclick = FALSE; + GQuark context; switch (e->type) { case Event_Client_Mapped: @@ -208,16 +205,14 @@ static void event(ObEvent *e, void *foo) } button = e->data.x.e->xbutton.button; } - fire_button(MouseAction_Press, - engine_get_context(e->data.x.client, - e->data.x.e->xbutton.window), + context = engine_get_context(e->data.x.client, + e->data.x.e->xbutton.window); + + fire_button(MouseAction_Press, context, e->data.x.client, e->data.x.e->xbutton.state, e->data.x.e->xbutton.button); - /* XXX dont look up the context so many times */ - if (engine_get_context(e->data.x.client, - e->data.x.e->xbutton.window) == - g_quark_try_string("client")) { + if (context == g_quark_try_string("client")) { /* Replay the event, so it goes to the client*/ XAllowEvents(ob_display, ReplayPointer, CurrentTime); /* Fall through to the release case! */ @@ -225,12 +220,12 @@ static void event(ObEvent *e, void *foo) break; case Event_X_ButtonRelease: + context = engine_get_context(e->data.x.client, + e->data.x.e->xbutton.window); if (e->data.x.e->xbutton.button == button) { /* end drags */ if (drag) { - fire_motion(MouseAction_Motion, - 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->xbutton.state, e->data.x.e->xbutton.button, cx, cy, cw, ch, dx, dy, TRUE, corner); @@ -262,35 +257,32 @@ static void event(ObEvent *e, void *foo) button = 0; ltime = e->data.x.e->xbutton.time; } - fire_button(MouseAction_Press, - engine_get_context(e->data.x.client, - e->data.x.e->xbutton.window), + fire_button(MouseAction_Press, context, e->data.x.client, e->data.x.e->xbutton.state, e->data.x.e->xbutton.button); if (click) - fire_button(MouseAction_Click, - engine_get_context(e->data.x.client, - e->data.x.e->xbutton.window), + fire_button(MouseAction_Click, context, e->data.x.client, e->data.x.e->xbutton.state, e->data.x.e->xbutton.button); if (dclick) - fire_button(MouseAction_DClick, - engine_get_context(e->data.x.client, - e->data.x.e->xbutton.window), + fire_button(MouseAction_DClick, context, e->data.x.client, e->data.x.e->xbutton.state, e->data.x.e->xbutton.button); break; 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; - fire_motion(MouseAction_Motion, - engine_get_context(e->data.x.client, - e->data.x.e->xbutton.window), - 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; @@ -376,10 +368,14 @@ static void binddef() a = action_new(action_resize); mbind("A-3", "frame", MouseAction_Motion, a); - a = action_new(action_focusraise); + a = action_new(action_focus); mbind("1", "titlebar", MouseAction_Press, a); - a = action_new(action_focusraise); + a = action_new(action_focus); mbind("1", "handle", MouseAction_Press, a); + a = action_new(action_raise); + mbind("1", "titlebar", MouseAction_Click, a); + a = action_new(action_raise); + mbind("1", "handle", MouseAction_Click, a); a = action_new(action_lower); mbind("2", "titlebar", MouseAction_Press, a); a = action_new(action_lower); @@ -389,7 +385,7 @@ static void binddef() a = action_new(action_lower); mbind("A-3", "frame", MouseAction_Click, a); - a = action_new(action_focusraise); + a = action_new(action_focus); mbind("1", "client", MouseAction_Press, a); a = action_new(action_toggle_shade); @@ -411,6 +407,8 @@ static void binddef() mbind("1", "icon", MouseAction_DClick, a); a = action_new(action_close); mbind("1", "close", MouseAction_Click, a); + a = action_new(action_kill); + mbind("2", "close", MouseAction_Click, a); a = action_new(action_toggle_omnipresent); mbind("1", "alldesktops", MouseAction_Click, a);