From 7e6f7fb45466bf6672e295ab155a9697c294410c Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 22 Jun 2007 18:38:51 +0000 Subject: [PATCH] add the directionaltargetwindow action --- Makefile.am | 1 + openbox/actions/all.c | 1 + openbox/actions/all.h | 1 + openbox/actions/directionaltargetwindow.c | 105 ++++++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 openbox/actions/directionaltargetwindow.c diff --git a/Makefile.am b/Makefile.am index 88cd5e1e..de045632 100644 --- a/Makefile.am +++ b/Makefile.am @@ -161,6 +161,7 @@ openbox_openbox_SOURCES = \ 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 \ diff --git a/openbox/actions/all.c b/openbox/actions/all.c index a9525233..b3fd1619 100644 --- a/openbox/actions/all.c +++ b/openbox/actions/all.c @@ -29,4 +29,5 @@ void action_all_startup() action_kill_startup(); action_omnipresent_startup(); action_directionalcyclewindows_startup(); + action_directionaltargetwindow_startup(); } diff --git a/openbox/actions/all.h b/openbox/actions/all.h index 11f9b7c6..2eae206e 100644 --- a/openbox/actions/all.h +++ b/openbox/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 diff --git a/openbox/actions/directionaltargetwindow.c b/openbox/actions/directionaltargetwindow.c new file mode 100644 index 00000000..93d33fbe --- /dev/null +++ b/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; +} -- 2.45.2