X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmouse.c;h=b2893cee6814afd151b35d807f9f85e36eaeb6ac;hb=b097f84dfdf4e2548dba96aa63325cb05b5244a1;hp=66615585fec0323f6ea8b4dc02eec96a790eb6f4;hpb=556eb7b7fb20b3b0db03b6d92259ad3bb16dccde;p=chaz%2Fopenbox diff --git a/openbox/mouse.c b/openbox/mouse.c index 66615585..b2893cee 100644 --- a/openbox/mouse.c +++ b/openbox/mouse.c @@ -19,16 +19,15 @@ #include "openbox.h" #include "config.h" -#include "xerror.h" #include "actions.h" #include "event.h" #include "client.h" -#include "prop.h" #include "grab.h" #include "frame.h" #include "translate.h" #include "mouse.h" #include "gettext.h" +#include "obt/display.h" #include @@ -225,6 +224,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 +245,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*/ - XAllowEvents(ob_display, ReplayPointer, event_curtime); - /* Fall through to the release case! */ - } else + /* 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(obt_display, ReplayPointer, event_curtime); + + /* 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: @@ -257,10 +270,10 @@ void mouse_event(ObClient *client, XEvent *e) Window wjunk; guint ujunk, b, w, h; /* this can cause errors to occur when the window closes */ - xerror_set_ignore(TRUE); - junk1 = XGetGeometry(ob_display, e->xbutton.window, + obt_display_ignore_errors(TRUE); + junk1 = XGetGeometry(obt_display, e->xbutton.window, &wjunk, &junk1, &junk2, &w, &h, &b, &ujunk); - xerror_set_ignore(FALSE); + obt_display_ignore_errors(FALSE); if (junk1) { if (e->xbutton.x >= (signed)-b && e->xbutton.y >= (signed)-b &&