1/* $OpenBSD: tmux.h,v 1.1215 2024/05/15 09:59:12 nicm Exp $ */
2
3/*
4 * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.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#ifndef TMUX_H
20#define TMUX_H
21
22#include <sys/time.h>
23#include <sys/queue.h>
24#include <sys/tree.h>
25
26#include <bitstring.h>
27#include <event.h>
28#include <limits.h>
29#include <stdarg.h>
30#include <stdint.h>
31#include <stdio.h>
32#include <termios.h>
33#include <wchar.h>
34
35#include "tmux-protocol.h"
36#include "xmalloc.h"
37
38extern char   **environ;
39
40struct args;
41struct args_command_state;
42struct client;
43struct cmd;
44struct cmd_find_state;
45struct cmdq_item;
46struct cmdq_list;
47struct cmdq_state;
48struct cmds;
49struct control_state;
50struct environ;
51struct format_job_tree;
52struct format_tree;
53struct hyperlinks_uri;
54struct hyperlinks;
55struct input_ctx;
56struct job;
57struct menu_data;
58struct mode_tree_data;
59struct mouse_event;
60struct options;
61struct options_array_item;
62struct options_entry;
63struct screen_write_citem;
64struct screen_write_cline;
65struct screen_write_ctx;
66struct session;
67struct tty_ctx;
68struct tty_code;
69struct tty_key;
70struct tmuxpeer;
71struct tmuxproc;
72struct winlink;
73
74/* Default configuration files and socket paths. */
75#ifndef TMUX_CONF
76#define TMUX_CONF "/etc/tmux.conf:~/.tmux.conf"
77#endif
78#ifndef TMUX_SOCK
79#define TMUX_SOCK "$TMUX_TMPDIR:" _PATH_TMP
80#endif
81#ifndef TMUX_TERM
82#define TMUX_TERM "screen"
83#endif
84
85/* Minimum layout cell size, NOT including border lines. */
86#define PANE_MINIMUM 1
87
88/* Minimum and maximum window size. */
89#define WINDOW_MINIMUM PANE_MINIMUM
90#define WINDOW_MAXIMUM 10000
91
92/* Automatic name refresh interval, in microseconds. Must be < 1 second. */
93#define NAME_INTERVAL 500000
94
95/* Default pixel cell sizes. */
96#define DEFAULT_XPIXEL 16
97#define DEFAULT_YPIXEL 32
98
99/* Attribute to make GCC check printf-like arguments. */
100#define printflike(a, b) __attribute__ ((format (printf, a, b)))
101
102/* Number of items in array. */
103#ifndef nitems
104#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
105#endif
106
107/* Alert option values. */
108#define ALERT_NONE 0
109#define ALERT_ANY 1
110#define ALERT_CURRENT 2
111#define ALERT_OTHER 3
112
113/* Visual option values. */
114#define VISUAL_OFF 0
115#define VISUAL_ON 1
116#define VISUAL_BOTH 2
117
118/* No key or unknown key. */
119#define KEYC_NONE            0x000ff000000000ULL
120#define KEYC_UNKNOWN         0x000fe000000000ULL
121
122/*
123 * Base for special (that is, not Unicode) keys. An enum must be at most a
124 * signed int, so these are based in the highest Unicode PUA.
125 */
126#define KEYC_BASE            0x0000000010e000ULL
127#define KEYC_USER            0x0000000010f000ULL
128
129/* Key modifier bits. */
130#define KEYC_META            0x00100000000000ULL
131#define KEYC_CTRL            0x00200000000000ULL
132#define KEYC_SHIFT           0x00400000000000ULL
133
134/* Key flag bits. */
135#define KEYC_LITERAL	     0x01000000000000ULL
136#define KEYC_KEYPAD	     0x02000000000000ULL
137#define KEYC_CURSOR	     0x04000000000000ULL
138#define KEYC_IMPLIED_META    0x08000000000000ULL
139#define KEYC_BUILD_MODIFIERS 0x10000000000000ULL
140#define KEYC_VI		     0x20000000000000ULL
141#define KEYC_EXTENDED	     0x40000000000000ULL
142#define KEYC_SENT	     0x80000000000000ULL
143
144/* Masks for key bits. */
145#define KEYC_MASK_MODIFIERS  0x00f00000000000ULL
146#define KEYC_MASK_FLAGS      0xff000000000000ULL
147#define KEYC_MASK_KEY        0x000fffffffffffULL
148
149/* Available user keys. */
150#define KEYC_NUSER 1000
151
152/* Is this a mouse key? */
153#define KEYC_IS_MOUSE(key) \
154	(((key) & KEYC_MASK_KEY) >= KEYC_MOUSE && \
155	 ((key) & KEYC_MASK_KEY) < KEYC_BSPACE)
156
157/* Is this a Unicode key? */
158#define KEYC_IS_UNICODE(key) \
159	(((key) & KEYC_MASK_KEY) > 0x7f && \
160	 (((key) & KEYC_MASK_KEY) < KEYC_BASE || \
161	  ((key) & KEYC_MASK_KEY) >= KEYC_BASE_END) && \
162	 (((key) & KEYC_MASK_KEY) < KEYC_USER || \
163	  ((key) & KEYC_MASK_KEY) >= KEYC_USER + KEYC_NUSER))
164
165/* Multiple click timeout. */
166#define KEYC_CLICK_TIMEOUT 300
167
168/* Mouse key codes. */
169#define KEYC_MOUSE_KEY(name)					\
170	KEYC_ ## name ## _PANE,					\
171	KEYC_ ## name ## _STATUS,				\
172	KEYC_ ## name ## _STATUS_LEFT,				\
173	KEYC_ ## name ## _STATUS_RIGHT,				\
174	KEYC_ ## name ## _STATUS_DEFAULT,			\
175	KEYC_ ## name ## _BORDER
176#define KEYC_MOUSE_STRING(name, s)				\
177	{ #s "Pane", KEYC_ ## name ## _PANE },			\
178	{ #s "Status", KEYC_ ## name ## _STATUS },		\
179	{ #s "StatusLeft", KEYC_ ## name ## _STATUS_LEFT },	\
180	{ #s "StatusRight", KEYC_ ## name ## _STATUS_RIGHT },	\
181	{ #s "StatusDefault", KEYC_ ## name ## _STATUS_DEFAULT }, \
182	{ #s "Border", KEYC_ ## name ## _BORDER }
183
184/*
185 * A single key. This can be ASCII or Unicode or one of the keys between
186 * KEYC_BASE and KEYC_BASE_END.
187 */
188typedef unsigned long long key_code;
189
190/* Special key codes. */
191enum {
192	/* Focus events. */
193	KEYC_FOCUS_IN = KEYC_BASE,
194	KEYC_FOCUS_OUT,
195
196	/* "Any" key, used if not found in key table. */
197	KEYC_ANY,
198
199	/* Paste brackets. */
200	KEYC_PASTE_START,
201	KEYC_PASTE_END,
202
203	/* Mouse keys. */
204	KEYC_MOUSE, /* unclassified mouse event */
205	KEYC_DRAGGING, /* dragging in progress */
206	KEYC_DOUBLECLICK, /* double click complete */
207	KEYC_MOUSE_KEY(MOUSEMOVE),
208	KEYC_MOUSE_KEY(MOUSEDOWN1),
209	KEYC_MOUSE_KEY(MOUSEDOWN2),
210	KEYC_MOUSE_KEY(MOUSEDOWN3),
211	KEYC_MOUSE_KEY(MOUSEDOWN6),
212	KEYC_MOUSE_KEY(MOUSEDOWN7),
213	KEYC_MOUSE_KEY(MOUSEDOWN8),
214	KEYC_MOUSE_KEY(MOUSEDOWN9),
215	KEYC_MOUSE_KEY(MOUSEDOWN10),
216	KEYC_MOUSE_KEY(MOUSEDOWN11),
217	KEYC_MOUSE_KEY(MOUSEUP1),
218	KEYC_MOUSE_KEY(MOUSEUP2),
219	KEYC_MOUSE_KEY(MOUSEUP3),
220	KEYC_MOUSE_KEY(MOUSEUP6),
221	KEYC_MOUSE_KEY(MOUSEUP7),
222	KEYC_MOUSE_KEY(MOUSEUP8),
223	KEYC_MOUSE_KEY(MOUSEUP9),
224	KEYC_MOUSE_KEY(MOUSEUP10),
225	KEYC_MOUSE_KEY(MOUSEUP11),
226	KEYC_MOUSE_KEY(MOUSEDRAG1),
227	KEYC_MOUSE_KEY(MOUSEDRAG2),
228	KEYC_MOUSE_KEY(MOUSEDRAG3),
229	KEYC_MOUSE_KEY(MOUSEDRAG6),
230	KEYC_MOUSE_KEY(MOUSEDRAG7),
231	KEYC_MOUSE_KEY(MOUSEDRAG8),
232	KEYC_MOUSE_KEY(MOUSEDRAG9),
233	KEYC_MOUSE_KEY(MOUSEDRAG10),
234	KEYC_MOUSE_KEY(MOUSEDRAG11),
235	KEYC_MOUSE_KEY(MOUSEDRAGEND1),
236	KEYC_MOUSE_KEY(MOUSEDRAGEND2),
237	KEYC_MOUSE_KEY(MOUSEDRAGEND3),
238	KEYC_MOUSE_KEY(MOUSEDRAGEND6),
239	KEYC_MOUSE_KEY(MOUSEDRAGEND7),
240	KEYC_MOUSE_KEY(MOUSEDRAGEND8),
241	KEYC_MOUSE_KEY(MOUSEDRAGEND9),
242	KEYC_MOUSE_KEY(MOUSEDRAGEND10),
243	KEYC_MOUSE_KEY(MOUSEDRAGEND11),
244	KEYC_MOUSE_KEY(WHEELUP),
245	KEYC_MOUSE_KEY(WHEELDOWN),
246	KEYC_MOUSE_KEY(SECONDCLICK1),
247	KEYC_MOUSE_KEY(SECONDCLICK2),
248	KEYC_MOUSE_KEY(SECONDCLICK3),
249	KEYC_MOUSE_KEY(SECONDCLICK6),
250	KEYC_MOUSE_KEY(SECONDCLICK7),
251	KEYC_MOUSE_KEY(SECONDCLICK8),
252	KEYC_MOUSE_KEY(SECONDCLICK9),
253	KEYC_MOUSE_KEY(SECONDCLICK10),
254	KEYC_MOUSE_KEY(SECONDCLICK11),
255	KEYC_MOUSE_KEY(DOUBLECLICK1),
256	KEYC_MOUSE_KEY(DOUBLECLICK2),
257	KEYC_MOUSE_KEY(DOUBLECLICK3),
258	KEYC_MOUSE_KEY(DOUBLECLICK6),
259	KEYC_MOUSE_KEY(DOUBLECLICK7),
260	KEYC_MOUSE_KEY(DOUBLECLICK8),
261	KEYC_MOUSE_KEY(DOUBLECLICK9),
262	KEYC_MOUSE_KEY(DOUBLECLICK10),
263	KEYC_MOUSE_KEY(DOUBLECLICK11),
264	KEYC_MOUSE_KEY(TRIPLECLICK1),
265	KEYC_MOUSE_KEY(TRIPLECLICK2),
266	KEYC_MOUSE_KEY(TRIPLECLICK3),
267	KEYC_MOUSE_KEY(TRIPLECLICK6),
268	KEYC_MOUSE_KEY(TRIPLECLICK7),
269	KEYC_MOUSE_KEY(TRIPLECLICK8),
270	KEYC_MOUSE_KEY(TRIPLECLICK9),
271	KEYC_MOUSE_KEY(TRIPLECLICK10),
272	KEYC_MOUSE_KEY(TRIPLECLICK11),
273
274	/* Backspace key. */
275	KEYC_BSPACE,
276
277	/* Function keys. */
278	KEYC_F1,
279	KEYC_F2,
280	KEYC_F3,
281	KEYC_F4,
282	KEYC_F5,
283	KEYC_F6,
284	KEYC_F7,
285	KEYC_F8,
286	KEYC_F9,
287	KEYC_F10,
288	KEYC_F11,
289	KEYC_F12,
290	KEYC_IC,
291	KEYC_DC,
292	KEYC_HOME,
293	KEYC_END,
294	KEYC_NPAGE,
295	KEYC_PPAGE,
296	KEYC_BTAB,
297
298	/* Arrow keys. */
299	KEYC_UP,
300	KEYC_DOWN,
301	KEYC_LEFT,
302	KEYC_RIGHT,
303
304	/* Numeric keypad. */
305	KEYC_KP_SLASH,
306	KEYC_KP_STAR,
307	KEYC_KP_MINUS,
308	KEYC_KP_SEVEN,
309	KEYC_KP_EIGHT,
310	KEYC_KP_NINE,
311	KEYC_KP_PLUS,
312	KEYC_KP_FOUR,
313	KEYC_KP_FIVE,
314	KEYC_KP_SIX,
315	KEYC_KP_ONE,
316	KEYC_KP_TWO,
317	KEYC_KP_THREE,
318	KEYC_KP_ENTER,
319	KEYC_KP_ZERO,
320	KEYC_KP_PERIOD,
321
322	/* End of special keys. */
323	KEYC_BASE_END
324};
325
326/* Termcap codes. */
327enum tty_code_code {
328	TTYC_ACSC,
329	TTYC_AM,
330	TTYC_AX,
331	TTYC_BCE,
332	TTYC_BEL,
333	TTYC_BIDI,
334	TTYC_BLINK,
335	TTYC_BOLD,
336	TTYC_CIVIS,
337	TTYC_CLEAR,
338	TTYC_CLMG,
339	TTYC_CMG,
340	TTYC_CNORM,
341	TTYC_COLORS,
342	TTYC_CR,
343	TTYC_CS,
344	TTYC_CSR,
345	TTYC_CUB,
346	TTYC_CUB1,
347	TTYC_CUD,
348	TTYC_CUD1,
349	TTYC_CUF,
350	TTYC_CUF1,
351	TTYC_CUP,
352	TTYC_CUU,
353	TTYC_CUU1,
354	TTYC_CVVIS,
355	TTYC_DCH,
356	TTYC_DCH1,
357	TTYC_DIM,
358	TTYC_DL,
359	TTYC_DL1,
360	TTYC_DSBP,
361	TTYC_DSEKS,
362	TTYC_DSFCS,
363	TTYC_DSMG,
364	TTYC_E3,
365	TTYC_ECH,
366	TTYC_ED,
367	TTYC_EL,
368	TTYC_EL1,
369	TTYC_ENACS,
370	TTYC_ENBP,
371	TTYC_ENEKS,
372	TTYC_ENFCS,
373	TTYC_ENMG,
374	TTYC_FSL,
375	TTYC_HLS,
376	TTYC_HOME,
377	TTYC_HPA,
378	TTYC_ICH,
379	TTYC_ICH1,
380	TTYC_IL,
381	TTYC_IL1,
382	TTYC_INDN,
383	TTYC_INVIS,
384	TTYC_KCBT,
385	TTYC_KCUB1,
386	TTYC_KCUD1,
387	TTYC_KCUF1,
388	TTYC_KCUU1,
389	TTYC_KDC2,
390	TTYC_KDC3,
391	TTYC_KDC4,
392	TTYC_KDC5,
393	TTYC_KDC6,
394	TTYC_KDC7,
395	TTYC_KDCH1,
396	TTYC_KDN2,
397	TTYC_KDN3,
398	TTYC_KDN4,
399	TTYC_KDN5,
400	TTYC_KDN6,
401	TTYC_KDN7,
402	TTYC_KEND,
403	TTYC_KEND2,
404	TTYC_KEND3,
405	TTYC_KEND4,
406	TTYC_KEND5,
407	TTYC_KEND6,
408	TTYC_KEND7,
409	TTYC_KF1,
410	TTYC_KF10,
411	TTYC_KF11,
412	TTYC_KF12,
413	TTYC_KF13,
414	TTYC_KF14,
415	TTYC_KF15,
416	TTYC_KF16,
417	TTYC_KF17,
418	TTYC_KF18,
419	TTYC_KF19,
420	TTYC_KF2,
421	TTYC_KF20,
422	TTYC_KF21,
423	TTYC_KF22,
424	TTYC_KF23,
425	TTYC_KF24,
426	TTYC_KF25,
427	TTYC_KF26,
428	TTYC_KF27,
429	TTYC_KF28,
430	TTYC_KF29,
431	TTYC_KF3,
432	TTYC_KF30,
433	TTYC_KF31,
434	TTYC_KF32,
435	TTYC_KF33,
436	TTYC_KF34,
437	TTYC_KF35,
438	TTYC_KF36,
439	TTYC_KF37,
440	TTYC_KF38,
441	TTYC_KF39,
442	TTYC_KF4,
443	TTYC_KF40,
444	TTYC_KF41,
445	TTYC_KF42,
446	TTYC_KF43,
447	TTYC_KF44,
448	TTYC_KF45,
449	TTYC_KF46,
450	TTYC_KF47,
451	TTYC_KF48,
452	TTYC_KF49,
453	TTYC_KF5,
454	TTYC_KF50,
455	TTYC_KF51,
456	TTYC_KF52,
457	TTYC_KF53,
458	TTYC_KF54,
459	TTYC_KF55,
460	TTYC_KF56,
461	TTYC_KF57,
462	TTYC_KF58,
463	TTYC_KF59,
464	TTYC_KF6,
465	TTYC_KF60,
466	TTYC_KF61,
467	TTYC_KF62,
468	TTYC_KF63,
469	TTYC_KF7,
470	TTYC_KF8,
471	TTYC_KF9,
472	TTYC_KHOM2,
473	TTYC_KHOM3,
474	TTYC_KHOM4,
475	TTYC_KHOM5,
476	TTYC_KHOM6,
477	TTYC_KHOM7,
478	TTYC_KHOME,
479	TTYC_KIC2,
480	TTYC_KIC3,
481	TTYC_KIC4,
482	TTYC_KIC5,
483	TTYC_KIC6,
484	TTYC_KIC7,
485	TTYC_KICH1,
486	TTYC_KIND,
487	TTYC_KLFT2,
488	TTYC_KLFT3,
489	TTYC_KLFT4,
490	TTYC_KLFT5,
491	TTYC_KLFT6,
492	TTYC_KLFT7,
493	TTYC_KMOUS,
494	TTYC_KNP,
495	TTYC_KNXT2,
496	TTYC_KNXT3,
497	TTYC_KNXT4,
498	TTYC_KNXT5,
499	TTYC_KNXT6,
500	TTYC_KNXT7,
501	TTYC_KPP,
502	TTYC_KPRV2,
503	TTYC_KPRV3,
504	TTYC_KPRV4,
505	TTYC_KPRV5,
506	TTYC_KPRV6,
507	TTYC_KPRV7,
508	TTYC_KRI,
509	TTYC_KRIT2,
510	TTYC_KRIT3,
511	TTYC_KRIT4,
512	TTYC_KRIT5,
513	TTYC_KRIT6,
514	TTYC_KRIT7,
515	TTYC_KUP2,
516	TTYC_KUP3,
517	TTYC_KUP4,
518	TTYC_KUP5,
519	TTYC_KUP6,
520	TTYC_KUP7,
521	TTYC_MS,
522	TTYC_NOBR,
523	TTYC_OL,
524	TTYC_OP,
525	TTYC_RECT,
526	TTYC_REV,
527	TTYC_RGB,
528	TTYC_RI,
529	TTYC_RIN,
530	TTYC_RMACS,
531	TTYC_RMCUP,
532	TTYC_RMKX,
533	TTYC_SE,
534	TTYC_SETAB,
535	TTYC_SETAF,
536	TTYC_SETAL,
537	TTYC_SETRGBB,
538	TTYC_SETRGBF,
539	TTYC_SETULC,
540	TTYC_SETULC1,
541	TTYC_SGR0,
542	TTYC_SITM,
543	TTYC_SMACS,
544	TTYC_SMCUP,
545	TTYC_SMKX,
546	TTYC_SMOL,
547	TTYC_SMSO,
548	TTYC_SMUL,
549	TTYC_SMULX,
550	TTYC_SMXX,
551	TTYC_SXL,
552	TTYC_SS,
553	TTYC_SWD,
554	TTYC_SYNC,
555	TTYC_TC,
556	TTYC_TSL,
557	TTYC_U8,
558	TTYC_VPA,
559	TTYC_XT
560};
561
562/* Character classes. */
563#define WHITESPACE " "
564
565/* Mode keys. */
566#define MODEKEY_EMACS 0
567#define MODEKEY_VI 1
568
569/* Modes. */
570#define MODE_CURSOR 0x1
571#define MODE_INSERT 0x2
572#define MODE_KCURSOR 0x4
573#define MODE_KKEYPAD 0x8
574#define MODE_WRAP 0x10
575#define MODE_MOUSE_STANDARD 0x20
576#define MODE_MOUSE_BUTTON 0x40
577#define MODE_CURSOR_BLINKING 0x80
578#define MODE_MOUSE_UTF8 0x100
579#define MODE_MOUSE_SGR 0x200
580#define MODE_BRACKETPASTE 0x400
581#define MODE_FOCUSON 0x800
582#define MODE_MOUSE_ALL 0x1000
583#define MODE_ORIGIN 0x2000
584#define MODE_CRLF 0x4000
585#define MODE_KEXTENDED 0x8000
586#define MODE_CURSOR_VERY_VISIBLE 0x10000
587#define MODE_CURSOR_BLINKING_SET 0x20000
588
589#define ALL_MODES 0xffffff
590#define ALL_MOUSE_MODES (MODE_MOUSE_STANDARD|MODE_MOUSE_BUTTON|MODE_MOUSE_ALL)
591#define MOTION_MOUSE_MODES (MODE_MOUSE_BUTTON|MODE_MOUSE_ALL)
592#define CURSOR_MODES (MODE_CURSOR|MODE_CURSOR_BLINKING|MODE_CURSOR_VERY_VISIBLE)
593
594/* Mouse protocol constants. */
595#define MOUSE_PARAM_MAX 0xff
596#define MOUSE_PARAM_UTF8_MAX 0x7ff
597#define MOUSE_PARAM_BTN_OFF 0x20
598#define MOUSE_PARAM_POS_OFF 0x21
599
600/* A single UTF-8 character. */
601typedef u_int utf8_char;
602
603/*
604 * An expanded UTF-8 character. UTF8_SIZE must be big enough to hold combining
605 * characters as well. It can't be more than 32 bytes without changes to how
606 * characters are stored.
607 */
608#define UTF8_SIZE 21
609struct utf8_data {
610	u_char	data[UTF8_SIZE];
611
612	u_char	have;
613	u_char	size;
614
615	u_char	width;	/* 0xff if invalid */
616};
617enum utf8_state {
618	UTF8_MORE,
619	UTF8_DONE,
620	UTF8_ERROR
621};
622
623/* Colour flags. */
624#define COLOUR_FLAG_256 0x01000000
625#define COLOUR_FLAG_RGB 0x02000000
626
627/* Special colours. */
628#define COLOUR_DEFAULT(c) ((c) == 8 || (c) == 9)
629
630/* Replacement palette. */
631struct colour_palette {
632	int	 fg;
633	int	 bg;
634
635	int	*palette;
636	int	*default_palette;
637};
638
639/* Grid attributes. Anything above 0xff is stored in an extended cell. */
640#define GRID_ATTR_BRIGHT 0x1
641#define GRID_ATTR_DIM 0x2
642#define GRID_ATTR_UNDERSCORE 0x4
643#define GRID_ATTR_BLINK 0x8
644#define GRID_ATTR_REVERSE 0x10
645#define GRID_ATTR_HIDDEN 0x20
646#define GRID_ATTR_ITALICS 0x40
647#define GRID_ATTR_CHARSET 0x80	/* alternative character set */
648#define GRID_ATTR_STRIKETHROUGH 0x100
649#define GRID_ATTR_UNDERSCORE_2 0x200
650#define GRID_ATTR_UNDERSCORE_3 0x400
651#define GRID_ATTR_UNDERSCORE_4 0x800
652#define GRID_ATTR_UNDERSCORE_5 0x1000
653#define GRID_ATTR_OVERLINE 0x2000
654
655/* All underscore attributes. */
656#define GRID_ATTR_ALL_UNDERSCORE \
657	(GRID_ATTR_UNDERSCORE|	 \
658	 GRID_ATTR_UNDERSCORE_2| \
659	 GRID_ATTR_UNDERSCORE_3| \
660	 GRID_ATTR_UNDERSCORE_4| \
661	 GRID_ATTR_UNDERSCORE_5)
662
663/* Grid flags. */
664#define GRID_FLAG_FG256 0x1
665#define GRID_FLAG_BG256 0x2
666#define GRID_FLAG_PADDING 0x4
667#define GRID_FLAG_EXTENDED 0x8
668#define GRID_FLAG_SELECTED 0x10
669#define GRID_FLAG_NOPALETTE 0x20
670#define GRID_FLAG_CLEARED 0x40
671
672/* Grid line flags. */
673#define GRID_LINE_WRAPPED 0x1
674#define GRID_LINE_EXTENDED 0x2
675#define GRID_LINE_DEAD 0x4
676#define GRID_LINE_START_PROMPT 0x8
677#define GRID_LINE_START_OUTPUT 0x10
678
679/* Grid string flags. */
680#define GRID_STRING_WITH_SEQUENCES 0x1
681#define GRID_STRING_ESCAPE_SEQUENCES 0x2
682#define GRID_STRING_TRIM_SPACES 0x4
683#define GRID_STRING_USED_ONLY 0x8
684#define GRID_STRING_EMPTY_CELLS 0x10
685
686/* Cell positions. */
687#define CELL_INSIDE 0
688#define CELL_TOPBOTTOM 1
689#define CELL_LEFTRIGHT 2
690#define CELL_TOPLEFT 3
691#define CELL_TOPRIGHT 4
692#define CELL_BOTTOMLEFT 5
693#define CELL_BOTTOMRIGHT 6
694#define CELL_TOPJOIN 7
695#define CELL_BOTTOMJOIN 8
696#define CELL_LEFTJOIN 9
697#define CELL_RIGHTJOIN 10
698#define CELL_JOIN 11
699#define CELL_OUTSIDE 12
700
701/* Cell borders. */
702#define CELL_BORDERS " xqlkmjwvtun~"
703#define SIMPLE_BORDERS " |-+++++++++."
704#define PADDED_BORDERS "             "
705
706/* Grid cell data. */
707struct grid_cell {
708	struct utf8_data	data;
709	u_short			attr;
710	u_char			flags;
711	int			fg;
712	int			bg;
713	int			us;
714	u_int			link;
715};
716
717/* Grid extended cell entry. */
718struct grid_extd_entry {
719	utf8_char		data;
720	u_short			attr;
721	u_char			flags;
722	int			fg;
723	int			bg;
724	int			us;
725	u_int			link;
726} __packed;
727
728/* Grid cell entry. */
729struct grid_cell_entry {
730	union {
731		u_int		offset;
732		struct {
733			u_char	attr;
734			u_char	fg;
735			u_char	bg;
736			u_char	data;
737		} data;
738	};
739	u_char			flags;
740} __packed;
741
742/* Grid line. */
743struct grid_line {
744	struct grid_cell_entry	*celldata;
745	u_int			 cellused;
746	u_int			 cellsize;
747
748	struct grid_extd_entry	*extddata;
749	u_int			 extdsize;
750
751	int			 flags;
752	time_t			 time;
753};
754
755/* Entire grid of cells. */
756struct grid {
757	int			 flags;
758#define GRID_HISTORY 0x1 /* scroll lines into history */
759
760	u_int			 sx;
761	u_int			 sy;
762
763	u_int			 hscrolled;
764	u_int			 hsize;
765	u_int			 hlimit;
766
767	struct grid_line	*linedata;
768};
769
770/* Virtual cursor in a grid. */
771struct grid_reader {
772	struct grid	*gd;
773	u_int		 cx;
774	u_int		 cy;
775};
776
777/* Style alignment. */
778enum style_align {
779	STYLE_ALIGN_DEFAULT,
780	STYLE_ALIGN_LEFT,
781	STYLE_ALIGN_CENTRE,
782	STYLE_ALIGN_RIGHT,
783	STYLE_ALIGN_ABSOLUTE_CENTRE
784};
785
786/* Style list. */
787enum style_list {
788	STYLE_LIST_OFF,
789	STYLE_LIST_ON,
790	STYLE_LIST_FOCUS,
791	STYLE_LIST_LEFT_MARKER,
792	STYLE_LIST_RIGHT_MARKER,
793};
794
795/* Style range. */
796enum style_range_type {
797	STYLE_RANGE_NONE,
798	STYLE_RANGE_LEFT,
799	STYLE_RANGE_RIGHT,
800	STYLE_RANGE_PANE,
801	STYLE_RANGE_WINDOW,
802	STYLE_RANGE_SESSION,
803	STYLE_RANGE_USER
804};
805struct style_range {
806	enum style_range_type	 type;
807	u_int			 argument;
808	char			 string[16];
809
810	u_int			 start;
811	u_int			 end; /* not included */
812
813	TAILQ_ENTRY(style_range) entry;
814};
815TAILQ_HEAD(style_ranges, style_range);
816
817/* Style default. */
818enum style_default_type {
819	STYLE_DEFAULT_BASE,
820	STYLE_DEFAULT_PUSH,
821	STYLE_DEFAULT_POP
822};
823
824/* Style option. */
825struct style {
826	struct grid_cell	gc;
827	int			ignore;
828
829	int			fill;
830	enum style_align	align;
831	enum style_list		list;
832
833	enum style_range_type	range_type;
834	u_int			range_argument;
835	char			range_string[16];
836
837	enum style_default_type	default_type;
838};
839
840/* Cursor style. */
841enum screen_cursor_style {
842	SCREEN_CURSOR_DEFAULT,
843	SCREEN_CURSOR_BLOCK,
844	SCREEN_CURSOR_UNDERLINE,
845	SCREEN_CURSOR_BAR
846};
847
848/* Virtual screen. */
849struct screen_sel;
850struct screen_titles;
851struct screen {
852	char				*title;
853	char *path;
854	struct screen_titles		*titles;
855
856	struct grid			*grid;	  /* grid data */
857
858	u_int				 cx;	  /* cursor x */
859	u_int				 cy;	  /* cursor y */
860
861	enum screen_cursor_style	 cstyle;  /* cursor style */
862	enum screen_cursor_style	 default_cstyle;
863	int				 ccolour; /* cursor colour */
864	int				 default_ccolour;
865
866	u_int				 rupper;  /* scroll region top */
867	u_int				 rlower;  /* scroll region bottom */
868
869	int				 mode;
870	int				 default_mode;
871
872	u_int				 saved_cx;
873	u_int				 saved_cy;
874	struct grid			*saved_grid;
875	struct grid_cell		 saved_cell;
876	int				 saved_flags;
877
878	bitstr_t			*tabs;
879	struct screen_sel		*sel;
880
881	struct screen_write_cline	*write_list;
882
883	struct hyperlinks		*hyperlinks;
884};
885
886/* Screen write context. */
887typedef void (*screen_write_init_ctx_cb)(struct screen_write_ctx *,
888    struct tty_ctx *);
889struct screen_write_ctx {
890	struct window_pane		*wp;
891	struct screen			*s;
892
893	int				 flags;
894#define SCREEN_WRITE_SYNC 0x1
895
896	screen_write_init_ctx_cb	 init_ctx_cb;
897	void				*arg;
898
899	struct screen_write_citem	*item;
900	u_int				 scrolled;
901	u_int				 bg;
902};
903
904/* Box border lines option. */
905enum box_lines {
906	BOX_LINES_DEFAULT = -1,
907	BOX_LINES_SINGLE,
908	BOX_LINES_DOUBLE,
909	BOX_LINES_HEAVY,
910	BOX_LINES_SIMPLE,
911	BOX_LINES_ROUNDED,
912	BOX_LINES_PADDED,
913	BOX_LINES_NONE
914};
915
916/* Pane border lines option. */
917enum pane_lines {
918	PANE_LINES_SINGLE,
919	PANE_LINES_DOUBLE,
920	PANE_LINES_HEAVY,
921	PANE_LINES_SIMPLE,
922	PANE_LINES_NUMBER
923};
924
925/* Pane border indicator option. */
926#define PANE_BORDER_OFF 0
927#define PANE_BORDER_COLOUR 1
928#define PANE_BORDER_ARROWS 2
929#define PANE_BORDER_BOTH 3
930
931/* Screen redraw context. */
932struct screen_redraw_ctx {
933	struct client	*c;
934
935	u_int		 statuslines;
936	int		 statustop;
937
938	int		 pane_status;
939	enum pane_lines	 pane_lines;
940
941	struct grid_cell no_pane_gc;
942	int		 no_pane_gc_set;
943
944	u_int		 sx;
945	u_int		 sy;
946	u_int		 ox;
947	u_int		 oy;
948};
949
950/* Screen size. */
951#define screen_size_x(s) ((s)->grid->sx)
952#define screen_size_y(s) ((s)->grid->sy)
953#define screen_hsize(s) ((s)->grid->hsize)
954#define screen_hlimit(s) ((s)->grid->hlimit)
955
956/* Menu. */
957struct menu_item {
958	const char	*name;
959	key_code	 key;
960	const char	*command;
961};
962struct menu {
963	const char		*title;
964	struct menu_item	*items;
965	u_int			 count;
966	u_int			 width;
967};
968typedef void (*menu_choice_cb)(struct menu *, u_int, key_code, void *);
969
970/*
971 * Window mode. Windows can be in several modes and this is used to call the
972 * right function to handle input and output.
973 */
974struct window_mode_entry;
975struct window_mode {
976	const char	*name;
977	const char	*default_format;
978
979	struct screen	*(*init)(struct window_mode_entry *,
980			     struct cmd_find_state *, struct args *);
981	void		 (*free)(struct window_mode_entry *);
982	void		 (*resize)(struct window_mode_entry *, u_int, u_int);
983	void		 (*update)(struct window_mode_entry *);
984	void		 (*key)(struct window_mode_entry *, struct client *,
985			     struct session *, struct winlink *, key_code,
986			     struct mouse_event *);
987
988	const char	*(*key_table)(struct window_mode_entry *);
989	void		 (*command)(struct window_mode_entry *, struct client *,
990			     struct session *, struct winlink *, struct args *,
991			     struct mouse_event *);
992	void		 (*formats)(struct window_mode_entry *,
993			     struct format_tree *);
994};
995
996/* Active window mode. */
997struct window_mode_entry {
998	struct window_pane		*wp;
999	struct window_pane		*swp;
1000
1001	const struct window_mode	*mode;
1002	void				*data;
1003
1004	struct screen			*screen;
1005	u_int				 prefix;
1006
1007	TAILQ_ENTRY(window_mode_entry)	 entry;
1008};
1009
1010/* Offsets into pane buffer. */
1011struct window_pane_offset {
1012	size_t	used;
1013};
1014
1015/* Queued pane resize. */
1016struct window_pane_resize {
1017	u_int				sx;
1018	u_int				sy;
1019
1020	u_int				osx;
1021	u_int				osy;
1022
1023	TAILQ_ENTRY(window_pane_resize)	entry;
1024};
1025TAILQ_HEAD(window_pane_resizes, window_pane_resize);
1026
1027/* Child window structure. */
1028struct window_pane {
1029	u_int		 id;
1030	u_int		 active_point;
1031
1032	struct window	*window;
1033	struct options	*options;
1034
1035	struct layout_cell *layout_cell;
1036	struct layout_cell *saved_layout_cell;
1037
1038	u_int		 sx;
1039	u_int		 sy;
1040
1041	u_int		 xoff;
1042	u_int		 yoff;
1043
1044	int		 flags;
1045#define PANE_REDRAW 0x1
1046#define PANE_DROP 0x2
1047#define PANE_FOCUSED 0x4
1048#define PANE_VISITED 0x8
1049/* 0x10 unused */
1050/* 0x20 unused */
1051#define PANE_INPUTOFF 0x40
1052#define PANE_CHANGED 0x80
1053#define PANE_EXITED 0x100
1054#define PANE_STATUSREADY 0x200
1055#define PANE_STATUSDRAWN 0x400
1056#define PANE_EMPTY 0x800
1057#define PANE_STYLECHANGED 0x1000
1058#define PANE_UNSEENCHANGES 0x2000
1059
1060	int		 argc;
1061	char	       **argv;
1062	char		*shell;
1063	char		*cwd;
1064
1065	pid_t		 pid;
1066	char		 tty[TTY_NAME_MAX];
1067	int		 status;
1068	struct timeval	 dead_time;
1069
1070	int		 fd;
1071	struct bufferevent *event;
1072
1073	struct window_pane_offset offset;
1074	size_t		 base_offset;
1075
1076	struct window_pane_resizes resize_queue;
1077	struct event	 resize_timer;
1078
1079	struct input_ctx *ictx;
1080
1081	struct grid_cell cached_gc;
1082	struct grid_cell cached_active_gc;
1083	struct colour_palette palette;
1084
1085	int		 pipe_fd;
1086	struct bufferevent *pipe_event;
1087	struct window_pane_offset pipe_offset;
1088
1089	struct screen	*screen;
1090	struct screen	 base;
1091
1092	struct screen	 status_screen;
1093	size_t		 status_size;
1094
1095	TAILQ_HEAD(, window_mode_entry) modes;
1096
1097	char		*searchstr;
1098	int		 searchregex;
1099
1100	int		 border_gc_set;
1101	struct grid_cell border_gc;
1102
1103	TAILQ_ENTRY(window_pane) entry;  /* link in list of all panes */
1104	TAILQ_ENTRY(window_pane) sentry; /* link in list of last visited */
1105	RB_ENTRY(window_pane) tree_entry;
1106};
1107TAILQ_HEAD(window_panes, window_pane);
1108RB_HEAD(window_pane_tree, window_pane);
1109
1110/* Window structure. */
1111struct window {
1112	u_int			 id;
1113	void			*latest;
1114
1115	char			*name;
1116	struct event		 name_event;
1117	struct timeval		 name_time;
1118
1119	struct event		 alerts_timer;
1120	struct event		 offset_timer;
1121
1122	struct timeval		 activity_time;
1123
1124	struct window_pane	*active;
1125	struct window_panes 	 last_panes;
1126	struct window_panes	 panes;
1127
1128	int			 lastlayout;
1129	struct layout_cell	*layout_root;
1130	struct layout_cell	*saved_layout_root;
1131	char			*old_layout;
1132
1133	u_int			 sx;
1134	u_int			 sy;
1135	u_int			 manual_sx;
1136	u_int			 manual_sy;
1137	u_int			 xpixel;
1138	u_int			 ypixel;
1139
1140	u_int			 new_sx;
1141	u_int			 new_sy;
1142	u_int			 new_xpixel;
1143	u_int			 new_ypixel;
1144
1145	struct utf8_data	*fill_character;
1146	int			 flags;
1147#define WINDOW_BELL 0x1
1148#define WINDOW_ACTIVITY 0x2
1149#define WINDOW_SILENCE 0x4
1150#define WINDOW_ZOOMED 0x8
1151#define WINDOW_WASZOOMED 0x10
1152#define WINDOW_RESIZE 0x20
1153#define WINDOW_ALERTFLAGS (WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_SILENCE)
1154
1155	int			 alerts_queued;
1156	TAILQ_ENTRY(window)	 alerts_entry;
1157
1158	struct options		*options;
1159
1160	u_int			 references;
1161	TAILQ_HEAD(, winlink)	 winlinks;
1162
1163	RB_ENTRY(window)	 entry;
1164};
1165RB_HEAD(windows, window);
1166
1167/* Entry on local window list. */
1168struct winlink {
1169	int		 idx;
1170	struct session	*session;
1171	struct window	*window;
1172
1173	int		 flags;
1174#define WINLINK_BELL 0x1
1175#define WINLINK_ACTIVITY 0x2
1176#define WINLINK_SILENCE 0x4
1177#define WINLINK_ALERTFLAGS (WINLINK_BELL|WINLINK_ACTIVITY|WINLINK_SILENCE)
1178#define WINLINK_VISITED 0x8
1179
1180	RB_ENTRY(winlink) entry;
1181	TAILQ_ENTRY(winlink) wentry;
1182	TAILQ_ENTRY(winlink) sentry;
1183};
1184RB_HEAD(winlinks, winlink);
1185TAILQ_HEAD(winlink_stack, winlink);
1186
1187/* Window size option. */
1188#define WINDOW_SIZE_LARGEST 0
1189#define WINDOW_SIZE_SMALLEST 1
1190#define WINDOW_SIZE_MANUAL 2
1191#define WINDOW_SIZE_LATEST 3
1192
1193/* Pane border status option. */
1194#define PANE_STATUS_OFF 0
1195#define PANE_STATUS_TOP 1
1196#define PANE_STATUS_BOTTOM 2
1197
1198/* Layout direction. */
1199enum layout_type {
1200	LAYOUT_LEFTRIGHT,
1201	LAYOUT_TOPBOTTOM,
1202	LAYOUT_WINDOWPANE
1203};
1204
1205/* Layout cells queue. */
1206TAILQ_HEAD(layout_cells, layout_cell);
1207
1208/* Layout cell. */
1209struct layout_cell {
1210	enum layout_type type;
1211
1212	struct layout_cell *parent;
1213
1214	u_int		 sx;
1215	u_int		 sy;
1216
1217	u_int		 xoff;
1218	u_int		 yoff;
1219
1220	struct window_pane *wp;
1221	struct layout_cells cells;
1222
1223	TAILQ_ENTRY(layout_cell) entry;
1224};
1225
1226/* Environment variable. */
1227struct environ_entry {
1228	char		*name;
1229	char		*value;
1230
1231	int		 flags;
1232#define ENVIRON_HIDDEN 0x1
1233
1234	RB_ENTRY(environ_entry) entry;
1235};
1236
1237/* Client session. */
1238struct session_group {
1239	const char		*name;
1240	TAILQ_HEAD(, session)	 sessions;
1241
1242	RB_ENTRY(session_group)	 entry;
1243};
1244RB_HEAD(session_groups, session_group);
1245
1246struct session {
1247	u_int		 id;
1248
1249	char		*name;
1250	const char	*cwd;
1251
1252	struct timeval	 creation_time;
1253	struct timeval	 last_attached_time;
1254	struct timeval	 activity_time;
1255	struct timeval	 last_activity_time;
1256
1257	struct event	 lock_timer;
1258
1259	struct winlink	*curw;
1260	struct winlink_stack lastw;
1261	struct winlinks	 windows;
1262
1263	int		 statusat;
1264	u_int		 statuslines;
1265
1266	struct options	*options;
1267
1268#define SESSION_PASTING 0x1
1269#define SESSION_ALERTED 0x2
1270	int		 flags;
1271
1272	u_int		 attached;
1273
1274	struct termios	*tio;
1275
1276	struct environ	*environ;
1277
1278	int		 references;
1279
1280	TAILQ_ENTRY(session) gentry;
1281	RB_ENTRY(session)    entry;
1282};
1283RB_HEAD(sessions, session);
1284
1285/* Mouse button masks. */
1286#define MOUSE_MASK_BUTTONS 195
1287#define MOUSE_MASK_SHIFT 4
1288#define MOUSE_MASK_META 8
1289#define MOUSE_MASK_CTRL 16
1290#define MOUSE_MASK_DRAG 32
1291#define MOUSE_MASK_MODIFIERS (MOUSE_MASK_SHIFT|MOUSE_MASK_META|MOUSE_MASK_CTRL)
1292
1293/* Mouse wheel type. */
1294#define MOUSE_WHEEL_UP 64
1295#define MOUSE_WHEEL_DOWN 65
1296
1297/* Mouse button type. */
1298#define MOUSE_BUTTON_1 0
1299#define MOUSE_BUTTON_2 1
1300#define MOUSE_BUTTON_3 2
1301#define MOUSE_BUTTON_6 66
1302#define MOUSE_BUTTON_7 67
1303#define MOUSE_BUTTON_8 128
1304#define MOUSE_BUTTON_9 129
1305#define MOUSE_BUTTON_10 130
1306#define MOUSE_BUTTON_11 131
1307
1308/* Mouse helpers. */
1309#define MOUSE_BUTTONS(b) ((b) & MOUSE_MASK_BUTTONS)
1310#define MOUSE_WHEEL(b) \
1311	(((b) & MOUSE_MASK_BUTTONS) == MOUSE_WHEEL_UP || \
1312	 ((b) & MOUSE_MASK_BUTTONS) == MOUSE_WHEEL_DOWN)
1313#define MOUSE_DRAG(b) ((b) & MOUSE_MASK_DRAG)
1314#define MOUSE_RELEASE(b) (((b) & MOUSE_MASK_BUTTONS) == 3)
1315
1316/* Mouse input. */
1317struct mouse_event {
1318	int		valid;
1319	int		ignore;
1320
1321	key_code	key;
1322
1323	int		statusat;
1324	u_int		statuslines;
1325
1326	u_int		x;
1327	u_int		y;
1328	u_int		b;
1329
1330	u_int		lx;
1331	u_int		ly;
1332	u_int		lb;
1333
1334	u_int		ox;
1335	u_int		oy;
1336
1337	int		s;
1338	int		w;
1339	int		wp;
1340
1341	u_int		sgr_type;
1342	u_int		sgr_b;
1343};
1344
1345/* Key event. */
1346struct key_event {
1347	key_code		key;
1348	struct mouse_event	m;
1349};
1350
1351/* Terminal definition. */
1352struct tty_term {
1353	char		*name;
1354	struct tty	*tty;
1355	int		 features;
1356
1357	char		 acs[UCHAR_MAX + 1][2];
1358
1359	struct tty_code	*codes;
1360
1361#define TERM_256COLOURS 0x1
1362#define TERM_NOAM 0x2
1363#define TERM_DECSLRM 0x4
1364#define TERM_DECFRA 0x8
1365#define TERM_RGBCOLOURS 0x10
1366#define TERM_VT100LIKE 0x20
1367#define TERM_SIXEL 0x40
1368	int		 flags;
1369
1370	LIST_ENTRY(tty_term) entry;
1371};
1372LIST_HEAD(tty_terms, tty_term);
1373
1374/* Client terminal. */
1375struct tty {
1376	struct client	*client;
1377	struct event	 start_timer;
1378	struct event	 clipboard_timer;
1379	time_t		 last_requests;
1380
1381	u_int		 sx;
1382	u_int		 sy;
1383	u_int		 xpixel;
1384	u_int		 ypixel;
1385
1386	u_int		 cx;
1387	u_int		 cy;
1388	enum screen_cursor_style cstyle;
1389	int		 ccolour;
1390
1391	int		 oflag;
1392	u_int		 oox;
1393	u_int		 ooy;
1394	u_int		 osx;
1395	u_int		 osy;
1396
1397	int		 mode;
1398	int              fg;
1399	int              bg;
1400
1401	u_int		 rlower;
1402	u_int		 rupper;
1403
1404	u_int		 rleft;
1405	u_int		 rright;
1406
1407	struct event	 event_in;
1408	struct evbuffer	*in;
1409	struct event	 event_out;
1410	struct evbuffer	*out;
1411	struct event	 timer;
1412	size_t		 discarded;
1413
1414	struct termios	 tio;
1415
1416	struct grid_cell cell;
1417	struct grid_cell last_cell;
1418
1419#define TTY_NOCURSOR 0x1
1420#define TTY_FREEZE 0x2
1421#define TTY_TIMER 0x4
1422#define TTY_NOBLOCK 0x8
1423#define TTY_STARTED 0x10
1424#define TTY_OPENED 0x20
1425#define TTY_OSC52QUERY 0x40
1426#define TTY_BLOCK 0x80
1427#define TTY_HAVEDA 0x100 /* Primary DA. */
1428#define TTY_HAVEXDA 0x200
1429#define TTY_SYNCING 0x400
1430#define TTY_HAVEDA2 0x800 /* Secondary DA. */
1431#define TTY_ALL_REQUEST_FLAGS \
1432	(TTY_HAVEDA|TTY_HAVEDA2|TTY_HAVEXDA)
1433	int		 flags;
1434
1435	struct tty_term	*term;
1436
1437	u_int		 mouse_last_x;
1438	u_int		 mouse_last_y;
1439	u_int		 mouse_last_b;
1440	int		 mouse_drag_flag;
1441	void		(*mouse_drag_update)(struct client *,
1442			    struct mouse_event *);
1443	void		(*mouse_drag_release)(struct client *,
1444			    struct mouse_event *);
1445
1446	struct event	 key_timer;
1447	struct tty_key	*key_tree;
1448};
1449
1450/* Terminal command context. */
1451typedef void (*tty_ctx_redraw_cb)(const struct tty_ctx *);
1452typedef int (*tty_ctx_set_client_cb)(struct tty_ctx *, struct client *);
1453struct tty_ctx {
1454	struct screen		*s;
1455
1456	tty_ctx_redraw_cb	 redraw_cb;
1457	tty_ctx_set_client_cb	 set_client_cb;
1458	void			*arg;
1459
1460	const struct grid_cell	*cell;
1461	int			 wrapped;
1462
1463	u_int			 num;
1464	void			*ptr;
1465	void			*ptr2;
1466
1467	/*
1468	 * Whether this command should be sent even when the pane is not
1469	 * visible (used for a passthrough sequence when allow-passthrough is
1470	 * "all").
1471	 */
1472	int			 allow_invisible_panes;
1473
1474	/*
1475	 * Cursor and region position before the screen was updated - this is
1476	 * where the command should be applied; the values in the screen have
1477	 * already been updated.
1478	 */
1479	u_int			 ocx;
1480	u_int			 ocy;
1481
1482	u_int			 orupper;
1483	u_int			 orlower;
1484
1485	/* Target region (usually pane) offset and size. */
1486	u_int			 xoff;
1487	u_int			 yoff;
1488	u_int			 rxoff;
1489	u_int			 ryoff;
1490	u_int			 sx;
1491	u_int			 sy;
1492
1493	/* The background colour used for clearing (erasing). */
1494	u_int			 bg;
1495
1496	/* The default colours and palette. */
1497	struct grid_cell	 defaults;
1498	struct colour_palette	*palette;
1499
1500	/* Containing region (usually window) offset and size. */
1501	int			 bigger;
1502	u_int			 wox;
1503	u_int			 woy;
1504	u_int			 wsx;
1505	u_int			 wsy;
1506};
1507
1508/* Saved message entry. */
1509struct message_entry {
1510	char				*msg;
1511	u_int				 msg_num;
1512	struct timeval			 msg_time;
1513
1514	TAILQ_ENTRY(message_entry)	 entry;
1515};
1516TAILQ_HEAD(message_list, message_entry);
1517
1518/* Argument type. */
1519enum args_type {
1520	ARGS_NONE,
1521	ARGS_STRING,
1522	ARGS_COMMANDS
1523};
1524
1525/* Argument value. */
1526struct args_value {
1527	enum args_type		 type;
1528	union {
1529		char		*string;
1530		struct cmd_list	*cmdlist;
1531	};
1532	char			*cached;
1533	TAILQ_ENTRY(args_value)	 entry;
1534};
1535
1536/* Arguments set. */
1537struct args_entry;
1538RB_HEAD(args_tree, args_entry);
1539
1540/* Arguments parsing type. */
1541enum args_parse_type {
1542	ARGS_PARSE_INVALID,
1543	ARGS_PARSE_STRING,
1544	ARGS_PARSE_COMMANDS_OR_STRING,
1545	ARGS_PARSE_COMMANDS
1546};
1547
1548/* Arguments parsing state. */
1549typedef enum args_parse_type (*args_parse_cb)(struct args *, u_int, char **);
1550struct args_parse {
1551	const char	*template;
1552	int		 lower;
1553	int		 upper;
1554	args_parse_cb	 cb;
1555};
1556
1557/* Command find structures. */
1558enum cmd_find_type {
1559	CMD_FIND_PANE,
1560	CMD_FIND_WINDOW,
1561	CMD_FIND_SESSION,
1562};
1563struct cmd_find_state {
1564	int			 flags;
1565	struct cmd_find_state	*current;
1566
1567	struct session		*s;
1568	struct winlink		*wl;
1569	struct window		*w;
1570	struct window_pane	*wp;
1571	int			 idx;
1572};
1573
1574/* Command find flags. */
1575#define CMD_FIND_PREFER_UNATTACHED 0x1
1576#define CMD_FIND_QUIET 0x2
1577#define CMD_FIND_WINDOW_INDEX 0x4
1578#define CMD_FIND_DEFAULT_MARKED 0x8
1579#define CMD_FIND_EXACT_SESSION 0x10
1580#define CMD_FIND_EXACT_WINDOW 0x20
1581#define CMD_FIND_CANFAIL 0x40
1582
1583/* List of commands. */
1584struct cmd_list {
1585	int		 references;
1586	u_int		 group;
1587	struct cmds	*list;
1588};
1589
1590/* Command return values. */
1591enum cmd_retval {
1592	CMD_RETURN_ERROR = -1,
1593	CMD_RETURN_NORMAL = 0,
1594	CMD_RETURN_WAIT,
1595	CMD_RETURN_STOP
1596};
1597
1598/* Command parse result. */
1599enum cmd_parse_status {
1600	CMD_PARSE_ERROR,
1601	CMD_PARSE_SUCCESS
1602};
1603struct cmd_parse_result {
1604	enum cmd_parse_status	 status;
1605	struct cmd_list		*cmdlist;
1606	char			*error;
1607};
1608struct cmd_parse_input {
1609	int			 flags;
1610#define CMD_PARSE_QUIET 0x1
1611#define CMD_PARSE_PARSEONLY 0x2
1612#define CMD_PARSE_NOALIAS 0x4
1613#define CMD_PARSE_VERBOSE 0x8
1614#define CMD_PARSE_ONEGROUP 0x10
1615
1616	const char		*file;
1617	u_int			 line;
1618
1619	struct cmdq_item	*item;
1620	struct client		*c;
1621	struct cmd_find_state	 fs;
1622};
1623
1624/* Command queue flags. */
1625#define CMDQ_STATE_REPEAT 0x1
1626#define CMDQ_STATE_CONTROL 0x2
1627#define CMDQ_STATE_NOHOOKS 0x4
1628
1629/* Command queue callback. */
1630typedef enum cmd_retval (*cmdq_cb) (struct cmdq_item *, void *);
1631
1632/* Command definition flag. */
1633struct cmd_entry_flag {
1634	char			 flag;
1635	enum cmd_find_type	 type;
1636	int			 flags;
1637};
1638
1639/* Command definition. */
1640struct cmd_entry {
1641	const char		*name;
1642	const char		*alias;
1643
1644	struct args_parse	 args;
1645	const char		*usage;
1646
1647	struct cmd_entry_flag	 source;
1648	struct cmd_entry_flag	 target;
1649
1650#define CMD_STARTSERVER 0x1
1651#define CMD_READONLY 0x2
1652#define CMD_AFTERHOOK 0x4
1653#define CMD_CLIENT_CFLAG 0x8
1654#define CMD_CLIENT_TFLAG 0x10
1655#define CMD_CLIENT_CANFAIL 0x20
1656	int		 flags;
1657
1658	enum cmd_retval	 (*exec)(struct cmd *, struct cmdq_item *);
1659};
1660
1661/* Status line. */
1662#define STATUS_LINES_LIMIT 5
1663struct status_line_entry {
1664	char			*expanded;
1665	struct style_ranges	 ranges;
1666};
1667struct status_line {
1668	struct event		 timer;
1669
1670	struct screen		 screen;
1671	struct screen		*active;
1672	int			 references;
1673
1674	struct grid_cell	 style;
1675	struct status_line_entry entries[STATUS_LINES_LIMIT];
1676};
1677
1678/* Prompt type. */
1679#define PROMPT_NTYPES 4
1680enum prompt_type {
1681	PROMPT_TYPE_COMMAND,
1682	PROMPT_TYPE_SEARCH,
1683	PROMPT_TYPE_TARGET,
1684	PROMPT_TYPE_WINDOW_TARGET,
1685	PROMPT_TYPE_INVALID = 0xff
1686};
1687
1688/* File in client. */
1689typedef void (*client_file_cb) (struct client *, const char *, int, int,
1690    struct evbuffer *, void *);
1691struct client_file {
1692	struct client			*c;
1693	struct tmuxpeer			*peer;
1694	struct client_files		*tree;
1695	int				 references;
1696	int				 stream;
1697
1698	char				*path;
1699	struct evbuffer			*buffer;
1700	struct bufferevent		*event;
1701
1702	int				 fd;
1703	int				 error;
1704	int				 closed;
1705
1706	client_file_cb			 cb;
1707	void				*data;
1708
1709	RB_ENTRY(client_file)		 entry;
1710};
1711RB_HEAD(client_files, client_file);
1712
1713/* Client window. */
1714struct client_window {
1715	u_int			 window;
1716	struct window_pane	*pane;
1717
1718	u_int			 sx;
1719	u_int			 sy;
1720
1721	RB_ENTRY(client_window)	 entry;
1722};
1723RB_HEAD(client_windows, client_window);
1724
1725/* Visible areas not obstructed by overlays. */
1726#define OVERLAY_MAX_RANGES 3
1727struct overlay_ranges {
1728	u_int	px[OVERLAY_MAX_RANGES];
1729	u_int	nx[OVERLAY_MAX_RANGES];
1730};
1731
1732/* Client connection. */
1733typedef int (*prompt_input_cb)(struct client *, void *, const char *, int);
1734typedef void (*prompt_free_cb)(void *);
1735typedef void (*overlay_check_cb)(struct client*, void *, u_int, u_int, u_int,
1736	    struct overlay_ranges *);
1737typedef struct screen *(*overlay_mode_cb)(struct client *, void *, u_int *,
1738	    u_int *);
1739typedef void (*overlay_draw_cb)(struct client *, void *,
1740	    struct screen_redraw_ctx *);
1741typedef int (*overlay_key_cb)(struct client *, void *, struct key_event *);
1742typedef void (*overlay_free_cb)(struct client *, void *);
1743typedef void (*overlay_resize_cb)(struct client *, void *);
1744struct client {
1745	const char		*name;
1746	struct tmuxpeer		*peer;
1747	struct cmdq_list	*queue;
1748
1749	struct client_windows	 windows;
1750
1751	struct control_state	*control_state;
1752	u_int			 pause_age;
1753
1754	pid_t			 pid;
1755	int			 fd;
1756	int			 out_fd;
1757	struct event		 event;
1758	int			 retval;
1759
1760	struct timeval		 creation_time;
1761	struct timeval		 activity_time;
1762
1763	struct environ		*environ;
1764	struct format_job_tree	*jobs;
1765
1766	char			*title;
1767	char			*path;
1768	const char		*cwd;
1769
1770	char			*term_name;
1771	int			 term_features;
1772	char			*term_type;
1773	char		       **term_caps;
1774	u_int			 term_ncaps;
1775
1776	char			*ttyname;
1777	struct tty		 tty;
1778
1779	size_t			 written;
1780	size_t			 discarded;
1781	size_t			 redraw;
1782
1783	struct event		 repeat_timer;
1784
1785	struct event		 click_timer;
1786	u_int			 click_button;
1787	struct mouse_event	 click_event;
1788
1789	struct status_line	 status;
1790
1791#define CLIENT_TERMINAL 0x1
1792#define CLIENT_LOGIN 0x2
1793#define CLIENT_EXIT 0x4
1794#define CLIENT_REDRAWWINDOW 0x8
1795#define CLIENT_REDRAWSTATUS 0x10
1796#define CLIENT_REPEAT 0x20
1797#define CLIENT_SUSPENDED 0x40
1798#define CLIENT_ATTACHED 0x80
1799#define CLIENT_EXITED 0x100
1800#define CLIENT_DEAD 0x200
1801#define CLIENT_REDRAWBORDERS 0x400
1802#define CLIENT_READONLY 0x800
1803#define CLIENT_NOSTARTSERVER 0x1000
1804#define CLIENT_CONTROL 0x2000
1805#define CLIENT_CONTROLCONTROL 0x4000
1806#define CLIENT_FOCUSED 0x8000
1807#define CLIENT_UTF8 0x10000
1808#define CLIENT_IGNORESIZE 0x20000
1809#define CLIENT_IDENTIFIED 0x40000
1810#define CLIENT_STATUSFORCE 0x80000
1811#define CLIENT_DOUBLECLICK 0x100000
1812#define CLIENT_TRIPLECLICK 0x200000
1813#define CLIENT_SIZECHANGED 0x400000
1814#define CLIENT_STATUSOFF 0x800000
1815#define CLIENT_REDRAWSTATUSALWAYS 0x1000000
1816#define CLIENT_REDRAWOVERLAY 0x2000000
1817#define CLIENT_CONTROL_NOOUTPUT 0x4000000
1818#define CLIENT_DEFAULTSOCKET 0x8000000
1819#define CLIENT_STARTSERVER 0x10000000
1820#define CLIENT_REDRAWPANES 0x20000000
1821#define CLIENT_NOFORK 0x40000000
1822#define CLIENT_ACTIVEPANE 0x80000000ULL
1823#define CLIENT_CONTROL_PAUSEAFTER 0x100000000ULL
1824#define CLIENT_CONTROL_WAITEXIT 0x200000000ULL
1825#define CLIENT_WINDOWSIZECHANGED 0x400000000ULL
1826#define CLIENT_CLIPBOARDBUFFER 0x800000000ULL
1827#define CLIENT_BRACKETPASTING 0x1000000000ULL
1828#define CLIENT_ALLREDRAWFLAGS		\
1829	(CLIENT_REDRAWWINDOW|		\
1830	 CLIENT_REDRAWSTATUS|		\
1831	 CLIENT_REDRAWSTATUSALWAYS|	\
1832	 CLIENT_REDRAWBORDERS|		\
1833	 CLIENT_REDRAWOVERLAY|		\
1834	 CLIENT_REDRAWPANES)
1835#define CLIENT_UNATTACHEDFLAGS	\
1836	(CLIENT_DEAD|		\
1837	 CLIENT_SUSPENDED|	\
1838	 CLIENT_EXIT)
1839#define CLIENT_NODETACHFLAGS	\
1840	(CLIENT_DEAD|		\
1841	 CLIENT_EXIT)
1842#define CLIENT_NOSIZEFLAGS	\
1843	(CLIENT_DEAD|		\
1844	 CLIENT_SUSPENDED|	\
1845	 CLIENT_EXIT)
1846	uint64_t		 flags;
1847
1848	enum {
1849		CLIENT_EXIT_RETURN,
1850		CLIENT_EXIT_SHUTDOWN,
1851		CLIENT_EXIT_DETACH
1852	}			 exit_type;
1853	enum msgtype		 exit_msgtype;
1854	char			*exit_session;
1855	char			*exit_message;
1856
1857	struct key_table	*keytable;
1858
1859	uint64_t		 redraw_panes;
1860
1861	int			 message_ignore_keys;
1862	int			 message_ignore_styles;
1863	char			*message_string;
1864	struct event		 message_timer;
1865
1866	char			*prompt_string;
1867	struct utf8_data	*prompt_buffer;
1868	char			*prompt_last;
1869	size_t			 prompt_index;
1870	prompt_input_cb		 prompt_inputcb;
1871	prompt_free_cb		 prompt_freecb;
1872	void			*prompt_data;
1873	u_int			 prompt_hindex[PROMPT_NTYPES];
1874	enum {
1875		PROMPT_ENTRY,
1876		PROMPT_COMMAND
1877	}			 prompt_mode;
1878	struct utf8_data	*prompt_saved;
1879#define PROMPT_SINGLE 0x1
1880#define PROMPT_NUMERIC 0x2
1881#define PROMPT_INCREMENTAL 0x4
1882#define PROMPT_NOFORMAT 0x8
1883#define PROMPT_KEY 0x10
1884	int			 prompt_flags;
1885	enum prompt_type	 prompt_type;
1886	int			 prompt_cursor;
1887
1888	struct session		*session;
1889	struct session		*last_session;
1890
1891	int			 references;
1892
1893	void			*pan_window;
1894	u_int			 pan_ox;
1895	u_int			 pan_oy;
1896
1897	overlay_check_cb	 overlay_check;
1898	overlay_mode_cb		 overlay_mode;
1899	overlay_draw_cb		 overlay_draw;
1900	overlay_key_cb		 overlay_key;
1901	overlay_free_cb		 overlay_free;
1902	overlay_resize_cb	 overlay_resize;
1903	void			*overlay_data;
1904	struct event		 overlay_timer;
1905
1906	struct client_files	 files;
1907
1908	u_int			*clipboard_panes;
1909	u_int			 clipboard_npanes;
1910
1911	TAILQ_ENTRY(client)	 entry;
1912};
1913TAILQ_HEAD(clients, client);
1914
1915/* Control mode subscription type. */
1916enum control_sub_type {
1917	CONTROL_SUB_SESSION,
1918	CONTROL_SUB_PANE,
1919	CONTROL_SUB_ALL_PANES,
1920	CONTROL_SUB_WINDOW,
1921	CONTROL_SUB_ALL_WINDOWS
1922};
1923
1924/* Key binding and key table. */
1925struct key_binding {
1926	key_code		 key;
1927	struct cmd_list		*cmdlist;
1928	const char		*note;
1929
1930	int			 flags;
1931#define KEY_BINDING_REPEAT 0x1
1932
1933	RB_ENTRY(key_binding)	 entry;
1934};
1935RB_HEAD(key_bindings, key_binding);
1936
1937struct key_table {
1938	const char		*name;
1939	struct key_bindings	 key_bindings;
1940	struct key_bindings	 default_key_bindings;
1941
1942	u_int			 references;
1943
1944	RB_ENTRY(key_table)	 entry;
1945};
1946RB_HEAD(key_tables, key_table);
1947
1948/* Option data. */
1949RB_HEAD(options_array, options_array_item);
1950union options_value {
1951	char			*string;
1952	long long		 number;
1953	struct style		 style;
1954	struct options_array	 array;
1955	struct cmd_list		*cmdlist;
1956};
1957
1958/* Option table entries. */
1959enum options_table_type {
1960	OPTIONS_TABLE_STRING,
1961	OPTIONS_TABLE_NUMBER,
1962	OPTIONS_TABLE_KEY,
1963	OPTIONS_TABLE_COLOUR,
1964	OPTIONS_TABLE_FLAG,
1965	OPTIONS_TABLE_CHOICE,
1966	OPTIONS_TABLE_COMMAND
1967};
1968
1969#define OPTIONS_TABLE_NONE 0
1970#define OPTIONS_TABLE_SERVER 0x1
1971#define OPTIONS_TABLE_SESSION 0x2
1972#define OPTIONS_TABLE_WINDOW 0x4
1973#define OPTIONS_TABLE_PANE 0x8
1974
1975#define OPTIONS_TABLE_IS_ARRAY 0x1
1976#define OPTIONS_TABLE_IS_HOOK 0x2
1977#define OPTIONS_TABLE_IS_STYLE 0x4
1978
1979struct options_table_entry {
1980	const char		 *name;
1981	const char		 *alternative_name;
1982	enum options_table_type	  type;
1983	int			  scope;
1984	int			  flags;
1985
1986	u_int			  minimum;
1987	u_int			  maximum;
1988	const char		**choices;
1989
1990	const char		 *default_str;
1991	long long		  default_num;
1992	const char		**default_arr;
1993
1994	const char		 *separator;
1995	const char		 *pattern;
1996
1997	const char		 *text;
1998	const char		 *unit;
1999};
2000
2001struct options_name_map {
2002	const char		*from;
2003	const char		*to;
2004};
2005
2006/* Common command usages. */
2007#define CMD_TARGET_PANE_USAGE "[-t target-pane]"
2008#define CMD_TARGET_WINDOW_USAGE "[-t target-window]"
2009#define CMD_TARGET_SESSION_USAGE "[-t target-session]"
2010#define CMD_TARGET_CLIENT_USAGE "[-t target-client]"
2011#define CMD_SRCDST_PANE_USAGE "[-s src-pane] [-t dst-pane]"
2012#define CMD_SRCDST_WINDOW_USAGE "[-s src-window] [-t dst-window]"
2013#define CMD_SRCDST_SESSION_USAGE "[-s src-session] [-t dst-session]"
2014#define CMD_SRCDST_CLIENT_USAGE "[-s src-client] [-t dst-client]"
2015#define CMD_BUFFER_USAGE "[-b buffer-name]"
2016
2017/* Spawn common context. */
2018struct spawn_context {
2019	struct cmdq_item	 *item;
2020
2021	struct session		 *s;
2022	struct winlink		 *wl;
2023	struct client		 *tc;
2024
2025	struct window_pane	 *wp0;
2026	struct layout_cell	 *lc;
2027
2028	const char		 *name;
2029	char			**argv;
2030	int			  argc;
2031	struct environ		 *environ;
2032
2033	int			  idx;
2034	const char		 *cwd;
2035
2036	int			  flags;
2037#define SPAWN_KILL 0x1
2038#define SPAWN_DETACHED 0x2
2039#define SPAWN_RESPAWN 0x4
2040#define SPAWN_BEFORE 0x8
2041#define SPAWN_NONOTIFY 0x10
2042#define SPAWN_FULLSIZE 0x20
2043#define SPAWN_EMPTY 0x40
2044#define SPAWN_ZOOM 0x80
2045};
2046
2047/* Mode tree sort order. */
2048struct mode_tree_sort_criteria {
2049	u_int	field;
2050	int	reversed;
2051};
2052
2053/* tmux.c */
2054extern struct options	*global_options;
2055extern struct options	*global_s_options;
2056extern struct options	*global_w_options;
2057extern struct environ	*global_environ;
2058extern struct timeval	 start_time;
2059extern const char	*socket_path;
2060extern const char	*shell_command;
2061extern int		 ptm_fd;
2062extern const char	*shell_command;
2063int		 checkshell(const char *);
2064void		 setblocking(int, int);
2065char 		*shell_argv0(const char *, int);
2066uint64_t	 get_timer(void);
2067const char	*sig2name(int);
2068const char	*find_cwd(void);
2069const char	*find_home(void);
2070const char	*getversion(void);
2071
2072/* proc.c */
2073struct imsg;
2074int	proc_send(struct tmuxpeer *, enum msgtype, int, const void *, size_t);
2075struct tmuxproc *proc_start(const char *);
2076void	proc_loop(struct tmuxproc *, int (*)(void));
2077void	proc_exit(struct tmuxproc *);
2078void	proc_set_signals(struct tmuxproc *, void(*)(int));
2079void	proc_clear_signals(struct tmuxproc *, int);
2080struct tmuxpeer *proc_add_peer(struct tmuxproc *, int,
2081	    void (*)(struct imsg *, void *), void *);
2082void	proc_remove_peer(struct tmuxpeer *);
2083void	proc_kill_peer(struct tmuxpeer *);
2084void	proc_flush_peer(struct tmuxpeer *);
2085void	proc_toggle_log(struct tmuxproc *);
2086pid_t	proc_fork_and_daemon(int *);
2087uid_t	proc_get_peer_uid(struct tmuxpeer *);
2088
2089/* cfg.c */
2090extern int cfg_finished;
2091extern struct client *cfg_client;
2092extern char **cfg_files;
2093extern u_int cfg_nfiles;
2094extern int cfg_quiet;
2095void	start_cfg(void);
2096int	load_cfg(const char *, struct client *, struct cmdq_item *,
2097            struct cmd_find_state *, int, struct cmdq_item **);
2098int	load_cfg_from_buffer(const void *, size_t, const char *,
2099  	    struct client *, struct cmdq_item *, struct cmd_find_state *,
2100	    int, struct cmdq_item **);
2101void printflike(1, 2) cfg_add_cause(const char *, ...);
2102void	cfg_print_causes(struct cmdq_item *);
2103void	cfg_show_causes(struct session *);
2104
2105/* paste.c */
2106struct paste_buffer;
2107const char	*paste_buffer_name(struct paste_buffer *);
2108u_int		 paste_buffer_order(struct paste_buffer *);
2109time_t		 paste_buffer_created(struct paste_buffer *);
2110const char	*paste_buffer_data(struct paste_buffer *, size_t *);
2111struct paste_buffer *paste_walk(struct paste_buffer *);
2112int		 paste_is_empty(void);
2113struct paste_buffer *paste_get_top(const char **);
2114struct paste_buffer *paste_get_name(const char *);
2115void		 paste_free(struct paste_buffer *);
2116void		 paste_add(const char *, char *, size_t);
2117int		 paste_rename(const char *, const char *, char **);
2118int		 paste_set(char *, size_t, const char *, char **);
2119void		 paste_replace(struct paste_buffer *, char *, size_t);
2120char		*paste_make_sample(struct paste_buffer *);
2121
2122/* format.c */
2123#define FORMAT_STATUS 0x1
2124#define FORMAT_FORCE 0x2
2125#define FORMAT_NOJOBS 0x4
2126#define FORMAT_VERBOSE 0x8
2127#define FORMAT_NONE 0
2128#define FORMAT_PANE 0x80000000U
2129#define FORMAT_WINDOW 0x40000000U
2130struct format_tree;
2131struct format_modifier;
2132typedef void *(*format_cb)(struct format_tree *);
2133void		 format_tidy_jobs(void);
2134const char	*format_skip(const char *, const char *);
2135int		 format_true(const char *);
2136struct format_tree *format_create(struct client *, struct cmdq_item *, int,
2137		     int);
2138void		 format_free(struct format_tree *);
2139void		 format_merge(struct format_tree *, struct format_tree *);
2140struct window_pane *format_get_pane(struct format_tree *);
2141void printflike(3, 4) format_add(struct format_tree *, const char *,
2142		     const char *, ...);
2143void		 format_add_tv(struct format_tree *, const char *,
2144		     struct timeval *);
2145void		 format_add_cb(struct format_tree *, const char *, format_cb);
2146void		 format_log_debug(struct format_tree *, const char *);
2147void		 format_each(struct format_tree *, void (*)(const char *,
2148		     const char *, void *), void *);
2149char		*format_pretty_time(time_t, int);
2150char		*format_expand_time(struct format_tree *, const char *);
2151char		*format_expand(struct format_tree *, const char *);
2152char		*format_single(struct cmdq_item *, const char *,
2153		     struct client *, struct session *, struct winlink *,
2154		     struct window_pane *);
2155char		*format_single_from_state(struct cmdq_item *, const char *,
2156		    struct client *, struct cmd_find_state *);
2157char		*format_single_from_target(struct cmdq_item *, const char *);
2158struct format_tree *format_create_defaults(struct cmdq_item *, struct client *,
2159		     struct session *, struct winlink *, struct window_pane *);
2160struct format_tree *format_create_from_state(struct cmdq_item *,
2161		     struct client *, struct cmd_find_state *);
2162struct format_tree *format_create_from_target(struct cmdq_item *);
2163void		 format_defaults(struct format_tree *, struct client *,
2164		     struct session *, struct winlink *, struct window_pane *);
2165void		 format_defaults_window(struct format_tree *, struct window *);
2166void		 format_defaults_pane(struct format_tree *,
2167		     struct window_pane *);
2168void		 format_defaults_paste_buffer(struct format_tree *,
2169		     struct paste_buffer *);
2170void		 format_lost_client(struct client *);
2171char		*format_grid_word(struct grid *, u_int, u_int);
2172char		*format_grid_hyperlink(struct grid *, u_int, u_int,
2173		     struct screen *);
2174char		*format_grid_line(struct grid *, u_int);
2175
2176/* format-draw.c */
2177void		 format_draw(struct screen_write_ctx *,
2178		     const struct grid_cell *, u_int, const char *,
2179		     struct style_ranges *, int);
2180u_int		 format_width(const char *);
2181char		*format_trim_left(const char *, u_int);
2182char		*format_trim_right(const char *, u_int);
2183
2184/* notify.c */
2185void	notify_hook(struct cmdq_item *, const char *);
2186void	notify_client(const char *, struct client *);
2187void	notify_session(const char *, struct session *);
2188void	notify_winlink(const char *, struct winlink *);
2189void	notify_session_window(const char *, struct session *, struct window *);
2190void	notify_window(const char *, struct window *);
2191void	notify_pane(const char *, struct window_pane *);
2192void	notify_paste_buffer(const char *, int);
2193
2194/* options.c */
2195struct options	*options_create(struct options *);
2196void		 options_free(struct options *);
2197struct options	*options_get_parent(struct options *);
2198void		 options_set_parent(struct options *, struct options *);
2199struct options_entry *options_first(struct options *);
2200struct options_entry *options_next(struct options_entry *);
2201struct options_entry *options_empty(struct options *,
2202		     const struct options_table_entry *);
2203struct options_entry *options_default(struct options *,
2204		     const struct options_table_entry *);
2205char		*options_default_to_string(const struct options_table_entry *);
2206const char	*options_name(struct options_entry *);
2207struct options	*options_owner(struct options_entry *);
2208const struct options_table_entry *options_table_entry(struct options_entry *);
2209struct options_entry *options_get_only(struct options *, const char *);
2210struct options_entry *options_get(struct options *, const char *);
2211void		 options_array_clear(struct options_entry *);
2212union options_value *options_array_get(struct options_entry *, u_int);
2213int		 options_array_set(struct options_entry *, u_int, const char *,
2214		     int, char **);
2215int		 options_array_assign(struct options_entry *, const char *,
2216		     char **);
2217struct options_array_item *options_array_first(struct options_entry *);
2218struct options_array_item *options_array_next(struct options_array_item *);
2219u_int		 options_array_item_index(struct options_array_item *);
2220union options_value *options_array_item_value(struct options_array_item *);
2221int		 options_is_array(struct options_entry *);
2222int		 options_is_string(struct options_entry *);
2223char		*options_to_string(struct options_entry *, int, int);
2224char		*options_parse(const char *, int *);
2225struct options_entry *options_parse_get(struct options *, const char *, int *,
2226		     int);
2227char		*options_match(const char *, int *, int *);
2228struct options_entry *options_match_get(struct options *, const char *, int *,
2229		     int, int *);
2230const char	*options_get_string(struct options *, const char *);
2231long long	 options_get_number(struct options *, const char *);
2232struct options_entry * printflike(4, 5) options_set_string(struct options *,
2233		     const char *, int, const char *, ...);
2234struct options_entry *options_set_number(struct options *, const char *,
2235		     long long);
2236int		 options_scope_from_name(struct args *, int,
2237		     const char *, struct cmd_find_state *, struct options **,
2238		     char **);
2239int		 options_scope_from_flags(struct args *, int,
2240		     struct cmd_find_state *, struct options **, char **);
2241struct style	*options_string_to_style(struct options *, const char *,
2242		     struct format_tree *);
2243int		 options_from_string(struct options *,
2244		     const struct options_table_entry *, const char *,
2245		     const char *, int, char **);
2246int	 	 options_find_choice(const struct options_table_entry *,
2247		     const char *, char **);
2248void		 options_push_changes(const char *);
2249int		 options_remove_or_default(struct options_entry *, int,
2250		     char **);
2251
2252/* options-table.c */
2253extern const struct options_table_entry	options_table[];
2254extern const struct options_name_map	options_other_names[];
2255
2256/* job.c */
2257typedef void (*job_update_cb) (struct job *);
2258typedef void (*job_complete_cb) (struct job *);
2259typedef void (*job_free_cb) (void *);
2260#define JOB_NOWAIT 0x1
2261#define JOB_KEEPWRITE 0x2
2262#define JOB_PTY 0x4
2263struct job	*job_run(const char *, int, char **, struct environ *,
2264		     struct session *, const char *, job_update_cb,
2265		     job_complete_cb, job_free_cb, void *, int, int, int);
2266void		 job_free(struct job *);
2267int		 job_transfer(struct job *, pid_t *, char *, size_t);
2268void		 job_resize(struct job *, u_int, u_int);
2269void		 job_check_died(pid_t, int);
2270int		 job_get_status(struct job *);
2271void		*job_get_data(struct job *);
2272struct bufferevent *job_get_event(struct job *);
2273void		 job_kill_all(void);
2274int		 job_still_running(void);
2275void		 job_print_summary(struct cmdq_item *, int);
2276
2277/* environ.c */
2278struct environ *environ_create(void);
2279void	environ_free(struct environ *);
2280struct environ_entry *environ_first(struct environ *);
2281struct environ_entry *environ_next(struct environ_entry *);
2282void	environ_copy(struct environ *, struct environ *);
2283struct environ_entry *environ_find(struct environ *, const char *);
2284void printflike(4, 5) environ_set(struct environ *, const char *, int,
2285	    const char *, ...);
2286void	environ_clear(struct environ *, const char *);
2287void	environ_put(struct environ *, const char *, int);
2288void	environ_unset(struct environ *, const char *);
2289void	environ_update(struct options *, struct environ *, struct environ *);
2290void	environ_push(struct environ *);
2291void printflike(2, 3) environ_log(struct environ *, const char *, ...);
2292struct environ *environ_for_session(struct session *, int);
2293
2294/* tty.c */
2295void	tty_create_log(void);
2296int	tty_window_bigger(struct tty *);
2297int	tty_window_offset(struct tty *, u_int *, u_int *, u_int *, u_int *);
2298void	tty_update_window_offset(struct window *);
2299void	tty_update_client_offset(struct client *);
2300void	tty_raw(struct tty *, const char *);
2301void	tty_attributes(struct tty *, const struct grid_cell *,
2302	    const struct grid_cell *, struct colour_palette *,
2303	    struct hyperlinks *);
2304void	tty_reset(struct tty *);
2305void	tty_region_off(struct tty *);
2306void	tty_margin_off(struct tty *);
2307void	tty_cursor(struct tty *, u_int, u_int);
2308void	tty_clipboard_query(struct tty *);
2309void	tty_putcode(struct tty *, enum tty_code_code);
2310void	tty_putcode_i(struct tty *, enum tty_code_code, int);
2311void	tty_putcode_ii(struct tty *, enum tty_code_code, int, int);
2312void	tty_putcode_iii(struct tty *, enum tty_code_code, int, int, int);
2313void	tty_putcode_s(struct tty *, enum tty_code_code, const char *);
2314void	tty_putcode_ss(struct tty *, enum tty_code_code, const char *,
2315	    const char *);
2316void	tty_puts(struct tty *, const char *);
2317void	tty_putc(struct tty *, u_char);
2318void	tty_putn(struct tty *, const void *, size_t, u_int);
2319void	tty_cell(struct tty *, const struct grid_cell *,
2320	    const struct grid_cell *, struct colour_palette *,
2321	    struct hyperlinks *);
2322int	tty_init(struct tty *, struct client *);
2323void	tty_resize(struct tty *);
2324void	tty_set_size(struct tty *, u_int, u_int, u_int, u_int);
2325void	tty_start_tty(struct tty *);
2326void	tty_send_requests(struct tty *);
2327void	tty_repeat_requests(struct tty *);
2328void	tty_stop_tty(struct tty *);
2329void	tty_set_title(struct tty *, const char *);
2330void	tty_set_path(struct tty *, const char *);
2331void	tty_update_mode(struct tty *, int, struct screen *);
2332void	tty_draw_line(struct tty *, struct screen *, u_int, u_int, u_int,
2333	    u_int, u_int, const struct grid_cell *, struct colour_palette *);
2334void	tty_sync_start(struct tty *);
2335void	tty_sync_end(struct tty *);
2336int	tty_open(struct tty *, char **);
2337void	tty_close(struct tty *);
2338void	tty_free(struct tty *);
2339void	tty_update_features(struct tty *);
2340void	tty_set_selection(struct tty *, const char *, const char *, size_t);
2341void	tty_write(void (*)(struct tty *, const struct tty_ctx *),
2342	    struct tty_ctx *);
2343void	tty_cmd_alignmenttest(struct tty *, const struct tty_ctx *);
2344void	tty_cmd_cell(struct tty *, const struct tty_ctx *);
2345void	tty_cmd_cells(struct tty *, const struct tty_ctx *);
2346void	tty_cmd_clearendofline(struct tty *, const struct tty_ctx *);
2347void	tty_cmd_clearendofscreen(struct tty *, const struct tty_ctx *);
2348void	tty_cmd_clearline(struct tty *, const struct tty_ctx *);
2349void	tty_cmd_clearscreen(struct tty *, const struct tty_ctx *);
2350void	tty_cmd_clearstartofline(struct tty *, const struct tty_ctx *);
2351void	tty_cmd_clearstartofscreen(struct tty *, const struct tty_ctx *);
2352void	tty_cmd_deletecharacter(struct tty *, const struct tty_ctx *);
2353void	tty_cmd_clearcharacter(struct tty *, const struct tty_ctx *);
2354void	tty_cmd_deleteline(struct tty *, const struct tty_ctx *);
2355void	tty_cmd_erasecharacter(struct tty *, const struct tty_ctx *);
2356void	tty_cmd_insertcharacter(struct tty *, const struct tty_ctx *);
2357void	tty_cmd_insertline(struct tty *, const struct tty_ctx *);
2358void	tty_cmd_linefeed(struct tty *, const struct tty_ctx *);
2359void	tty_cmd_scrollup(struct tty *, const struct tty_ctx *);
2360void	tty_cmd_scrolldown(struct tty *, const struct tty_ctx *);
2361void	tty_cmd_reverseindex(struct tty *, const struct tty_ctx *);
2362void	tty_cmd_setselection(struct tty *, const struct tty_ctx *);
2363void	tty_cmd_rawstring(struct tty *, const struct tty_ctx *);
2364void	tty_cmd_syncstart(struct tty *, const struct tty_ctx *);
2365void	tty_default_colours(struct grid_cell *, struct window_pane *);
2366
2367/* tty-term.c */
2368extern struct tty_terms tty_terms;
2369u_int		 tty_term_ncodes(void);
2370void		 tty_term_apply(struct tty_term *, const char *, int);
2371void		 tty_term_apply_overrides(struct tty_term *);
2372struct tty_term *tty_term_create(struct tty *, char *, char **, u_int, int *,
2373		     char **);
2374void		 tty_term_free(struct tty_term *);
2375int		 tty_term_read_list(const char *, int, char ***, u_int *,
2376		     char **);
2377void		 tty_term_free_list(char **, u_int);
2378int		 tty_term_has(struct tty_term *, enum tty_code_code);
2379const char	*tty_term_string(struct tty_term *, enum tty_code_code);
2380const char	*tty_term_string_i(struct tty_term *, enum tty_code_code, int);
2381const char	*tty_term_string_ii(struct tty_term *, enum tty_code_code, int,
2382		     int);
2383const char	*tty_term_string_iii(struct tty_term *, enum tty_code_code, int,
2384		     int, int);
2385const char	*tty_term_string_s(struct tty_term *, enum tty_code_code,
2386		     const char *);
2387const char	*tty_term_string_ss(struct tty_term *, enum tty_code_code,
2388		     const char *, const char *);
2389int		 tty_term_number(struct tty_term *, enum tty_code_code);
2390int		 tty_term_flag(struct tty_term *, enum tty_code_code);
2391const char	*tty_term_describe(struct tty_term *, enum tty_code_code);
2392
2393/* tty-features.c */
2394void		 tty_add_features(int *, const char *, const char *);
2395const char	*tty_get_features(int);
2396int		 tty_apply_features(struct tty_term *, int);
2397void		 tty_default_features(int *, const char *, u_int);
2398
2399/* tty-acs.c */
2400int		 tty_acs_needed(struct tty *);
2401const char	*tty_acs_get(struct tty *, u_char);
2402int		 tty_acs_reverse_get(struct tty *, const char *, size_t);
2403const struct utf8_data *tty_acs_double_borders(int);
2404const struct utf8_data *tty_acs_heavy_borders(int);
2405const struct utf8_data *tty_acs_rounded_borders(int);
2406
2407/* tty-keys.c */
2408void		tty_keys_build(struct tty *);
2409void		tty_keys_free(struct tty *);
2410int		tty_keys_next(struct tty *);
2411
2412/* arguments.c */
2413void		 args_set(struct args *, u_char, struct args_value *, int);
2414struct args 	*args_create(void);
2415struct args	*args_parse(const struct args_parse *, struct args_value *,
2416		     u_int, char **);
2417struct args	*args_copy(struct args *, int, char **);
2418void		 args_to_vector(struct args *, int *, char ***);
2419struct args_value *args_from_vector(int, char **);
2420void		 args_free_value(struct args_value *);
2421void		 args_free_values(struct args_value *, u_int);
2422void		 args_free(struct args *);
2423char		*args_print(struct args *);
2424char		*args_escape(const char *);
2425int		 args_has(struct args *, u_char);
2426const char	*args_get(struct args *, u_char);
2427u_char		 args_first(struct args *, struct args_entry **);
2428u_char		 args_next(struct args_entry **);
2429u_int		 args_count(struct args *);
2430struct args_value *args_values(struct args *);
2431struct args_value *args_value(struct args *, u_int);
2432const char	*args_string(struct args *, u_int);
2433struct cmd_list	*args_make_commands_now(struct cmd *, struct cmdq_item *,
2434		     u_int, int);
2435struct args_command_state *args_make_commands_prepare(struct cmd *,
2436		     struct cmdq_item *, u_int, const char *, int, int);
2437struct cmd_list *args_make_commands(struct args_command_state *, int, char **,
2438		     char **);
2439void		 args_make_commands_free(struct args_command_state *);
2440char		*args_make_commands_get_command(struct args_command_state *);
2441struct args_value *args_first_value(struct args *, u_char);
2442struct args_value *args_next_value(struct args_value *);
2443long long	 args_strtonum(struct args *, u_char, long long, long long,
2444		     char **);
2445long long	 args_strtonum_and_expand(struct args *, u_char, long long,
2446		     long long, struct cmdq_item *, char **);
2447long long	 args_percentage(struct args *, u_char, long long,
2448		     long long, long long, char **);
2449long long	 args_string_percentage(const char *, long long, long long,
2450		     long long, char **);
2451long long	 args_percentage_and_expand(struct args *, u_char, long long,
2452		     long long, long long, struct cmdq_item *, char **);
2453long long	 args_string_percentage_and_expand(const char *, long long,
2454		     long long, long long, struct cmdq_item *, char **);
2455
2456/* cmd-find.c */
2457int		 cmd_find_target(struct cmd_find_state *, struct cmdq_item *,
2458		     const char *, enum cmd_find_type, int);
2459struct client	*cmd_find_best_client(struct session *);
2460struct client	*cmd_find_client(struct cmdq_item *, const char *, int);
2461void		 cmd_find_clear_state(struct cmd_find_state *, int);
2462int		 cmd_find_empty_state(struct cmd_find_state *);
2463int		 cmd_find_valid_state(struct cmd_find_state *);
2464void		 cmd_find_copy_state(struct cmd_find_state *,
2465		     struct cmd_find_state *);
2466void		 cmd_find_from_session(struct cmd_find_state *,
2467		     struct session *, int);
2468void		 cmd_find_from_winlink(struct cmd_find_state *,
2469		     struct winlink *, int);
2470int		 cmd_find_from_session_window(struct cmd_find_state *,
2471		     struct session *, struct window *, int);
2472int		 cmd_find_from_window(struct cmd_find_state *, struct window *,
2473		     int);
2474void		 cmd_find_from_winlink_pane(struct cmd_find_state *,
2475		     struct winlink *, struct window_pane *, int);
2476int		 cmd_find_from_pane(struct cmd_find_state *,
2477		     struct window_pane *, int);
2478int		 cmd_find_from_client(struct cmd_find_state *, struct client *,
2479		     int);
2480int		 cmd_find_from_mouse(struct cmd_find_state *,
2481		     struct mouse_event *, int);
2482int		 cmd_find_from_nothing(struct cmd_find_state *, int);
2483
2484/* cmd.c */
2485extern const struct cmd_entry *cmd_table[];
2486void printflike(3, 4) cmd_log_argv(int, char **, const char *, ...);
2487void		 cmd_prepend_argv(int *, char ***, const char *);
2488void		 cmd_append_argv(int *, char ***, const char *);
2489int		 cmd_pack_argv(int, char **, char *, size_t);
2490int		 cmd_unpack_argv(char *, size_t, int, char ***);
2491char	       **cmd_copy_argv(int, char **);
2492void		 cmd_free_argv(int, char **);
2493char		*cmd_stringify_argv(int, char **);
2494char		*cmd_get_alias(const char *);
2495const struct cmd_entry *cmd_get_entry(struct cmd *);
2496struct args	*cmd_get_args(struct cmd *);
2497u_int		 cmd_get_group(struct cmd *);
2498void		 cmd_get_source(struct cmd *, const char **, u_int *);
2499struct cmd	*cmd_parse(struct args_value *, u_int, const char *, u_int,
2500		     char **);
2501struct cmd	*cmd_copy(struct cmd *, int, char **);
2502void		 cmd_free(struct cmd *);
2503char		*cmd_print(struct cmd *);
2504struct cmd_list	*cmd_list_new(void);
2505struct cmd_list	*cmd_list_copy(struct cmd_list *, int, char **);
2506void		 cmd_list_append(struct cmd_list *, struct cmd *);
2507void		 cmd_list_append_all(struct cmd_list *, struct cmd_list *);
2508void		 cmd_list_move(struct cmd_list *, struct cmd_list *);
2509void		 cmd_list_free(struct cmd_list *);
2510char		*cmd_list_print(struct cmd_list *, int);
2511struct cmd	*cmd_list_first(struct cmd_list *);
2512struct cmd	*cmd_list_next(struct cmd *);
2513int		 cmd_list_all_have(struct cmd_list *, int);
2514int		 cmd_list_any_have(struct cmd_list *, int);
2515int		 cmd_mouse_at(struct window_pane *, struct mouse_event *,
2516		     u_int *, u_int *, int);
2517struct winlink	*cmd_mouse_window(struct mouse_event *, struct session **);
2518struct window_pane *cmd_mouse_pane(struct mouse_event *, struct session **,
2519		     struct winlink **);
2520char		*cmd_template_replace(const char *, const char *, int);
2521
2522/* cmd-attach-session.c */
2523enum cmd_retval	 cmd_attach_session(struct cmdq_item *, const char *, int, int,
2524		     int, const char *, int, const char *);
2525
2526/* cmd-parse.c */
2527void		 cmd_parse_empty(struct cmd_parse_input *);
2528struct cmd_parse_result *cmd_parse_from_file(FILE *, struct cmd_parse_input *);
2529struct cmd_parse_result *cmd_parse_from_string(const char *,
2530		     struct cmd_parse_input *);
2531enum cmd_parse_status cmd_parse_and_insert(const char *,
2532		     struct cmd_parse_input *, struct cmdq_item *,
2533		     struct cmdq_state *, char **);
2534enum cmd_parse_status cmd_parse_and_append(const char *,
2535		     struct cmd_parse_input *, struct client *,
2536		     struct cmdq_state *, char **);
2537struct cmd_parse_result *cmd_parse_from_buffer(const void *, size_t,
2538		     struct cmd_parse_input *);
2539struct cmd_parse_result *cmd_parse_from_arguments(struct args_value *, u_int,
2540		     struct cmd_parse_input *);
2541
2542/* cmd-queue.c */
2543struct cmdq_state *cmdq_new_state(struct cmd_find_state *, struct key_event *,
2544		     int);
2545struct cmdq_state *cmdq_link_state(struct cmdq_state *);
2546struct cmdq_state *cmdq_copy_state(struct cmdq_state *,
2547		     struct cmd_find_state *);
2548void		  cmdq_free_state(struct cmdq_state *);
2549void printflike(3, 4) cmdq_add_format(struct cmdq_state *, const char *,
2550		     const char *, ...);
2551void		  cmdq_add_formats(struct cmdq_state *, struct format_tree *);
2552void		  cmdq_merge_formats(struct cmdq_item *, struct format_tree *);
2553struct cmdq_list *cmdq_new(void);
2554void cmdq_free(struct cmdq_list *);
2555const char	 *cmdq_get_name(struct cmdq_item *);
2556struct client	 *cmdq_get_client(struct cmdq_item *);
2557struct client	 *cmdq_get_target_client(struct cmdq_item *);
2558struct cmdq_state *cmdq_get_state(struct cmdq_item *);
2559struct cmd_find_state *cmdq_get_target(struct cmdq_item *);
2560struct cmd_find_state *cmdq_get_source(struct cmdq_item *);
2561struct key_event *cmdq_get_event(struct cmdq_item *);
2562struct cmd_find_state *cmdq_get_current(struct cmdq_item *);
2563int		  cmdq_get_flags(struct cmdq_item *);
2564struct cmdq_item *cmdq_get_command(struct cmd_list *, struct cmdq_state *);
2565#define cmdq_get_callback(cb, data) cmdq_get_callback1(#cb, cb, data)
2566struct cmdq_item *cmdq_get_callback1(const char *, cmdq_cb, void *);
2567struct cmdq_item *cmdq_get_error(const char *);
2568struct cmdq_item *cmdq_insert_after(struct cmdq_item *, struct cmdq_item *);
2569struct cmdq_item *cmdq_append(struct client *, struct cmdq_item *);
2570void printflike(4, 5) cmdq_insert_hook(struct session *, struct cmdq_item *,
2571		     struct cmd_find_state *, const char *, ...);
2572void		 cmdq_continue(struct cmdq_item *);
2573u_int		 cmdq_next(struct client *);
2574struct cmdq_item *cmdq_running(struct client *);
2575void		 cmdq_guard(struct cmdq_item *, const char *, int);
2576void printflike(2, 3) cmdq_print(struct cmdq_item *, const char *, ...);
2577void 		 cmdq_print_data(struct cmdq_item *, int, struct evbuffer *);
2578void printflike(2, 3) cmdq_error(struct cmdq_item *, const char *, ...);
2579
2580/* cmd-wait-for.c */
2581void	cmd_wait_for_flush(void);
2582
2583/* client.c */
2584int	client_main(struct event_base *, int, char **, uint64_t, int);
2585
2586/* key-bindings.c */
2587struct key_table *key_bindings_get_table(const char *, int);
2588struct key_table *key_bindings_first_table(void);
2589struct key_table *key_bindings_next_table(struct key_table *);
2590void	 key_bindings_unref_table(struct key_table *);
2591struct key_binding *key_bindings_get(struct key_table *, key_code);
2592struct key_binding *key_bindings_get_default(struct key_table *, key_code);
2593struct key_binding *key_bindings_first(struct key_table *);
2594struct key_binding *key_bindings_next(struct key_table *, struct key_binding *);
2595void	 key_bindings_add(const char *, key_code, const char *, int,
2596	     struct cmd_list *);
2597void	 key_bindings_remove(const char *, key_code);
2598void	 key_bindings_reset(const char *, key_code);
2599void	 key_bindings_remove_table(const char *);
2600void	 key_bindings_reset_table(const char *);
2601void	 key_bindings_init(void);
2602struct cmdq_item *key_bindings_dispatch(struct key_binding *,
2603	     struct cmdq_item *, struct client *, struct key_event *,
2604	     struct cmd_find_state *);
2605
2606/* key-string.c */
2607key_code	 key_string_lookup_string(const char *);
2608const char	*key_string_lookup_key(key_code, int);
2609
2610/* alerts.c */
2611void	alerts_reset_all(void);
2612void	alerts_queue(struct window *, int);
2613void	alerts_check_session(struct session *);
2614
2615/* file.c */
2616int	 file_cmp(struct client_file *, struct client_file *);
2617RB_PROTOTYPE(client_files, client_file, entry, file_cmp);
2618struct client_file *file_create_with_peer(struct tmuxpeer *,
2619	    struct client_files *, int, client_file_cb, void *);
2620struct client_file *file_create_with_client(struct client *, int,
2621	    client_file_cb, void *);
2622void	 file_free(struct client_file *);
2623void	 file_fire_done(struct client_file *);
2624void	 file_fire_read(struct client_file *);
2625int	 file_can_print(struct client *);
2626void printflike(2, 3) file_print(struct client *, const char *, ...);
2627void printflike(2, 0) file_vprint(struct client *, const char *, va_list);
2628void	 file_print_buffer(struct client *, void *, size_t);
2629void printflike(2, 3) file_error(struct client *, const char *, ...);
2630void	 file_write(struct client *, const char *, int, const void *, size_t,
2631	     client_file_cb, void *);
2632struct client_file *file_read(struct client *, const char *, client_file_cb,
2633	     void *);
2634void	 file_cancel(struct client_file *);
2635void	 file_push(struct client_file *);
2636int	 file_write_left(struct client_files *);
2637void	 file_write_open(struct client_files *, struct tmuxpeer *,
2638	     struct imsg *, int, int, client_file_cb, void *);
2639void	 file_write_data(struct client_files *, struct imsg *);
2640void	 file_write_close(struct client_files *, struct imsg *);
2641void	 file_read_open(struct client_files *, struct tmuxpeer *, struct imsg *,
2642	     int, int, client_file_cb, void *);
2643void	 file_write_ready(struct client_files *, struct imsg *);
2644void	 file_read_data(struct client_files *, struct imsg *);
2645void	 file_read_done(struct client_files *, struct imsg *);
2646void	 file_read_cancel(struct client_files *, struct imsg *);
2647
2648/* server.c */
2649extern struct tmuxproc *server_proc;
2650extern struct clients clients;
2651extern struct cmd_find_state marked_pane;
2652extern struct message_list message_log;
2653extern time_t current_time;
2654void	 server_set_marked(struct session *, struct winlink *,
2655	     struct window_pane *);
2656void	 server_clear_marked(void);
2657int	 server_is_marked(struct session *, struct winlink *,
2658	     struct window_pane *);
2659int	 server_check_marked(void);
2660int	 server_start(struct tmuxproc *, int, struct event_base *, int, char *);
2661void	 server_update_socket(void);
2662void	 server_add_accept(int);
2663void printflike(1, 2) server_add_message(const char *, ...);
2664
2665/* server-client.c */
2666RB_PROTOTYPE(client_windows, client_window, entry, server_client_window_cmp);
2667u_int	 server_client_how_many(void);
2668void	 server_client_set_overlay(struct client *, u_int, overlay_check_cb,
2669	     overlay_mode_cb, overlay_draw_cb, overlay_key_cb,
2670	     overlay_free_cb, overlay_resize_cb, void *);
2671void	 server_client_clear_overlay(struct client *);
2672void	 server_client_overlay_range(u_int, u_int, u_int, u_int, u_int, u_int,
2673	     u_int, struct overlay_ranges *);
2674void	 server_client_set_key_table(struct client *, const char *);
2675const char *server_client_get_key_table(struct client *);
2676int	 server_client_check_nested(struct client *);
2677int	 server_client_handle_key(struct client *, struct key_event *);
2678struct client *server_client_create(int);
2679int	 server_client_open(struct client *, char **);
2680void	 server_client_unref(struct client *);
2681void	 server_client_set_session(struct client *, struct session *);
2682void	 server_client_lost(struct client *);
2683void	 server_client_suspend(struct client *);
2684void	 server_client_detach(struct client *, enum msgtype);
2685void	 server_client_exec(struct client *, const char *);
2686void	 server_client_loop(void);
2687void	 server_client_push_stdout(struct client *);
2688void	 server_client_push_stderr(struct client *);
2689const char *server_client_get_cwd(struct client *, struct session *);
2690void	 server_client_set_flags(struct client *, const char *);
2691const char *server_client_get_flags(struct client *);
2692struct client_window *server_client_get_client_window(struct client *, u_int);
2693struct client_window *server_client_add_client_window(struct client *, u_int);
2694struct window_pane *server_client_get_pane(struct client *);
2695void	 server_client_set_pane(struct client *, struct window_pane *);
2696void	 server_client_remove_pane(struct window_pane *);
2697void	 server_client_print(struct client *, int, struct evbuffer *);
2698
2699/* server-fn.c */
2700void	 server_redraw_client(struct client *);
2701void	 server_status_client(struct client *);
2702void	 server_redraw_session(struct session *);
2703void	 server_redraw_session_group(struct session *);
2704void	 server_status_session(struct session *);
2705void	 server_status_session_group(struct session *);
2706void	 server_redraw_window(struct window *);
2707void	 server_redraw_window_borders(struct window *);
2708void	 server_status_window(struct window *);
2709void	 server_lock(void);
2710void	 server_lock_session(struct session *);
2711void	 server_lock_client(struct client *);
2712void	 server_kill_pane(struct window_pane *);
2713void	 server_kill_window(struct window *, int);
2714void	 server_renumber_session(struct session *);
2715void	 server_renumber_all(void);
2716int	 server_link_window(struct session *,
2717	     struct winlink *, struct session *, int, int, int, char **);
2718void	 server_unlink_window(struct session *, struct winlink *);
2719void	 server_destroy_pane(struct window_pane *, int);
2720void	 server_destroy_session(struct session *);
2721void	 server_check_unattached(void);
2722void	 server_unzoom_window(struct window *);
2723
2724/* status.c */
2725extern char	**status_prompt_hlist[];
2726extern u_int	  status_prompt_hsize[];
2727void	 status_timer_start(struct client *);
2728void	 status_timer_start_all(void);
2729void	 status_update_cache(struct session *);
2730int	 status_at_line(struct client *);
2731u_int	 status_line_size(struct client *);
2732struct style_range *status_get_range(struct client *, u_int, u_int);
2733void	 status_init(struct client *);
2734void	 status_free(struct client *);
2735int	 status_redraw(struct client *);
2736void printflike(5, 6) status_message_set(struct client *, int, int, int,
2737	     const char *, ...);
2738void	 status_message_clear(struct client *);
2739int	 status_message_redraw(struct client *);
2740void	 status_prompt_set(struct client *, struct cmd_find_state *,
2741	     const char *, const char *, prompt_input_cb, prompt_free_cb,
2742	     void *, int, enum prompt_type);
2743void	 status_prompt_clear(struct client *);
2744int	 status_prompt_redraw(struct client *);
2745int	 status_prompt_key(struct client *, key_code);
2746void	 status_prompt_update(struct client *, const char *, const char *);
2747void	 status_prompt_load_history(void);
2748void	 status_prompt_save_history(void);
2749const char *status_prompt_type_string(u_int);
2750enum prompt_type status_prompt_type(const char *type);
2751
2752/* resize.c */
2753void	 resize_window(struct window *, u_int, u_int, int, int);
2754void	 default_window_size(struct client *, struct session *, struct window *,
2755	     u_int *, u_int *, u_int *, u_int *, int);
2756void	 recalculate_size(struct window *, int);
2757void	 recalculate_sizes(void);
2758void	 recalculate_sizes_now(int);
2759
2760/* input.c */
2761struct input_ctx *input_init(struct window_pane *, struct bufferevent *,
2762	     struct colour_palette *);
2763void	 input_free(struct input_ctx *);
2764void	 input_reset(struct input_ctx *, int);
2765struct evbuffer *input_pending(struct input_ctx *);
2766void	 input_parse_pane(struct window_pane *);
2767void	 input_parse_buffer(struct window_pane *, u_char *, size_t);
2768void	 input_parse_screen(struct input_ctx *, struct screen *,
2769	     screen_write_init_ctx_cb, void *, u_char *, size_t);
2770void	 input_reply_clipboard(struct bufferevent *, const char *, size_t,
2771	     const char *);
2772
2773/* input-key.c */
2774void	 input_key_build(void);
2775int	 input_key_pane(struct window_pane *, key_code, struct mouse_event *);
2776int	 input_key(struct screen *, struct bufferevent *, key_code);
2777int	 input_key_get_mouse(struct screen *, struct mouse_event *, u_int,
2778	     u_int, const char **, size_t *);
2779
2780/* colour.c */
2781int	 colour_find_rgb(u_char, u_char, u_char);
2782int	 colour_join_rgb(u_char, u_char, u_char);
2783void	 colour_split_rgb(int, u_char *, u_char *, u_char *);
2784int	 colour_force_rgb(int);
2785const char *colour_tostring(int);
2786int	 colour_fromstring(const char *s);
2787int	 colour_256toRGB(int);
2788int	 colour_256to16(int);
2789int	 colour_byname(const char *);
2790int	 colour_parseX11(const char *);
2791void	 colour_palette_init(struct colour_palette *);
2792void	 colour_palette_clear(struct colour_palette *);
2793void	 colour_palette_free(struct colour_palette *);
2794int	 colour_palette_get(struct colour_palette *, int);
2795int	 colour_palette_set(struct colour_palette *, int, int);
2796void	 colour_palette_from_option(struct colour_palette *, struct options *);
2797
2798/* attributes.c */
2799const char *attributes_tostring(int);
2800int	 attributes_fromstring(const char *);
2801
2802/* grid.c */
2803extern const struct grid_cell grid_default_cell;
2804void	 grid_empty_line(struct grid *, u_int, u_int);
2805int	 grid_cells_equal(const struct grid_cell *, const struct grid_cell *);
2806int	 grid_cells_look_equal(const struct grid_cell *,
2807	     const struct grid_cell *);
2808struct grid *grid_create(u_int, u_int, u_int);
2809void	 grid_destroy(struct grid *);
2810int	 grid_compare(struct grid *, struct grid *);
2811void	 grid_collect_history(struct grid *);
2812void	 grid_remove_history(struct grid *, u_int );
2813void	 grid_scroll_history(struct grid *, u_int);
2814void	 grid_scroll_history_region(struct grid *, u_int, u_int, u_int);
2815void	 grid_clear_history(struct grid *);
2816const struct grid_line *grid_peek_line(struct grid *, u_int);
2817void	 grid_get_cell(struct grid *, u_int, u_int, struct grid_cell *);
2818void	 grid_set_cell(struct grid *, u_int, u_int, const struct grid_cell *);
2819void	 grid_set_padding(struct grid *, u_int, u_int);
2820void	 grid_set_cells(struct grid *, u_int, u_int, const struct grid_cell *,
2821	     const char *, size_t);
2822struct grid_line *grid_get_line(struct grid *, u_int);
2823void	 grid_adjust_lines(struct grid *, u_int);
2824void	 grid_clear(struct grid *, u_int, u_int, u_int, u_int, u_int);
2825void	 grid_clear_lines(struct grid *, u_int, u_int, u_int);
2826void	 grid_move_lines(struct grid *, u_int, u_int, u_int, u_int);
2827void	 grid_move_cells(struct grid *, u_int, u_int, u_int, u_int, u_int);
2828char	*grid_string_cells(struct grid *, u_int, u_int, u_int,
2829	     struct grid_cell **, int, struct screen *);
2830void	 grid_duplicate_lines(struct grid *, u_int, struct grid *, u_int,
2831	     u_int);
2832void	 grid_reflow(struct grid *, u_int);
2833void	 grid_wrap_position(struct grid *, u_int, u_int, u_int *, u_int *);
2834void	 grid_unwrap_position(struct grid *, u_int *, u_int *, u_int, u_int);
2835u_int	 grid_line_length(struct grid *, u_int);
2836
2837/* grid-reader.c */
2838void	 grid_reader_start(struct grid_reader *, struct grid *, u_int, u_int);
2839void	 grid_reader_get_cursor(struct grid_reader *, u_int *, u_int *);
2840u_int	 grid_reader_line_length(struct grid_reader *);
2841int	 grid_reader_in_set(struct grid_reader *, const char *);
2842void	 grid_reader_cursor_right(struct grid_reader *, int, int);
2843void	 grid_reader_cursor_left(struct grid_reader *, int);
2844void	 grid_reader_cursor_down(struct grid_reader *);
2845void	 grid_reader_cursor_up(struct grid_reader *);
2846void	 grid_reader_cursor_start_of_line(struct grid_reader *, int);
2847void	 grid_reader_cursor_end_of_line(struct grid_reader *, int, int);
2848void	 grid_reader_cursor_next_word(struct grid_reader *, const char *);
2849void	 grid_reader_cursor_next_word_end(struct grid_reader *, const char *);
2850void	 grid_reader_cursor_previous_word(struct grid_reader *, const char *,
2851	     int, int);
2852int	 grid_reader_cursor_jump(struct grid_reader *,
2853	     const struct utf8_data *);
2854int	 grid_reader_cursor_jump_back(struct grid_reader *,
2855	     const struct utf8_data *);
2856void	 grid_reader_cursor_back_to_indentation(struct grid_reader *);
2857
2858/* grid-view.c */
2859void	 grid_view_get_cell(struct grid *, u_int, u_int, struct grid_cell *);
2860void	 grid_view_set_cell(struct grid *, u_int, u_int,
2861	     const struct grid_cell *);
2862void	 grid_view_set_padding(struct grid *, u_int, u_int);
2863void	 grid_view_set_cells(struct grid *, u_int, u_int,
2864	     const struct grid_cell *, const char *, size_t);
2865void	 grid_view_clear_history(struct grid *, u_int);
2866void	 grid_view_clear(struct grid *, u_int, u_int, u_int, u_int, u_int);
2867void	 grid_view_scroll_region_up(struct grid *, u_int, u_int, u_int);
2868void	 grid_view_scroll_region_down(struct grid *, u_int, u_int, u_int);
2869void	 grid_view_insert_lines(struct grid *, u_int, u_int, u_int);
2870void	 grid_view_insert_lines_region(struct grid *, u_int, u_int, u_int,
2871	     u_int);
2872void	 grid_view_delete_lines(struct grid *, u_int, u_int, u_int);
2873void	 grid_view_delete_lines_region(struct grid *, u_int, u_int, u_int,
2874	     u_int);
2875void	 grid_view_insert_cells(struct grid *, u_int, u_int, u_int, u_int);
2876void	 grid_view_delete_cells(struct grid *, u_int, u_int, u_int, u_int);
2877char	*grid_view_string_cells(struct grid *, u_int, u_int, u_int);
2878
2879/* screen-write.c */
2880void	 screen_write_make_list(struct screen *);
2881void	 screen_write_free_list(struct screen *);
2882void	 screen_write_start_pane(struct screen_write_ctx *,
2883	     struct window_pane *, struct screen *);
2884void	 screen_write_start(struct screen_write_ctx *, struct screen *);
2885void	 screen_write_start_callback(struct screen_write_ctx *, struct screen *,
2886	     screen_write_init_ctx_cb, void *);
2887void	 screen_write_stop(struct screen_write_ctx *);
2888void	 screen_write_reset(struct screen_write_ctx *);
2889size_t printflike(1, 2) screen_write_strlen(const char *, ...);
2890int printflike(7, 8) screen_write_text(struct screen_write_ctx *, u_int, u_int,
2891	     u_int, int, const struct grid_cell *, const char *, ...);
2892void printflike(3, 4) screen_write_puts(struct screen_write_ctx *,
2893	     const struct grid_cell *, const char *, ...);
2894void printflike(4, 5) screen_write_nputs(struct screen_write_ctx *,
2895	     ssize_t, const struct grid_cell *, const char *, ...);
2896void printflike(4, 0) screen_write_vnputs(struct screen_write_ctx *, ssize_t,
2897	     const struct grid_cell *, const char *, va_list);
2898void	 screen_write_putc(struct screen_write_ctx *, const struct grid_cell *,
2899	     u_char);
2900void	 screen_write_fast_copy(struct screen_write_ctx *, struct screen *,
2901	     u_int, u_int, u_int, u_int);
2902void	 screen_write_hline(struct screen_write_ctx *, u_int, int, int,
2903	     enum box_lines, const struct grid_cell *);
2904void	 screen_write_vline(struct screen_write_ctx *, u_int, int, int);
2905void	 screen_write_menu(struct screen_write_ctx *, struct menu *, int,
2906	     enum box_lines, const struct grid_cell *, const struct grid_cell *,
2907	     const struct grid_cell *);
2908void	 screen_write_box(struct screen_write_ctx *, u_int, u_int,
2909             enum box_lines, const struct grid_cell *, const char *);
2910void	 screen_write_preview(struct screen_write_ctx *, struct screen *, u_int,
2911	     u_int);
2912void	 screen_write_backspace(struct screen_write_ctx *);
2913void	 screen_write_mode_set(struct screen_write_ctx *, int);
2914void	 screen_write_mode_clear(struct screen_write_ctx *, int);
2915void	 screen_write_cursorup(struct screen_write_ctx *, u_int);
2916void	 screen_write_cursordown(struct screen_write_ctx *, u_int);
2917void	 screen_write_cursorright(struct screen_write_ctx *, u_int);
2918void	 screen_write_cursorleft(struct screen_write_ctx *, u_int);
2919void	 screen_write_alignmenttest(struct screen_write_ctx *);
2920void	 screen_write_insertcharacter(struct screen_write_ctx *, u_int, u_int);
2921void	 screen_write_deletecharacter(struct screen_write_ctx *, u_int, u_int);
2922void	 screen_write_clearcharacter(struct screen_write_ctx *, u_int, u_int);
2923void	 screen_write_insertline(struct screen_write_ctx *, u_int, u_int);
2924void	 screen_write_deleteline(struct screen_write_ctx *, u_int, u_int);
2925void	 screen_write_clearline(struct screen_write_ctx *, u_int);
2926void	 screen_write_clearendofline(struct screen_write_ctx *, u_int);
2927void	 screen_write_clearstartofline(struct screen_write_ctx *, u_int);
2928void	 screen_write_cursormove(struct screen_write_ctx *, int, int, int);
2929void	 screen_write_reverseindex(struct screen_write_ctx *, u_int);
2930void	 screen_write_scrollregion(struct screen_write_ctx *, u_int, u_int);
2931void	 screen_write_linefeed(struct screen_write_ctx *, int, u_int);
2932void	 screen_write_scrollup(struct screen_write_ctx *, u_int, u_int);
2933void	 screen_write_scrolldown(struct screen_write_ctx *, u_int, u_int);
2934void	 screen_write_carriagereturn(struct screen_write_ctx *);
2935void	 screen_write_clearendofscreen(struct screen_write_ctx *, u_int);
2936void	 screen_write_clearstartofscreen(struct screen_write_ctx *, u_int);
2937void	 screen_write_clearscreen(struct screen_write_ctx *, u_int);
2938void	 screen_write_clearhistory(struct screen_write_ctx *);
2939void	 screen_write_fullredraw(struct screen_write_ctx *);
2940void	 screen_write_collect_end(struct screen_write_ctx *);
2941void	 screen_write_collect_add(struct screen_write_ctx *,
2942	     const struct grid_cell *);
2943void	 screen_write_cell(struct screen_write_ctx *, const struct grid_cell *);
2944void	 screen_write_setselection(struct screen_write_ctx *, const char *,
2945	     u_char *, u_int);
2946void	 screen_write_rawstring(struct screen_write_ctx *, u_char *, u_int,
2947	     int);
2948void	 screen_write_alternateon(struct screen_write_ctx *,
2949	     struct grid_cell *, int);
2950void	 screen_write_alternateoff(struct screen_write_ctx *,
2951	     struct grid_cell *, int);
2952
2953/* screen-redraw.c */
2954void	 screen_redraw_screen(struct client *);
2955void	 screen_redraw_pane(struct client *, struct window_pane *);
2956
2957/* screen.c */
2958void	 screen_init(struct screen *, u_int, u_int, u_int);
2959void	 screen_reinit(struct screen *);
2960void	 screen_free(struct screen *);
2961void	 screen_reset_tabs(struct screen *);
2962void	 screen_reset_hyperlinks(struct screen *);
2963void	 screen_set_cursor_style(u_int, enum screen_cursor_style *, int *);
2964void	 screen_set_cursor_colour(struct screen *, int);
2965int	 screen_set_title(struct screen *, const char *);
2966void	 screen_set_path(struct screen *, const char *);
2967void	 screen_push_title(struct screen *);
2968void	 screen_pop_title(struct screen *);
2969void	 screen_resize(struct screen *, u_int, u_int, int);
2970void	 screen_resize_cursor(struct screen *, u_int, u_int, int, int, int);
2971void	 screen_set_selection(struct screen *, u_int, u_int, u_int, u_int,
2972	     u_int, int, struct grid_cell *);
2973void	 screen_clear_selection(struct screen *);
2974void	 screen_hide_selection(struct screen *);
2975int	 screen_check_selection(struct screen *, u_int, u_int);
2976void	 screen_select_cell(struct screen *, struct grid_cell *,
2977	     const struct grid_cell *);
2978void	 screen_alternate_on(struct screen *, struct grid_cell *, int);
2979void	 screen_alternate_off(struct screen *, struct grid_cell *, int);
2980const char *screen_mode_to_string(int);
2981
2982/* window.c */
2983extern struct windows windows;
2984extern struct window_pane_tree all_window_panes;
2985int		 window_cmp(struct window *, struct window *);
2986RB_PROTOTYPE(windows, window, entry, window_cmp);
2987int		 winlink_cmp(struct winlink *, struct winlink *);
2988RB_PROTOTYPE(winlinks, winlink, entry, winlink_cmp);
2989int		 window_pane_cmp(struct window_pane *, struct window_pane *);
2990RB_PROTOTYPE(window_pane_tree, window_pane, tree_entry, window_pane_cmp);
2991struct winlink	*winlink_find_by_index(struct winlinks *, int);
2992struct winlink	*winlink_find_by_window(struct winlinks *, struct window *);
2993struct winlink	*winlink_find_by_window_id(struct winlinks *, u_int);
2994u_int		 winlink_count(struct winlinks *);
2995struct winlink	*winlink_add(struct winlinks *, int);
2996void		 winlink_set_window(struct winlink *, struct window *);
2997void		 winlink_remove(struct winlinks *, struct winlink *);
2998struct winlink	*winlink_next(struct winlink *);
2999struct winlink	*winlink_previous(struct winlink *);
3000struct winlink	*winlink_next_by_number(struct winlink *, struct session *,
3001		     int);
3002struct winlink	*winlink_previous_by_number(struct winlink *, struct session *,
3003		     int);
3004void		 winlink_stack_push(struct winlink_stack *, struct winlink *);
3005void		 winlink_stack_remove(struct winlink_stack *, struct winlink *);
3006struct window	*window_find_by_id_str(const char *);
3007struct window	*window_find_by_id(u_int);
3008void		 window_update_activity(struct window *);
3009struct window	*window_create(u_int, u_int, u_int, u_int);
3010void		 window_pane_set_event(struct window_pane *);
3011struct window_pane *window_get_active_at(struct window *, u_int, u_int);
3012struct window_pane *window_find_string(struct window *, const char *);
3013int		 window_has_pane(struct window *, struct window_pane *);
3014int		 window_set_active_pane(struct window *, struct window_pane *,
3015		     int);
3016void		 window_update_focus(struct window *);
3017void		 window_pane_update_focus(struct window_pane *);
3018void		 window_redraw_active_switch(struct window *,
3019		     struct window_pane *);
3020struct window_pane *window_add_pane(struct window *, struct window_pane *,
3021		     u_int, int);
3022void		 window_resize(struct window *, u_int, u_int, int, int);
3023void		 window_pane_send_resize(struct window_pane *, u_int, u_int);
3024int		 window_zoom(struct window_pane *);
3025int		 window_unzoom(struct window *, int);
3026int		 window_push_zoom(struct window *, int, int);
3027int		 window_pop_zoom(struct window *);
3028void		 window_lost_pane(struct window *, struct window_pane *);
3029void		 window_remove_pane(struct window *, struct window_pane *);
3030struct window_pane *window_pane_at_index(struct window *, u_int);
3031struct window_pane *window_pane_next_by_number(struct window *,
3032			struct window_pane *, u_int);
3033struct window_pane *window_pane_previous_by_number(struct window *,
3034			struct window_pane *, u_int);
3035int		 window_pane_index(struct window_pane *, u_int *);
3036u_int		 window_count_panes(struct window *);
3037void		 window_destroy_panes(struct window *);
3038struct window_pane *window_pane_find_by_id_str(const char *);
3039struct window_pane *window_pane_find_by_id(u_int);
3040int		 window_pane_destroy_ready(struct window_pane *);
3041void		 window_pane_resize(struct window_pane *, u_int, u_int);
3042int		 window_pane_set_mode(struct window_pane *,
3043		     struct window_pane *, const struct window_mode *,
3044		     struct cmd_find_state *, struct args *);
3045void		 window_pane_reset_mode(struct window_pane *);
3046void		 window_pane_reset_mode_all(struct window_pane *);
3047int		 window_pane_key(struct window_pane *, struct client *,
3048		     struct session *, struct winlink *, key_code,
3049		     struct mouse_event *);
3050int		 window_pane_visible(struct window_pane *);
3051int		 window_pane_exited(struct window_pane *);
3052u_int		 window_pane_search(struct window_pane *, const char *, int,
3053		     int);
3054const char	*window_printable_flags(struct winlink *, int);
3055struct window_pane *window_pane_find_up(struct window_pane *);
3056struct window_pane *window_pane_find_down(struct window_pane *);
3057struct window_pane *window_pane_find_left(struct window_pane *);
3058struct window_pane *window_pane_find_right(struct window_pane *);
3059void		 window_pane_stack_push(struct window_panes *,
3060		     struct window_pane *);
3061void		 window_pane_stack_remove(struct window_panes *,
3062		     struct window_pane *);
3063void		 window_set_name(struct window *, const char *);
3064void		 window_add_ref(struct window *, const char *);
3065void		 window_remove_ref(struct window *, const char *);
3066void		 winlink_clear_flags(struct winlink *);
3067int		 winlink_shuffle_up(struct session *, struct winlink *, int);
3068int		 window_pane_start_input(struct window_pane *,
3069		     struct cmdq_item *, char **);
3070void		*window_pane_get_new_data(struct window_pane *,
3071		     struct window_pane_offset *, size_t *);
3072void		 window_pane_update_used_data(struct window_pane *,
3073		     struct window_pane_offset *, size_t);
3074void		 window_set_fill_character(struct window *);
3075void		 window_pane_default_cursor(struct window_pane *);
3076
3077/* layout.c */
3078u_int		 layout_count_cells(struct layout_cell *);
3079struct layout_cell *layout_create_cell(struct layout_cell *);
3080void		 layout_free_cell(struct layout_cell *);
3081void		 layout_print_cell(struct layout_cell *, const char *, u_int);
3082void		 layout_destroy_cell(struct window *, struct layout_cell *,
3083		     struct layout_cell **);
3084void		 layout_resize_layout(struct window *, struct layout_cell *,
3085		     enum layout_type, int, int);
3086struct layout_cell *layout_search_by_border(struct layout_cell *, u_int, u_int);
3087void		 layout_set_size(struct layout_cell *, u_int, u_int, u_int,
3088		     u_int);
3089void		 layout_make_leaf(struct layout_cell *, struct window_pane *);
3090void		 layout_make_node(struct layout_cell *, enum layout_type);
3091void		 layout_fix_offsets(struct window *);
3092void		 layout_fix_panes(struct window *, struct window_pane *);
3093void		 layout_resize_adjust(struct window *, struct layout_cell *,
3094		     enum layout_type, int);
3095void		 layout_init(struct window *, struct window_pane *);
3096void		 layout_free(struct window *);
3097void		 layout_resize(struct window *, u_int, u_int);
3098void		 layout_resize_pane(struct window_pane *, enum layout_type,
3099		     int, int);
3100void		 layout_resize_pane_to(struct window_pane *, enum layout_type,
3101		     u_int);
3102void		 layout_assign_pane(struct layout_cell *, struct window_pane *,
3103		     int);
3104struct layout_cell *layout_split_pane(struct window_pane *, enum layout_type,
3105		     int, int);
3106void		 layout_close_pane(struct window_pane *);
3107int		 layout_spread_cell(struct window *, struct layout_cell *);
3108void		 layout_spread_out(struct window_pane *);
3109
3110/* layout-custom.c */
3111char		*layout_dump(struct layout_cell *);
3112int		 layout_parse(struct window *, const char *, char **);
3113
3114/* layout-set.c */
3115int		 layout_set_lookup(const char *);
3116u_int		 layout_set_select(struct window *, u_int);
3117u_int		 layout_set_next(struct window *);
3118u_int		 layout_set_previous(struct window *);
3119
3120/* mode-tree.c */
3121typedef void (*mode_tree_build_cb)(void *, struct mode_tree_sort_criteria *,
3122				   uint64_t *, const char *);
3123typedef void (*mode_tree_draw_cb)(void *, void *, struct screen_write_ctx *,
3124	     u_int, u_int);
3125typedef int (*mode_tree_search_cb)(void *, void *, const char *);
3126typedef void (*mode_tree_menu_cb)(void *, struct client *, key_code);
3127typedef u_int (*mode_tree_height_cb)(void *, u_int);
3128typedef key_code (*mode_tree_key_cb)(void *, void *, u_int);
3129typedef void (*mode_tree_each_cb)(void *, void *, struct client *, key_code);
3130u_int	 mode_tree_count_tagged(struct mode_tree_data *);
3131void	*mode_tree_get_current(struct mode_tree_data *);
3132const char *mode_tree_get_current_name(struct mode_tree_data *);
3133void	 mode_tree_expand_current(struct mode_tree_data *);
3134void	 mode_tree_collapse_current(struct mode_tree_data *);
3135void	 mode_tree_expand(struct mode_tree_data *, uint64_t);
3136int	 mode_tree_set_current(struct mode_tree_data *, uint64_t);
3137void	 mode_tree_each_tagged(struct mode_tree_data *, mode_tree_each_cb,
3138	     struct client *, key_code, int);
3139void	 mode_tree_up(struct mode_tree_data *, int);
3140void	 mode_tree_down(struct mode_tree_data *, int);
3141struct mode_tree_data *mode_tree_start(struct window_pane *, struct args *,
3142	     mode_tree_build_cb, mode_tree_draw_cb, mode_tree_search_cb,
3143	     mode_tree_menu_cb, mode_tree_height_cb, mode_tree_key_cb, void *,
3144	     const struct menu_item *, const char **, u_int, struct screen **);
3145void	 mode_tree_zoom(struct mode_tree_data *, struct args *);
3146void	 mode_tree_build(struct mode_tree_data *);
3147void	 mode_tree_free(struct mode_tree_data *);
3148void	 mode_tree_resize(struct mode_tree_data *, u_int, u_int);
3149struct mode_tree_item *mode_tree_add(struct mode_tree_data *,
3150	     struct mode_tree_item *, void *, uint64_t, const char *,
3151	     const char *, int);
3152void	 mode_tree_draw_as_parent(struct mode_tree_item *);
3153void	 mode_tree_no_tag(struct mode_tree_item *);
3154void	 mode_tree_remove(struct mode_tree_data *, struct mode_tree_item *);
3155void	 mode_tree_draw(struct mode_tree_data *);
3156int	 mode_tree_key(struct mode_tree_data *, struct client *, key_code *,
3157	     struct mouse_event *, u_int *, u_int *);
3158void	 mode_tree_run_command(struct client *, struct cmd_find_state *,
3159	     const char *, const char *);
3160
3161/* window-buffer.c */
3162extern const struct window_mode window_buffer_mode;
3163
3164/* window-tree.c */
3165extern const struct window_mode window_tree_mode;
3166
3167/* window-clock.c */
3168extern const struct window_mode window_clock_mode;
3169extern const char window_clock_table[14][5][5];
3170
3171/* window-client.c */
3172extern const struct window_mode window_client_mode;
3173
3174/* window-copy.c */
3175extern const struct window_mode window_copy_mode;
3176extern const struct window_mode window_view_mode;
3177void printflike(3, 4) window_copy_add(struct window_pane *, int, const char *,
3178		     ...);
3179void printflike(3, 0) window_copy_vadd(struct window_pane *, int, const char *,
3180		     va_list);
3181void		 window_copy_pageup(struct window_pane *, int);
3182void		 window_copy_start_drag(struct client *, struct mouse_event *);
3183char		*window_copy_get_word(struct window_pane *, u_int, u_int);
3184char		*window_copy_get_line(struct window_pane *, u_int);
3185
3186/* window-option.c */
3187extern const struct window_mode window_customize_mode;
3188
3189/* names.c */
3190void	 check_window_name(struct window *);
3191char	*default_window_name(struct window *);
3192char	*parse_window_name(const char *);
3193
3194/* control.c */
3195void	control_discard(struct client *);
3196void	control_start(struct client *);
3197void	control_ready(struct client *);
3198void	control_stop(struct client *);
3199void	control_set_pane_on(struct client *, struct window_pane *);
3200void	control_set_pane_off(struct client *, struct window_pane *);
3201void	control_continue_pane(struct client *, struct window_pane *);
3202void	control_pause_pane(struct client *, struct window_pane *);
3203struct window_pane_offset *control_pane_offset(struct client *,
3204	   struct window_pane *, int *);
3205void	control_reset_offsets(struct client *);
3206void printflike(2, 3) control_write(struct client *, const char *, ...);
3207void	control_write_output(struct client *, struct window_pane *);
3208int	control_all_done(struct client *);
3209void	control_add_sub(struct client *, const char *, enum control_sub_type,
3210    	   int, const char *);
3211void	control_remove_sub(struct client *, const char *);
3212
3213/* control-notify.c */
3214void	control_notify_input(struct client *, struct window_pane *,
3215	    const u_char *, size_t);
3216void	control_notify_pane_mode_changed(int);
3217void	control_notify_window_layout_changed(struct window *);
3218void	control_notify_window_pane_changed(struct window *);
3219void	control_notify_window_unlinked(struct session *, struct window *);
3220void	control_notify_window_linked(struct session *, struct window *);
3221void	control_notify_window_renamed(struct window *);
3222void	control_notify_client_session_changed(struct client *);
3223void	control_notify_client_detached(struct client *);
3224void	control_notify_session_renamed(struct session *);
3225void	control_notify_session_created(struct session *);
3226void	control_notify_session_closed(struct session *);
3227void	control_notify_session_window_changed(struct session *);
3228void	control_notify_paste_buffer_changed(const char *);
3229void	control_notify_paste_buffer_deleted(const char *);
3230
3231/* session.c */
3232extern struct sessions sessions;
3233extern u_int next_session_id;
3234int	session_cmp(struct session *, struct session *);
3235RB_PROTOTYPE(sessions, session, entry, session_cmp);
3236int		 session_alive(struct session *);
3237struct session	*session_find(const char *);
3238struct session	*session_find_by_id_str(const char *);
3239struct session	*session_find_by_id(u_int);
3240struct session	*session_create(const char *, const char *, const char *,
3241		     struct environ *, struct options *, struct termios *);
3242void		 session_destroy(struct session *, int,	 const char *);
3243void		 session_add_ref(struct session *, const char *);
3244void		 session_remove_ref(struct session *, const char *);
3245char		*session_check_name(const char *);
3246void		 session_update_activity(struct session *, struct timeval *);
3247struct session	*session_next_session(struct session *);
3248struct session	*session_previous_session(struct session *);
3249struct winlink	*session_new(struct session *, const char *, int, char **,
3250		     const char *, const char *, int, char **);
3251struct winlink	*session_attach(struct session *, struct window *, int,
3252		     char **);
3253int		 session_detach(struct session *, struct winlink *);
3254int		 session_has(struct session *, struct window *);
3255int		 session_is_linked(struct session *, struct window *);
3256int		 session_next(struct session *, int);
3257int		 session_previous(struct session *, int);
3258int		 session_select(struct session *, int);
3259int		 session_last(struct session *);
3260int		 session_set_current(struct session *, struct winlink *);
3261struct session_group *session_group_contains(struct session *);
3262struct session_group *session_group_find(const char *);
3263struct session_group *session_group_new(const char *);
3264void		 session_group_add(struct session_group *, struct session *);
3265void		 session_group_synchronize_to(struct session *);
3266void		 session_group_synchronize_from(struct session *);
3267u_int		 session_group_count(struct session_group *);
3268u_int		 session_group_attached_count(struct session_group *);
3269void		 session_renumber_windows(struct session *);
3270
3271/* utf8.c */
3272enum utf8_state	 utf8_towc (const struct utf8_data *, wchar_t *);
3273int		 utf8_in_table(wchar_t, const wchar_t *, u_int);
3274utf8_char	 utf8_build_one(u_char);
3275enum utf8_state	 utf8_from_data(const struct utf8_data *, utf8_char *);
3276void		 utf8_to_data(utf8_char, struct utf8_data *);
3277void		 utf8_set(struct utf8_data *, u_char);
3278void		 utf8_copy(struct utf8_data *, const struct utf8_data *);
3279enum utf8_state	 utf8_open(struct utf8_data *, u_char);
3280enum utf8_state	 utf8_append(struct utf8_data *, u_char);
3281int		 utf8_isvalid(const char *);
3282int		 utf8_strvis(char *, const char *, size_t, int);
3283int		 utf8_stravis(char **, const char *, int);
3284int		 utf8_stravisx(char **, const char *, size_t, int);
3285char		*utf8_sanitize(const char *);
3286size_t		 utf8_strlen(const struct utf8_data *);
3287u_int		 utf8_strwidth(const struct utf8_data *, ssize_t);
3288struct utf8_data *utf8_fromcstr(const char *);
3289char		*utf8_tocstr(struct utf8_data *);
3290u_int		 utf8_cstrwidth(const char *);
3291char		*utf8_padcstr(const char *, u_int);
3292char		*utf8_rpadcstr(const char *, u_int);
3293int		 utf8_cstrhas(const char *, const struct utf8_data *);
3294
3295/* utf8-combined.c */
3296int		 utf8_has_zwj(const struct utf8_data *);
3297int		 utf8_is_zwj(const struct utf8_data *);
3298int		 utf8_is_vs(const struct utf8_data *);
3299int		 utf8_is_modifier(const struct utf8_data *);
3300
3301/* procname.c */
3302char   *get_proc_name(int, char *);
3303char   *get_proc_cwd(int);
3304
3305/* log.c */
3306void	log_add_level(void);
3307int	log_get_level(void);
3308void	log_open(const char *);
3309void	log_toggle(const char *);
3310void	log_close(void);
3311void printflike(1, 2) log_debug(const char *, ...);
3312__dead void printflike(1, 2) fatal(const char *, ...);
3313__dead void printflike(1, 2) fatalx(const char *, ...);
3314
3315/* menu.c */
3316#define MENU_NOMOUSE 0x1
3317#define MENU_TAB 0x2
3318#define MENU_STAYOPEN 0x4
3319struct menu	*menu_create(const char *);
3320void		 menu_add_items(struct menu *, const struct menu_item *,
3321		    struct cmdq_item *, struct client *,
3322		    struct cmd_find_state *);
3323void		 menu_add_item(struct menu *, const struct menu_item *,
3324		    struct cmdq_item *, struct client *,
3325		    struct cmd_find_state *);
3326void		 menu_free(struct menu *);
3327struct menu_data *menu_prepare(struct menu *, int, int, struct cmdq_item *,
3328		    u_int, u_int, struct client *, enum box_lines, const char *,
3329		    const char *, const char *, struct cmd_find_state *,
3330		    menu_choice_cb, void *);
3331int		 menu_display(struct menu *, int, int, struct cmdq_item *,
3332		    u_int, u_int, struct client *, enum box_lines, const char *,
3333		    const char *, const char *, struct cmd_find_state *,
3334		    menu_choice_cb, void *);
3335struct screen	*menu_mode_cb(struct client *, void *, u_int *, u_int *);
3336void		 menu_check_cb(struct client *, void *, u_int, u_int, u_int,
3337		    struct overlay_ranges *);
3338void		 menu_draw_cb(struct client *, void *,
3339		    struct screen_redraw_ctx *);
3340void		 menu_free_cb(struct client *, void *);
3341int		 menu_key_cb(struct client *, void *, struct key_event *);
3342
3343/* popup.c */
3344#define POPUP_CLOSEEXIT 0x1
3345#define POPUP_CLOSEEXITZERO 0x2
3346#define POPUP_INTERNAL 0x4
3347typedef void (*popup_close_cb)(int, void *);
3348typedef void (*popup_finish_edit_cb)(char *, size_t, void *);
3349int		 popup_display(int, enum box_lines, struct cmdq_item *, u_int,
3350                    u_int, u_int, u_int, struct environ *, const char *, int,
3351                    char **, const char *, const char *, struct client *,
3352                    struct session *, const char *, const char *,
3353                    popup_close_cb, void *);
3354int		 popup_editor(struct client *, const char *, size_t,
3355		    popup_finish_edit_cb, void *);
3356
3357/* style.c */
3358int		 style_parse(struct style *,const struct grid_cell *,
3359		     const char *);
3360const char	*style_tostring(struct style *);
3361void		 style_add(struct grid_cell *, struct options *,
3362		     const char *, struct format_tree *);
3363void		 style_apply(struct grid_cell *, struct options *,
3364		     const char *, struct format_tree *);
3365void		 style_set(struct style *, const struct grid_cell *);
3366void		 style_copy(struct style *, struct style *);
3367
3368/* spawn.c */
3369struct winlink	*spawn_window(struct spawn_context *, char **);
3370struct window_pane *spawn_pane(struct spawn_context *, char **);
3371
3372/* regsub.c */
3373char		*regsub(const char *, const char *, const char *, int);
3374
3375/* server-acl.c */
3376void			 server_acl_init(void);
3377struct server_acl_user	*server_acl_user_find(uid_t);
3378void 			 server_acl_display(struct cmdq_item *);
3379void			 server_acl_user_allow(uid_t);
3380void			 server_acl_user_deny(uid_t);
3381void			 server_acl_user_allow_write(uid_t);
3382void			 server_acl_user_deny_write(uid_t);
3383int			 server_acl_join(struct client *);
3384uid_t			 server_acl_get_uid(struct server_acl_user *);
3385
3386/* hyperlink.c */
3387u_int	 		 hyperlinks_put(struct hyperlinks *, const char *,
3388			     const char *);
3389int			 hyperlinks_get(struct hyperlinks *, u_int,
3390			     const char **, const char **, const char **);
3391struct hyperlinks	*hyperlinks_init(void);
3392void			 hyperlinks_reset(struct hyperlinks *);
3393void			 hyperlinks_free(struct hyperlinks *);
3394
3395#endif /* TMUX_H */
3396