]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus.c
validate clients before trying to focus them in fallback
[chaz/openbox] / openbox / focus.c
index 7b40db5e585bd1a512a2980afeb96fe2a797e668..201a43492bf88103c26c5f152d92e7becd0040c0 100644 (file)
@@ -2,7 +2,7 @@
 
    focus.c for the Openbox window manager
    Copyright (c) 2006        Mikael Magnusson
-   Copyright (c) 2003        Ben Jansens
+   Copyright (c) 2003-2007   Dana Jansens
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -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;
 }
@@ -244,11 +248,14 @@ static ObClient* focus_fallback_transient(ObClient *top, ObClient *old)
         return NULL;
 }
 
-ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old)
+ObClient* focus_fallback_target(ObFocusFallbackType type)
 {
     GList *it;
+    ObClient *old;
     ObClient *target = NULL;
 
+    old = focus_client;
+
     if ((type == OB_FOCUS_FALLBACK_UNFOCUSING
          || type == OB_FOCUS_FALLBACK_CLOSED) && old) {
         if (old->transient_for) {
@@ -257,8 +264,8 @@ ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old)
             if (!config_focus_follow || config_focus_last)
                 trans = TRUE;
             else if ((target = client_under_pointer()) &&
-                     (client_search_transient
-                      (client_search_top_parent(target), old)))
+                     client_search_transient
+                     (client_search_top_parent(target), old))
                 trans = TRUE;
 
             /* try for transient relations */
@@ -298,7 +305,8 @@ ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old)
         (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;
             }
@@ -321,7 +329,9 @@ ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old)
     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;
             }
@@ -337,7 +347,6 @@ ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old)
 void focus_fallback(ObFocusFallbackType type)
 {
     ObClient *new;
-    ObClient *old = focus_client;
 
     /* unfocus any focused clients.. they can be focused by Pointer events
        and such, and then when I try focus them, I won't get a FocusIn event
@@ -345,7 +354,7 @@ void focus_fallback(ObFocusFallbackType type)
     */
     focus_set_client(NULL);
 
-    if ((new = focus_fallback_target(type, old)))
+    if ((new = focus_fallback_target(type)))
         client_focus(new);
 }
 
This page took 0.02819 seconds and 4 git commands to generate.