let functions get which window would be selected on a focus fallback
authorDana Jansens <danakj@orodu.net>
Fri, 3 Oct 2003 04:37:16 +0000 (04:37 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 3 Oct 2003 04:37:16 +0000 (04:37 +0000)
openbox/focus.c
openbox/focus.h

index c95111f..cac6fc7 100644 (file)
@@ -131,15 +131,6 @@ void focus_set_client(ObClient *client)
     }
 }
 
-static gboolean focus_under_pointer()
-{
-    ObClient *c;
-
-    if ((c = client_under_pointer()))
-        return client_normal(c) && client_focus(c);
-    return FALSE;
-}
-
 /* finds the first transient that isn't 'skip' and ensure's that client_normal
  is true for it */
 static ObClient *find_transient_recursive(ObClient *c, ObClient *top, ObClient *skip)
@@ -156,31 +147,29 @@ static ObClient *find_transient_recursive(ObClient *c, ObClient *top, ObClient *
     return NULL;
 }
 
-static gboolean focus_fallback_transient(ObClient *top, ObClient *old)
+static ObClient* focus_fallback_transient(ObClient *top, ObClient *old)
 {
     ObClient *target = find_transient_recursive(top, top, old);
     if (!target) {
         /* make sure client_normal is true always */
         if (!client_normal(top))
-            return FALSE;
+            return NULL;
         target = top; /* no transient, keep the top */
     }
-    return client_focus(target);
+    if (client_can_focus(target))
+        return target;
+    else
+        return NULL;
 }
 
-void focus_fallback(ObFocusFallbackType type)
+ObClient* focus_fallback_target(ObFocusFallbackType type)
 {
     GList *it;
     ObClient *old = NULL;
+    ObClient *target = NULL;
 
     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
-       at all for them.
-    */
-    focus_set_client(NULL);
-
     if (type == OB_FOCUS_FALLBACK_UNFOCUSING && old) {
         if (old->transient_for) {
             gboolean trans = FALSE;
@@ -188,12 +177,12 @@ void focus_fallback(ObFocusFallbackType type)
             if (!config_focus_follow)
                 trans = TRUE;
             else {
-                ObClient *c;
-
-                if ((c = client_under_pointer()) &&
-                    client_search_transient(client_search_top_transient(c),
-                                            old))
+                if ((target = client_under_pointer()) &&
+                    client_search_transient
+                    (client_search_top_transient(target), old))
+                {
                     trans = TRUE;
+                }
             }
 
             /* try for transient relations */
@@ -204,20 +193,24 @@ void focus_fallback(ObFocusFallbackType type)
 
                         for (sit = old->group->members; sit; sit = sit->next)
                             if (sit->data == it->data)
-                                if (focus_fallback_transient(sit->data, old))
-                                    return;
+                                if ((target =
+                                     focus_fallback_transient(sit->data, old)))
+                                    return target;
                     }
                 } else {
-                    if (focus_fallback_transient(old->transient_for, old))
-                        return;
+                    if ((target =
+                         focus_fallback_transient(old->transient_for, old)))
+                        return target;
                 }
             }
         }
     }
 
-    if (config_focus_follow)
-        if (focus_under_pointer())
-            return;
+    if (config_focus_follow) {
+        if ((target = client_under_pointer()))
+            if (client_normal(target) && client_can_focus(target))
+                return target;
+    }
 
 #if 0
         /* try for group relations */
@@ -228,23 +221,31 @@ void focus_fallback(ObFocusFallbackType type)
                 for (sit = old->group->members; sit; sit = sit->next)
                     if (sit->data == it->data)
                         if (sit->data != old && client_normal(sit->data))
-                            if (client_can_focus(sit->data)) {
-                                gboolean r = client_focus(sit->data);
-                                assert(r);
-                                return;
-                            }
+                            if (client_can_focus(sit->data))
+                                return sit->data;
         }
 #endif
 
     for (it = focus_order[screen_desktop]; it != NULL; it = it->next)
         if (type != OB_FOCUS_FALLBACK_UNFOCUSING || it->data != old)
-            if (client_normal(it->data) && client_can_focus(it->data)) {
-                gboolean r = client_focus(it->data);
-                assert(r);
-                return;
-            }
+            if (client_normal(it->data) && client_can_focus(it->data))
+                return it->data;
+
+    return NULL;
+}
+
+void focus_fallback(ObFocusFallbackType type)
+{
+    ObClient *new;
+
+    /* 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
+       at all for them.
+    */
+    focus_set_client(NULL);
 
-    /* nothing to focus, and already set it to none above */
+    if ((new = focus_fallback_target(type)))
+        client_focus(new);
 }
 
 static void popup_cycle(ObClient *c, gboolean show)
index 7c67f6c..090af72 100644 (file)
@@ -47,6 +47,8 @@ typedef enum {
     OB_FOCUS_FALLBACK_NOFOCUS     /*!< nothing has focus for some reason */
 } ObFocusFallbackType;
 
+struct _ObClient* focus_fallback_target(ObFocusFallbackType type);
+
 /*! Call this when you need to focus something! */
 void focus_fallback(ObFocusFallbackType type);