]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
debug print modified and the confignotify test
[chaz/openbox] / openbox / client.c
index bf7723365fdde511c1fa1e39ccbd68ba951f191c..aa0d8fafc4f77f836e34a33cf63304c24c470fdb 100644 (file)
@@ -67,7 +67,6 @@ GList            *client_list          = NULL;
 static GSList *client_destroy_notifies = NULL;
 
 static void client_get_all(ObClient *self, gboolean real);
-static void client_toggle_border(ObClient *self, gboolean show);
 static void client_get_startup_id(ObClient *self);
 static void client_get_session_ids(ObClient *self);
 static void client_get_area(ObClient *self);
@@ -324,9 +323,6 @@ void client_manage(Window window)
     /* now we have all of the window's information so we can set this up */
     client_setup_decor_and_functions(self);
 
-    /* remove the client's border (and adjust re gravity) */
-    client_toggle_border(self, FALSE);
-     
     {
         Time t = sn_app_started(self->startup_id, self->class);
         if (t) self->user_time = t;
@@ -377,7 +373,7 @@ void client_manage(Window window)
                  (!self->positioned ? "no" :
                   (self->positioned == PPosition ? "program specified" :
                    (self->positioned == USPosition ? "user specified" :
-                    (self->positioned == PPosition | USPosition ?
+                    (self->positioned == (PPosition | USPosition) ?
                      "program + user specified" :
                      "BADNESS !?")))), self->area.x, self->area.y);
 
@@ -385,7 +381,7 @@ void client_manage(Window window)
                  (!self->sized ? "no" :
                   (self->sized == PSize ? "program specified" :
                    (self->sized == USSize ? "user specified" :
-                    (self->sized == PSize | USSize ?
+                    (self->sized == (PSize | USSize) ?
                      "program + user specified" :
                      "BADNESS !?")))), self->area.width, self->area.height);
 
@@ -404,15 +400,17 @@ void client_manage(Window window)
             a.height -= self->frame->size.top + self->frame->size.bottom;
 
             /* fit the window inside the area */
-            self->area.width = MIN(self->area.width, a.width);
-            self->area.height = MIN(self->area.height, a.height);
+            if (self->area.width > a.width || self->area.height > a.height) {
+                self->area.width = MIN(self->area.width, a.width);
+                self->area.height = MIN(self->area.height, a.height);
 
-            ob_debug("setting window size to %dx%d\n",
-                     self->area.width, self->area.height);
+                ob_debug("setting window size to %dx%d\n",
+                         self->area.width, self->area.height);
 
-            /* adjust the frame to the client's new size */
-            frame_adjust_area(self->frame, FALSE, TRUE, FALSE);
-            frame_adjust_client_area(self->frame);
+                /* adjust the frame to the client's new size */
+                frame_adjust_area(self->frame, FALSE, TRUE, FALSE);
+                frame_adjust_client_area(self->frame);
+            }
         }
 
         /* make sure the window is visible. */
@@ -460,6 +458,7 @@ void client_manage(Window window)
     */
     client_configure(self, placex, placey,
                      self->area.width, self->area.height,
+                     self->border_width,
                      FALSE, TRUE);
 
 
@@ -701,9 +700,6 @@ void client_unmanage(ObClient *self)
     {
         Rect a;
 
-        /* give the client its border back */
-        client_toggle_border(self, TRUE);
-
         a = self->area;
 
         if (self->fullscreen)
@@ -1037,71 +1033,6 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h,
     return ox != *x || oy != *y;
 }
 
-static void client_toggle_border(ObClient *self, gboolean show)
-{
-    /* adjust our idea of where the client is, based on its border. When the
-       border is removed, the client should now be considered to be in a
-       different position.
-       when re-adding the border to the client, the same operation needs to be
-       reversed. */
-    gint oldx = self->area.x, oldy = self->area.y;
-    gint x = oldx, y = oldy;
-    switch(self->gravity) {
-    default:
-    case NorthWestGravity:
-    case WestGravity:
-    case SouthWestGravity:
-        break;
-    case NorthEastGravity:
-    case EastGravity:
-    case SouthEastGravity:
-        if (show) x -= self->border_width * 2;
-        else      x += self->border_width * 2;
-        break;
-    case NorthGravity:
-    case SouthGravity:
-    case CenterGravity:
-    case ForgetGravity:
-    case StaticGravity:
-        if (show) x -= self->border_width;
-        else      x += self->border_width;
-        break;
-    }
-    switch(self->gravity) {
-    default:
-    case NorthWestGravity:
-    case NorthGravity:
-    case NorthEastGravity:
-        break;
-    case SouthWestGravity:
-    case SouthGravity:
-    case SouthEastGravity:
-        if (show) y -= self->border_width * 2;
-        else      y += self->border_width * 2;
-        break;
-    case WestGravity:
-    case EastGravity:
-    case CenterGravity:
-    case ForgetGravity:
-    case StaticGravity:
-        if (show) y -= self->border_width;
-        else      y += self->border_width;
-        break;
-    }
-    self->area.x = x;
-    self->area.y = y;
-
-    if (show) {
-        XSetWindowBorderWidth(ob_display, self->window, self->border_width);
-
-        /* set border_width to 0 because there is no border to add into
-           calculations anymore */
-        self->border_width = 0;
-    } else
-        XSetWindowBorderWidth(ob_display, self->window, 0);
-}
-
-
 static void client_get_all(ObClient *self, gboolean real)
 {
     /* this is needed for the frame to set itself up */
@@ -1179,8 +1110,8 @@ static void client_get_area(ObClient *self)
     POINT_SET(self->root_pos, wattrib.x, wattrib.y);
     self->border_width = wattrib.border_width;
 
-    ob_debug("client area: %d %d  %d %d\n", wattrib.x, wattrib.y,
-             wattrib.width, wattrib.height);
+    ob_debug("client area: %d %d  %d %d  bw %d\n", wattrib.x, wattrib.y,
+             wattrib.width, wattrib.height, wattrib.border_width);
 }
 
 static void client_get_desktop(ObClient *self)
@@ -1871,11 +1802,9 @@ static void client_change_allowed_actions(ObClient *self)
 
 void client_reconfigure(ObClient *self)
 {
-    /* by making this pass FALSE for user, we avoid the emacs event storm where
-       every configurenotify causes an update in its normal hints, i think this
-       is generally what we want anyways... */
     client_configure(self, self->area.x, self->area.y,
-                     self->area.width, self->area.height, FALSE, TRUE);
+                     self->area.width, self->area.height,
+                     self->border_width, FALSE, TRUE);
 }
 
 void client_update_wmhints(ObClient *self)
@@ -2851,7 +2780,7 @@ 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,
+void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gint b,
                       gboolean user, gboolean final)
 {
     gint oldw, oldh;
@@ -2872,11 +2801,13 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
 
     /* figure out if we moved or resized or what */
     moved = x != self->area.x || y != self->area.y;
-    resized = w != self->area.width || h != self->area.height;
+    resized = w != self->area.width || h != self->area.height ||
+        b != self->border_width;
 
     oldw = self->area.width;
     oldh = self->area.height;
     RECT_SET(self->area, x, y, w, h);
+    self->border_width = b;
 
     /* for app-requested resizes, always resize if 'resized' is true.
        for user-requested ones, only resize if final is true, or when
@@ -2887,8 +2818,15 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
 
     /* if the client is enlarging, then resize the client before the frame */
     if (send_resize_client && (w > oldw || h > oldh)) {
-        XResizeWindow(ob_display, self->window,
-                      MAX(w, oldw), MAX(h, oldh));
+        XWindowChanges changes;
+        changes.x = -self->border_width;
+        changes.y = -self->border_width;
+        changes.width = MAX(w, oldw);
+        changes.height = MAX(h, oldh);
+        changes.border_width = self->border_width;
+        XConfigureWindow(ob_display, self->window,
+                         CWX|CWY|CWWidth|CWHeight|CWBorderWidth,
+                         &changes);
         /* resize the plate to show the client padding color underneath */
         frame_adjust_client_area(self->frame);
     }
@@ -2912,6 +2850,8 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
     {
         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,
@@ -2931,20 +2871,29 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
         event.xconfigure.y = self->root_pos.y;
         event.xconfigure.width = w;
         event.xconfigure.height = h;
-        event.xconfigure.border_width = 0;
-        event.xconfigure.above = self->frame->plate;
+        event.xconfigure.border_width = self->border_width;
+        event.xconfigure.above = None;
         event.xconfigure.override_redirect = FALSE;
         XSendEvent(event.xconfigure.display, event.xconfigure.window,
                    FALSE, StructureNotifyMask, &event);
     }
 
     /* if the client is shrinking, then resize the frame before the client */
-    if (send_resize_client && (w <= oldw || h <= oldh)) {
+    if (send_resize_client && (w <= oldw && h <= oldh)) {
         /* resize the plate to show the client padding color underneath */
         frame_adjust_client_area(self->frame);
 
-        if (send_resize_client)
-            XResizeWindow(ob_display, self->window, w, h);
+        if (send_resize_client) {
+            XWindowChanges changes;
+            changes.x = -self->border_width;
+            changes.y = -self->border_width;
+            changes.width = w;
+            changes.height = h;
+            changes.border_width = self->border_width;
+            XConfigureWindow(ob_display, self->window,
+                             CWX|CWY|CWWidth|CWHeight|CWBorderWidth,
+                             &changes);
+        }
     }
 
     XFlush(ob_display);
This page took 0.030085 seconds and 4 git commands to generate.