4 * Copyright (c) 2012 Nicholas Marriott <nicm@users.sourceforge.net>
5 * Copyright (c) 2012 George Nachman <tmux@georgester.com>
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
16 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
17 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 #include <sys/types.h>
24 #define CONTROL_SHOULD_NOTIFY_CLIENT(c) \
25 ((c) != NULL && ((c)->flags & CLIENT_CONTROL))
28 control_notify_input(struct client
*c
, struct window_pane
*wp
,
29 struct evbuffer
*input
)
33 struct evbuffer
*message
;
36 if (c
->session
== NULL
)
39 buf
= EVBUFFER_DATA(input
);
40 len
= EVBUFFER_LENGTH(input
);
43 * Only write input if the window pane is linked to a window belonging
44 * to the client's session.
46 if (winlink_find_by_window(&c
->session
->windows
, wp
->window
) != NULL
) {
47 message
= evbuffer_new();
48 evbuffer_add_printf(message
, "%%output %%%u ", wp
->id
);
49 for (i
= 0; i
< len
; i
++)
50 evbuffer_add_printf(message
, "%02hhx", buf
[i
]);
51 control_write_buffer(c
, message
);
52 evbuffer_free(message
);
57 control_notify_window_layout_changed(struct window
*w
)
61 struct format_tree
*ft
;
66 for (i
= 0; i
< ARRAY_LENGTH(&clients
); i
++) {
67 c
= ARRAY_ITEM(&clients
, i
);
68 if (!CONTROL_SHOULD_NOTIFY_CLIENT(c
) || c
->session
== NULL
)
72 if (winlink_find_by_window_id(&s
->windows
, w
->id
) == NULL
)
76 * When the last pane in a window is closed it won't have a
77 * layout root and we don't need to inform the client about the
78 * layout change because the whole window will go away soon.
80 if (w
->layout_root
== NULL
)
82 template = "%layout-change #{window_id} #{window_layout}";
85 wl
= winlink_find_by_window(&s
->windows
, w
);
87 format_winlink(ft
, c
->session
, wl
);
88 control_write(c
, "%s", format_expand(ft
, template));
95 control_notify_window_unlinked(unused
struct session
*s
, struct window
*w
)
101 for (i
= 0; i
< ARRAY_LENGTH(&clients
); i
++) {
102 c
= ARRAY_ITEM(&clients
, i
);
103 if (!CONTROL_SHOULD_NOTIFY_CLIENT(c
) || c
->session
== NULL
)
107 if (winlink_find_by_window_id(&cs
->windows
, w
->id
) != NULL
)
108 control_write(c
, "%%window-close %u", w
->id
);
110 control_write(c
, "%%unlinked-window-close %u", w
->id
);
115 control_notify_window_linked(unused
struct session
*s
, struct window
*w
)
121 for (i
= 0; i
< ARRAY_LENGTH(&clients
); i
++) {
122 c
= ARRAY_ITEM(&clients
, i
);
123 if (!CONTROL_SHOULD_NOTIFY_CLIENT(c
) || c
->session
== NULL
)
127 if (winlink_find_by_window_id(&cs
->windows
, w
->id
) != NULL
)
128 control_write(c
, "%%window-add %u", w
->id
);
130 control_write(c
, "%%unlinked-window-add %u", w
->id
);
135 control_notify_window_renamed(struct window
*w
)
141 for (i
= 0; i
< ARRAY_LENGTH(&clients
); i
++) {
142 c
= ARRAY_ITEM(&clients
, i
);
143 if (!CONTROL_SHOULD_NOTIFY_CLIENT(c
) || c
->session
== NULL
)
147 if (winlink_find_by_window_id(&s
->windows
, w
->id
) != NULL
) {
148 control_write(c
, "%%window-renamed %u %s",
151 control_write(c
, "%%unlinked-window-renamed %u %s",
158 control_notify_attached_session_changed(struct client
*c
)
162 if (!CONTROL_SHOULD_NOTIFY_CLIENT(c
) || c
->session
== NULL
)
166 control_write(c
, "%%session-changed %d %s", s
->idx
, s
->name
);
170 control_notify_session_renamed(struct session
*s
)
175 for (i
= 0; i
< ARRAY_LENGTH(&clients
); i
++) {
176 c
= ARRAY_ITEM(&clients
, i
);
177 if (!CONTROL_SHOULD_NOTIFY_CLIENT(c
) || c
->session
!= s
)
180 control_write(c
, "%%session-renamed %s", s
->name
);
185 control_notify_session_created(unused
struct session
*s
)
190 for (i
= 0; i
< ARRAY_LENGTH(&clients
); i
++) {
191 c
= ARRAY_ITEM(&clients
, i
);
192 if (!CONTROL_SHOULD_NOTIFY_CLIENT(c
) || c
->session
== NULL
)
195 control_write(c
, "%%sessions-changed");
200 control_notify_session_close(unused
struct session
*s
)
205 for (i
= 0; i
< ARRAY_LENGTH(&clients
); i
++) {
206 c
= ARRAY_ITEM(&clients
, i
);
207 if (!CONTROL_SHOULD_NOTIFY_CLIENT(c
) || c
->session
== NULL
)
210 control_write(c
, "%%sessions-changed");