]> Dogcows Code - chaz/openbox/blobdiff - openbox/frame.c
don't show vertical resize context/arrow when the window is shaded
[chaz/openbox] / openbox / frame.c
index a8391e48319ddde9c8d6cf0c35bb25c670b3cb61..7d7ac901680de3e6d61d42655ee209ee6859c04c 100644 (file)
@@ -297,8 +297,7 @@ void frame_adjust_shape(ObFrame *self)
             xrect[0].x = 0;
             xrect[0].y = 0;
             xrect[0].width = self->area.width;
-            xrect[0].height = ob_rr_theme->title_height +
-                self->bwidth + self->rbwidth;
+            xrect[0].height = self->size.top;
             ++num;
         }
 
@@ -335,16 +334,20 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
         self->decorations = self->client->decorations;
         self->max_horz = self->client->max_horz;
         self->max_vert = self->client->max_vert;
+        self->shaded = self->client->shaded;
 
-        if (self->decorations & OB_FRAME_DECOR_BORDER) {
+        if (self->decorations & OB_FRAME_DECOR_BORDER ||
+            (self->client->undecorated && config_theme_keepborder))
             self->bwidth = ob_rr_theme->fbwidth;
+        else
+            self->bwidth = 0;
+
+        if (self->decorations & OB_FRAME_DECOR_BORDER) {
             self->cbwidth_l = self->cbwidth_r = ob_rr_theme->cbwidthx;
             self->cbwidth_t = self->cbwidth_b = ob_rr_theme->cbwidthy;
-        } else {
-            self->bwidth = self->cbwidth_l = self->cbwidth_t =
+        } else
+            self->cbwidth_l = self->cbwidth_t =
                 self->cbwidth_r = self->cbwidth_b = 0;
-        }
-        self->rbwidth = self->bwidth;
 
         if (self->max_horz) {
             self->cbwidth_l = self->cbwidth_r = 0;
@@ -367,7 +370,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
                   self->cbwidth_b + (!self->max_horz || !self->max_vert ? self->bwidth : 0));
 
         if (self->decorations & OB_FRAME_DECOR_TITLEBAR)
-            self->size.top += ob_rr_theme->title_height + self->rbwidth;
+            self->size.top += ob_rr_theme->title_height + self->bwidth;
         if (self->decorations & OB_FRAME_DECOR_HANDLE &&
             ob_rr_theme->handle_height > 0)
         {
@@ -470,14 +473,12 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
                 XMapWindow(ob_display, self->titletopleft);
                 XMapWindow(ob_display, self->titletopright);
 
-                if (self->decorations & OB_FRAME_DECOR_TITLEBAR &&
-                    self->rbwidth)
-                {
+                if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
                     XMoveResizeWindow(ob_display, self->titlebottom,
                                       self->bwidth,
                                       ob_rr_theme->title_height + self->bwidth,
                                       self->width,
-                                      self->rbwidth);
+                                      self->bwidth);
 
                     XMapWindow(ob_display, self->titlebottom);
                 } else
@@ -764,6 +765,13 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
                               self->area.width,
                               self->area.height);
 
+        /* when the client has StaticGravity, it likes to move around.
+           also this correctly positions the client when it maps.
+           this also needs to be run when the frame's decorations sizes change!
+        */
+        XMoveWindow(ob_display, self->client->window,
+                    self->size.left, self->size.top);
+
         if (resized) {
             framerender_frame(self);
             frame_adjust_shape(self);
@@ -797,15 +805,18 @@ 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)
+        self->max_vert != self->client->max_vert ||
+        self->shaded != self->client->shaded)
     {
         gboolean r = (self->client->functions & OB_CLIENT_FUNC_RESIZE) &&
             !(self->client->max_horz && self->client->max_vert);
         gboolean topbot = !self->client->max_vert;
+        gboolean sh = self->client->shaded;
         XSetWindowAttributes a;
 
-        /* these ones turn off when max vert */
-        a.cursor = ob_cursor(r && topbot ? OB_CURSOR_NORTH : OB_CURSOR_NONE);
+        /* these ones turn off when max vert, and some when shaded */
+        a.cursor = ob_cursor(r && topbot && !sh ?
+                             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);
@@ -814,17 +825,21 @@ static void frame_adjust_cursors(ObFrame *self)
         XChangeWindowAttributes(ob_display, self->handlebottom, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->innerbottom, CWCursor, &a);
 
-        /* these ones don't */
-        a.cursor = ob_cursor(r ? OB_CURSOR_NORTHWEST : OB_CURSOR_NONE);
+        /* these ones change when shaded */
+        a.cursor = ob_cursor(r ? (sh ? OB_CURSOR_WEST : OB_CURSOR_NORTHWEST) :
+                             OB_CURSOR_NONE);
+        XChangeWindowAttributes(ob_display, self->titleleft, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->tltresize, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->tllresize, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->titletopleft, CWCursor, &a);
-        XChangeWindowAttributes(ob_display, self->titleleft, CWCursor, &a);
-        a.cursor = ob_cursor(r ? OB_CURSOR_NORTHEAST : OB_CURSOR_NONE);
+        a.cursor = ob_cursor(r ? (sh ? OB_CURSOR_EAST : OB_CURSOR_NORTHEAST) :
+                             OB_CURSOR_NONE);
+        XChangeWindowAttributes(ob_display, self->titleright, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->trtresize, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->trrresize, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->titletopright, CWCursor, &a);
-        XChangeWindowAttributes(ob_display, self->titleright, CWCursor, &a);
+
+        /* these ones are pretty static */
         a.cursor = ob_cursor(r ? OB_CURSOR_WEST : OB_CURSOR_NONE);
         XChangeWindowAttributes(ob_display, self->left, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->innerleft, CWCursor, &a);
@@ -1321,6 +1336,10 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y)
              (win == self->titletop || win == self->topresize))
         /* can't resize vertically when max vert */
         return OB_FRAME_CONTEXT_TITLEBAR;
+    else if (self->shaded &&
+             (win == self->titletop || win == self->topresize))
+        /* can't resize vertically when shaded */
+        return OB_FRAME_CONTEXT_TITLEBAR;
 
     if (win == self->window)            return OB_FRAME_CONTEXT_FRAME;
     if (win == self->label)             return OB_FRAME_CONTEXT_TITLEBAR;
@@ -1485,6 +1504,13 @@ void frame_frame_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h)
     }
 }
 
+void frame_rect_to_frame(ObFrame *self, Rect *r)
+{
+    r->width += self->size.left + self->size.right;
+    r->height += self->size.top + self->size.bottom;
+    frame_client_gravity(self, &r->x, &r->y, r->width, r->height);
+}
+
 static void flash_done(gpointer data)
 {
     ObFrame *self = data;
@@ -1563,10 +1589,12 @@ static gboolean frame_animate_iconify(gpointer p)
 
     if (self->client->icon_geometry.width == 0) {
         /* there is no icon geometry set so just go straight down */
-        Rect *a = screen_physical_area();
+        Rect *a = screen_physical_area_monitor
+            (screen_find_monitor(&self->area));
         iconx = self->area.x + self->area.width / 2 + 32;
         icony = a->y + a->width;
         iconw = 64;
+        g_free(a);
     } else {
         iconx = self->client->icon_geometry.x;
         icony = self->client->icon_geometry.y;
@@ -1627,10 +1655,11 @@ void frame_end_iconify_animation(ObFrame *self)
 
     if (!self->visible)
         XUnmapWindow(ob_display, self->window);
-    else
+    else {
         /* Send a ConfigureNotify when the animation is done, this fixes
            KDE's pager showing the window in the wrong place. */
         client_reconfigure(self->client);
+    }
 
     /* we're not animating any more ! */
     self->iconify_animation_going = 0;
@@ -1638,6 +1667,8 @@ void frame_end_iconify_animation(ObFrame *self)
     XMoveResizeWindow(ob_display, self->window,
                       self->area.x, self->area.y,
                       self->area.width, self->area.height);
+    /* we delay re-rendering until after we're done animating */
+    framerender_frame(self);
     XFlush(ob_display);
 }
 
This page took 0.028087 seconds and 4 git commands to generate.