all repos — openbox @ 7e6f7fb45466bf6672e295ab155a9697c294410c

openbox fork - make it a bit more like ryudo

add the directionaltargetwindow action
Dana Jansens danakj@orodu.net
commit

7e6f7fb45466bf6672e295ab155a9697c294410c

parent

97bb443edb8895b2b68147b0b7cb89f7338cead6

4 files changed, 108 insertions(+), 0 deletions(-)

jump to
M Makefile.amMakefile.am

@@ -161,6 +161,7 @@ openbox/actions/close.c \

openbox/actions/cyclewindows.c \ openbox/actions/debug.c \ openbox/actions/directionalcyclewindows.c \ + openbox/actions/directionaltargetwindow.c \ openbox/actions/execute.c \ openbox/actions/exit.c \ openbox/actions/focus.c \
M openbox/actions/all.copenbox/actions/all.c

@@ -29,4 +29,5 @@ action_shade_startup();

action_kill_startup(); action_omnipresent_startup(); action_directionalcyclewindows_startup(); + action_directionaltargetwindow_startup(); }
M openbox/actions/all.hopenbox/actions/all.h

@@ -30,5 +30,6 @@ void action_shade_startup();

void action_kill_startup(); void action_omnipresent_startup(); void action_directionalcyclewindows_startup(); +void action_directionaltargetwindow_startup(); #endif
A openbox/actions/directionaltargetwindow.c

@@ -0,0 +1,105 @@

+#include "openbox/actions.h" +#include "openbox/event.h" +#include "openbox/focus_cycle.h" +#include "openbox/openbox.h" +#include "openbox/misc.h" +#include "gettext.h" + +typedef struct { + gboolean dialog; + gboolean dock_windows; + gboolean desktop_windows; + ObDirection direction; + GSList *actions; +} Options; + +static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node); +static void free_func(gpointer options); +static gboolean run_func(ObActionsData *data, gpointer options); + +void action_directionaltargetwindow_startup() +{ + actions_register("DirectionalTargetWindow", + setup_func, + free_func, + run_func, + NULL, NULL); +} + +static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node) +{ + xmlNodePtr n; + Options *o; + + o = g_new0(Options, 1); + o->dialog = TRUE; + + if ((n = parse_find_node("dialog", node))) + o->dialog = 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))) + o->desktop_windows = parse_bool(doc, n); + if ((n = parse_find_node("direction", node))) { + gchar *s = parse_string(doc, n); + if (!g_ascii_strcasecmp(s, "north")) + o->direction = OB_DIRECTION_NORTH; + else if (!g_ascii_strcasecmp(s, "northwest")) + o->direction = OB_DIRECTION_NORTHWEST; + else if (!g_ascii_strcasecmp(s, "northeast")) + o->direction = OB_DIRECTION_NORTHEAST; + else if (!g_ascii_strcasecmp(s, "west")) + o->direction = OB_DIRECTION_WEST; + else if (!g_ascii_strcasecmp(s, "east")) + o->direction = OB_DIRECTION_EAST; + else if (!g_ascii_strcasecmp(s, "south")) + o->direction = OB_DIRECTION_NORTH; + else if (!g_ascii_strcasecmp(s, "southwest")) + o->direction = OB_DIRECTION_NORTHWEST; + else if (!g_ascii_strcasecmp(s, "southeast")) + o->direction = OB_DIRECTION_NORTHEAST; + g_free(s); + } + + if ((n = parse_find_node("actions", node))) { + xmlNodePtr m; + + m = parse_find_node("action", n->xmlChildrenNode); + while (m) { + ObActionsAct *action = actions_parse(i, doc, m); + if (action) o->actions = g_slist_prepend(o->actions, action); + m = parse_find_node("action", m->next); + } + } + return o; +} + +static void free_func(gpointer options) +{ + Options *o = options; + + g_free(o); +} + +static gboolean run_func(ObActionsData *data, gpointer options) +{ + Options *o = options; + struct _ObClient *ft; + + /* if using focus_delay, stop the timer now so that focus doesn't go moving + on us */ + event_halt_focus_delay(); + + ft = focus_directional_cycle(o->direction, + o->dock_windows, + o->desktop_windows, + FALSE, + o->dialog, + TRUE, FALSE); + + if (ft) + actions_run_acts(o->actions, data->uact, data->state, + data->x, data->y, data->button, data->context, ft); + + return FALSE; +}