]> Dogcows Code - chaz/openbox/blobdiff - openbox/frame.c
hopefully fix some stuff with kde tray icons
[chaz/openbox] / openbox / frame.c
index 44ca9c4e997c02f6c0385a96395f4311a220db42..74d5630ec1c84bbc7ea8fa4de353c7fb9837e8a2 100644 (file)
@@ -24,6 +24,7 @@
 #include "config.h"
 #include "framerender.h"
 #include "mainloop.h"
+#include "focus.h"
 #include "moveresize.h"
 #include "render/theme.h"
 
@@ -45,7 +46,7 @@ static gboolean flash_timeout(gpointer data);
 static void set_theme_statics(ObFrame *self);
 static void free_theme_statics(ObFrame *self);
 
-static Window createWindow(Window parent, unsigned long mask,
+static Window createWindow(Window parent, gulong mask,
                           XSetWindowAttributes *attrib)
 {
     return XCreateWindow(ob_display, parent, 0, 0, 1, 1, 0,
@@ -57,7 +58,7 @@ static Window createWindow(Window parent, unsigned long mask,
 ObFrame *frame_new()
 {
     XSetWindowAttributes attrib;
-    unsigned long mask;
+    gulong mask;
     ObFrame *self;
 
     self = g_new0(ObFrame, 1);
@@ -65,9 +66,8 @@ ObFrame *frame_new()
     self->obscured = TRUE;
 
     /* create all of the decor windows */
-    mask = CWOverrideRedirect | CWEventMask;
+    mask = CWEventMask;
     attrib.event_mask = FRAME_EVENTMASK;
-    attrib.override_redirect = TRUE;
     self->window = createWindow(RootWindow(ob_display, ob_screen),
                                 mask, &attrib);
 
@@ -121,11 +121,16 @@ ObFrame *frame_new()
 static void set_theme_statics(ObFrame *self)
 {
     /* set colors/appearance/sizes for stuff that doesn't change */
-    XSetWindowBorder(ob_display, self->window, ob_rr_theme->b_color->pixel);
-    XSetWindowBorder(ob_display, self->title, ob_rr_theme->b_color->pixel);
-    XSetWindowBorder(ob_display, self->handle, ob_rr_theme->b_color->pixel);
-    XSetWindowBorder(ob_display, self->rgrip, ob_rr_theme->b_color->pixel);
-    XSetWindowBorder(ob_display, self->lgrip, ob_rr_theme->b_color->pixel);
+    XSetWindowBorder(ob_display, self->window,
+                     RrColorPixel(ob_rr_theme->b_color));
+    XSetWindowBorder(ob_display, self->title,
+                     RrColorPixel(ob_rr_theme->b_color));
+    XSetWindowBorder(ob_display, self->handle,
+                     RrColorPixel(ob_rr_theme->b_color));
+    XSetWindowBorder(ob_display, self->rgrip,
+                     RrColorPixel(ob_rr_theme->b_color));
+    XSetWindowBorder(ob_display, self->lgrip,
+                     RrColorPixel(ob_rr_theme->b_color));
 
     XResizeWindow(ob_display, self->max,
                   ob_rr_theme->button_size, ob_rr_theme->button_size);
@@ -183,6 +188,7 @@ void frame_show(ObFrame *self)
 {
     if (!self->visible) {
         self->visible = TRUE;
+        XMapWindow(ob_display, self->client->window);
         XMapWindow(ob_display, self->window);
     }
 }
@@ -191,8 +197,11 @@ void frame_hide(ObFrame *self)
 {
     if (self->visible) {
         self->visible = FALSE;
-        self->client->ignore_unmaps++;
+        self->client->ignore_unmaps += 2;
+        /* we unmap the client itself so that we can get MapRequest
+           events, and because the ICCCM tells us to! */
         XUnmapWindow(ob_display, self->window);
+        XUnmapWindow(ob_display, self->client->window);
     }
 }
 
@@ -205,7 +214,7 @@ void frame_adjust_theme(ObFrame *self)
 void frame_adjust_shape(ObFrame *self)
 {
 #ifdef SHAPE
-    int num;
+    gint num;
     XRectangle xrect[2];
 
     if (!self->client->shaped) {
@@ -420,6 +429,11 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
             PROP_SETA32(self->client->window, kde_net_wm_frame_strut,
                         cardinal, vals, 4);
         }
+
+        /* if this occurs while we are focus cycling, the indicator needs to
+           match the changes */
+        if (focus_cycle_target == self->client)
+            focus_cycle_draw_indicator();
     }
 }
 
@@ -491,26 +505,35 @@ void frame_grab_client(ObFrame *self, ObClient *client)
 void frame_release_client(ObFrame *self, ObClient *client)
 {
     XEvent ev;
+    gboolean reparent = TRUE;
 
     g_assert(self->client == client);
 
     /* check if the app has already reparented its window away */
-    if (XCheckTypedWindowEvent(ob_display, client->window,
-                              ReparentNotify, &ev)) {
-       XPutBackEvent(ob_display, &ev);
-
-       /* re-map the window since the unmanaging process unmaps it */
+    while (XCheckTypedWindowEvent(ob_display, client->window,
+                                  ReparentNotify, &ev))
+    {
+        /* This check makes sure we don't catch our own reparent action to
+           our frame window. This doesn't count as the app reparenting itself
+           away of course.
+
+           Reparent events that are generated by us are just discarded here.
+           They are of no consequence to us anyhow.
+        */
+        if (ev.xreparent.parent != self->plate) {
+            reparent = FALSE;
+            XPutBackEvent(ob_display, &ev);
+            break;
+        }
+    }
 
-        /* XXX ... um no it doesnt it unmaps its parent, the window itself
-           retains its mapped state, no?! XXX
-           XMapWindow(ob_display, client->window); */
-    } else {
-       /* according to the ICCCM - if the client doesn't reparent itself,
-          then we will reparent the window to root for them */
-       XReparentWindow(ob_display, client->window,
+    if (reparent) {
+        /* according to the ICCCM - if the client doesn't reparent itself,
+           then we will reparent the window to root for them */
+        XReparentWindow(ob_display, client->window,
                         RootWindow(ob_display, ob_screen),
-                       client->area.x,
-                       client->area.y);
+                        client->area.x,
+                        client->area.y);
     }
 
     /* remove all the windows for the frame from the window_map */
@@ -537,8 +560,8 @@ void frame_release_client(ObFrame *self, ObClient *client)
 
 static void layout_title(ObFrame *self)
 {
-    char *lc;
-    int x;
+    gchar *lc;
+    gint x;
     gboolean n, d, i, l, m, c, s;
 
     n = d = i = l = m = c = s = FALSE;
@@ -740,7 +763,7 @@ ObFrameContext frame_context(ObClient *client, Window win)
     return OB_FRAME_CONTEXT_NONE;
 }
 
-void frame_client_gravity(ObFrame *self, int *x, int *y)
+void frame_client_gravity(ObFrame *self, gint *x, gint *y)
 {
     /* horizontal */
     switch (self->client->gravity) {
@@ -795,7 +818,7 @@ void frame_client_gravity(ObFrame *self, int *x, int *y)
     }
 }
 
-void frame_frame_gravity(ObFrame *self, int *x, int *y)
+void frame_frame_gravity(ObFrame *self, gint *x, gint *y)
 {
     /* horizontal */
     switch (self->client->gravity) {
This page took 0.0273 seconds and 4 git commands to generate.