From 9b3ae84993d2493ff0761efbcda0b9d188ed6d9e Mon Sep 17 00:00:00 2001 From: nicm Date: Sat, 15 Oct 2016 00:01:01 +0000 Subject: Drain notifys once at the end of the server loop instead of doing it from the end of every command queue (which could be nested). --- notify.c | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) (limited to 'notify.c') diff --git a/notify.c b/notify.c index a1f69240..3ec41e99 100644 --- a/notify.c +++ b/notify.c @@ -45,25 +45,10 @@ struct notify_entry { }; TAILQ_HEAD(notify_queue, notify_entry); static struct notify_queue notify_queue = TAILQ_HEAD_INITIALIZER(notify_queue); -static int notify_enabled = 1; -static void notify_drain(void); static void notify_add(enum notify_type, struct client *, struct session *, struct window *); -void -notify_enable(void) -{ - notify_enabled = 1; - notify_drain(); -} - -void -notify_disable(void) -{ - notify_enabled = 0; -} - static void notify_add(enum notify_type type, struct client *c, struct session *s, struct window *w) @@ -85,14 +70,11 @@ notify_add(enum notify_type type, struct client *c, struct session *s, w->references++; } -static void +void notify_drain(void) { struct notify_entry *ne, *ne1; - if (!notify_enabled) - return; - TAILQ_FOREACH_SAFE(ne, ¬ify_queue, entry, ne1) { switch (ne->type) { case NOTIFY_WINDOW_LAYOUT_CHANGED: @@ -138,13 +120,6 @@ notify_input(struct window_pane *wp, struct evbuffer *input) { struct client *c; - /* - * notify_input() is not queued and only does anything when - * notifications are enabled. - */ - if (!notify_enabled) - return; - TAILQ_FOREACH(c, &clients, entry) { if (c->flags & CLIENT_CONTROL) control_notify_input(c, wp, input); -- cgit From 63b2547a0255c42bff405ca34577de240a99b736 Mon Sep 17 00:00:00 2001 From: nicm Date: Sat, 15 Oct 2016 00:09:30 +0000 Subject: Fire hooks on the simple notifys (window-renamed and session-renamed), the complicated ones get no hooks for now (more to come). --- notify.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) (limited to 'notify.c') diff --git a/notify.c b/notify.c index 3ec41e99..5f4f046e 100644 --- a/notify.c +++ b/notify.c @@ -34,6 +34,17 @@ enum notify_type { NOTIFY_SESSION_CLOSED }; +static const char *notify_hooks[] = { + "window-layout-changed", + NULL, /* "window-unlinked", */ + NULL, /* "window-linked", */ + "window-renamed", + NULL, /* "attached-session-changed", */ + "session-renamed", + NULL, /* "session-created", */ + NULL, /* "session-closed" */ +}; + struct notify_entry { enum notify_type type; @@ -49,6 +60,43 @@ static struct notify_queue notify_queue = TAILQ_HEAD_INITIALIZER(notify_queue); static void notify_add(enum notify_type, struct client *, struct session *, struct window *); +static void +notify_hook(struct notify_entry *ne) +{ + const char *name; + struct cmd_find_state fs; + struct hook *hook; + struct cmd_q *hooks_cmdq; + + name = notify_hooks[ne->type]; + if (name == NULL) + return; + + cmd_find_clear_state(&fs, NULL, 0); + if (ne->session != NULL && ne->window != NULL) + cmd_find_from_session_window(&fs, ne->session, ne->window); + else if (ne->window != NULL) + cmd_find_from_window(&fs, ne->window); + else if (ne->session != NULL) + cmd_find_from_session(&fs, ne->session); + if (cmd_find_empty_state(&fs) || !cmd_find_valid_state(&fs)) + return; + + hook = hooks_find(fs.s->hooks, name); + if (hook == NULL) + return; + log_debug("notify hook %s", name); + + hooks_cmdq = cmdq_new(NULL); + hooks_cmdq->flags |= CMD_Q_NOHOOKS; + + cmd_find_copy_state(&hooks_cmdq->current, &fs); + hooks_cmdq->parent = NULL; + + cmdq_run(hooks_cmdq, hook->cmdlist, NULL); + cmdq_free(hooks_cmdq); +} + static void notify_add(enum notify_type type, struct client *c, struct session *s, struct window *w) @@ -102,6 +150,8 @@ notify_drain(void) control_notify_session_close(ne->session); break; } + TAILQ_REMOVE(¬ify_queue, ne, entry); + notify_hook(ne); if (ne->client != NULL) server_client_unref(ne->client); @@ -109,8 +159,6 @@ notify_drain(void) session_unref(ne->session); if (ne->window != NULL) window_remove_ref(ne->window); - - TAILQ_REMOVE(¬ify_queue, ne, entry); free(ne); } } -- cgit From 3f138dc40c37ddee021b92e5d29676ed96b6cab8 Mon Sep 17 00:00:00 2001 From: nicm Date: Sat, 15 Oct 2016 00:12:58 +0000 Subject: Rename a function for consistency and some spacing nits. --- notify.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'notify.c') diff --git a/notify.c b/notify.c index 5f4f046e..416b81f6 100644 --- a/notify.c +++ b/notify.c @@ -147,7 +147,7 @@ notify_drain(void) control_notify_session_created(ne->session); break; case NOTIFY_SESSION_CLOSED: - control_notify_session_close(ne->session); + control_notify_session_closed(ne->session); break; } TAILQ_REMOVE(¬ify_queue, ne, entry); -- cgit