X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus.c;h=a4626bf83af64c900efafb1d45c3695fca832cf3;hb=HEAD;hp=20b799f6f72d3cb64a13cf6204a4777719656653;hpb=3bd4397b6ec5212bfe53a36892746962dc45dbeb;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index 20b799f6..a4626bf8 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -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));