]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus.c
make the combined client list menu not suck quite as bad
[chaz/openbox] / openbox / focus.c
index 02832cea8c7f8ab428490694acbf7b65ce864f7f..a84d253a2bbb5e88b766c283699555d0776f7446 100644 (file)
@@ -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);
     }
 }
 
@@ -236,14 +244,11 @@ static ObClient* focus_fallback_transient(ObClient *top, ObClient *old)
         return NULL;
 }
 
-ObClient* focus_fallback_target(ObFocusFallbackType type)
+ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old)
 {
     GList *it;
-    ObClient *old = NULL;
     ObClient *target = NULL;
 
-    old = focus_client;
-
     if ((type == OB_FOCUS_FALLBACK_UNFOCUSING
          || type == OB_FOCUS_FALLBACK_CLOSED) && old) {
         if (old->transient_for) {
@@ -252,11 +257,15 @@ 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;
+                if ((target = client_under_pointer())) {
+                    GSList *sit;
+
+                    sit = client_search_top_transients(target);
+                    for (; sit; sit = g_slist_next(sit))
+                        if (client_search_transient(sit->data, old)) {
+                            trans = TRUE;
+                            break;
+                        }
                 }
             }
 
@@ -324,6 +333,7 @@ ObClient* focus_fallback_target(ObFocusFallbackType type)
 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
@@ -331,7 +341,7 @@ void focus_fallback(ObFocusFallbackType type)
     */
     focus_set_client(NULL);
 
-    if ((new = focus_fallback_target(type)))
+    if ((new = focus_fallback_target(type, old)))
         client_focus(new);
 }
 
@@ -521,7 +531,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 +553,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 +614,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 +631,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 +677,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.032078 seconds and 4 git commands to generate.