summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2012-07-13 06:27:42 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2012-07-13 06:27:42 +0000
commit8f8d56b846ca8cb92ef1b28e653693230bcf8922 (patch)
tree71e618de45e25cade51ebf4e20aa3315973c3b2a /usr.bin
parentb0c7ccbc02c590cdfafa4b07e2e4715094d682c1 (diff)
Add a queue of notifys and a way to turn them off and on (we do not want
notifys to happen during some commands). Based on code from George Nachman.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/tmux/cmd-list.c6
-rw-r--r--usr.bin/tmux/notify.c147
-rw-r--r--usr.bin/tmux/tmux.h10
3 files changed, 149 insertions, 14 deletions
diff --git a/usr.bin/tmux/cmd-list.c b/usr.bin/tmux/cmd-list.c
index 32e94c4d170..4629702c29b 100644
--- a/usr.bin/tmux/cmd-list.c
+++ b/usr.bin/tmux/cmd-list.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-list.c,v 1.9 2012/07/11 07:10:15 nicm Exp $ */
+/* $OpenBSD: cmd-list.c,v 1.10 2012/07/13 06:27:41 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -91,6 +91,8 @@ cmd_list_exec(struct cmd_list *cmdlist, struct cmd_ctx *ctx)
if (c != NULL && c->session != NULL)
guards = c->flags & CLIENT_CONTROL;
+ notify_disable();
+
retval = 0;
TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if (guards)
@@ -128,6 +130,8 @@ cmd_list_exec(struct cmd_list *cmdlist, struct cmd_ctx *ctx)
break;
}
}
+
+ notify_enable();
return (retval);
}
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();
}
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index 4ef964e205f..0981d1dab45 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.348 2012/07/11 07:10:15 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.349 2012/07/13 06:27:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -1484,6 +1484,8 @@ void mode_key_init(struct mode_key_data *, struct mode_key_tree *);
enum mode_key_cmd mode_key_lookup(struct mode_key_data *, int);
/* notify.c */
+void notify_enable(void);
+void notify_disable(void);
void notify_window_layout_changed(struct window *);
void notify_window_unlinked(struct session *, struct window *);
void notify_window_linked(struct session *, struct window *);
@@ -2162,11 +2164,11 @@ void queue_window_name(struct window *);
char *default_window_name(struct window *);
/* signal.c */
-void set_signals(void(*)(int, short, void *));
-void clear_signals(int);
+void set_signals(void(*)(int, short, void *));
+void clear_signals(int);
/* control.c */
-void control_callback(struct client *, int, void*);
+void control_callback(struct client *, int, void*);
/* session.c */
extern struct sessions sessions;