]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus_cycle.c
don't crash when a window adds itself to the focus order while cycling
[chaz/openbox] / openbox / focus_cycle.c
index 56a228387c2621e3cc273efcb9fd72671907d199..1fef375480d41d7f06f85b2d68334b1700173994 100644 (file)
@@ -124,7 +124,9 @@ gboolean focus_cycle_target_valid(ObClient *ft,
     if (dock_windows || desktop_windows)
         ok = ok && ((dock_windows && ft->type == OB_CLIENT_TYPE_DOCK) ||
                     (desktop_windows && ft->type == OB_CLIENT_TYPE_DESKTOP));
-    else
+    /* modal windows are important and can always get focus if they are
+       visible and stuff, so don't change 'ok' based on their type */ 
+    else if (!ft->modal)
         /* normal non-helper windows are valid targets */
         ok = ok &&
             ((client_normal(ft) && !client_helper(ft))
@@ -138,12 +140,13 @@ gboolean focus_cycle_target_valid(ObClient *ft,
                !focus_target_has_siblings(ft, iconic_windows, all_desktops))));
 
     /* it's not set to skip the taskbar (unless it is a type that would be
-       expected to set this hint */
+       expected to set this hint, or modal) */
     ok = ok && ((ft->type == OB_CLIENT_TYPE_DOCK ||
                  ft->type == OB_CLIENT_TYPE_DESKTOP ||
                  ft->type == OB_CLIENT_TYPE_TOOLBAR ||
                  ft->type == OB_CLIENT_TYPE_MENU ||
                  ft->type == OB_CLIENT_TYPE_UTILITY) ||
+                ft->modal ||
                 !ft->skip_taskbar);
 
     /* it's not going to just send fous off somewhere else (modal window) */
@@ -375,8 +378,9 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
     }
     if (focus_cycle_target && dialog) {
         /* same arguments as focus_target_valid */
-        focus_cycle_popup_show(focus_cycle_target, FALSE, FALSE, dock_windows,
-                               desktop_windows);
+        focus_cycle_popup_single_show(focus_cycle_target,
+                                      FALSE, FALSE, dock_windows,
+                                      desktop_windows);
         return;
     }
 
@@ -388,23 +392,7 @@ done_cycle:
     focus_cycle_target = NULL;
 
     focus_cycle_draw_indicator(NULL);
-    focus_cycle_popup_hide();
+    focus_cycle_popup_single_hide();
 
     return;
 }
-
-void focus_order_add_new(ObClient *c)
-{
-    if (c->iconic)
-        focus_order_to_top(c);
-    else {
-        g_assert(!g_list_find(focus_order, c));
-        /* if there are any iconic windows, put this above them in the order,
-           but if there are not, then put it under the currently focused one */
-        if (focus_order && ((ObClient*)focus_order->data)->iconic)
-            focus_order = g_list_insert(focus_order, c, 0);
-        else
-            focus_order = g_list_insert(focus_order, c, 1);
-    }
-}
-
This page took 0.023492 seconds and 4 git commands to generate.