X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Factions%2Fdirectionalwindows.c;h=c575d84e2d056b5ae99fa21b12046d1839d07757;hb=ea371936cec5f1e7f0eaed698b2cff6fab42f210;hp=66c1a1628ff967187c53fa85567436f27b387033;hpb=c6f2875d61ce038bcc3b28e28aa26a0648efd752;p=chaz%2Fopenbox diff --git a/openbox/actions/directionalwindows.c b/openbox/actions/directionalwindows.c index 66c1a162..c575d84e 100644 --- a/openbox/actions/directionalwindows.c +++ b/openbox/actions/directionalwindows.c @@ -1,5 +1,7 @@ #include "openbox/actions.h" #include "openbox/event.h" +#include "openbox/stacking.h" +#include "openbox/window.h" #include "openbox/focus_cycle.h" #include "openbox/openbox.h" #include "openbox/misc.h" @@ -11,6 +13,8 @@ typedef struct { gboolean dock_windows; gboolean desktop_windows; ObDirection direction; + gboolean bar; + gboolean raise; GSList *actions; } Options; @@ -31,7 +35,7 @@ static void i_cancel_func(gpointer options); static void end_cycle(gboolean cancel, guint state, Options *o); -void action_directionalwindows_startup() +void action_directionalwindows_startup(void) { actions_register("DirectionalCycleWindows", setup_cycle_func, free_func, run_func, i_input_func, i_cancel_func); @@ -46,9 +50,14 @@ static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node) o = g_new0(Options, 1); o->dialog = TRUE; + o->bar = TRUE; if ((n = parse_find_node("dialog", node))) o->dialog = parse_bool(doc, n); + if ((n = parse_find_node("bar", node))) + o->bar = parse_bool(doc, n); + if ((n = parse_find_node("raise", node))) + o->raise = parse_bool(doc, n); if ((n = parse_find_node("panels", node))) o->dock_windows = parse_bool(doc, n); if ((n = parse_find_node("desktop", node))) @@ -132,16 +141,22 @@ static gboolean run_func(ObActionsData *data, gpointer options) { Options *o = options; - if (o->interactive) + if (!o->interactive) end_cycle(FALSE, data->state, o); else { - focus_directional_cycle(o->direction, - o->dock_windows, - o->desktop_windows, - TRUE, - o->dialog, - FALSE, FALSE); + struct _ObClient *ft; + + ft = focus_directional_cycle(o->direction, + o->dock_windows, + o->desktop_windows, + TRUE, + o->bar, + o->dialog, + FALSE, FALSE); cycling = TRUE; + + stacking_restore(); + if (o->raise) stacking_temp_raise(CLIENT_AS_WINDOW(ft)); } return o->interactive; @@ -193,13 +208,15 @@ static void end_cycle(gboolean cancel, guint state, Options *o) ft = focus_directional_cycle(o->direction, o->dock_windows, o->desktop_windows, - TRUE, + o->interactive, + o->bar, o->dialog, TRUE, cancel); cycling = FALSE; - if (ft) { + if (ft) actions_run_acts(o->actions, OB_USER_ACTION_KEYBOARD_KEY, state, -1, -1, 0, OB_FRAME_CONTEXT_NONE, ft); - } + + stacking_restore(); }