summaryrefslogtreecommitdiff
path: root/openbox/actions
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2012-10-01 22:32:59 -0400
committerDana Jansens <danakj@orodu.net>2012-10-06 22:30:02 -0400
commit1869e4e830d08acd5f7801acd8910ce99806f53b (patch)
tree3cc34928f80aa19470cedbed6f44893e06349331 /openbox/actions
parentd0ba8806689ea80b6a739122aaf8dac81d2a3e5c (diff)
Allow non-interactive focus cycling.
Adds an <interactive>bool</interactive> option to the NextWindow and PreviousWindow actions. When it is false, the action is not interactive and will immediately switch focus to whatever the next focus target is. Removing the "interactive" flag from the focus_cycle() method, as it was unused previously, and the new code does not make use of it either. In order to be non-interactive it simply starts a focus_cycle then immediately ends it when the action ends. The "interactive" flag in focus_cycle() forced a linear cycling order which may not be what you want, so the new method is preferrable anyhow.
Diffstat (limited to 'openbox/actions')
-rw-r--r--openbox/actions/cyclewindows.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/openbox/actions/cyclewindows.c b/openbox/actions/cyclewindows.c
index a64d2256..f8349515 100644
--- a/openbox/actions/cyclewindows.c
+++ b/openbox/actions/cyclewindows.c
@@ -16,6 +16,7 @@ typedef struct {
gboolean forward;
gboolean bar;
gboolean raise;
+ gboolean interactive;
ObFocusCyclePopupMode dialog_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->interactive = TRUE;
if ((n = obt_xml_find_node(node, "linear")))
o->linear = obt_xml_node_bool(n);
@@ -80,6 +82,8 @@ 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, "interactive")))
+ o->interactive = obt_xml_node_bool(n);
if ((n = obt_xml_find_node(node, "bar")))
o->bar = obt_xml_node_bool(n);
if ((n = obt_xml_find_node(node, "raise")))
@@ -157,21 +161,24 @@ static gboolean run_func(ObActionsData *data, gpointer options)
Options *o = options;
struct _ObClient *ft;
- ft = focus_cycle(o->forward,
- o->all_desktops,
- !o->only_hilite_windows,
- o->dock_windows,
- o->desktop_windows,
- o->linear,
- TRUE,
- o->bar,
- o->dialog_mode,
- FALSE, FALSE);
+ gboolean done = FALSE;
+ gboolean cancel = FALSE;
+
+ ft = focus_cycle(
+ o->forward,
+ o->all_desktops,
+ !o->only_hilite_windows,
+ o->dock_windows,
+ o->desktop_windows,
+ o->linear,
+ (o->interactive ? o->bar : FALSE),
+ (o->interactive ? o->dialog_mode : OB_FOCUS_CYCLE_POPUP_MODE_NONE),
+ done, cancel);
stacking_restore();
if (o->raise && ft) stacking_temp_raise(CLIENT_AS_WINDOW(ft));
- return TRUE;
+ return o->interactive;
}
static gboolean i_input_func(guint initial_state,
@@ -231,16 +238,17 @@ static void i_post_func(gpointer options)
Options *o = options;
struct _ObClient *ft;
+ gboolean done = TRUE;
+
ft = focus_cycle(o->forward,
o->all_desktops,
!o->only_hilite_windows,
o->dock_windows,
o->desktop_windows,
o->linear,
- TRUE,
o->bar,
o->dialog_mode,
- TRUE, o->cancel);
+ done, o->cancel);
if (ft)
actions_run_acts(o->actions, OB_USER_ACTION_KEYBOARD_KEY,