]> Dogcows Code - chaz/openbox/blobdiff - openbox/frame.c
merge r6815 from 3.4-working (!) 'fix positioning of tlt, top and trt resize elements...
[chaz/openbox] / openbox / frame.c
index 43b50722e5f4866a77bbed8e36fd8415d7e63a17..37e39e2eebd0bd5925472e56d23da6c4f47e6f52 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)
@@ -250,6 +251,7 @@ void frame_show(ObFrame *self)
     if (!self->visible) {
         self->visible = TRUE;
         XMapWindow(ob_display, self->client->window);
+        XMapWindow(ob_display, self->plate);
         XMapWindow(ob_display, self->window);
     }
 }
@@ -260,6 +262,10 @@ void frame_hide(ObFrame *self)
         self->visible = FALSE;
         if (!frame_iconify_animating(self))
             XUnmapWindow(ob_display, self->window);
+        /* unmap the plate along with the client. some people (libwnck) look
+           to see if it is unmapped when the client is iconified, for whatever
+           reason. so let's play along... */
+        XUnmapWindow(ob_display, self->plate);
         /* we unmap the client itself so that we can get MapRequest
            events, and because the ICCCM tells us to! */
         XUnmapWindow(ob_display, self->client->window);
@@ -329,7 +335,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 +352,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;
@@ -370,7 +379,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
                 XMoveResizeWindow(ob_display, self->titletop,
                                   ob_rr_theme->grip_width + self->bwidth, 0,
                                   /* width + bwidth*2 - bwidth*2 - grips*2 */
-                                  self->width + ob_rr_theme->grip_width * 2,
+                                  self->width - ob_rr_theme->grip_width * 2,
                                   self->bwidth);
                 XMoveResizeWindow(ob_display, self->titletopleft,
                                   0, 0,
@@ -437,10 +446,9 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
 
                 if (self->decorations & OB_FRAME_DECOR_GRIPS) {
                     XMoveResizeWindow(ob_display, self->topresize,
-                                      ob_rr_theme->grip_width + self->bwidth,
+                                      ob_rr_theme->grip_width,
                                       0,
-                                      self->width - (ob_rr_theme->grip_width +
-                                                     self->bwidth) * 2,
+                                      self->width - ob_rr_theme->grip_width *2,
                                       ob_rr_theme->paddingy + 1);
 
                     XMoveWindow(ob_display, self->tltresize, 0, 0);
@@ -691,7 +699,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
                    self->client->area.height +
                    self->size.top + self->size.bottom));
 
-    if (moved || resized) {
+    if ((moved || resized) && !fake) {
         /* find the new coordinates, done after setting the frame.size, for
            frame_client_gravity. */
         self->area.x = self->client->area.x;
@@ -740,19 +748,30 @@ 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->client->max_horz ||
+        self->max_vert != 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);
+        gboolean topbot = !self->client->max_vert;
         XSetWindowAttributes a;
 
-        a.cursor = ob_cursor(r ? OB_CURSOR_NORTH : OB_CURSOR_NONE);
+        /* these ones turn off when max vert */
+        a.cursor = ob_cursor(r && topbot ? OB_CURSOR_NORTH : OB_CURSOR_NONE);
         XChangeWindowAttributes(ob_display, self->topresize, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->titletop, CWCursor, &a);
+        a.cursor = ob_cursor(r && topbot ? OB_CURSOR_SOUTH : OB_CURSOR_NONE);
+        XChangeWindowAttributes(ob_display, self->handle, CWCursor, &a);
+        XChangeWindowAttributes(ob_display, self->handletop, CWCursor, &a);
+        XChangeWindowAttributes(ob_display, self->handlebottom, CWCursor, &a);
+
+        /* these ones don't */
         a.cursor = ob_cursor(r ? OB_CURSOR_NORTHWEST : OB_CURSOR_NONE);
         XChangeWindowAttributes(ob_display, self->tltresize, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->tllresize, CWCursor, &a);
@@ -767,10 +786,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
         XChangeWindowAttributes(ob_display, self->left, CWCursor, &a);
         a.cursor = ob_cursor(r ? OB_CURSOR_EAST : OB_CURSOR_NONE);
         XChangeWindowAttributes(ob_display, self->right, CWCursor, &a);
-        a.cursor = ob_cursor(r ? OB_CURSOR_SOUTH : OB_CURSOR_NONE);
-        XChangeWindowAttributes(ob_display, self->handle, CWCursor, &a);
-        XChangeWindowAttributes(ob_display, self->handletop, CWCursor, &a);
-        XChangeWindowAttributes(ob_display, self->handlebottom, CWCursor, &a);
         a.cursor = ob_cursor(r ? OB_CURSOR_SOUTHWEST : OB_CURSOR_NONE);
         XChangeWindowAttributes(ob_display, self->lgrip, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->handleleft, CWCursor, &a);
@@ -783,8 +798,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;
     }
 }
 
@@ -1201,7 +1214,7 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y)
        is fully maximized, then treat it like they clicked in the
        button that is there */
     if (self->max_horz && self->max_vert &&
-        (win == self->title ||
+        (win == self->title || win == self->titletop ||
          win == self->titleleft || win == self->titletopleft ||
          win == self->titleright || win == self->titletopright))
     {
@@ -1217,6 +1230,9 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y)
         /* title is a border width in from the edge */
         if (win == self->title)
             fx += self->bwidth;
+        /* titletop is a bit to the right */
+        else if (win == self->titletop)
+            fx += ob_rr_theme->grip_width + self->bwidth;
         /* titletopright is way to the right edge */
         else if (win == self->titletopright)
             fx += self->area.width - (ob_rr_theme->grip_width + self->bwidth);
@@ -1243,7 +1259,15 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y)
                     return self->rightmost;
             }
         }
+
+        /* there is no resizing maximized windows so make them the titlebar
+           context */
+        return OB_FRAME_CONTEXT_TITLEBAR;
     }
+    else if (self->max_vert &&
+             (win == self->titletop || win == self->topresize))
+        /* can't resize vertically when max vert */
+        return OB_FRAME_CONTEXT_TITLEBAR;
 
     if (win == self->window)            return OB_FRAME_CONTEXT_FRAME;
     if (win == self->label)             return OB_FRAME_CONTEXT_TITLEBAR;
@@ -1296,17 +1320,20 @@ void frame_client_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h)
     case NorthGravity:
     case SouthGravity:
     case CenterGravity:
-        *x -= (self->size.left + w) / 2;
+        /* the middle of the client will be the middle of the frame */
+        *x -= (self->size.right - self->size.left) / 2;
         break;
 
     case NorthEastGravity:
     case SouthEastGravity:
     case EastGravity:
-        *x -= (self->size.left + self->size.right + w) - 1;
+        /* the right side of the client will be the right side of the frame */
+        *x -= self->size.right + self->size.left;
         break;
 
     case ForgetGravity:
     case StaticGravity:
+        /* the client's position won't move */
         *x -= self->size.left;
         break;
     }
@@ -1322,17 +1349,20 @@ void frame_client_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h)
     case CenterGravity:
     case EastGravity:
     case WestGravity:
-        *y -= (self->size.top + h) / 2;
+        /* the middle of the client will be the middle of the frame */
+        *y -= (self->size.bottom - self->size.top) / 2;
         break;
 
     case SouthWestGravity:
     case SouthEastGravity:
     case SouthGravity:
-        *y -= (self->size.top + self->size.bottom + h) - 1;
+        /* the bottom of the client will be the bottom of the frame */
+        *y -= self->size.bottom + self->size.top;
         break;
 
     case ForgetGravity:
     case StaticGravity:
+        /* the client's position won't move */
         *y -= self->size.top;
         break;
     }
@@ -1350,15 +1380,18 @@ void frame_frame_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h)
     case NorthGravity:
     case CenterGravity:
     case SouthGravity:
-        *x += (self->size.left + w) / 2;
+        /* the middle of the client will be the middle of the frame */
+        *x += (self->size.right - self->size.left) / 2;
         break;
     case NorthEastGravity:
     case EastGravity:
     case SouthEastGravity:
-        *x += (self->size.left + self->size.right + w) - 1;
+        /* the right side of the client will be the right side of the frame */
+        *x += self->size.right + self->size.left;
         break;
     case StaticGravity:
     case ForgetGravity:
+        /* the client's position won't move */
         *x += self->size.left;
         break;
     }
@@ -1373,15 +1406,18 @@ void frame_frame_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h)
     case WestGravity:
     case CenterGravity:
     case EastGravity:
-        *y += (self->size.top + h) / 2;
+        /* the middle of the client will be the middle of the frame */
+        *y += (self->size.bottom - self->size.top) / 2;
         break;
     case SouthWestGravity:
     case SouthGravity:
     case SouthEastGravity:
-        *y += (self->size.top + self->size.bottom + h) - 1;
+        /* the bottom of the client will be the bottom of the frame */
+        *y += self->size.bottom + self->size.top;
         break;
     case StaticGravity:
     case ForgetGravity:
+        /* the client's position won't move */
         *y += self->size.top;
         break;
     }
This page took 0.026109 seconds and 4 git commands to generate.