Skip to content

Commit

Permalink
Allow non-interactive focus cycling.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
danakj committed Oct 2, 2012
1 parent 276f125 commit 459ec44
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 49 deletions.
33 changes: 20 additions & 13 deletions openbox/actions/cyclewindows.c
Expand Up @@ -16,6 +16,7 @@ typedef struct {
gboolean forward;
gboolean bar;
gboolean raise;
gboolean interactive;
ObFocusCyclePopupMode dialog_mode;
GSList *actions;

Expand Down Expand Up @@ -80,6 +81,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")))
Expand Down Expand Up @@ -157,21 +160,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,
Expand Down Expand Up @@ -231,16 +237,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,
Expand Down
53 changes: 19 additions & 34 deletions openbox/focus_cycle.c
Expand Up @@ -93,40 +93,34 @@ 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, OB_FOCUS_CYCLE_POPUP_MODE_NONE,
TRUE, OB_FOCUS_CYCLE_POPUP_MODE_NONE,
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,
gboolean linear, gboolean showbar,
ObFocusCyclePopupMode mode,
gboolean done, gboolean cancel)
{
static GList *order = NULL;
GList *it, *start, *list;
ObClient *ft = NULL;
ObClient *ret = NULL;

if (interactive) {
if (cancel) {
focus_cycle_target = NULL;
goto done_cycle;
} else if (done)
goto done_cycle;
if (cancel) {
focus_cycle_target = NULL;
goto done_cycle;
} else if (done)
goto done_cycle;

if (!focus_order)
goto done_cycle;
if (!focus_order)
goto done_cycle;

if (linear) list = client_list;
else list = focus_order;
} else {
if (!focus_order)
goto done_cycle;
list = client_list;
}
if (linear) list = client_list;
else list = focus_order;

if (focus_cycle_target == NULL) {
focus_cycle_linear = linear;
Expand All @@ -153,21 +147,14 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
}
ft = it->data;
if (focus_cycle_valid(ft)) {
if (interactive) {
if (ft != focus_cycle_target) { /* prevents flicker */
focus_cycle_target = ft;
focus_cycle_type = OB_CYCLE_NORMAL;
focus_cycle_draw_indicator(showbar ? ft : NULL);
}
/* same arguments as focus_target_valid */
focus_cycle_popup_show(ft, mode, focus_cycle_linear);
return focus_cycle_target;
} else if (ft != focus_cycle_target) {
if (ft != focus_cycle_target) { /* prevents flicker */
focus_cycle_target = ft;
focus_cycle_type = OB_CYCLE_NORMAL;
done = TRUE;
break;
focus_cycle_draw_indicator(showbar ? ft : NULL);
}
/* same arguments as focus_target_valid */
focus_cycle_popup_show(ft, mode, focus_cycle_linear);
return focus_cycle_target;
}
} while (it != start);

Expand All @@ -179,10 +166,8 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
g_list_free(order);
order = NULL;

if (interactive) {
focus_cycle_draw_indicator(NULL);
focus_cycle_popup_hide();
}
focus_cycle_draw_indicator(NULL);
focus_cycle_popup_hide();

return ret;
}
Expand Down
4 changes: 2 additions & 2 deletions openbox/focus_cycle.h
Expand Up @@ -38,8 +38,8 @@ void focus_cycle_shutdown(gboolean reconfig);
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,
gboolean linear, gboolean showbar,
ObFocusCyclePopupMode mode,
gboolean done, gboolean cancel);
struct _ObClient* focus_directional_cycle(ObDirection dir,
gboolean dock_windows,
Expand Down

0 comments on commit 459ec44

Please sign in to comment.