validate clients before trying to focus them in fallback
authorDana Jansens <danakj@orodu.net>
Mon, 12 Mar 2007 05:57:30 +0000 (05:57 +0000)
committerDana Jansens <danakj@orodu.net>
Mon, 12 Mar 2007 05:57:30 +0000 (05:57 +0000)
also validate before trying to set the focus on a window

this should fix those crashes, and should just be better over all

openbox/client.c
openbox/focus.c

index e4bef71..7e93603 100644 (file)
@@ -2937,6 +2937,9 @@ gboolean client_focus(ObClient *self)
     /* choose the correct target */
     self = client_focus_target(self);
 
+    if (!client_validate(self))
+        return FALSE;
+
     if (!client_can_focus(self)) {
         if (!self->frame->visible) {
             /* update the focus lists */
index 417ffa9..201a434 100644 (file)
@@ -223,8 +223,12 @@ static ObClient *find_transient_recursive(ObClient *c, ObClient *top,
     for (it = c->transients; it; it = g_slist_next(it)) {
         if (it->data == top) return NULL;
         ret = find_transient_recursive(it->data, top, skip);
-        if (ret && ret != skip && client_normal(ret)) return ret;
-        if (it->data != skip && client_normal(it->data)) return it->data;
+        if (ret && ret != skip && client_normal(ret) &&
+            client_can_focus(ret) && client_validate(ret))
+            return ret;
+        if (it->data != skip && client_normal(it->data) &&
+            client_can_focus(it->data) && client_validate(it->data))
+            return it->data;
     }
     return NULL;
 }
@@ -301,7 +305,8 @@ ObClient* focus_fallback_target(ObFocusFallbackType type)
         (type == OB_FOCUS_FALLBACK_UNFOCUSING || !config_focus_last))
     {
         if ((target = client_under_pointer()))
-            if (client_normal(target) && client_can_focus(target)) {
+            if (client_normal(target) && client_can_focus(target) &&
+                client_validate(target)) {
                 ob_debug("found in pointer stuff\n");
                 return target;
             }
@@ -324,7 +329,9 @@ ObClient* focus_fallback_target(ObFocusFallbackType type)
     ob_debug("trying  the focus order\n");
     for (it = focus_order[screen_desktop]; it; it = g_list_next(it))
         if (type != OB_FOCUS_FALLBACK_UNFOCUSING || it->data != old)
-            if (client_normal(it->data) && client_can_focus(it->data)) {
+            if (client_normal(it->data) && client_can_focus(it->data) &&
+                client_validate(it->data))
+            {
                 ob_debug("found in focus order\n");
                 return it->data;
             }