]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus.c
s/ob_display/obt_display/ and remove ob_display
[chaz/openbox] / openbox / focus.c
index f34021a47b5f4528b497d05e8e849a1924386913..0d6af4eea8be5f9a6d7ffc65372df513c00bae4c 100644 (file)
@@ -52,7 +52,7 @@ void focus_shutdown(gboolean reconfig)
     if (reconfig) return;
 
     /* reset focus to root */
     if (reconfig) return;
 
     /* reset focus to root */
-    XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime);
+    XSetInputFocus(obt_display, PointerRoot, RevertToNone, CurrentTime);
 }
 
 static void push_to_top(ObClient *client)
 }
 
 static void push_to_top(ObClient *client)
@@ -91,7 +91,7 @@ void focus_set_client(ObClient *client)
     /* set the NET_ACTIVE_WINDOW hint, but preserve it on shutdown */
     if (ob_state() != OB_STATE_EXITING) {
         active = client ? client->window : None;
     /* set the NET_ACTIVE_WINDOW hint, but preserve it on shutdown */
     if (ob_state() != OB_STATE_EXITING) {
         active = client ? client->window : None;
-        PROP_SET32(RootWindow(ob_display, ob_screen),
+        PROP_SET32(RootWindow(obt_display, ob_screen),
                    net_active_window, window, active);
     }
 }
                    net_active_window, window, active);
     }
 }
@@ -122,12 +122,12 @@ static ObClient* focus_fallback_target(gboolean allow_refocus,
            1. it is on the current desktop. this ignores omnipresent
            windows, which are problematic in their own rite, unless they are
            specifically allowed
            1. it is on the current desktop. this ignores omnipresent
            windows, which are problematic in their own rite, unless they are
            specifically allowed
-           2. 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)
+           2. it is a valid auto-focus target
+           3. it is not shaded
         */
         if ((allow_omnipresent || c->desktop == screen_desktop) &&
         */
         if ((allow_omnipresent || c->desktop == screen_desktop) &&
-            focus_valid_target(c, FALSE, FALSE, FALSE, FALSE) &&
+            focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, FALSE) &&
+            !c->shaded &&
             (allow_refocus || client_focus_target(c) != old) &&
             client_focus(c))
         {
             (allow_refocus || client_focus_target(c) != old) &&
             client_focus(c))
         {
@@ -146,7 +146,7 @@ static ObClient* focus_fallback_target(gboolean allow_refocus,
            a splashscreen or a desktop window (save the desktop as a
            backup fallback though)
         */
            a splashscreen or a desktop window (save the desktop as a
            backup fallback though)
         */
-        if (focus_valid_target(c, FALSE, FALSE, FALSE, TRUE) &&
+        if (focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, TRUE) &&
             (allow_refocus || client_focus_target(c) != old) &&
             client_focus(c))
         {
             (allow_refocus || client_focus_target(c) != old) &&
             client_focus(c))
         {
@@ -159,7 +159,7 @@ static ObClient* focus_fallback_target(gboolean allow_refocus,
 }
 
 ObClient* focus_fallback(gboolean allow_refocus, gboolean allow_pointer,
 }
 
 ObClient* focus_fallback(gboolean allow_refocus, gboolean allow_pointer,
-                         gboolean allow_omnipresent)
+                         gboolean allow_omnipresent, gboolean focus_lost)
 {
     ObClient *new;
     ObClient *old = focus_client;
 {
     ObClient *new;
     ObClient *old = focus_client;
@@ -167,7 +167,8 @@ ObClient* focus_fallback(gboolean allow_refocus, gboolean allow_pointer,
     /* unfocus any focused clients.. they can be focused by Pointer events
        and such, and then when we try focus them, we won't get a FocusIn
        event at all for them. */
     /* unfocus any focused clients.. they can be focused by Pointer events
        and such, and then when we try focus them, we won't get a FocusIn
        event at all for them. */
-    focus_nothing();
+    if (focus_lost)
+        focus_nothing();
 
     new = focus_fallback_target(allow_refocus, allow_pointer,
                                 allow_omnipresent, old);
 
     new = focus_fallback_target(allow_refocus, allow_pointer,
                                 allow_omnipresent, old);
@@ -177,7 +178,7 @@ ObClient* focus_fallback(gboolean allow_refocus, gboolean allow_pointer,
     return new;
 }
 
     return new;
 }
 
-void focus_nothing()
+void focus_nothing(void)
 {
     /* Install our own colormap */
     if (focus_client != NULL) {
 {
     /* Install our own colormap */
     if (focus_client != NULL) {
@@ -198,7 +199,7 @@ void focus_nothing()
     event_cancel_all_key_grabs();
 
     /* when nothing will be focused, send focus to the backup target */
     event_cancel_all_key_grabs();
 
     /* when nothing will be focused, send focus to the backup target */
-    XSetInputFocus(ob_display, screen_support_win, RevertToPointerRoot,
+    XSetInputFocus(obt_display, screen_support_win, RevertToPointerRoot,
                    event_curtime);
 }
 
                    event_curtime);
 }
 
@@ -274,7 +275,7 @@ ObClient *focus_order_find_first(guint desktop)
 static gboolean focus_target_has_siblings(ObClient *ft,
                                           gboolean iconic_windows,
                                           gboolean all_desktops)
 static gboolean focus_target_has_siblings(ObClient *ft,
                                           gboolean iconic_windows,
                                           gboolean all_desktops)
-                                                         
+
 {
     GSList *it;
 
 {
     GSList *it;
 
@@ -284,7 +285,8 @@ static gboolean focus_target_has_siblings(ObClient *ft,
         ObClient *c = it->data;
         /* check that it's not a helper window to avoid infinite recursion */
         if (c != ft && c->type == OB_CLIENT_TYPE_NORMAL &&
         ObClient *c = it->data;
         /* check that it's not a helper window to avoid infinite recursion */
         if (c != ft && c->type == OB_CLIENT_TYPE_NORMAL &&
-            focus_valid_target(c, iconic_windows, all_desktops, FALSE, FALSE))
+            focus_valid_target(c, TRUE, iconic_windows, all_desktops,
+                               FALSE, FALSE))
         {
             return TRUE;
         }
         {
             return TRUE;
         }
@@ -293,6 +295,7 @@ static gboolean focus_target_has_siblings(ObClient *ft,
 }
 
 gboolean focus_valid_target(ObClient *ft,
 }
 
 gboolean focus_valid_target(ObClient *ft,
+                            gboolean helper_windows,
                             gboolean iconic_windows,
                             gboolean all_desktops,
                             gboolean dock_windows,
                             gboolean iconic_windows,
                             gboolean all_desktops,
                             gboolean dock_windows,
@@ -318,7 +321,7 @@ gboolean focus_valid_target(ObClient *ft,
         ok = ok && ((dock_windows && ft->type == OB_CLIENT_TYPE_DOCK) ||
                     (desktop_windows && ft->type == OB_CLIENT_TYPE_DESKTOP));
     /* modal windows are important and can always get focus if they are
         ok = ok && ((dock_windows && ft->type == OB_CLIENT_TYPE_DOCK) ||
                     (desktop_windows && ft->type == OB_CLIENT_TYPE_DESKTOP));
     /* modal windows are important and can always get focus if they are
-       visible and stuff, so don't change 'ok' based on their type */ 
+       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 &&
     else if (!ft->modal)
         /* normal non-helper windows are valid targets */
         ok = ok &&
@@ -326,19 +329,17 @@ gboolean focus_valid_target(ObClient *ft,
              ||
              /* helper windows are valid targets if... */
              (client_helper(ft) &&
              ||
              /* helper windows are valid targets if... */
              (client_helper(ft) &&
-              /* ...a window in its group already has focus ... */
-              ((focus_client && ft->group == focus_client->group) ||
-               /* ... or if there are no other windows in its group 
-                  that can be cycled to instead */
+              /* ...a window in its group already has focus and we want to
+                 include helper windows ... */
+              ((focus_client && ft->group == focus_client->group &&
+                helper_windows) ||
+               /* ... or if there are no other windows in its group
+                  that can be focused instead */
                !focus_target_has_siblings(ft, iconic_windows, all_desktops))));
 
                !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, 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) ||
+    /* it's not set to skip the taskbar (but this only applies to normal typed
+       windows, and is overridden if the window is modal) */
+    ok = ok && (ft->type != OB_CLIENT_TYPE_NORMAL ||
                 ft->modal ||
                 !ft->skip_taskbar);
 
                 ft->modal ||
                 !ft->skip_taskbar);
 
@@ -348,6 +349,7 @@ gboolean focus_valid_target(ObClient *ft,
     {
         ObClient *cft = client_focus_target(ft);
         ok = ok && (ft == cft || !focus_valid_target(cft,
     {
         ObClient *cft = client_focus_target(ft);
         ok = ok && (ft == cft || !focus_valid_target(cft,
+                                                     TRUE,
                                                      iconic_windows,
                                                      all_desktops,
                                                      dock_windows,
                                                      iconic_windows,
                                                      all_desktops,
                                                      dock_windows,
This page took 0.024911 seconds and 4 git commands to generate.