]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus.c
refix for managing iconic windows, without having the frame map which caused flashing.
[chaz/openbox] / openbox / focus.c
index 02832cea8c7f8ab428490694acbf7b65ce864f7f..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
@@ -56,9 +56,11 @@ static ObIconPopup *focus_cycle_popup;
 
 static void focus_cycle_destructor(ObClient *client, gpointer data)
 {
-    /* end cycling if the target disappears */
+    /* end cycling if the target disappears. CurrentTime is fine, time won't
+       be used
+    */
     if (focus_cycle_target == client)
-        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
+        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, CurrentTime);
 }
 
 static Window createWindow(Window parent, gulong mask,
@@ -185,9 +187,11 @@ void focus_set_client(ObClient *client)
         XSync(ob_display, FALSE);
     }
 
-    /* in the middle of cycling..? kill it. */
+    /* in the middle of cycling..? kill it. CurrentTime is fine, time won't
+       be used.
+    */
     if (focus_cycle_target)
-        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
+        focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, CurrentTime);
 
     old = focus_client;
     focus_client = client;
@@ -201,6 +205,10 @@ void focus_set_client(ObClient *client)
         active = client ? client->window : None;
         PROP_SET32(RootWindow(ob_display, ob_screen),
                    net_active_window, window, active);
+
+        /* remove hiliting from the window when it gets focused */
+        if (client != NULL)
+            client_hilite(client, FALSE);
     }
 }
 
@@ -215,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;
 }
@@ -239,7 +251,7 @@ static ObClient* focus_fallback_transient(ObClient *top, ObClient *old)
 ObClient* focus_fallback_target(ObFocusFallbackType type)
 {
     GList *it;
-    ObClient *old = NULL;
+    ObClient *old;
     ObClient *target = NULL;
 
     old = focus_client;
@@ -251,14 +263,10 @@ ObClient* focus_fallback_target(ObFocusFallbackType type)
 
             if (!config_focus_follow || config_focus_last)
                 trans = TRUE;
-            else {
-                if ((target = client_under_pointer()) &&
-                    client_search_transient
-                    (client_search_top_transient(target), old))
-                {
-                    trans = TRUE;
-                }
-            }
+            else if ((target = client_under_pointer()) &&
+                     client_search_transient
+                     (client_search_top_parent(target), old))
+                trans = TRUE;
 
             /* try for transient relations */
             if (trans) {
@@ -274,24 +282,34 @@ ObClient* focus_fallback_target(ObFocusFallbackType type)
                             if (sit->data == it->data)
                                 if ((target =
                                      focus_fallback_transient(sit->data, old)))
+                                {
+                                    ob_debug("found in transient #1\n");
                                     return target;
+                                }
                         }
                     }
                 } else {
                     if ((target =
                          focus_fallback_transient(old->transient_for, old)))
+                    {
+                        ob_debug("found in transient #2\n");
                         return target;
+                    }
                 }
             }
         }
     }
 
+    ob_debug("trying pointer stuff\n");
     if (config_focus_follow &&
         (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;
+            }
     }
 
 #if 0
@@ -308,10 +326,15 @@ ObClient* focus_fallback_target(ObFocusFallbackType type)
         }
 #endif
 
+    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;
+            }
 
     /* XXX fallback to the "desktop window" if one exists ?
        could store it while going through all the windows in the loop right
@@ -521,7 +544,7 @@ static gboolean valid_focus_target(ObClient *ft)
            ft->type == OB_CLIENT_TYPE_MENU ||
            ft->type == OB_CLIENT_TYPE_UTILITY))) &&
         ((ft->can_focus || ft->focus_notify) &&
-         !ft->skip_taskbar &&
+         !ft->skip_pager &&
          (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL)) &&
         ft == client_focus_target(ft))
         return TRUE;
@@ -543,7 +566,7 @@ static gboolean valid_focus_target(ObClient *ft)
 }
 
 void focus_cycle(gboolean forward, gboolean linear, gboolean interactive,
-                 gboolean dialog, gboolean done, gboolean cancel)
+                 gboolean dialog, gboolean done, gboolean cancel, Time time)
 {
     static ObClient *first = NULL;
     static ObClient *t = NULL;
@@ -604,7 +627,7 @@ void focus_cycle(gboolean forward, gboolean linear, gboolean interactive,
 
 done_cycle:
     if (done && focus_cycle_target)
-        client_activate(focus_cycle_target, FALSE, TRUE);
+        client_activate(focus_cycle_target, FALSE, TRUE, time);
 
     t = NULL;
     first = NULL;
@@ -621,7 +644,8 @@ done_cycle:
 }
 
 void focus_directional_cycle(ObDirection dir, gboolean interactive,
-                             gboolean dialog, gboolean done, gboolean cancel)
+                             gboolean dialog, gboolean done, gboolean cancel,
+                             Time time)
 {
     static ObClient *first = NULL;
     ObClient *ft = NULL;
@@ -666,7 +690,7 @@ void focus_directional_cycle(ObDirection dir, gboolean interactive,
 
 done_cycle:
     if (done && focus_cycle_target)
-        client_activate(focus_cycle_target, FALSE, TRUE);
+        client_activate(focus_cycle_target, FALSE, TRUE, time);
 
     first = NULL;
     focus_cycle_target = NULL;
This page took 0.025478 seconds and 4 git commands to generate.