summaryrefslogtreecommitdiffstats
path: root/notify.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2012-08-12 19:23:01 +0000
committerTiago Cunha <tcunha@gmx.com>2012-08-12 19:23:01 +0000
commitc8849ac990af34eef6b3516c392d1796b4fbeba3 (patch)
tree3cc0ecd6be9a992c44857d4d986060fb40978a7d /notify.c
parent44307712edd30911286fb350788b64ba77dc3a20 (diff)
Sync OpenBSD patchset 1153:
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 'notify.c')
-rw-r--r--notify.c145
1 files changed, 137 insertions, 8 deletions
diff --git a/notify.c b/notify.c
index ddce6d76..7d7491b6 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();
}