]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus.c
more handling time wraparounds
[chaz/openbox] / openbox / focus.c
index 4be187b9a7682d8ed13a5edaee3da32dd56eed31..6652c5deb069b750cb819a96eb0d0eac298f5d70 100644 (file)
@@ -59,7 +59,7 @@ static void focus_cycle_destructor(ObClient *client, gpointer data)
        be used
     */
     if (focus_cycle_target == client)
        be used
     */
     if (focus_cycle_target == client)
-        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, CurrentTime);
+        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
 }
 
 static Window createWindow(Window parent, gulong mask,
 }
 
 static Window createWindow(Window parent, gulong mask,
@@ -180,7 +180,7 @@ void focus_set_client(ObClient *client)
        be used.
     */
     if (focus_cycle_target)
        be used.
     */
     if (focus_cycle_target)
-        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, CurrentTime);
+        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
 
     old = focus_client;
     focus_client = client;
 
     old = focus_client;
     focus_client = client;
@@ -233,6 +233,11 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old)
         }
 #endif
 
         }
 #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) {
     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.
                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) &&
                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");
             {
                 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.
         }
 
     /* 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;   
 }
     */
     return desktop;   
 }
@@ -490,7 +497,7 @@ static gboolean valid_focus_target(ObClient *ft)
 }
 
 void focus_cycle(gboolean forward, gboolean linear, gboolean interactive,
 }
 
 void focus_cycle(gboolean forward, gboolean linear, gboolean interactive,
-                 gboolean dialog, gboolean done, gboolean cancel, Time time)
+                 gboolean dialog, gboolean done, gboolean cancel)
 {
     static ObClient *first = NULL;
     static ObClient *t = NULL;
 {
     static ObClient *first = NULL;
     static ObClient *t = NULL;
@@ -551,7 +558,7 @@ void focus_cycle(gboolean forward, gboolean linear, gboolean interactive,
 
 done_cycle:
     if (done && focus_cycle_target)
 
 done_cycle:
     if (done && focus_cycle_target)
-        client_activate(focus_cycle_target, FALSE, TRUE, time);
+        client_activate(focus_cycle_target, FALSE, TRUE);
 
     t = NULL;
     first = NULL;
 
     t = NULL;
     first = NULL;
@@ -568,8 +575,7 @@ done_cycle:
 }
 
 void focus_directional_cycle(ObDirection dir, gboolean interactive,
 }
 
 void focus_directional_cycle(ObDirection dir, gboolean interactive,
-                             gboolean dialog, gboolean done, gboolean cancel,
-                             Time time)
+                             gboolean dialog, gboolean done, gboolean cancel)
 {
     static ObClient *first = NULL;
     ObClient *ft = NULL;
 {
     static ObClient *first = NULL;
     ObClient *ft = NULL;
@@ -614,7 +620,7 @@ void focus_directional_cycle(ObDirection dir, gboolean interactive,
 
 done_cycle:
     if (done && focus_cycle_target)
 
 done_cycle:
     if (done && focus_cycle_target)
-        client_activate(focus_cycle_target, FALSE, TRUE, time);
+        client_activate(focus_cycle_target, FALSE, TRUE);
 
     first = NULL;
     focus_cycle_target = NULL;
 
     first = NULL;
     focus_cycle_target = NULL;
This page took 0.024784 seconds and 4 git commands to generate.