]> Dogcows Code - chaz/openbox/commitdiff
fix showing the resize cursors at the right times.
authorDana Jansens <danakj@orodu.net>
Tue, 22 May 2007 01:03:13 +0000 (01:03 +0000)
committerDana Jansens <danakj@orodu.net>
Tue, 22 May 2007 01:03:13 +0000 (01:03 +0000)
fix losing the pre-size/position for windows mapped maximized or fullscreen states (and on restart)

openbox/client.c
openbox/frame.c

index 94b5c4800572850cd5c741e2b6819351f6a57e25..5cc1df9a3cab46b28eac80d88bcd8784f4c1f6ed 100644 (file)
@@ -403,20 +403,26 @@ void client_manage(Window window)
     frame_adjust_client_area(self->frame);
 
 
+    /* do this after the window is placed, so the premax/prefullscreen numbers
+       won't be all wacko!!
+       also, this moves the window to the position where it has been placed
+    */
+    client_apply_startup_state(self);
+
     /* move the client to its placed position, or it it's already there,
        generate a ConfigureNotify telling the client where it is.
 
        do this after adjusting the frame. otherwise it gets all weird and
-       clients don't work right */
+       clients don't work right
+
+       also do this after applying the startup state so maximize and fullscreen
+       will get the right sizes and positions if the client is starting with
+       those states
+    */
     client_configure(self, self->area.x, self->area.y,
                      self->area.width, self->area.height,
                      FALSE, TRUE);
 
-    /* do this after the window is placed, so the premax/prefullscreen numbers
-       won't be all wacko!!
-       also, this moves the window to the position where it has been placed
-    */
-    client_apply_startup_state(self);
 
     if (activate) {
         guint32 last_time = focus_client ?
@@ -1584,6 +1590,8 @@ void client_update_normal_hints(ObClient *self)
     }
 }
 
+/*! This needs to be followed by a call to client_configure to make
+  the changes show */
 void client_setup_decor_and_functions(ObClient *self)
 {
     /* start with everything (cept fullscreen) */
@@ -1704,14 +1712,9 @@ void client_setup_decor_and_functions(ObClient *self)
         self->decorations &= ~OB_FRAME_DECOR_MAXIMIZE;
     }
 
-    if (self->max_horz && self->max_vert) {
-        /* also can't resize maximized windows.
-           do this after checking for resize to let you maximize */
-        self->functions &=~ OB_CLIENT_FUNC_RESIZE;
-
+    if (self->max_horz && self->max_vert)
         /* kill the handle on fully maxed windows */
         self->decorations &= ~(OB_FRAME_DECOR_HANDLE | OB_FRAME_DECOR_GRIPS);
-    }
 
     /* If there are no decorations to remove, don't allow the user to try
        toggle the state */
@@ -1740,11 +1743,6 @@ void client_setup_decor_and_functions(ObClient *self)
     }
 
     client_change_allowed_actions(self);
-
-    if (self->frame) {
-        /* adjust the client's decorations, etc. */
-        client_reconfigure(self);
-    }
 }
 
 static void client_change_allowed_actions(ObClient *self)
@@ -3615,6 +3613,7 @@ void client_set_undecorated(ObClient *self, gboolean undecorated)
     {
         self->undecorated = undecorated;
         client_setup_decor_and_functions(self);
+        client_reconfigure(self); /* show the lack of decorations */
         client_change_state(self); /* reflect this in the state hints */
     }
 }
index 43b50722e5f4866a77bbed8e36fd8415d7e63a17..80d6ca1e53228c8c758ac83d975e0d24719f9b2a 100644 (file)
@@ -55,6 +55,7 @@ static void layout_title(ObFrame *self);
 static void set_theme_statics(ObFrame *self);
 static void free_theme_statics(ObFrame *self);
 static gboolean frame_animate_iconify(gpointer self);
+static void frame_adjust_cursors(ObFrame *self);
 
 static Window createWindow(Window parent, Visual *visual,
                            gulong mask, XSetWindowAttributes *attrib)
@@ -329,7 +330,13 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
     oldsize = self->size;
 
     if (resized) {
+        /* do this before changing the frame's status like max_horz max_vert */
+        frame_adjust_cursors(self);
+
+        self->functions = self->client->functions;
         self->decorations = self->client->decorations;
+        self->max_horz = self->client->max_horz;
+        self->max_vert = self->client->max_vert;
 
         if (self->decorations & OB_FRAME_DECOR_BORDER) {
             self->bwidth = ob_rr_theme->fbwidth;
@@ -340,9 +347,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
         }
         self->rbwidth = self->bwidth;
 
-        self->max_horz = self->client->max_horz;
-        self->max_vert = self->client->max_vert;
-
         if (self->max_horz) {
             self->cbwidth_x = 0;
             self->width = self->client->area.width - self->bwidth * 2;
@@ -740,14 +744,17 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
     if (resized && (self->decorations & OB_FRAME_DECOR_TITLEBAR))
         XResizeWindow(ob_display, self->label, self->label_width,
                       ob_rr_theme->label_height);
+}
 
-    /* set up cursors */
-    if (!fake &&
-        (self->functions & OB_CLIENT_FUNC_RESIZE) !=
-        (self->client->functions & OB_CLIENT_FUNC_RESIZE))
+static void frame_adjust_cursors(ObFrame *self)
+{
+    if ((self->functions & OB_CLIENT_FUNC_RESIZE) !=
+        (self->client->functions & OB_CLIENT_FUNC_RESIZE) ||
+        ((self->max_horz && self->max_vert) !=
+         (self->client->max_horz && self->client->max_vert)))
     {
-        gboolean r = self->client->functions & OB_CLIENT_FUNC_RESIZE &&
-            !(self->max_horz && self->max_vert);
+        gboolean r = (self->client->functions & OB_CLIENT_FUNC_RESIZE) &&
+            !(self->client->max_horz && self->client->max_vert);
         XSetWindowAttributes a;
 
         a.cursor = ob_cursor(r ? OB_CURSOR_NORTH : OB_CURSOR_NONE);
@@ -783,8 +790,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
         XChangeWindowAttributes(ob_display, self->rgripright, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->rgriptop, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->rgripbottom, CWCursor, &a);
-
-        self->functions = self->client->functions;
     }
 }
 
This page took 0.030757 seconds and 4 git commands to generate.