]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
add a big comment about more menus
[chaz/openbox] / openbox / client.c
index 48f5d2a9c86bf69ff5a866a45604ce6aad4b3e3c..5a6f443ae82d3b157a136067044b74a6357653bd 100644 (file)
@@ -349,15 +349,19 @@ void client_manage(Window window)
          client_search_focus_tree_full(self)) &&
         /* this checks for focus=false for the window */
         (!settings || settings->focus != 0) &&
-        /* note the check against Type_Normal/Dialog, not client_normal(self),
-           which would also include other types. in this case we want more
-           strict rules for focus */
+        /* note the check against type Normal/Dialog/Utility,
+           not client_normal(self), which would also include other types.
+           in this case we want more strict rules for focus */
         (self->type == OB_CLIENT_TYPE_NORMAL ||
+         self->type == OB_CLIENT_TYPE_UTILITY ||
          self->type == OB_CLIENT_TYPE_DIALOG))
     {
         activate = TRUE;
     }
 
+    /* remove the client's border */
+    XSetWindowBorderWidth(ob_display, self->window, 0);
+
     /* adjust the frame to the client's size before showing or placing
        the window */
     frame_adjust_area(self->frame, FALSE, TRUE, FALSE);
@@ -387,6 +391,8 @@ void client_manage(Window window)
                      "program + user specified" :
                      "BADNESS !?")))), placew, placeh);
 
+        /* splash screens are also returned as TRUE for transient,
+           and so will be forced on screen below */
         transient = place_client(self, &placex, &placey, settings);
 
         /* make sure the window is visible. */
@@ -400,7 +406,11 @@ void client_manage(Window window)
                                 place.c or by the user are allowed partially
                                 off-screen and on xinerama divides (ie,
                                 it is up to the placement routines to avoid
-                                the xinerama divides) */
+                                the xinerama divides)
+
+                                splash screens get "transient" set to TRUE by
+                                the place_client call
+                             */
                              transient ||
                              (!(self->positioned & USPosition) &&
                               client_normal(self) &&
@@ -411,7 +421,11 @@ void client_manage(Window window)
        the visible screen area on its monitor. Use basically the same rules
        for forcing the window on screen in the client_find_onscreen call.
 
-       do this after place_client, it chooses the monitor! */
+       do this after place_client, it chooses the monitor!
+
+       splash screens get "transient" set to TRUE by
+       the place_client call
+    */
     if (transient ||
         (!(self->sized & USSize) &&
          client_normal(self) &&
@@ -426,12 +440,8 @@ void client_manage(Window window)
 
         /* fit the window inside the area */
         if (placew > a.width || self->area.height > a.height) {
-            placew = MAX(MIN(MIN(self->area.width, a.width),
-                             self->max_size.width),
-                         self->min_size.width);
-            placeh = MAX(MIN(MIN(self->area.height, a.height),
-                             self->max_size.height),
-                         self->min_size.height);
+            placew = MIN(self->area.width, a.width);
+            placeh = MIN(self->area.height, a.height);
 
             ob_debug("setting window size to %dx%d\n",
                      self->area.width, self->area.height);
@@ -713,6 +723,9 @@ void client_unmanage(ObClient *self)
         self->functions = OB_CLIENT_FUNC_MOVE | OB_CLIENT_FUNC_RESIZE;
         self->decorations = 0; /* unmanaged windows have no decor */
 
+        /* give the client its border back */
+        XSetWindowBorderWidth(ob_display, self->window, self->border_width);
+
         client_move_resize(self, a.x, a.y, a.width, a.height);
     }
 
@@ -1810,7 +1823,7 @@ void client_reconfigure(ObClient *self)
 {
     client_configure(self, self->area.x, self->area.y,
                      self->area.width, self->area.height,
-                     self->border_width, FALSE, TRUE);
+                     FALSE, TRUE);
 }
 
 void client_update_wmhints(ObClient *self)
@@ -2568,7 +2581,7 @@ static void client_apply_startup_state(ObClient *self,
        do this before applying the states so they have the correct
        pre-max/pre-fullscreen values
     */
-    client_configure(self, x, y, w, h, self->border_width, FALSE, TRUE);
+    client_configure(self, x, y, w, h, FALSE, TRUE);
     ob_debug("placed window 0x%x at %d, %d with size %d x %d\n",
              self->window, self->area.x, self->area.y,
              self->area.width, self->area.height);
@@ -2818,7 +2831,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, gint b,
+void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
                       gboolean user, gboolean final)
 {
     gint oldw, oldh;
@@ -2838,14 +2851,12 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gint b,
         SIZE_SET(self->logical_size, logicalw, logicalh);
 
     /* 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 ||
-        b != self->border_width;
+    moved = (x != self->area.x || y != self->area.y);
+    resized = (w != self->area.width || h != self->area.height);
 
     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
@@ -2856,16 +2867,7 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gint b,
 
     /* if the client is enlarging, then resize the client before the frame */
     if (send_resize_client && (w > oldw || h > oldh)) {
-        XWindowChanges changes;
-        changes.x = self->frame->size.left - self->border_width;
-        changes.y = self->frame->size.top -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);
-
+        XResizeWindow(ob_display, self->window, MAX(w, oldw), MAX(h, oldh));
         frame_adjust_client_area(self->frame);
     }
 
@@ -2916,20 +2918,14 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, gint b,
                    FALSE, StructureNotifyMask, &event);
     }
 
-    /* if the client is shrinking, then resize the frame before the client */
-    if (send_resize_client && (w <= oldw && h <= oldh)) {
-        XWindowChanges changes;
+    /* if the client is shrinking, then resize the frame before the client.
 
+       both of these resize sections may run, because the top one only resizes
+       in the direction that is growing
+     */
+    if (send_resize_client && (w <= oldw || h <= oldh)) {
         frame_adjust_client_area(self->frame);
-
-        changes.x = self->frame->size.left - self->border_width;
-        changes.y = self->frame->size.top -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);
+        XResizeWindow(ob_display, self->window, w, h);
     }
 
     XFlush(ob_display);
This page took 0.030376 seconds and 4 git commands to generate.