]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus.c
Merge branch 'master' into chaz
[chaz/openbox] / openbox / focus.c
index 20b799f6f72d3cb64a13cf6204a4777719656653..a4626bf83af64c900efafb1d45c3695fca832cf3 100644 (file)
@@ -100,6 +100,10 @@ void focus_set_client(ObClient *client)
         active = client ? client->window : None;
         OBT_PROP_SET32(obt_root(ob_screen), NET_ACTIVE_WINDOW, WINDOW, active);
     }
+
+    /* when focus is moved to a new window, the last_user_time timestamp would
+       no longer be valid, as it applies for the focused window */
+    event_reset_user_time();
 }
 
 static ObClient* focus_fallback_target(gboolean allow_refocus,
@@ -133,7 +137,8 @@ static ObClient* focus_fallback_target(gboolean allow_refocus,
         */
         if ((allow_omnipresent || c->desktop == screen_desktop) &&
             focus_valid_target(c, screen_desktop,
-                               TRUE, FALSE, FALSE, FALSE, FALSE, FALSE) &&
+                               TRUE, FALSE, FALSE, TRUE, FALSE, FALSE,
+                               FALSE) &&
             !c->shaded &&
             (allow_refocus || client_focus_target(c) != old) &&
             client_focus(c))
@@ -154,7 +159,7 @@ static ObClient* focus_fallback_target(gboolean allow_refocus,
            backup fallback though)
         */
         if (focus_valid_target(c, screen_desktop,
-                               TRUE, FALSE, FALSE, FALSE, TRUE, FALSE) &&
+                               TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE) &&
             (allow_refocus || client_focus_target(c) != old) &&
             client_focus(c))
         {
@@ -193,7 +198,7 @@ void focus_nothing(void)
 
     /* when nothing will be focused, send focus to the backup target */
     XSetInputFocus(obt_display, screen_support_win, RevertToPointerRoot,
-                   event_curtime);
+                   event_time());
 }
 
 void focus_order_add_new(ObClient *c)
@@ -288,7 +293,7 @@ static gboolean focus_target_has_siblings(ObClient *ft,
         if (c != ft && c->type == OB_CLIENT_TYPE_NORMAL &&
             focus_valid_target(c, screen_desktop,
                                TRUE, iconic_windows, all_desktops,
-                               FALSE, FALSE, FALSE))
+                               TRUE, FALSE, FALSE, FALSE))
         {
             return TRUE;
         }
@@ -301,6 +306,7 @@ gboolean focus_valid_target(ObClient *ft,
                             gboolean helper_windows,
                             gboolean iconic_windows,
                             gboolean all_desktops,
+                            gboolean nonhilite_windows,
                             gboolean dock_windows,
                             gboolean desktop_windows,
                             gboolean user_request)
@@ -321,6 +327,9 @@ gboolean focus_valid_target(ObClient *ft,
     ok = (all_desktops || ft->desktop == desktop ||
           ft->desktop == DESKTOP_ALL);
 
+    /* if we only include hilited windows, check if the window is */
+    ok = ok && (nonhilite_windows || ft->demands_attention);
+
     /* the window can receive focus somehow */
     ok = ok && (ft->can_focus || ft->focus_notify);
 
@@ -348,14 +357,17 @@ gboolean focus_valid_target(ObClient *ft,
                   that can be focused instead */
                !focus_target_has_siblings(ft, iconic_windows, all_desktops))));
 
-    /* it's not set to skip the taskbar (but this only applies to normal typed
-       windows, and is overridden if the window is modal or if the user asked
-       for this window to be focused, or if the window is iconified) */
-    ok = ok && (ft->type != OB_CLIENT_TYPE_NORMAL ||
-                ft->modal ||
-                ft->iconic ||
-                user_request ||
-                !ft->skip_taskbar);
+    /* it's not set to skip the taskbar (but this is overridden if the
+       window is modal or if the user asked for this window to be focused,
+       or if the window is iconified (and does not have any parents with
+       which to uniconify it), and it is not used for windows which are
+       hilited, or dialog windows as these need user interaction and should
+       not be long-lasting windows */
+    ok = ok && (!ft->skip_taskbar ||
+                (ft->modal || user_request ||
+                 (ft->iconic && !ft->parents) ||
+                 ft->demands_attention ||
+                 ft->type == OB_CLIENT_TYPE_DIALOG));
 
     /* it's not going to just send focus off somewhere else (modal window),
        unless that modal window is not one of our valid targets, then let
@@ -367,6 +379,7 @@ gboolean focus_valid_target(ObClient *ft,
                                                      TRUE,
                                                      iconic_windows,
                                                      all_desktops,
+                                                     nonhilite_windows,
                                                      dock_windows,
                                                      desktop_windows,
                                                      FALSE));
This page took 0.023978 seconds and 4 git commands to generate.