merge r6920-21 from trunk
authorDana Jansens <danakj@orodu.net>
Sat, 26 May 2007 23:10:26 +0000 (23:10 +0000)
committerDana Jansens <danakj@orodu.net>
Sat, 26 May 2007 23:10:26 +0000 (23:10 +0000)
openbox/client.c
openbox/client.h
openbox/event.c
openbox/frame.c
openbox/moveresize.c
tests/borderchange.c [new file with mode: 0644]

index 3c6aee45ac3d3de50af2ee69c4a4e6c42ed6f31f..b69df9e09f47bb5065ce62cff793a297dc24fa47 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);
 
@@ -460,6 +456,7 @@ void client_manage(Window window)
     */
     client_configure(self, placex, placey,
                      self->area.width, self->area.height,
+                     self->border_width,
                      FALSE, TRUE);
 
 
@@ -701,9 +698,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 +1031,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 */
@@ -1875,7 +1804,8 @@ void client_reconfigure(ObClient *self)
        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 +2781,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 +2802,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 +2819,16 @@ 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,
+                         (moved ? CWX|CWY : 0) |
+                         (resized ? CWWidth|CWHeight|CWBorderWidth : 0),
+                         &changes);
         /* resize the plate to show the client padding color underneath */
         frame_adjust_client_area(self->frame);
     }
@@ -2915,8 +2855,10 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
         /* 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->frame->area.y + self->frame->size.top);
+                  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;
@@ -2931,7 +2873,7 @@ 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.border_width = self->border_width;
         event.xconfigure.above = self->frame->plate;
         event.xconfigure.override_redirect = FALSE;
         XSendEvent(event.xconfigure.display, event.xconfigure.window,
@@ -2943,8 +2885,18 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
         /* 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,
+                             (moved ? CWX|CWY : 0) |
+                             (resized ? CWWidth|CWHeight|CWBorderWidth : 0),
+                             &changes);
+        }
     }
 
     XFlush(ob_display);
index e4831b95341af4c09de21b49688681b4dec6826e..755b973ac9540700bf8cdeac203c7c9df0ae64de 100644 (file)
@@ -386,11 +386,13 @@ 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, \
+                   self->border_width, TRUE, TRUE)
 #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, \
+                   self->border_width, TRUE, TRUE)
 #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, self->border_width, TRUE, TRUE)
 
 /*! Figure out where a window will end up and what size it will be if you
   told it to move/resize to these coordinates.
@@ -431,7 +433,7 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
   @param force_reply Send a ConfigureNotify to the client regardless of if
                      the position changed.
 */
-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);
 
 void client_reconfigure(ObClient *self);
index e7ef27fb3058b1ab7ca6942c3a582463cde39d32..e03c8203cd66e62ffdc49a35ae69b8a83bd49dc8 100644 (file)
@@ -536,7 +536,6 @@ static void event_process(const XEvent *ec, gpointer data)
             client_bring_helper_windows(client);
         }
     } else if (e->type == FocusOut) {
-        gboolean nomove = FALSE;
         XEvent ce;
 
         /* Look for the followup FocusIn */
@@ -995,26 +994,22 @@ static void event_handle_client(ObClient *client, XEvent *e)
            also you can't compress stacking events
         */
 
-        gint x, y, w, h;
+        gint x, y, w, h, b;
         gboolean move = FALSE;
         gboolean resize = FALSE;
+        gboolean border = FALSE;
 
         /* get the current area */
         RECT_TO_DIMS(client->area, x, y, w, h);
+        b = client->border_width;
 
         ob_debug("ConfigureRequest desktop %d wmstate %d visibile %d\n",
                  screen_desktop, client->wmstate, client->frame->visible);
 
         if (e->xconfigurerequest.value_mask & CWBorderWidth)
             if (client->border_width != e->xconfigurerequest.border_width) {
-                client->border_width = e->xconfigurerequest.border_width;
-
-                /* 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;
+                b = e->xconfigurerequest.border_width;
+                border = TRUE;
             }
 
 
@@ -1114,17 +1109,21 @@ static void event_handle_client(ObClient *client, XEvent *e)
                notify is sent or not */
         }
 
-        if (move || resize) {
+        if (move || resize || border) {
             gint lw,lh;
 
-            client_find_onscreen(client, &x, &y, w, h, FALSE);
-            client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
+            if (move || resize) {
+                client_find_onscreen(client, &x, &y, w, h, FALSE);
+                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)) {
+            if (move || !RECT_EQUAL_DIMS(client->area, x, y, w, h) ||
+                border)
+            {
                 ob_debug("Doing configure\n");
-                client_configure(client, x, y, w, h, FALSE, TRUE);
+                client_configure(client, x, y, w, h, b, FALSE, TRUE);
             }
 
             /* ignore enter events caused by these like ob actions do */
@@ -1329,7 +1328,8 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
             client_find_onscreen(client, &x, &y, w, h, FALSE);
 
-            client_configure(client, x, y, w, h, FALSE, TRUE);
+            client_configure(client, x, y, w, h, client->border_width,
+                             FALSE, TRUE);
 
             client->gravity = ograv;
 
index dbb17681601fb0249b9608650862c4aaa3675e50..9eaeff633ae22d58db307107b0e30d468f274992 100644 (file)
@@ -695,7 +695,9 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
                         self->cbwidth_y);
 
             /* when the client has StaticGravity, it likes to move around. */
-            XMoveWindow(ob_display, self->client->window, 0, 0);
+            XMoveWindow(ob_display, self->client->window,
+                        -self->client->border_width,
+                        -self->client->border_width);
         }
     }
 
@@ -848,7 +850,8 @@ void frame_grab_client(ObFrame *self)
     */
 
     /* reparent the client to the frame */
-    XReparentWindow(ob_display, self->client->window, self->plate, 0, 0);
+    XReparentWindow(ob_display, self->client->window, self->plate,
+                    -self->client->border_width, -self->client->border_width);
 
     /*
       When reparenting the client window, it is usually not mapped yet, since
index c55b88e1504249f660afa2581d79e4b3dd15b747..8ef18a87f56a556e02ab41b03021d4d176618617 100644 (file)
@@ -297,7 +297,8 @@ void moveresize_end(gboolean cancel)
         get_resize_position(&x, &y, cancel);
         client_configure(moveresize_client, x, y,
                          (cancel ? start_cw : cur_x),
-                         (cancel ? start_ch : cur_y), TRUE, TRUE);
+                         (cancel ? start_ch : cur_y),
+                         moveresize_client->border_width, TRUE, TRUE);
     }
 
     moveresize_in_progress = FALSE;
@@ -316,7 +317,8 @@ static void do_move(gboolean keyboard)
 
     client_configure(moveresize_client, cur_x, cur_y,
                      moveresize_client->area.width,
-                     moveresize_client->area.height, TRUE, FALSE);
+                     moveresize_client->area.height,
+                     moveresize_client->border_width, TRUE, FALSE);
     if (config_resize_popup_show == 2) /* == "Always" */
         popup_coords(moveresize_client, "%d x %d",
                      moveresize_client->frame->area.x,
@@ -374,7 +376,8 @@ 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,
+                     moveresize_client->border_width, TRUE, FALSE);
 
     /* this would be better with a fixed width font ... XXX can do it better
        if there are 2 text boxes */
diff --git a/tests/borderchange.c b/tests/borderchange.c
new file mode 100644 (file)
index 0000000..a9b3a3d
--- /dev/null
@@ -0,0 +1,107 @@
+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
+
+   borderchange.c for the Openbox window manager
+   Copyright (c) 2003-2007   Dana Jansens
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   See the COPYING file for a copy of the GNU General Public License.
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <X11/Xlib.h>
+
+int main () {
+  Display   *display;
+  Window     win;
+  XEvent     report;
+  XEvent     msg;
+  int        x=10,y=10,h=200,w=200;
+
+  display = XOpenDisplay(NULL);
+
+  if (display == NULL) {
+    fprintf(stderr, "couldn't connect to X server :0\n");
+    return 0;
+  }
+
+  win = XCreateWindow(display, RootWindow(display, 0),
+                     x, y, w, h, 10, CopyFromParent, CopyFromParent,
+                     CopyFromParent, 0, NULL);
+
+  XSetWindowBackground(display,win,WhitePixel(display,0)); 
+  XSelectInput(display, win, ExposureMask | StructureNotifyMask);
+
+  XMapWindow(display, win);
+  XFlush(display);
+
+  while (XPending(display)) {
+    XNextEvent(display, &report);
+    switch (report.type) {
+    case Expose:
+      printf("exposed\n");
+      break;
+    case ConfigureNotify:
+      x = report.xconfigure.x;
+      y = report.xconfigure.y;
+      w = report.xconfigure.width;
+      h = report.xconfigure.height;
+      printf("confignotify %i,%i-%ix%i\n",x,y,w,h);
+      break;
+    }
+  }
+  sleep(2);
+
+  printf("setting border to 0\n");
+  XSetWindowBorderWidth(display, win, 0);
+  XFlush(display);
+
+  while (XPending(display)) {
+    XNextEvent(display, &report);
+    switch (report.type) {
+    case Expose:
+      printf("exposed\n");
+      break;
+    case ConfigureNotify:
+      x = report.xconfigure.x;
+      y = report.xconfigure.y;
+      w = report.xconfigure.width;
+      h = report.xconfigure.height;
+      printf("confignotify %i,%i-%ix%i\n",x,y,w,h);
+      break;
+    }
+  }
+  sleep(2);
+
+  printf("setting border to 50\n");
+  XSetWindowBorderWidth(display, win, 50);
+  XFlush(display);
+
+  while (XPending(display)) {
+    XNextEvent(display, &report);
+    switch (report.type) {
+    case Expose:
+      printf("exposed\n");
+      break;
+    case ConfigureNotify:
+      x = report.xconfigure.x;
+      y = report.xconfigure.y;
+      w = report.xconfigure.width;
+      h = report.xconfigure.height;
+      printf("confignotify %i,%i-%ix%i\n",x,y,w,h);
+      break;
+    }
+
+  }
+
+  return 0;
+}