X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmouse.c;h=711317ec77514946964c456a0b36e6dfad655891;hb=d5a25283dceb4b0eb7f1dcba1ac15674f6422fbe;hp=97616096d5ffafc6b9908c2a56535636e06ed753;hpb=77baf26a7f2f64ddf1274035fd4991ab17345904;p=chaz%2Fopenbox diff --git a/openbox/mouse.c b/openbox/mouse.c index 97616096..711317ec 100644 --- a/openbox/mouse.c +++ b/openbox/mouse.c @@ -142,7 +142,7 @@ static void grab_all_clients(gboolean grab) mouse_grab_for_client(it->data, grab); } -void mouse_unbind_all() +void mouse_unbind_all(void) { gint i; GSList *it; @@ -153,10 +153,10 @@ void mouse_unbind_all() gint j; for (j = 0; j < OB_NUM_MOUSE_ACTIONS; ++j) { - GSList *it; + GSList *jt; - for (it = b->actions[j]; it; it = g_slist_next(it)) - actions_act_unref(it->data); + for (jt = b->actions[j]; jt; jt = g_slist_next(jt)) + actions_act_unref(jt->data); g_slist_free(b->actions[j]); } g_free(b); @@ -225,6 +225,17 @@ void mouse_event(ObClient *client, XEvent *e) button = e->xbutton.button; state = e->xbutton.state; + /* if the binding was in a client context, then we need to call + XAllowEvents with ReplayPointer at some point, to send the event + through to the client. when this happens though depends. if + windows are going to be moved on screen, then the click will end + up going somewhere wrong, so have the action system perform the + ReplayPointer for us if that is the case. */ + if (CLIENT_CONTEXT(context, client)) + actions_set_need_pointer_replay_before_move(TRUE); + else + actions_set_need_pointer_replay_before_move(FALSE); + fire_binding(OB_MOUSE_ACTION_PRESS, context, client, e->xbutton.state, e->xbutton.button, @@ -235,11 +246,14 @@ void mouse_event(ObClient *client, XEvent *e) if (grab_on_pointer()) button = 0; - if (CLIENT_CONTEXT(context, client)) { - /* Replay the event, so it goes to the client*/ + /* replay the pointer event if it hasn't been replayed yet (i.e. no + windows were moved) */ + if (actions_get_need_pointer_replay_before_move()) XAllowEvents(ob_display, ReplayPointer, event_curtime); - /* Fall through to the release case! */ - } else + + /* in the client context, we won't get a button release because of the + way it is grabbed, so just fake one */ + if (!CLIENT_CONTEXT(context, client)) break; case ButtonRelease: