only refocus the omnipresent window if its allowed
[mikachu/openbox.git] / openbox / focus.c
index 4be187b..f06a077 100644 (file)
@@ -233,6 +233,11 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old)
         }
 #endif
 
+    ob_debug("trying omnipresentness\n");
+    if (allow_refocus && old && old->desktop == DESKTOP_ALL)
+        return old;
+
+
     ob_debug("trying  the focus order\n");
     for (it = focus_order; it; it = g_list_next(it))
         if (allow_refocus || it->data != old) {
@@ -242,13 +247,15 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old)
                focus off to nothing
                2. it is validated. if the window is about to disappear, then
                don't try focus it.
-               3. it is visible on the screen right now.
-               4. it is a normal type window, don't fall back onto a dock or
+               3. it is visible on the current desktop. this ignores
+               omnipresent windows, which are problematic in their own rite.
+               4. it's not iconic
+               5. it is a normal type window, don't fall back onto a dock or
                a splashscreen or a desktop window (save the desktop as a
                backup fallback though)
             */
             if (client_can_focus(c) && client_validate(c) &&
-                client_should_show(c))
+                c->desktop == screen_desktop && !c->iconic)
             {
                 if (client_normal(c)) {
                     ob_debug("found in focus order\n");
@@ -259,7 +266,7 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old)
         }
 
     /* as a last resort fallback to the desktop window if there is one.
-       (if there's more than one, then the one last focused.)
+       (if there's more than one, then the one most recently focused.)
     */
     return desktop;   
 }