]> Dogcows Code - chaz/openbox/blobdiff - openbox/frame.c
Merge branch 'backport'
[chaz/openbox] / openbox / frame.c
index a4843d6ff9f577f5407c57e1120f2cf18f07855b..b10f793b9de8c7d0d0b4192c832bb15ec51ad9e8 100644 (file)
@@ -22,6 +22,7 @@
 #include "openbox.h"
 #include "extensions.h"
 #include "prop.h"
+#include "grab.h"
 #include "config.h"
 #include "framerender.h"
 #include "mainloop.h"
@@ -59,7 +60,7 @@ static Window createWindow(Window parent, Visual *visual,
                          (visual ? 32 : RrDepth(ob_rr_inst)), InputOutput,
                          (visual ? visual : RrVisual(ob_rr_inst)),
                          mask, attrib);
-                       
+
 }
 
 static Visual *check_32bit_client(ObClient *c)
@@ -129,6 +130,11 @@ ObFrame *frame_new(ObClient *client)
     self->innerright = createWindow(self->window, NULL, mask, &attrib);
     self->innerbottom = createWindow(self->window, NULL, mask, &attrib);
 
+    self->innerblb = createWindow(self->innerbottom, NULL, mask, &attrib);
+    self->innerbrb = createWindow(self->innerbottom, NULL, mask, &attrib);
+    self->innerbll = createWindow(self->innerleft, NULL, mask, &attrib);
+    self->innerbrr = createWindow(self->innerright, NULL, mask, &attrib);
+
     self->title = createWindow(self->window, NULL, mask, &attrib);
     self->titleleft = createWindow(self->window, NULL, mask, &attrib);
     self->titletop = createWindow(self->window, NULL, mask, &attrib);
@@ -156,7 +162,7 @@ ObFrame *frame_new(ObClient *client)
 
     self->handle = createWindow(self->window, NULL, mask, &attrib);
     self->lgrip = createWindow(self->handle, NULL, mask, &attrib);
-    self->rgrip = createWindow(self->handle, NULL, mask, &attrib); 
+    self->rgrip = createWindow(self->handle, NULL, mask, &attrib);
 
     self->handleleft = createWindow(self->handle, NULL, mask, &attrib);
     self->handleright = createWindow(self->handle, NULL, mask, &attrib);
@@ -177,9 +183,9 @@ ObFrame *frame_new(ObClient *client)
     XMapWindow(ob_display, self->backback);
     XMapWindow(ob_display, self->backfront);
 
-    self->max_press = self->close_press = self->desk_press = 
+    self->max_press = self->close_press = self->desk_press =
         self->iconify_press = self->shade_press = FALSE;
-    self->max_hover = self->close_hover = self->desk_hover = 
+    self->max_hover = self->close_hover = self->desk_hover =
         self->iconify_hover = self->shade_hover = FALSE;
 
     set_theme_statics(self);
@@ -224,7 +230,7 @@ static void set_theme_statics(ObFrame *self)
 
 static void free_theme_statics(ObFrame *self)
 {
-    RrAppearanceFree(self->a_unfocused_title); 
+    RrAppearanceFree(self->a_unfocused_title);
     RrAppearanceFree(self->a_focused_title);
     RrAppearanceFree(self->a_unfocused_label);
     RrAppearanceFree(self->a_focused_label);
@@ -249,8 +255,13 @@ void frame_show(ObFrame *self)
     if (!self->visible) {
         self->visible = TRUE;
         framerender_frame(self);
+        /* Grab the server to make sure that the frame window is mapped before
+           the client gets its MapNotify, i.e. to make sure the client is
+           _visible_ when it gets MapNotify. */
+        grab_server(TRUE);
         XMapWindow(ob_display, self->client->window);
         XMapWindow(ob_display, self->window);
+        grab_server(FALSE);
     }
 }
 
@@ -368,7 +379,8 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
                   self->cbwidth_l + (!self->max_horz ? self->bwidth : 0),
                   self->cbwidth_t + self->bwidth,
                   self->cbwidth_r + (!self->max_horz ? self->bwidth : 0),
-                  self->cbwidth_b + (!self->max_horz || !self->max_vert ? self->bwidth : 0));
+                  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->bwidth;
@@ -377,10 +389,13 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
         {
             self->size.bottom += ob_rr_theme->handle_height + self->bwidth;
         }
-  
+
         /* position/size and map/unmap all the windows */
 
         if (!fake) {
+            gint innercornerheight =
+                ob_rr_theme->grip_width - self->size.bottom;
+
             if (self->cbwidth_l) {
                 XMoveResizeWindow(ob_display, self->innerleft,
                                   self->size.left - self->cbwidth_l,
@@ -391,6 +406,19 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
             } else
                 XUnmapWindow(ob_display, self->innerleft);
 
+            if (self->cbwidth_l && innercornerheight > 0) {
+                XMoveResizeWindow(ob_display, self->innerbll,
+                                  0,
+                                  self->client->area.height - 
+                                  (ob_rr_theme->grip_width -
+                                   self->size.bottom),
+                                  self->cbwidth_l,
+                                  ob_rr_theme->grip_width - self->size.bottom);
+
+                XMapWindow(ob_display, self->innerbll);
+            } else
+                XUnmapWindow(ob_display, self->innerbll);
+
             if (self->cbwidth_r) {
                 XMoveResizeWindow(ob_display, self->innerright,
                                   self->size.left + self->client->area.width,
@@ -401,6 +429,19 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
             } else
                 XUnmapWindow(ob_display, self->innerright);
 
+            if (self->cbwidth_r && innercornerheight > 0) {
+                XMoveResizeWindow(ob_display, self->innerbrr,
+                                  0,
+                                  self->client->area.height - 
+                                  (ob_rr_theme->grip_width -
+                                   self->size.bottom),
+                                  self->cbwidth_r,
+                                  ob_rr_theme->grip_width - self->size.bottom);
+
+                XMapWindow(ob_display, self->innerbrr);
+            } else
+                XUnmapWindow(ob_display, self->innerbrr);
+
             if (self->cbwidth_t) {
                 XMoveResizeWindow(ob_display, self->innertop,
                                   self->size.left - self->cbwidth_l,
@@ -421,9 +462,26 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
                                   self->cbwidth_l + self->cbwidth_r,
                                   self->cbwidth_b);
 
+                XMoveResizeWindow(ob_display, self->innerblb,
+                                  0, 0,
+                                  ob_rr_theme->grip_width + self->bwidth,
+                                  self->cbwidth_b);
+                XMoveResizeWindow(ob_display, self->innerbrb,
+                                  self->client->area.width +
+                                  self->cbwidth_l + self->cbwidth_r -
+                                  (ob_rr_theme->grip_width + self->bwidth),
+                                  0,
+                                  ob_rr_theme->grip_width + self->bwidth,
+                                  self->cbwidth_b);
+
                 XMapWindow(ob_display, self->innerbottom);
-            } else
+                XMapWindow(ob_display, self->innerblb);
+                XMapWindow(ob_display, self->innerbrb);
+            } else {
                 XUnmapWindow(ob_display, self->innerbottom);
+                XUnmapWindow(ob_display, self->innerblb);
+                XUnmapWindow(ob_display, self->innerbrb);
+            }
 
             if (self->bwidth) {
                 gint titlesides;
@@ -547,7 +605,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
                                                  sidebwidth) * 2,
                                   self->bwidth);
 
-                
+
                 if (sidebwidth) {
                     XMoveResizeWindow(ob_display, self->lgripleft,
                                       0,
@@ -591,7 +649,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
                                   self->bwidth);
                 XMoveResizeWindow(ob_display, self->rgripbottom,
                                   self->size.left + self->client->area.width +
-                                  self->size.right - self->bwidth - sidebwidth -
+                                  self->size.right - self->bwidth - sidebwidth-
                                   ob_rr_theme->grip_width,
                                   self->size.top + self->client->area.height +
                                   self->size.bottom - self->bwidth,
@@ -710,7 +768,10 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
                 XUnmapWindow(ob_display, self->handle);
             }
 
-            if (self->bwidth && !self->max_horz) {
+            if (self->bwidth && !self->max_horz &&
+                (self->client->area.height + self->size.top +
+                 self->size.bottom) > ob_rr_theme->grip_width * 2)
+            {
                 XMoveResizeWindow(ob_display, self->left,
                                   0,
                                   self->bwidth + ob_rr_theme->grip_width,
@@ -723,10 +784,13 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
             } else
                 XUnmapWindow(ob_display, self->left);
 
-            if (self->bwidth && !self->max_horz) {
+            if (self->bwidth && !self->max_horz &&
+                (self->client->area.height + self->size.top +
+                 self->size.bottom) > ob_rr_theme->grip_width * 2)
+            {
                 XMoveResizeWindow(ob_display, self->right,
-                                  self->client->area.width +
-                                  self->cbwidth_l + self->cbwidth_r + self->bwidth,
+                                  self->client->area.width + self->cbwidth_l +
+                                  self->cbwidth_r + self->bwidth,
                                   self->bwidth + ob_rr_theme->grip_width,
                                   self->bwidth,
                                   self->client->area.height +
@@ -765,7 +829,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
         if (!frame_iconify_animating(self))
             /* move and resize the top level frame.
                shading can change without being moved or resized.
-               
+
                but don't do this during an iconify animation. it will be
                reflected afterwards.
             */
@@ -863,12 +927,16 @@ static void frame_adjust_cursors(ObFrame *self)
         XChangeWindowAttributes(ob_display, self->lgripleft, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->lgriptop, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->lgripbottom, CWCursor, &a);
+        XChangeWindowAttributes(ob_display, self->innerbll, CWCursor, &a);
+        XChangeWindowAttributes(ob_display, self->innerblb, CWCursor, &a);
         a.cursor = ob_cursor(r ? OB_CURSOR_SOUTHEAST : OB_CURSOR_NONE);
         XChangeWindowAttributes(ob_display, self->rgrip, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->handleright, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->rgripright, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->rgriptop, CWCursor, &a);
         XChangeWindowAttributes(ob_display, self->rgripbottom, CWCursor, &a);
+        XChangeWindowAttributes(ob_display, self->innerbrr, CWCursor, &a);
+        XChangeWindowAttributes(ob_display, self->innerbrb, CWCursor, &a);
     }
 }
 
@@ -1526,6 +1594,13 @@ void frame_rect_to_frame(ObFrame *self, Rect *r)
     frame_client_gravity(self, &r->x, &r->y);
 }
 
+void frame_rect_to_client(ObFrame *self, Rect *r)
+{
+    r->width -= self->size.left + self->size.right;
+    r->height -= self->size.top + self->size.bottom;
+    frame_frame_gravity(self, &r->x, &r->y);
+}
+
 static void flash_done(gpointer data)
 {
     ObFrame *self = data;
@@ -1570,7 +1645,7 @@ void frame_flash_start(ObFrame *self)
                                  flash_done);
     g_get_current_time(&self->flash_end);
     g_time_val_add(&self->flash_end, G_USEC_PER_SEC * 5);
-    
+
     self->flashing = TRUE;
 }
 
@@ -1621,7 +1696,7 @@ static gboolean frame_animate_iconify(gpointer p)
     /* how far do we have left to go ? */
     g_get_current_time(&now);
     time = frame_animate_iconify_time_left(self, &now);
-    
+
     if (time == 0 || iconifying) {
         /* start where the frame is supposed to be */
         x = self->area.x;
This page took 0.028912 seconds and 4 git commands to generate.