#include "focus.h"
#include "stacking.h"
#include "openbox.h"
+#include "hooks.h"
#include "group.h"
#include "config.h"
#include "menuframe.h"
ob_debug("Managed window 0x%lx plate 0x%x (%s)",
window, self->frame->window, self->class);
+
+ hooks_run(OB_HOOK_WIN_NEW, self);
}
if (!self->prompt)
XChangeSaveSet(obt_display, self->window, SetModeDelete);
+ hooks_run(OB_HOOK_WIN_CLOSE, self);
+
/* update the focus lists */
focus_order_remove(self);
if (client_focused(self)) {
desktop!
*/
client_change_wm_state(self);
+
+ hooks_run(OB_HOOK_WIN_VISIBLE, self);
}
return show;
}
desktop!
*/
client_change_wm_state(self);
+
+ hooks_run(OB_HOOK_WIN_INVISIBLE, self);
}
return hide;
}
frame_begin_iconify_animation(self->frame, iconic);
/* do this after starting the animation so it doesn't flash */
client_showhide(self);
+
+ hooks_run((iconic ? OB_HOOK_WIN_ICONIC : OB_HOOK_WIN_UNICONIC), self);
}
/* iconify all direct transients, and deiconify all transients
client_setup_decor_and_functions(self, FALSE);
client_move_resize(self, x, y, w, h);
+
+ hooks_run((max ? OB_HOOK_WIN_MAX : OB_HOOK_WIN_UNMAX), self);
}
void client_shade(ObClient *self, gboolean shade)
client_change_wm_state(self); /* the window is being hidden/shown */
/* resize the frame to just the titlebar */
frame_adjust_area(self->frame, FALSE, TRUE, FALSE);
+
+ hooks_run((shade ? OB_HOOK_WIN_SHADE : OB_HOOK_WIN_UNSHADE), self);
}
static void client_ping_event(ObClient *self, gboolean dead)
/* the new desktop's geometry may be different, so we may need to
resize, for example if we are maximized */
client_reconfigure(self, FALSE);
+
+ if (old != self->desktop)
+ hooks_run(OB_HOOK_WIN_DESK_CHANGE, self);
}
/* move all transients */
self->undecorated = undecorated;
client_setup_decor_and_functions(self, TRUE);
client_change_state(self); /* reflect this in the state hints */
+
+ hooks_run((undecorated ?
+ OB_HOOK_WIN_UNDECORATED : OB_HOOK_WIN_DECORATED), self);
}
}
#include "focus_cycle.h"
#include "screen.h"
#include "keyboard.h"
+#include "hooks.h"
#include "focus.h"
#include "stacking.h"
#include "obt/prop.h"
void focus_set_client(ObClient *client)
{
Window active;
+ ObClient *old;
ob_debug_type(OB_DEBUG_FOCUS,
"focus_set_client 0x%lx", client ? client->window : 0);
focus_cycle_stop(focus_client);
focus_cycle_stop(client);
+ old = focus_client;
focus_client = client;
if (client != NULL) {
active = client ? client->window : None;
OBT_PROP_SET32(obt_root(ob_screen), NET_ACTIVE_WINDOW, WINDOW, active);
}
+
+ hooks_run(OB_HOOK_WIN_UNFOCUS, old);
+ hooks_run(OB_HOOK_WIN_FOCUS, client);
}
static ObClient* focus_fallback_target(gboolean allow_refocus,
#include <glib.h>
-static GSList *hooks[OB_NUM_HOOKS*2];
+static GSList *hooks[OB_NUM_HOOKS];
void hooks_startup(gboolean reconfig)
{
+ gint i;
+
+ for (i = 0; i < OB_NUM_HOOKS; ++i)
+ hooks[i] = NULL;
}
void hooks_shutdown(gboolean reconfig)
{
gint i;
- for (i = 0; i < OB_NUM_HOOKS*2; ++i)
+ for (i = 0; i < OB_NUM_HOOKS; ++i)
while (hooks[i]) {
actions_act_unref(hooks[i]->data);
hooks[i] = g_slist_delete_link(hooks[i], hooks[i]);
return OB_HOOK_WIN_FOCUS;
if (!g_ascii_strcasecmp(n, "WindowUnfocused"))
return OB_HOOK_WIN_UNFOCUS;
- if (!g_ascii_strcasecmp(n, "WindowOnCurrentDesktop"))
- return OB_HOOK_WIN_CURRENT_DESK;
- if (!g_ascii_strcasecmp(n, "WindowOnOtherDesktop"))
- return OB_HOOK_WIN_OTHER_DESK;
+ 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;
return OB_HOOK_INVALID;
}
-void hooks_fire(ObHook hook, struct _ObClient *c)
+void hooks_run(ObHook hook, struct _ObClient *c)
{
GSList *it;
g_assert(hook < OB_NUM_HOOKS);
- for (it = hooks[hook]; it; it = g_slist_next(it))
- actions_run_acts(it->data,
- OB_USER_ACTION_HOOK,
- 0, -1, -1, 0,
- OB_FRAME_CONTEXT_NONE,
- c);
+ actions_run_acts(hooks[hook],
+ OB_USER_ACTION_HOOK,
+ 0, -1, -1, 0,
+ OB_FRAME_CONTEXT_NONE,
+ c);
}
void hooks_add(ObHook hook, struct _ObActionsAct *act)
OB_HOOK_WIN_UNSHADE,
OB_HOOK_WIN_FOCUS,
OB_HOOK_WIN_UNFOCUS,
- OB_HOOK_WIN_CURRENT_DESK,
- OB_HOOK_WIN_OTHER_DESK,
+ OB_HOOK_WIN_DESK_CHANGE,
OB_HOOK_WIN_DECORATED,
OB_HOOK_WIN_UNDECORATED,
+ OB_HOOK_SCREEN_DESK_CHANGE,
OB_NUM_HOOKS
} ObHook;
@param on TRUE if the hook is being run cuz a state was turned on, FALSE
if a state was turned off
*/
-void hooks_fire(ObHook hook, struct _ObClient *c);
+void hooks_run(ObHook hook, struct _ObClient *c);
void hooks_add(ObHook hook, struct _ObActionsAct *act);
#include "event.h"
#include "focus.h"
#include "popup.h"
+#include "hooks.h"
#include "render/render.h"
#include "gettext.h"
#include "obt/display.h"
if (event_curtime != CurrentTime)
screen_desktop_user_time = event_curtime;
+
+ hooks_run(OB_HOOK_SCREEN_DESK_CHANGE, NULL);
}
void screen_add_desktop(gboolean current)