]> Dogcows Code - chaz/openbox/blobdiff - openbox/frame.c
fix a long-lurknig gravity bug
[chaz/openbox] / openbox / frame.c
index 82e7f90b12dcb68aa9c6366e5c86ba3b91d05e99..19ee3297f2b4d6aeb594da389b0e8ca773b2b7de 100644 (file)
@@ -2,6 +2,7 @@
 #include "client.h"
 #include "openbox.h"
 #include "extensions.h"
+#include "config.h"
 #include "framerender.h"
 #include "render/theme.h"
 
 #define FRAME_EVENTMASK (EnterWindowMask | LeaveWindowMask | \
                          ButtonPressMask | ButtonReleaseMask)
 #define ELEMENT_EVENTMASK (ButtonPressMask | ButtonReleaseMask | \
-                           ButtonMotionMask | ExposureMask)
+                           ButtonMotionMask | ExposureMask | \
+                           EnterWindowMask | LeaveWindowMask)
 
 #define FRAME_HANDLE_Y(f) (f->innersize.top + f->client->area.height + \
                           f->cbwidth)
 
 static void layout_title(ObFrame *self);
 
-void frame_startup()
-{
-}
-
-void frame_shutdown()
-{
-}
-
 static Window createWindow(Window parent, unsigned long mask,
                           XSetWindowAttributes *attrib)
 {
@@ -114,6 +108,8 @@ ObFrame *frame_new()
 
     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->iconify_hover = self->shade_hover = FALSE;
 
     return (ObFrame*)self;
 }
@@ -171,7 +167,7 @@ void frame_adjust_shape(ObFrame *self)
                           ShapeBounding, ShapeSet);
 
        num = 0;
-       if (self->decorations & Decor_Titlebar) {
+       if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
            xrect[0].x = -ob_rr_theme->bevel;
            xrect[0].y = -ob_rr_theme->bevel;
            xrect[0].width = self->width + self->bwidth * 2;
@@ -180,7 +176,7 @@ void frame_adjust_shape(ObFrame *self)
            ++num;
        }
 
-       if (self->decorations & Decor_Handle) {
+       if (self->decorations & OB_FRAME_DECOR_HANDLE) {
            xrect[1].x = -ob_rr_theme->bevel;
            xrect[1].y = FRAME_HANDLE_Y(self);
            xrect[1].width = self->width + self->bwidth * 2;
@@ -200,7 +196,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
 {
     if (resized) {
         self->decorations = self->client->decorations;
-        if (self->decorations & Decor_Border) {
+        if (self->decorations & OB_FRAME_DECOR_BORDER) {
             self->bwidth = ob_rr_theme->bwidth;
             self->cbwidth = ob_rr_theme->cbwidth;
         } else {
@@ -230,7 +226,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
         self->max_x = -1;
         self->close_x = -1;
 
-        if (self->decorations & Decor_Titlebar) {
+        if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
             XMoveResizeWindow(ob_display, self->title,
                               -self->bwidth, -self->bwidth,
                               self->width, ob_rr_theme->title_height);
@@ -242,19 +238,27 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
         } else
             XUnmapWindow(ob_display, self->title);
 
-        if (self->decorations & Decor_Handle) {
+        if (self->decorations & OB_FRAME_DECOR_HANDLE) {
             XMoveResizeWindow(ob_display, self->handle,
                               -self->bwidth, FRAME_HANDLE_Y(self),
                               self->width, ob_rr_theme->handle_height);
-            XMoveWindow(ob_display, self->lgrip,
-                        -self->bwidth, -self->bwidth);
-            XMoveWindow(ob_display, self->rgrip,
-                        -self->bwidth + self->width -
-                        ob_rr_theme->grip_width, -self->bwidth);
             self->innersize.bottom += ob_rr_theme->handle_height +
                 self->bwidth;
             XMapWindow(ob_display, self->handle);
 
+            if (self->decorations & OB_FRAME_DECOR_GRIPS) {
+                XMoveWindow(ob_display, self->lgrip,
+                            -self->bwidth, -self->bwidth);
+                XMoveWindow(ob_display, self->rgrip,
+                            -self->bwidth + self->width -
+                            ob_rr_theme->grip_width, -self->bwidth);
+                XMapWindow(ob_display, self->lgrip);
+                XMapWindow(ob_display, self->rgrip);
+            } else {
+                XUnmapWindow(ob_display, self->lgrip);
+                XUnmapWindow(ob_display, self->rgrip);
+            }
+
             /* XXX make a subwindow with these dimentions?
                ob_rr_theme->grip_width + self->bwidth, 0,
                self->width - (ob_rr_theme->grip_width + self->bwidth) * 2,
@@ -262,9 +266,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
             */
         } else
             XUnmapWindow(ob_display, self->handle);
-    }
 
-    if (resized) {
         /* move and resize the plate */
         XMoveResizeWindow(ob_display, self->plate,
                           self->innersize.left - self->cbwidth,
@@ -273,9 +275,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
                           self->client->area.height);
         /* when the client has StaticGravity, it likes to move around. */
         XMoveWindow(ob_display, self->client->window, 0, 0);
-    }
 
-    if (resized) {
         STRUT_SET(self->size,
                   self->innersize.left + self->bwidth,
                   self->innersize.top + self->bwidth,
@@ -287,7 +287,8 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
     RECT_SET_SIZE(self->area,
                  self->client->area.width +
                  self->size.left + self->size.right,
-                 (self->client->shaded ? ob_rr_theme->title_height + self->bwidth*2:
+                 (self->client->shaded ?
+                   ob_rr_theme->title_height + self->bwidth*2:
                    self->client->area.height +
                    self->size.top + self->size.bottom));
 
@@ -296,8 +297,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
            frame_client_gravity. */
         self->area.x = self->client->area.x;
         self->area.y = self->client->area.y;
-        frame_client_gravity((ObFrame*)self,
-                             &self->area.x, &self->area.y);
+        frame_client_gravity(self, &self->area.x, &self->area.y);
     }
 
     /* move and resize the top level frame.
@@ -349,7 +349,7 @@ void frame_grab_client(ObFrame *self, ObClient *client)
       member set the root window, and one set to the client, but both get
       handled and need to be ignored.
     */
-    if (ob_state == OB_STATE_STARTING)
+    if (ob_state() == OB_STATE_STARTING)
        client->ignore_unmaps += 2;
 
     /* select the event mask on the client's parent (to receive config/map
@@ -430,31 +430,27 @@ static void layout_title(ObFrame *self)
 
     /* figure out whats being shown, and the width of the label */
     self->label_width = self->width - (ob_rr_theme->bevel + 1) * 2;
-    for (lc = ob_rr_theme->title_layout; *lc != '\0'; ++lc) {
+    for (lc = config_title_layout; *lc != '\0'; ++lc) {
        switch (*lc) {
        case 'N':
-           if (!(self->decorations & Decor_Icon)) break;
             if (n) { *lc = ' '; break; } /* rm duplicates */
            n = TRUE;
            self->label_width -= (ob_rr_theme->button_size + 2 +
                                   ob_rr_theme->bevel + 1);
            break;
        case 'D':
-           if (!(self->decorations & Decor_AllDesktops)) break;
             if (d) { *lc = ' '; break; } /* rm duplicates */
            d = TRUE;
            self->label_width -= (ob_rr_theme->button_size +
                                   ob_rr_theme->bevel + 1);
            break;
        case 'S':
-           if (!(self->decorations & Decor_Shade)) break;
             if (s) { *lc = ' '; break; } /* rm duplicates */
            s = TRUE;
            self->label_width -= (ob_rr_theme->button_size +
                                   ob_rr_theme->bevel + 1);
            break;
        case 'I':
-           if (!(self->decorations & Decor_Iconify)) break;
             if (i) { *lc = ' '; break; } /* rm duplicates */
            i = TRUE;
            self->label_width -= (ob_rr_theme->button_size +
@@ -465,14 +461,12 @@ static void layout_title(ObFrame *self)
            l = TRUE;
            break;
        case 'M':
-           if (!(self->decorations & Decor_Maximize)) break;
             if (m) { *lc = ' '; break; } /* rm duplicates */
            m = TRUE;
            self->label_width -= (ob_rr_theme->button_size +
                                   ob_rr_theme->bevel + 1);
            break;
        case 'C':
-           if (!(self->decorations & Decor_Close)) break;
             if (c) { *lc = ' '; break; } /* rm duplicates */
            c = TRUE;
            self->label_width -= (ob_rr_theme->button_size +
@@ -494,7 +488,7 @@ static void layout_title(ObFrame *self)
     if (!c) XUnmapWindow(ob_display, self->close);
 
     x = ob_rr_theme->bevel + 1;
-    for (lc = ob_rr_theme->title_layout; *lc != '\0'; ++lc) {
+    for (lc = config_title_layout; *lc != '\0'; ++lc) {
        switch (*lc) {
        case 'N':
            if (!n) break;
@@ -690,16 +684,16 @@ void frame_frame_gravity(ObFrame *self, int *x, int *y)
     switch (self->client->gravity) {
     default:
     case NorthWestGravity:
-    case WestGravity:
-    case SouthWestGravity:
-       break;
     case NorthGravity:
+    case NorthEastGravity:
+       break;
+    case WestGravity:
     case CenterGravity:
-    case SouthGravity:
+    case EastGravity:
        *y += (self->size.top + self->size.bottom) / 2;
        break;
-    case NorthEastGravity:
-    case EastGravity:
+    case SouthWestGravity:
+    case SouthGravity:
     case SouthEastGravity:
        *y += self->size.top + self->size.bottom;
        break;
This page took 0.030054 seconds and 4 git commands to generate.