Annotation of embedaddon/tmux/notify.c, revision 1.1
1.1 ! misho 1: /* $OpenBSD$ */
! 2:
! 3: /*
! 4: * Copyright (c) 2012 George Nachman <tmux@georgester.com>
! 5: *
! 6: * Permission to use, copy, modify, and distribute this software for any
! 7: * purpose with or without fee is hereby granted, provided that the above
! 8: * copyright notice and this permission notice appear in all copies.
! 9: *
! 10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 14: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
! 15: * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
! 16: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 17: */
! 18:
! 19: #include <sys/types.h>
! 20:
! 21: #include <stdlib.h>
! 22: #include <string.h>
! 23:
! 24: #include "tmux.h"
! 25:
! 26: struct notify_entry {
! 27: const char *name;
! 28:
! 29: struct client *client;
! 30: struct session *session;
! 31: struct window *window;
! 32: int pane;
! 33:
! 34: struct cmd_find_state fs;
! 35: };
! 36:
! 37: static void
! 38: notify_hook(struct cmdq_item *item, struct notify_entry *ne)
! 39: {
! 40: struct cmd_find_state fs;
! 41: struct hook *hook;
! 42: struct cmdq_item *new_item;
! 43: struct session *s = ne->session;
! 44: struct window *w = ne->window;
! 45:
! 46: cmd_find_clear_state(&fs, NULL, 0);
! 47: if (cmd_find_empty_state(&ne->fs) || !cmd_find_valid_state(&ne->fs))
! 48: cmd_find_current(&fs, item, CMD_FIND_QUIET);
! 49: else
! 50: cmd_find_copy_state(&fs, &ne->fs);
! 51:
! 52: hook = hooks_find(hooks_get(fs.s), ne->name);
! 53: if (hook == NULL)
! 54: return;
! 55: log_debug("notify hook %s", ne->name);
! 56:
! 57: new_item = cmdq_get_command(hook->cmdlist, &fs, NULL, CMDQ_NOHOOKS);
! 58: cmdq_format(new_item, "hook", "%s", ne->name);
! 59:
! 60: if (s != NULL) {
! 61: cmdq_format(new_item, "hook_session", "$%u", s->id);
! 62: cmdq_format(new_item, "hook_session_name", "%s", s->name);
! 63: }
! 64: if (w != NULL) {
! 65: cmdq_format(new_item, "hook_window", "@%u", w->id);
! 66: cmdq_format(new_item, "hook_window_name", "%s", w->name);
! 67: }
! 68: if (ne->pane != -1)
! 69: cmdq_format(new_item, "hook_pane", "%%%d", ne->pane);
! 70:
! 71: cmdq_insert_after(item, new_item);
! 72: }
! 73:
! 74: static enum cmd_retval
! 75: notify_callback(struct cmdq_item *item, void *data)
! 76: {
! 77: struct notify_entry *ne = data;
! 78:
! 79: log_debug("%s: %s", __func__, ne->name);
! 80:
! 81: if (strcmp(ne->name, "window-layout-changed") == 0)
! 82: control_notify_window_layout_changed(ne->window);
! 83: if (strcmp(ne->name, "window-unlinked") == 0)
! 84: control_notify_window_unlinked(ne->session, ne->window);
! 85: if (strcmp(ne->name, "window-linked") == 0)
! 86: control_notify_window_linked(ne->session, ne->window);
! 87: if (strcmp(ne->name, "window-renamed") == 0)
! 88: control_notify_window_renamed(ne->window);
! 89: if (strcmp(ne->name, "client-session-changed") == 0)
! 90: control_notify_client_session_changed(ne->client);
! 91: if (strcmp(ne->name, "session-renamed") == 0)
! 92: control_notify_session_renamed(ne->session);
! 93: if (strcmp(ne->name, "session-created") == 0)
! 94: control_notify_session_created(ne->session);
! 95: if (strcmp(ne->name, "session-closed") == 0)
! 96: control_notify_session_closed(ne->session);
! 97:
! 98: notify_hook(item, ne);
! 99:
! 100: if (ne->client != NULL)
! 101: server_client_unref(ne->client);
! 102: if (ne->session != NULL)
! 103: session_unref(ne->session);
! 104: if (ne->window != NULL)
! 105: window_remove_ref(ne->window);
! 106:
! 107: if (ne->fs.s != NULL)
! 108: session_unref(ne->fs.s);
! 109:
! 110: free((void *)ne->name);
! 111: free(ne);
! 112:
! 113: return (CMD_RETURN_NORMAL);
! 114: }
! 115:
! 116: static void
! 117: notify_add(const char *name, struct cmd_find_state *fs, struct client *c,
! 118: struct session *s, struct window *w, struct window_pane *wp)
! 119: {
! 120: struct notify_entry *ne;
! 121: struct cmdq_item *new_item;
! 122:
! 123: ne = xcalloc(1, sizeof *ne);
! 124: ne->name = xstrdup(name);
! 125:
! 126: ne->client = c;
! 127: ne->session = s;
! 128: ne->window = w;
! 129:
! 130: if (wp != NULL)
! 131: ne->pane = wp->id;
! 132: else
! 133: ne->pane = -1;
! 134:
! 135: if (c != NULL)
! 136: c->references++;
! 137: if (s != NULL)
! 138: s->references++;
! 139: if (w != NULL)
! 140: w->references++;
! 141:
! 142: cmd_find_copy_state(&ne->fs, fs);
! 143: if (ne->fs.s != NULL)
! 144: ne->fs.s->references++; /* cmd_find_valid_state need session */
! 145:
! 146: new_item = cmdq_get_callback(notify_callback, ne);
! 147: cmdq_append(NULL, new_item);
! 148: }
! 149:
! 150: void
! 151: notify_input(struct window_pane *wp, struct evbuffer *input)
! 152: {
! 153: struct client *c;
! 154:
! 155: TAILQ_FOREACH(c, &clients, entry) {
! 156: if (c->flags & CLIENT_CONTROL)
! 157: control_notify_input(c, wp, input);
! 158: }
! 159: }
! 160:
! 161: void
! 162: notify_client(const char *name, struct client *c)
! 163: {
! 164: struct cmd_find_state fs;
! 165:
! 166: if (c->session != NULL)
! 167: cmd_find_from_session(&fs, c->session);
! 168: else
! 169: cmd_find_current(&fs, NULL, CMD_FIND_QUIET);
! 170: notify_add(name, &fs, c, NULL, NULL, NULL);
! 171: }
! 172:
! 173: void
! 174: notify_session(const char *name, struct session *s)
! 175: {
! 176: struct cmd_find_state fs;
! 177:
! 178: if (session_alive(s))
! 179: cmd_find_from_session(&fs, s);
! 180: else
! 181: cmd_find_current(&fs, NULL, CMD_FIND_QUIET);
! 182: notify_add(name, &fs, NULL, s, NULL, NULL);
! 183: }
! 184:
! 185: void
! 186: notify_winlink(const char *name, struct session *s, struct winlink *wl)
! 187: {
! 188: struct cmd_find_state fs;
! 189:
! 190: cmd_find_from_winlink(&fs, s, wl);
! 191: notify_add(name, &fs, NULL, s, wl->window, NULL);
! 192: }
! 193:
! 194: void
! 195: notify_session_window(const char *name, struct session *s, struct window *w)
! 196: {
! 197: struct cmd_find_state fs;
! 198:
! 199: cmd_find_from_session_window(&fs, s, w);
! 200: notify_add(name, &fs, NULL, s, w, NULL);
! 201: }
! 202:
! 203: void
! 204: notify_window(const char *name, struct window *w)
! 205: {
! 206: struct cmd_find_state fs;
! 207:
! 208: cmd_find_from_window(&fs, w);
! 209: notify_add(name, &fs, NULL, NULL, w, NULL);
! 210: }
! 211:
! 212: void
! 213: notify_pane(const char *name, struct window_pane *wp)
! 214: {
! 215: struct cmd_find_state fs;
! 216:
! 217: cmd_find_from_pane(&fs, wp);
! 218: notify_add(name, &fs, NULL, NULL, NULL, wp);
! 219: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>