*/
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))
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))
{
/* 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)
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;
}
gboolean helper_windows,
gboolean iconic_windows,
gboolean all_desktops,
+ gboolean nonhilite_windows,
gboolean dock_windows,
gboolean desktop_windows,
gboolean user_request)
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);
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
TRUE,
iconic_windows,
all_desktops,
+ nonhilite_windows,
dock_windows,
desktop_windows,
FALSE));