]> Dogcows Code - chaz/openbox/commitdiff
only send configure notify when they requested a move, or if we are actually changing...
authorDana Jansens <danakj@orodu.net>
Tue, 22 May 2007 02:14:49 +0000 (02:14 +0000)
committerDana Jansens <danakj@orodu.net>
Tue, 22 May 2007 02:14:49 +0000 (02:14 +0000)
that is: if they only request a resize and nothing changes, don't do anything and dont send a configurenotify. this fixes the emacs event storm

also some new macros for rects

openbox/event.c
openbox/geom.h

index ac0e6ff2efc567ffb972f3aec0c97ca4fba1a9e8..aa082e68a8c66a187b615e2405f3a1405b1457b1 100644 (file)
@@ -993,14 +993,11 @@ static void event_handle_client(ObClient *client, XEvent *e)
         */
 
         gint x, y, w, h;
+        gboolean move = FALSE;
+        gboolean resize = FALSE;
 
-        /* if nothing is changed, then a configurenotify is needed */
-        gboolean config = TRUE;
-
-        x = client->area.x;
-        y = client->area.y;
-        w = client->area.width;
-        h = client->area.height;
+        /* get the current area */
+        RECT_TO_DIMS(client->area, x, y, w, h);
 
         ob_debug("ConfigureRequest desktop %d wmstate %d visibile %d\n",
                  screen_desktop, client->wmstate, client->frame->visible);
@@ -1008,8 +1005,13 @@ static void event_handle_client(ObClient *client, XEvent *e)
         if (e->xconfigurerequest.value_mask & CWBorderWidth)
             if (client->border_width != e->xconfigurerequest.border_width) {
                 client->border_width = e->xconfigurerequest.border_width;
-                /* if only the border width is changing, then it's not needed*/
-                config = FALSE;
+
+                /* if the border width is changing then that is the same
+                   as requesting a resize, but we don't actually change
+                   the client's border, so it will change their root
+                   coordiantes (since they include the border width) and
+                   we need to a notify then */
+                move = TRUE;
             }
 
 
@@ -1029,8 +1031,8 @@ static void event_handle_client(ObClient *client, XEvent *e)
             stacking_restack_request(client, sibling,
                                      e->xconfigurerequest.detail, TRUE);
 
-            /* if a stacking change is requested then it is needed */
-            config = TRUE;
+            /* if a stacking change moves the window without resizing */
+            move = TRUE;
         }
 
         /* don't allow clients to move shaded windows (fvwm does this) */
@@ -1042,7 +1044,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
             /* if the client tried to move and we aren't letting it then a
                synthetic event is needed */
-            config = TRUE;
+            move = TRUE;
         }
 
         if (e->xconfigurerequest.value_mask & CWX ||
@@ -1050,25 +1052,31 @@ static void event_handle_client(ObClient *client, XEvent *e)
             e->xconfigurerequest.value_mask & CWWidth ||
             e->xconfigurerequest.value_mask & CWHeight)
         {
-            if (e->xconfigurerequest.value_mask & CWX)
+            if (e->xconfigurerequest.value_mask & CWX) {
                 x = e->xconfigurerequest.x;
-            if (e->xconfigurerequest.value_mask & CWY)
+                move = TRUE;
+            }
+            if (e->xconfigurerequest.value_mask & CWY) {
                 y = e->xconfigurerequest.y;
-            if (e->xconfigurerequest.value_mask & CWWidth)
+                move = TRUE;
+            }
+            if (e->xconfigurerequest.value_mask & CWWidth) {
                 w = e->xconfigurerequest.width;
-            if (e->xconfigurerequest.value_mask & CWHeight)
+                resize = TRUE;
+            }
+            if (e->xconfigurerequest.value_mask & CWHeight) {
                 h = e->xconfigurerequest.height;
-
-            /* if a new position or size is requested, then a configure is
-               needed */
-            config = TRUE;
+                resize = TRUE;
+            }
         }
 
-        ob_debug("ConfigureRequest x(%d) %d y(%d) %d w(%d) %d h(%d) %d\n",
+        ob_debug("ConfigureRequest x(%d) %d y(%d) %d w(%d) %d h(%d) %d "
+                 "move %d resize %d\n",
                  e->xconfigurerequest.value_mask & CWX, x,
                  e->xconfigurerequest.value_mask & CWY, y,
                  e->xconfigurerequest.value_mask & CWWidth, w,
-                 e->xconfigurerequest.value_mask & CWHeight, h);
+                 e->xconfigurerequest.value_mask & CWHeight, h,
+                 move, resize);
 
         /* check for broken apps moving to their root position
 
@@ -1077,7 +1085,8 @@ static void event_handle_client(ObClient *client, XEvent *e)
            desktop. eg. open amarok window on desktop 1, switch to desktop
            2, click amarok tray icon. it will move by its decoration size.
         */
-        if (x != client->area.x &&
+        if (move && !resize &&
+            x != client->area.x &&
             x == (client->frame->area.x + client->frame->size.left -
                   (gint)client->border_width) &&
             y != client->area.y &&
@@ -1092,11 +1101,23 @@ static void event_handle_client(ObClient *client, XEvent *e)
             /* don't move it */
             x = client->area.x;
             y = client->area.y;
+
+            /* they still requested a move, so don't change whether a
+               notify is sent or not */
         }
 
-        if (config) {
+        if (move || resize) {
+            gint lw,lh;
+
             client_find_onscreen(client, &x, &y, w, h, FALSE);
-            client_configure(client, x, y, w, h, FALSE, TRUE);
+            client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
+            /* if they requested something that moves the window, or if
+               the window is actually being changed then configure it and
+               send a configure notify to them */
+            if (move || !RECT_EQUAL_DIMS(client->area, x, y, w, h)) {
+                ob_debug("Doing configure\n");
+                client_configure(client, x, y, w, h, FALSE, TRUE);
+            }
 
             /* ignore enter events caused by these like ob actions do */
             event_ignore_all_queued_enters();
index 39832e949050c5cbb78ff1e73264945a2dd5108e..67a82cded06ae4a984b5015f354f628c99f19557 100644 (file)
@@ -57,6 +57,11 @@ typedef struct _Rect {
 #define RECT_EQUAL(r1, r2) ((r1).x == (r2).x && (r1).y == (r2).y && \
                             (r1).width == (r2).width && \
                             (r1).height == (r2).height)
+#define RECT_EQUAL_DIMS(r, x, y, w, h) \
+    ((r).x == (x) && (r).y == (y) && (r).width == (w) && (r).height == (h))
+
+#define RECT_TO_DIMS(r, x, y, w, h) \
+    (x) = (r).x, (y) = (r).y, (w) = (r).width, (h) = (r).height
 
 #define RECT_CONTAINS(r, px, py) \
     ((px) >= (r).x && (px) < (r).x + (r).width && \
This page took 0.029242 seconds and 4 git commands to generate.