From dc2e6f6bf7143a56de360a393b33906735e63625 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 1 Mar 2008 00:04:28 -0500 Subject: [PATCH] Get hooks working --- openbox/event.c | 9 ++++++-- openbox/event.h | 4 ++++ openbox/hooks.c | 68 ++++++++++++++++++++++++++----------------------------- openbox/openbox.c | 4 ++-- 4 files changed, 45 insertions(+), 40 deletions(-) diff --git a/openbox/event.c b/openbox/event.c index 4d1b6ab..142cf1f 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -1884,11 +1884,16 @@ static void event_handle_user_input(ObClient *client, XEvent *e) if (!client || !frame_iconify_animating(client->frame)) mouse_event(client, e); } else - keyboard_event((focus_cycle_target ? focus_cycle_target : - (client ? client : focus_client)), e); + keyboard_event(event_target_client(client), e); } } +ObClient* event_target_client(ObClient *client) +{ + return (focus_cycle_target ? focus_cycle_target : + (client ? client : focus_client)); +} + static void focus_delay_dest(gpointer data) { g_free(data); diff --git a/openbox/event.h b/openbox/event.h index 4e6fc32..ba5a03e 100644 --- a/openbox/event.h +++ b/openbox/event.h @@ -64,4 +64,8 @@ gboolean event_time_after(Time t1, Time t2); Time event_get_server_time(void); +/*! Given a possible target client, returns what the target client really + should be for actions */ +struct _ObClient* event_target_client(struct _ObClient *client); + #endif diff --git a/openbox/hooks.c b/openbox/hooks.c index 2a346c3..ea46192 100644 --- a/openbox/hooks.c +++ b/openbox/hooks.c @@ -1,9 +1,13 @@ #include "hooks.h" #include "actions.h" +#include "client.h" +#include "focus.h" +#include "debug.h" #include static GSList *hooks[OB_NUM_HOOKS]; +static const gchar *names[OB_NUM_HOOKS]; void hooks_startup(gboolean reconfig) { @@ -11,6 +15,23 @@ void hooks_startup(gboolean reconfig) for (i = 0; i < OB_NUM_HOOKS; ++i) hooks[i] = NULL; + + names[OB_HOOK_WIN_NEW] = "WindowNew"; + names[OB_HOOK_WIN_CLOSE] = "WindowClosed"; + names[OB_HOOK_WIN_VISIBLE] = "WindowVisible"; + names[OB_HOOK_WIN_INVISIBLE] = "WindowInvisible"; + names[OB_HOOK_WIN_ICONIC] = "WindowIconified"; + names[OB_HOOK_WIN_UNICONIC] = "WindowUniconified"; + names[OB_HOOK_WIN_MAX] = "WindowMaximized"; + names[OB_HOOK_WIN_UNMAX] = "WindowUnmaximized"; + names[OB_HOOK_WIN_SHADE] = "WindowShaded"; + names[OB_HOOK_WIN_UNSHADE] = "WindowUnshaded"; + names[OB_HOOK_WIN_FOCUS] = "WindowFocused"; + names[OB_HOOK_WIN_UNFOCUS] = "WindowUnfocused"; + names[OB_HOOK_WIN_DESK_CHANGE] = "WindowOnNewDesktop"; + names[OB_HOOK_WIN_DECORATED] = "WindowDecorated"; + names[OB_HOOK_WIN_UNDECORATED] = "WindowUndecorated"; + names[OB_HOOK_SCREEN_DESK_CHANGE] = "DesktopChanged"; } void hooks_shutdown(gboolean reconfig) @@ -26,57 +47,32 @@ void hooks_shutdown(gboolean reconfig) ObHook hooks_hook_from_name(const gchar *n) { - if (!g_ascii_strcasecmp(n, "WindowNew")) - return OB_HOOK_WIN_NEW; - if (!g_ascii_strcasecmp(n, "WindowClosed")) - return OB_HOOK_WIN_CLOSE; - if (!g_ascii_strcasecmp(n, "WindowVisible")) - return OB_HOOK_WIN_VISIBLE; - if (!g_ascii_strcasecmp(n, "WindowInvisible")) - return OB_HOOK_WIN_INVISIBLE; - if (!g_ascii_strcasecmp(n, "WindowIconified")) - return OB_HOOK_WIN_ICONIC; - if (!g_ascii_strcasecmp(n, "WindowUniconified")) - return OB_HOOK_WIN_UNICONIC; - if (!g_ascii_strcasecmp(n, "WindowMaximized")) - return OB_HOOK_WIN_MAX; - if (!g_ascii_strcasecmp(n, "WindowUnmaximized")) - return OB_HOOK_WIN_UNMAX; - if (!g_ascii_strcasecmp(n, "WindowShaded")) - return OB_HOOK_WIN_SHADE; - if (!g_ascii_strcasecmp(n, "WindowUnshaded")) - return OB_HOOK_WIN_UNSHADE; - if (!g_ascii_strcasecmp(n, "WindowFocused")) - return OB_HOOK_WIN_FOCUS; - if (!g_ascii_strcasecmp(n, "WindowUnfocused")) - return OB_HOOK_WIN_UNFOCUS; - if (!g_ascii_strcasecmp(n, "WindowOnNewDesktop")) - return OB_HOOK_WIN_DESK_CHANGE; - if (!g_ascii_strcasecmp(n, "WindowDecorated")) - return OB_HOOK_WIN_DECORATED; - if (!g_ascii_strcasecmp(n, "WindowUndecorated")) - return OB_HOOK_WIN_UNDECORATED; - if (!g_ascii_strcasecmp(n, "DesktopChanged")) - return OB_HOOK_SCREEN_DESK_CHANGE; + gint i; + + for (i = 1; i < OB_NUM_HOOKS; ++i) + if (!g_ascii_strcasecmp(n, names[i])) + return (ObHook)i; return OB_HOOK_INVALID; } -void hooks_run(ObHook hook, struct _ObClient *c) +void hooks_run(ObHook hook, struct _ObClient *client) { GSList *it; - g_assert(hook < OB_NUM_HOOKS); + g_assert(hook < OB_NUM_HOOKS && hook > OB_HOOK_INVALID); + ob_debug("Running hook %s for client 0x%x", names[hook], + (client ? client->window : 0)); actions_run_acts(hooks[hook], OB_USER_ACTION_HOOK, 0, -1, -1, 0, OB_FRAME_CONTEXT_NONE, - c); + event_target_client(client)); } void hooks_add(ObHook hook, struct _ObActionsAct *act) { - g_assert(hook < OB_NUM_HOOKS); + g_assert(hook < OB_NUM_HOOKS && hook > OB_HOOK_INVALID); /* append so they are executed in the same order as they appear in the config file */ diff --git a/openbox/openbox.c b/openbox/openbox.c index 79b080d..01aa58a 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -233,6 +233,7 @@ gint main(gint argc, gchar **argv) /* register all the available actions */ actions_startup(reconfigure); + hooks_startup(reconfigure); /* start up config which sets up with the parser */ config_startup(i); @@ -298,7 +299,6 @@ gint main(gint argc, gchar **argv) /* focus_backup is used for stacking, so this needs to come before anything that calls stacking_add */ sn_startup(reconfigure); - hooks_startup(reconfigure); window_startup(reconfigure); focus_startup(reconfigure); focus_cycle_startup(reconfigure); @@ -375,10 +375,10 @@ gint main(gint argc, gchar **argv) focus_cycle_shutdown(reconfigure); focus_shutdown(reconfigure); window_shutdown(reconfigure); - hooks_shutdown(reconfigure); sn_shutdown(reconfigure); event_shutdown(reconfigure); config_shutdown(); + hooks_shutdown(reconfigure); actions_shutdown(reconfigure); } while (reconfigure); } -- 1.9.1