]> Dogcows Code - chaz/openbox/blobdiff - openbox/mouse.c
Merge branch 'backport' into work
[chaz/openbox] / openbox / mouse.c
index dbd48695277042f6caead446271b2c51434cd6ae..b2893cee6814afd151b35d807f9f85e36eaeb6ac 100644 (file)
 
 #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 <glib.h>
 
@@ -142,7 +141,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;
@@ -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 &&
This page took 0.022005 seconds and 4 git commands to generate.