summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2012-07-13 06:27:41 +0000
committerNicholas Marriott <nicm@openbsd.org>2012-07-13 06:27:41 +0000
commit5385a9bb347ae703fdc44eb59c71d70e61fbf95e (patch)
tree8b62f04660a8c99b8315117072d6a06384c6dbdd
parent35a8a61254a190d2c4ec52f0525993ab1594bc44 (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.
-rw-r--r--cmd-list.c4
-rw-r--r--notify.c145
-rw-r--r--tmux.h8
3 files changed, 146 insertions, 11 deletions
diff --git a/cmd-list.c b/cmd-list.c
index 80d1ade3..2cf66a80 100644
--- a/cmd-list.c
+++ b/cmd-list.c
@@ -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/notify.c b/notify.c
index a9d89ee5..dad50b94 100644
--- a/notify.c
+++ b/notify.c
@@ -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/tmux.h b/tmux.h
index d189385f..6c03cdc3 100644
--- a/tmux.h
+++ b/tmux.h
@@ -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;