diff options
| -rw-r--r-- | openbox/actions/cyclewindows.c | 34 | ||||
| -rw-r--r-- | openbox/focus_cycle.c | 53 | ||||
| -rw-r--r-- | openbox/focus_cycle.h | 4 |
3 files changed, 42 insertions, 49 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, diff --git a/openbox/focus_cycle.c b/openbox/focus_cycle.c index 93a9a993..de176501 100644 --- a/openbox/focus_cycle.c +++ b/openbox/focus_cycle.c @@ -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, OB_FOCUS_CYCLE_POPUP_MODE_NONE, + TRUE, OB_FOCUS_CYCLE_POPUP_MODE_NONE, TRUE, TRUE); } } @@ -101,8 +101,8 @@ void focus_cycle_reorder() 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; @@ -110,23 +110,17 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops, 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; @@ -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); @@ -179,10 +166,8 @@ done_cycle: 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; } diff --git a/openbox/focus_cycle.h b/openbox/focus_cycle.h index 9394b3df..8acb53d9 100644 --- a/openbox/focus_cycle.h +++ b/openbox/focus_cycle.h @@ -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, |
