add force_reply back to client_configure(). client_reconfigure is nicer this time...
authorDana Jansens <danakj@orodu.net>
Wed, 13 Jun 2007 15:56:44 +0000 (15:56 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 13 Jun 2007 15:56:44 +0000 (15:56 +0000)
openbox/client.c
openbox/client.h
openbox/event.c
openbox/moveresize.c

index d80ed29..ae2a998 100644 (file)
@@ -1808,24 +1808,6 @@ static void client_change_allowed_actions(ObClient *self)
     }
 }
 
-void client_reconfigure(ObClient *self, gboolean force)
-{
-    gint x, y, w, h, lw, lh;
-
-    RECT_TO_DIMS(self->area, x, y, w, h);
-    if (!force)
-        client_try_configure(self, &x, &y, &w, &h, &lw, &lh, FALSE);
-    if (force || !RECT_EQUAL_DIMS(self->area, x, y, w, h)) {
-        gulong ignore_start;
-
-        ob_debug("Reconfiguring client x %d y %d w %d h %d\n",
-                 x, y, w, h);
-        ignore_start = event_start_ignore_all_enters();
-        client_configure(self, x, y, w, h, FALSE, TRUE);
-        event_end_ignore_all_enters(ignore_start);
-    }
-}
-
 void client_update_wmhints(ObClient *self)
 {
     XWMHints *hints;
@@ -2630,7 +2612,7 @@ static void client_apply_startup_state(ObClient *self,
     /* if the window hasn't been configured yet, then do so now */
     if (!fullscreen && !max_vert && !max_horz) {
         self->area = oldarea;
-        client_configure(self, x, y, w, h, FALSE, TRUE);
+        client_configure(self, x, y, w, h, FALSE, TRUE, FALSE);
     }
 
     /* set the desktop hint, to make sure that it always exists */
@@ -2873,11 +2855,11 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
 
 
 void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
-                      gboolean user, gboolean final)
+                      gboolean user, gboolean final, gboolean force_reply)
 {
     gint oldw, oldh;
     gboolean send_resize_client;
-    gboolean moved = FALSE, resized = FALSE;
+    gboolean moved = FALSE, resized = FALSE, rootmoved = FALSE;
     gboolean fmoved, fresized;
     guint fdecor = self->frame->decorations;
     gboolean fhorz = self->frame->max_horz;
@@ -2926,15 +2908,37 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
     }
 
     /* adjust the frame */
-    if (fmoved || fresized)
+    if (fmoved || fresized) {
+        gulong ignore_start;
+        if (!user)
+            ignore_start = event_start_ignore_all_enters();
+
         frame_adjust_area(self->frame, fmoved, fresized, FALSE);
 
+        if (!user)
+            event_end_ignore_all_enters(ignore_start);
+    }
+
+    if (!user || final) {
+        gint oldrx = self->root_pos.x;
+        gint oldry = self->root_pos.y;
+        /* we have reset the client to 0 border width, so don't include
+           it in these coords */
+        POINT_SET(self->root_pos,
+                  self->frame->area.x + self->frame->size.left -
+                  self->border_width,
+                  self->frame->area.y + self->frame->size.top -
+                  self->border_width);
+        if (self->root_pos.x != oldrx || self->root_pos.y != oldry)
+            rootmoved = TRUE;
+    }
+
     /* This is kinda tricky and should not be changed.. let me explain!
 
        When user = FALSE, then the request is coming from the application
        itself, and we are more strict about when to send a synthetic
        ConfigureNotify.  We strictly follow the rules of the ICCCM sec 4.1.5
-       in this case.
+       in this case (if force_reply is true)
 
        When user = TRUE, then the request is coming from "us", like when we
        maximize a window or sometihng.  In this case we are more lenient.  We
@@ -2942,18 +2946,10 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
        this. So just to appease Swing, when user = TRUE, we always send
        a synthetic ConfigureNotify to give the window its root coordinates.
     */
-    if ((!user && !resized) || (user && final))
+    if ((!user && !resized && (rootmoved || force_reply)) || (user && final))
     {
         XEvent event;
 
-        /* we have reset the client to 0 border width, so don't include
-           it in these coords */
-        POINT_SET(self->root_pos,
-                  self->frame->area.x + self->frame->size.left -
-                  self->border_width,
-                  self->frame->area.y + self->frame->size.top -
-                  self->border_width);
-
         event.type = ConfigureNotify;
         event.xconfigure.display = ob_display;
         event.xconfigure.event = self->window;
index 812d0ac..ed67792 100644 (file)
@@ -379,16 +379,21 @@ void client_convert_gravity_resize(ObClient *self, gint gravity,
                                    gint w, gint h);
 
 #define client_move(self, x, y) \
-  client_configure(self, x, y, self->area.width, self->area.height, TRUE, TRUE)
+  client_configure(self, x, y, self->area.width, self->area.height, TRUE, TRUE,\
+                   FALSE)
 #define client_resize(self, w, h) \
-  client_configure(self, self->area.x, self->area.y, w, h, TRUE, TRUE)
+  client_configure(self, self->area.x, self->area.y, w, h, TRUE, TRUE, FALSE)
 #define client_move_resize(self, x, y, w, h) \
-  client_configure(self, x, y, w, h, TRUE, TRUE)
+  client_configure(self, x, y, w, h, TRUE, TRUE, FALSE)
+#define client_reconfigure(self, force) \
+  client_configure(self, ((ObClient*)self)->area.x, ((ObClient*)self)->area.y, \
+                   ((ObClient*)self)->area.width, \
+                   ((ObClient*)self)->area.height, FALSE, TRUE, force)
 
 /*! Figure out where a window will end up and what size it will be if you
   told it to move/resize to these coordinates.
 
-  These values are what client_configure_full will give the window.
+  These values are what client_configure will give the window.
 
   @param x The x coordiante of the new position for the client.
   @param y The y coordiante of the new position for the client.
@@ -422,12 +427,10 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
                interactive move/resize, and then be TRUE for the last call
                only.
   @param force_reply Send a ConfigureNotify to the client regardless of if
-                     the position changed.
+                     the position/size changed.
 */
 void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
-                      gboolean user, gboolean final);
-
-void client_reconfigure(ObClient *self, gboolean force);
+                      gboolean user, gboolean final, gboolean force_reply);
 
 /*! Finds coordinates to keep a client on the screen.
   @param self The client
index 3052e1b..8089792 100644 (file)
@@ -1160,7 +1160,6 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
         {
             gint lw,lh;
-            gulong ignore_start;
 
             client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
 
@@ -1179,9 +1178,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
             ob_debug("Granting ConfigureRequest x %d y %d w %d h %d\n",
                      x, y, w, h);
-            ignore_start = event_start_ignore_all_enters();
-            client_configure(client, x, y, w, h, FALSE, TRUE);
-            event_end_ignore_all_enters(ignore_start);
+            client_configure(client, x, y, w, h, FALSE, TRUE, TRUE);
         }
         break;
     }
@@ -1343,7 +1340,6 @@ static void event_handle_client(ObClient *client, XEvent *e)
                 moveresize_end(TRUE);
         } else if (msgtype == prop_atoms.net_moveresize_window) {
             gint ograv, x, y, w, h;
-            gulong ignore_start;
 
             ograv = client->gravity;
 
@@ -1388,10 +1384,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
             client_find_onscreen(client, &x, &y, w, h, FALSE);
 
-            /* ignore enter events caused by these like ob actions do */
-            ignore_start = event_start_ignore_all_enters();
-            client_configure(client, x, y, w, h, FALSE, TRUE);
-            event_end_ignore_all_enters(ignore_start);
+            client_configure(client, x, y, w, h, FALSE, TRUE, FALSE);
 
             client->gravity = ograv;
         } else if (msgtype == prop_atoms.net_restack_window) {
index 232cc9b..534cd01 100644 (file)
@@ -299,7 +299,7 @@ void moveresize_end(gboolean cancel)
         client_configure(moveresize_client, x, y,
                          (cancel ? start_cw : cur_x),
                          (cancel ? start_ch : cur_y),
-                         TRUE, TRUE);
+                         TRUE, TRUE, FALSE);
     }
 
     moveresize_in_progress = FALSE;
@@ -319,7 +319,7 @@ static void do_move(gboolean keyboard)
     client_configure(moveresize_client, cur_x, cur_y,
                      moveresize_client->area.width,
                      moveresize_client->area.height,
-                     TRUE, FALSE);
+                     TRUE, FALSE, FALSE);
     if (config_resize_popup_show == 2) /* == "Always" */
         popup_coords(moveresize_client, "%d x %d",
                      moveresize_client->frame->area.x,
@@ -377,7 +377,7 @@ static void do_resize()
 #endif
 
     get_resize_position(&x, &y, FALSE);
-    client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE);
+    client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE, FALSE);
 
     /* this would be better with a fixed width font ... XXX can do it better
        if there are 2 text boxes */