add an option to next/previous window to only include hilited/flashing/urgent windows (feature req/bug #4341)
@@ -11,6 +11,7 @@ typedef struct {
gboolean linear; gboolean dock_windows; gboolean desktop_windows; + gboolean only_hilite_windows; gboolean all_desktops; gboolean forward; gboolean bar;@@ -83,6 +84,8 @@ if ((n = obt_xml_find_node(node, "raise")))
o->raise = obt_xml_node_bool(n); if ((n = obt_xml_find_node(node, "panels"))) o->dock_windows = obt_xml_node_bool(n); + if ((n = obt_xml_find_node(node, "hilite"))) + o->only_hilite_windows = obt_xml_node_bool(n); if ((n = obt_xml_find_node(node, "desktop"))) o->desktop_windows = obt_xml_node_bool(n); if ((n = obt_xml_find_node(node, "allDesktops")))@@ -154,6 +157,7 @@ struct _ObClient *ft;
ft = focus_cycle(o->forward, o->all_desktops, + !o->only_hilite_windows, o->dock_windows, o->desktop_windows, o->linear,@@ -226,6 +230,7 @@ struct _ObClient *ft;
ft = focus_cycle(o->forward, o->all_desktops, + !o->only_hilite_windows, o->dock_windows, o->desktop_windows, o->linear,
@@ -295,7 +295,7 @@ (user_time != 0) &&
/* this checks for focus=false for the window */ (!settings || settings->focus != 0) && focus_valid_target(self, self->desktop, - FALSE, FALSE, TRUE, FALSE, FALSE, + FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, settings->focus == 1)) { activate = TRUE;
@@ -133,7 +133,8 @@ 3. it is not shaded
*/ 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 +155,7 @@ a splashscreen or a desktop window (save the desktop as a
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)) {@@ -288,7 +289,7 @@ /* 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, screen_desktop, TRUE, iconic_windows, all_desktops, - FALSE, FALSE, FALSE)) + TRUE, FALSE, FALSE, FALSE)) { return TRUE; }@@ -301,6 +302,7 @@ guint desktop,
gboolean helper_windows, gboolean iconic_windows, gboolean all_desktops, + gboolean nonhilite_windows, gboolean dock_windows, gboolean desktop_windows, gboolean user_request)@@ -320,6 +322,9 @@ do this check first because it will usually filter out the most
windows */ 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);@@ -370,6 +375,7 @@ screen_desktop,
TRUE, iconic_windows, all_desktops, + nonhilite_windows, dock_windows, desktop_windows, FALSE));
@@ -73,6 +73,7 @@ guint desktop,
gboolean helper_windows, gboolean iconic_windows, gboolean all_desktops, + gboolean nonhilite_windows, gboolean dock_windows, gboolean desktop_windows, gboolean user_request);
@@ -39,6 +39,7 @@ ObClient *focus_cycle_target = NULL;
static ObCycleType focus_cycle_type = OB_CYCLE_NONE; static gboolean focus_cycle_iconic_windows; static gboolean focus_cycle_all_desktops; +static gboolean focus_cycle_nonhilite_windows; static gboolean focus_cycle_dock_windows; static gboolean focus_cycle_desktop_windows;@@ -89,12 +90,13 @@ focus_cycle_target = focus_cycle_popup_refresh(focus_cycle_target,
TRUE); focus_cycle_update_indicator(focus_cycle_target); if (!focus_cycle_target) - focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, + focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); } } ObClient* focus_cycle(gboolean forward, gboolean all_desktops, + gboolean nonhilite_windows, gboolean dock_windows, gboolean desktop_windows, gboolean linear, gboolean interactive, gboolean showbar, ObFocusCyclePopupMode mode,@@ -126,6 +128,7 @@
if (focus_cycle_target == NULL) { focus_cycle_iconic_windows = TRUE; focus_cycle_all_desktops = all_desktops; + focus_cycle_nonhilite_windows = nonhilite_windows; focus_cycle_dock_windows = dock_windows; focus_cycle_desktop_windows = desktop_windows; start = it = g_list_find(list, focus_client);@@ -153,12 +156,7 @@ focus_cycle_type = OB_CYCLE_NORMAL;
focus_cycle_draw_indicator(showbar ? ft : NULL); } /* same arguments as focus_target_valid */ - focus_cycle_popup_show(ft, - focus_cycle_iconic_windows, - focus_cycle_all_desktops, - focus_cycle_dock_windows, - focus_cycle_desktop_windows, - mode); + focus_cycle_popup_show(ft, mode); return focus_cycle_target; } else if (ft != focus_cycle_target) { focus_cycle_target = ft;@@ -302,6 +300,7 @@
if (focus_cycle_target == NULL) { focus_cycle_iconic_windows = FALSE; focus_cycle_all_desktops = FALSE; + focus_cycle_nonhilite_windows = TRUE; focus_cycle_dock_windows = dock_windows; focus_cycle_desktop_windows = desktop_windows; }@@ -332,11 +331,7 @@ focus_cycle_draw_indicator(showbar ? ft : NULL);
} if (focus_cycle_target && dialog) /* same arguments as focus_target_valid */ - focus_cycle_popup_single_show(focus_cycle_target, - focus_cycle_iconic_windows, - focus_cycle_all_desktops, - focus_cycle_dock_windows, - focus_cycle_desktop_windows); + focus_cycle_popup_single_show(focus_cycle_target); return focus_cycle_target; done_cycle:@@ -357,6 +352,7 @@ {
return focus_valid_target(client, screen_desktop, TRUE, focus_cycle_iconic_windows, focus_cycle_all_desktops, + focus_cycle_nonhilite_windows, focus_cycle_dock_windows, focus_cycle_desktop_windows, FALSE);
@@ -36,6 +36,7 @@ void focus_cycle_shutdown(gboolean reconfig);
/*! Cycle focus amongst windows. */ struct _ObClient* focus_cycle(gboolean forward, gboolean all_desktops, + gboolean nonhilite_windows, gboolean dock_windows, gboolean desktop_windows, gboolean linear, gboolean interactive, gboolean showbar, ObFocusCyclePopupMode mode,
@@ -700,10 +700,7 @@
XFlush(obt_display); } -void focus_cycle_popup_show(ObClient *c, gboolean iconic_windows, - gboolean all_desktops, gboolean dock_windows, - gboolean desktop_windows, - ObFocusCyclePopupMode mode) +void focus_cycle_popup_show(ObClient *c, ObFocusCyclePopupMode mode) { g_assert(c != NULL);@@ -747,11 +744,7 @@
popup_cleanup(); } -void focus_cycle_popup_single_show(struct _ObClient *c, - gboolean iconic_windows, - gboolean all_desktops, - gboolean dock_windows, - gboolean desktop_windows) +void focus_cycle_popup_single_show(struct _ObClient *c) { gchar *text;
@@ -33,17 +33,10 @@
void focus_cycle_popup_startup(gboolean reconfig); void focus_cycle_popup_shutdown(gboolean reconfig); -void focus_cycle_popup_show(struct _ObClient *c, gboolean iconic_windows, - gboolean all_desktops, gboolean dock_windows, - gboolean desktop_windows, - ObFocusCyclePopupMode mode); +void focus_cycle_popup_show(struct _ObClient *c, ObFocusCyclePopupMode mode); void focus_cycle_popup_hide(void); -void focus_cycle_popup_single_show(struct _ObClient *c, - gboolean iconic_windows, - gboolean all_desktops, - gboolean dock_windows, - gboolean desktop_windows); +void focus_cycle_popup_single_show(struct _ObClient *c); void focus_cycle_popup_single_hide(void); gboolean focus_cycle_popup_is_showing(struct _ObClient *c);