X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus.c;h=9a0b2bdc31b466c21ab6c151fbed345c2225ed5c;hb=c6f2875d61ce038bcc3b28e28aa26a0648efd752;hp=f34021a47b5f4528b497d05e8e849a1924386913;hpb=8f2e3f5fe16aeb0324aa5ee2b2c30a83ec724ad0;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index f34021a4..9a0b2bdc 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -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 - 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) && - 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)) { @@ -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) */ - 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)) { @@ -284,7 +284,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 && - focus_valid_target(c, iconic_windows, all_desktops, FALSE, FALSE)) + focus_valid_target(c, TRUE, iconic_windows, all_desktops, + FALSE, FALSE)) { return TRUE; } @@ -293,6 +294,7 @@ static gboolean focus_target_has_siblings(ObClient *ft, } gboolean focus_valid_target(ObClient *ft, + gboolean helper_windows, gboolean iconic_windows, gboolean all_desktops, gboolean dock_windows, @@ -326,10 +328,12 @@ gboolean focus_valid_target(ObClient *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) || + /* ...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 cycled to instead */ + that can be focused instead */ !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 @@ -348,6 +352,7 @@ gboolean focus_valid_target(ObClient *ft, { ObClient *cft = client_focus_target(ft); ok = ok && (ft == cft || !focus_valid_target(cft, + TRUE, iconic_windows, all_desktops, dock_windows,