]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
better focus cycling for transients. use the parent instead of the transients in...
[chaz/openbox] / openbox / client.c
index d1890956e93eade10c06e4f009da0bd5e30798f0..40b0836e1c61276e9688fdb4c0639cf04f116596 100644 (file)
@@ -1,5 +1,6 @@
 #include "client.h"
 #include "dock.h"
+#include "xerror.h"
 #include "startup.h"
 #include "screen.h"
 #include "moveresize.h"
@@ -1362,6 +1363,7 @@ void client_update_icons(Client *self)
         if (num == 2) {
             self->nicons++;
             self->icons = g_new(Icon, self->nicons);
+            xerror_set_ignore(TRUE);
             if (!render_pixmap_to_rgba(data[0], data[1],
                                        &self->icons[self->nicons-1].width,
                                        &self->icons[self->nicons-1].height,
@@ -1369,6 +1371,7 @@ void client_update_icons(Client *self)
                 g_free(&self->icons[self->nicons-1]);
                 self->nicons--;
             }
+            xerror_set_ignore(FALSE);
         }
         g_free(data);
     } else {
@@ -1378,6 +1381,7 @@ void client_update_icons(Client *self)
             if (hints->flags & IconPixmapHint) {
                 self->nicons++;
                 self->icons = g_new(Icon, self->nicons);
+                xerror_set_ignore(TRUE);
                 if (!render_pixmap_to_rgba(hints->icon_pixmap,
                                            (hints->flags & IconMaskHint ?
                                             hints->icon_mask : None),
@@ -1387,6 +1391,7 @@ void client_update_icons(Client *self)
                     g_free(&self->icons[self->nicons-1]);
                     self->nicons--;
                 }
+                xerror_set_ignore(FALSE);
             }
             XFree(hints);
         }
@@ -2234,10 +2239,30 @@ Client *client_focus_target(Client *self)
     return self;
 }
 
+gboolean client_can_focus(Client *self)
+{
+    /* same code as in client_focus */
+
+    /* choose the correct target */
+    self = client_focus_target(self);
+
+    if (!self->frame->visible)
+        return FALSE;
+
+    if (!((self->can_focus || self->focus_notify) &&
+          (self->desktop == screen_desktop ||
+           self->desktop == DESKTOP_ALL) &&
+          !self->iconic))
+       return FALSE;
+    return TRUE;
+}
+
 gboolean client_focus(Client *self)
 {
     XEvent ev;
 
+    /* same code as in client_can_focus */
+
     /* choose the correct target */
     self = client_focus_target(self);
 
This page took 0.024751 seconds and 4 git commands to generate.