From 5a9083ec42f258251cea35e961b74cd836ab592e Mon Sep 17 00:00:00 2001 From: Carlos Pita Date: Thu, 13 Jan 2011 01:19:52 -0300 Subject: [PATCH] Iconics in focus cycle: only, include, exclude. --- data/menu.xsd | 8 ++++++++ data/rc.xsd | 8 ++++++++ openbox/actions/cyclewindows.c | 12 ++++++++++++ openbox/focus.c | 16 +++++++++------- openbox/focus.h | 8 +++++++- openbox/focus_cycle.c | 11 ++++++----- openbox/focus_cycle.h | 2 ++ 7 files changed, 52 insertions(+), 13 deletions(-) diff --git a/data/menu.xsd b/data/menu.xsd index 2ff76b7..1194c75 100644 --- a/data/menu.xsd +++ b/data/menu.xsd @@ -79,6 +79,7 @@ + @@ -109,6 +110,13 @@ + + + + + + + diff --git a/data/rc.xsd b/data/rc.xsd index 3a1d654..6e70420 100644 --- a/data/rc.xsd +++ b/data/rc.xsd @@ -172,6 +172,7 @@ + @@ -375,6 +376,13 @@ + + + + + + + diff --git a/openbox/actions/cyclewindows.c b/openbox/actions/cyclewindows.c index bbcb658..bc174b8 100644 --- a/openbox/actions/cyclewindows.c +++ b/openbox/actions/cyclewindows.c @@ -17,6 +17,7 @@ typedef struct { gboolean bar; gboolean raise; ObFocusCyclePopupMode dialog_mode; + ObFocusIconicMode iconic_mode; GSList *actions; @@ -69,6 +70,7 @@ static gpointer setup_func(xmlNodePtr node, o = g_slice_new0(Options); o->bar = TRUE; o->dialog_mode = OB_FOCUS_CYCLE_POPUP_MODE_LIST; + o->iconic_mode = OB_FOCUS_ICONIC_INCLUDE; if ((n = obt_xml_find_node(node, "linear"))) o->linear = obt_xml_node_bool(n); @@ -78,6 +80,14 @@ static gpointer setup_func(xmlNodePtr node, else if (obt_xml_node_contains(n, "icons")) o->dialog_mode = OB_FOCUS_CYCLE_POPUP_MODE_ICONS; } + if ((n = obt_xml_find_node(node, "iconics"))) { + if (obt_xml_node_contains(n, "include")) + o->iconic_mode = OB_FOCUS_ICONIC_INCLUDE; + else if (obt_xml_node_contains(n, "exclude")) + o->iconic_mode = OB_FOCUS_ICONIC_EXCLUDE; + else if (obt_xml_node_contains(n, "only")) + o->iconic_mode = OB_FOCUS_ICONIC_ONLY; + } if ((n = obt_xml_find_node(node, "bar"))) o->bar = obt_xml_node_bool(n); if ((n = obt_xml_find_node(node, "raise"))) @@ -164,6 +174,7 @@ static gboolean run_func(ObActionsData *data, gpointer options) TRUE, o->bar, o->dialog_mode, + o->iconic_mode, FALSE, FALSE); stacking_restore(); @@ -237,6 +248,7 @@ static void i_post_func(gpointer options) TRUE, o->bar, o->dialog_mode, + o->iconic_mode, TRUE, o->cancel); if (ft) diff --git a/openbox/focus.c b/openbox/focus.c index 8c02361..76bc5cf 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -275,7 +275,7 @@ ObClient *focus_order_find_first(guint desktop) /*! Returns if a focus target has valid group siblings that can be cycled to in its place */ static gboolean focus_target_has_siblings(ObClient *ft, - gboolean iconic_windows, + ObFocusIconicMode iconic_mode, gboolean all_desktops) { @@ -288,7 +288,7 @@ static gboolean focus_target_has_siblings(ObClient *ft, /* 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, + TRUE, iconic_mode, all_desktops, TRUE, FALSE, FALSE, FALSE)) { return TRUE; @@ -300,7 +300,7 @@ static gboolean focus_target_has_siblings(ObClient *ft, gboolean focus_valid_target(ObClient *ft, guint desktop, gboolean helper_windows, - gboolean iconic_windows, + ObFocusIconicMode iconic_mode, gboolean all_desktops, gboolean nonhilite_windows, gboolean dock_windows, @@ -329,8 +329,10 @@ gboolean focus_valid_target(ObClient *ft, /* the window can receive focus somehow */ ok = ok && (ft->can_focus || ft->focus_notify); - /* the window is not iconic, or we're allowed to go to iconic ones */ - ok = ok && (iconic_windows || !ft->iconic); + /* the window is iconic and we're not excluding icons or + the window is non-iconic and we're not requesting only icons */ + ok = ok && ((ft->iconic && iconic_mode != OB_FOCUS_ICONIC_EXCLUDE) || + (!ft->iconic && iconic_mode != OB_FOCUS_ICONIC_ONLY)); /* it's the right type of window */ if (dock_windows || desktop_windows) @@ -351,7 +353,7 @@ gboolean focus_valid_target(ObClient *ft, helper_windows) || /* ... or if there are no other windows in its group that can be focused instead */ - !focus_target_has_siblings(ft, iconic_windows, all_desktops)))); + !focus_target_has_siblings(ft, iconic_mode, all_desktops)))); /* 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, @@ -373,7 +375,7 @@ gboolean focus_valid_target(ObClient *ft, ok = ok && (ft == cft || !focus_valid_target(cft, screen_desktop, TRUE, - iconic_windows, + iconic_mode, all_desktops, nonhilite_windows, dock_windows, diff --git a/openbox/focus.h b/openbox/focus.h index 1fc1eb5..2491413 100644 --- a/openbox/focus.h +++ b/openbox/focus.h @@ -25,6 +25,12 @@ #include #include +typedef enum { + OB_FOCUS_ICONIC_EXCLUDE, + OB_FOCUS_ICONIC_INCLUDE, + OB_FOCUS_ICONIC_ONLY +} ObFocusIconicMode; + struct _ObClient; /*! The client which is currently focused */ @@ -71,7 +77,7 @@ struct _ObClient *focus_order_find_first(guint desktop); gboolean focus_valid_target(struct _ObClient *ft, guint desktop, gboolean helper_windows, - gboolean iconic_windows, + ObFocusIconicMode iconic_mode, gboolean all_desktops, gboolean nonhilite_windows, gboolean dock_windows, diff --git a/openbox/focus_cycle.c b/openbox/focus_cycle.c index 39d704c..b546959 100644 --- a/openbox/focus_cycle.c +++ b/openbox/focus_cycle.c @@ -38,7 +38,7 @@ typedef enum { ObClient *focus_cycle_target = NULL; static ObCycleType focus_cycle_type = OB_CYCLE_NONE; static gboolean focus_cycle_linear; -static gboolean focus_cycle_iconic_windows; +static ObFocusIconicMode focus_cycle_iconic_mode; static gboolean focus_cycle_all_desktops; static gboolean focus_cycle_nonhilite_windows; static gboolean focus_cycle_dock_windows; @@ -93,7 +93,7 @@ void focus_cycle_reorder() focus_cycle_update_indicator(focus_cycle_target); if (!focus_cycle_target) focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, - TRUE, TRUE, TRUE, TRUE, TRUE); + TRUE, TRUE, TRUE, OB_FOCUS_ICONIC_INCLUDE, TRUE, TRUE); } } @@ -102,6 +102,7 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops, gboolean dock_windows, gboolean desktop_windows, gboolean linear, gboolean interactive, gboolean showbar, ObFocusCyclePopupMode mode, + ObFocusIconicMode iconic_mode, gboolean done, gboolean cancel) { static GList *order = NULL; @@ -129,7 +130,7 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops, if (focus_cycle_target == NULL) { focus_cycle_linear = linear; - focus_cycle_iconic_windows = TRUE; + focus_cycle_iconic_mode = iconic_mode; focus_cycle_all_desktops = all_desktops; focus_cycle_nonhilite_windows = nonhilite_windows; focus_cycle_dock_windows = dock_windows; @@ -302,7 +303,7 @@ ObClient* focus_directional_cycle(ObDirection dir, gboolean dock_windows, if (focus_cycle_target == NULL) { focus_cycle_linear = FALSE; - focus_cycle_iconic_windows = FALSE; + focus_cycle_iconic_mode = OB_FOCUS_ICONIC_EXCLUDE; focus_cycle_all_desktops = FALSE; focus_cycle_nonhilite_windows = TRUE; focus_cycle_dock_windows = dock_windows; @@ -354,7 +355,7 @@ done_cycle: gboolean focus_cycle_valid(struct _ObClient *client) { return focus_valid_target(client, screen_desktop, TRUE, - focus_cycle_iconic_windows, + focus_cycle_iconic_mode, focus_cycle_all_desktops, focus_cycle_nonhilite_windows, focus_cycle_dock_windows, diff --git a/openbox/focus_cycle.h b/openbox/focus_cycle.h index 9394b3d..55d4a23 100644 --- a/openbox/focus_cycle.h +++ b/openbox/focus_cycle.h @@ -21,6 +21,7 @@ #define __focus_cycle_h #include "misc.h" +#include "focus.h" #include "focus_cycle_popup.h" #include @@ -40,6 +41,7 @@ struct _ObClient* focus_cycle(gboolean forward, gboolean all_desktops, gboolean dock_windows, gboolean desktop_windows, gboolean linear, gboolean interactive, gboolean showbar, ObFocusCyclePopupMode mode, + ObFocusIconicMode iconic_mode, gboolean done, gboolean cancel); struct _ObClient* focus_directional_cycle(ObDirection dir, gboolean dock_windows, -- 1.7.3.4