summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/notify.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/tmux/notify.c')
-rw-r--r--usr.bin/tmux/notify.c147
1 files changed, 138 insertions, 9 deletions
diff --git a/usr.bin/tmux/notify.c b/usr.bin/tmux/notify.c
index 59f52e1fd02..ac71d5ec789 100644
--- a/usr.bin/tmux/notify.c
+++ b/usr.bin/tmux/notify.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: notify.c,v 1.1 2012/03/17 22:35:09 nicm Exp $ */
+/* $OpenBSD: notify.c,v 1.2 2012/07/13 06:27:41 nicm Exp $ */
/*
* Copyright (c) 2012 George Nachman <tmux@georgester.com>
@@ -16,44 +16,173 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#include <sys/types.h>
+#include <sys/queue.h>
+
+#include <stdlib.h>
+
#include "tmux.h"
+enum notify_type {
+ NOTIFY_WINDOW_LAYOUT_CHANGED,
+ NOTIFY_WINDOW_UNLINKED,
+ NOTIFY_WINDOW_LINKED,
+ NOTIFY_WINDOW_RENAMED,
+ NOTIFY_ATTACHED_SESSION_CHANGED,
+ NOTIFY_SESSION_RENAMED,
+ NOTIFY_SESSION_CREATED,
+ NOTIFY_SESSION_CLOSED
+};
+
+struct notify_entry {
+ enum notify_type type;
+
+ struct client *client;
+ struct session *session;
+ struct window *window;
+
+ TAILQ_ENTRY(notify_entry) entry;
+};
+TAILQ_HEAD(, notify_entry) notify_queue = TAILQ_HEAD_INITIALIZER(notify_queue);
+int notify_enabled = 1;
+
+void notify_drain(void);
+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;
+}
+
+void
+notify_add(enum notify_type type, struct client *c, struct session *s,
+ struct window *w)
+{
+ struct notify_entry *ne;
+
+ ne = xcalloc(1, sizeof *ne);
+ ne->type = type;
+ ne->client = c;
+ ne->session = s;
+ ne->window = w;
+ TAILQ_INSERT_TAIL(&notify_queue, ne, entry);
+
+ if (c != NULL)
+ c->references++;
+ if (s != NULL)
+ s->references++;
+ if (w != NULL)
+ w->references++;
+}
+
+void
+notify_drain(void)
+{
+ struct notify_entry *ne, *ne1;
+
+ if (!notify_enabled)
+ return;
+
+ TAILQ_FOREACH_SAFE(ne, &notify_queue, entry, ne1) {
+ switch (ne->type) {
+ case NOTIFY_WINDOW_LAYOUT_CHANGED:
+ /* control_notify_window_layout_changed(ne->window); */
+ break;
+ case NOTIFY_WINDOW_UNLINKED:
+ /* control_notify_window_unlinked(ne->session, ne->window); */
+ break;
+ case NOTIFY_WINDOW_LINKED:
+ /* control_notify_window_linked(ne->session, ne->window); */
+ break;
+ case NOTIFY_WINDOW_RENAMED:
+ /* control_notify_window_renamed(ne->window); */
+ break;
+ case NOTIFY_ATTACHED_SESSION_CHANGED:
+ /* control_notify_attached_session_changed(ne->client, ne->session); */
+ break;
+ case NOTIFY_SESSION_RENAMED:
+ /* control_notify_session_renamed(ne->session); */
+ break;
+ case NOTIFY_SESSION_CREATED:
+ /* control_notify_session_created(ne->session); */
+ break;
+ case NOTIFY_SESSION_CLOSED:
+ /* control_notify_session_close(ne->session); */
+ break;
+ }
+
+ if (ne->client != NULL)
+ ne->client->references--;
+ if (ne->session != NULL)
+ ne->session->references--;
+ if (ne->window != NULL)
+ ne->window->references--;
+ TAILQ_REMOVE(&notify_queue, ne, entry);
+ free(ne);
+ }
+}
+
void
-notify_window_layout_changed(unused struct window *w)
+notify_window_layout_changed(struct window *w)
{
+ notify_add(NOTIFY_WINDOW_LAYOUT_CHANGED, NULL, NULL, w);
+ notify_drain();
}
void
-notify_window_unlinked(unused struct session *s, unused struct window *w)
+notify_window_unlinked(struct session *s, struct window *w)
{
+ notify_add(NOTIFY_WINDOW_UNLINKED, NULL, s, w);
+ notify_drain();
}
void
-notify_window_linked(unused struct session *s, unused struct window *w)
+notify_window_linked(struct session *s, struct window *w)
{
+ notify_add(NOTIFY_WINDOW_LINKED, NULL, s, w);
+ notify_drain();
}
void
-notify_window_renamed(unused struct window *w)
+notify_window_renamed(struct window *w)
{
+ notify_add(NOTIFY_WINDOW_RENAMED, NULL, NULL, w);
+ notify_drain();
}
void
-notify_attached_session_changed(unused struct client *c)
+notify_attached_session_changed(struct client *c)
{
+ notify_add(NOTIFY_ATTACHED_SESSION_CHANGED, c, NULL, NULL);
+ notify_drain();
}
void
-notify_session_renamed(unused struct session *s)
+notify_session_renamed(struct session *s)
{
+ notify_add(NOTIFY_SESSION_RENAMED, NULL, s, NULL);
+ notify_drain();
}
void
-notify_session_created(unused struct session *s)
+notify_session_created(struct session *s)
{
+ notify_add(NOTIFY_SESSION_CREATED, NULL, s, NULL);
+ notify_drain();
}
void
-notify_session_closed(unused struct session *s)
+notify_session_closed(struct session *s)
{
+ notify_add(NOTIFY_SESSION_CLOSED, NULL, s, NULL);
+ notify_drain();
}