xref: /minix3/external/bsd/tmux/dist/tmux.h (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /* Id */
2eda6f593SDavid van Moolenbroek 
3eda6f593SDavid van Moolenbroek /*
4eda6f593SDavid van Moolenbroek  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
5eda6f593SDavid van Moolenbroek  *
6eda6f593SDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
7eda6f593SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8eda6f593SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9eda6f593SDavid van Moolenbroek  *
10eda6f593SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11eda6f593SDavid van Moolenbroek  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12eda6f593SDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13eda6f593SDavid van Moolenbroek  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14eda6f593SDavid van Moolenbroek  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15eda6f593SDavid van Moolenbroek  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16eda6f593SDavid van Moolenbroek  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17eda6f593SDavid van Moolenbroek  */
18eda6f593SDavid van Moolenbroek 
19eda6f593SDavid van Moolenbroek #ifndef TMUX_H
20eda6f593SDavid van Moolenbroek #define TMUX_H
21eda6f593SDavid van Moolenbroek 
22*0a6a1f1dSLionel Sambuc #define PROTOCOL_VERSION 8
23eda6f593SDavid van Moolenbroek 
24eda6f593SDavid van Moolenbroek #include <sys/param.h>
25eda6f593SDavid van Moolenbroek #include <sys/time.h>
26eda6f593SDavid van Moolenbroek #include <sys/uio.h>
27eda6f593SDavid van Moolenbroek 
28eda6f593SDavid van Moolenbroek #include <event.h>
29eda6f593SDavid van Moolenbroek #include <limits.h>
30eda6f593SDavid van Moolenbroek #include <signal.h>
31eda6f593SDavid van Moolenbroek #include <stdarg.h>
32eda6f593SDavid van Moolenbroek #include <stdio.h>
33eda6f593SDavid van Moolenbroek #include <termios.h>
34eda6f593SDavid van Moolenbroek 
35eda6f593SDavid van Moolenbroek #include "array.h"
36eda6f593SDavid van Moolenbroek 
37eda6f593SDavid van Moolenbroek #include "compat.h"
38eda6f593SDavid van Moolenbroek 
39eda6f593SDavid van Moolenbroek extern char    *__progname;
40eda6f593SDavid van Moolenbroek extern char   **environ;
41eda6f593SDavid van Moolenbroek 
42eda6f593SDavid van Moolenbroek /* Default prompt history length. */
43eda6f593SDavid van Moolenbroek #define PROMPT_HISTORY 100
44eda6f593SDavid van Moolenbroek 
45eda6f593SDavid van Moolenbroek /*
46eda6f593SDavid van Moolenbroek  * Minimum layout cell size, NOT including separator line. The scroll region
47eda6f593SDavid van Moolenbroek  * cannot be one line in height so this must be at least two.
48eda6f593SDavid van Moolenbroek  */
49eda6f593SDavid van Moolenbroek #define PANE_MINIMUM 2
50eda6f593SDavid van Moolenbroek 
51eda6f593SDavid van Moolenbroek /* Automatic name refresh interval, in milliseconds. */
52eda6f593SDavid van Moolenbroek #define NAME_INTERVAL 500
53eda6f593SDavid van Moolenbroek 
54eda6f593SDavid van Moolenbroek /*
55eda6f593SDavid van Moolenbroek  * UTF-8 data size. This must be big enough to hold combined characters as well
56eda6f593SDavid van Moolenbroek  * as single.
57eda6f593SDavid van Moolenbroek  */
58eda6f593SDavid van Moolenbroek #define UTF8_SIZE 9
59eda6f593SDavid van Moolenbroek 
60eda6f593SDavid van Moolenbroek /* Fatal errors. */
61eda6f593SDavid van Moolenbroek #define fatal(msg) log_fatal("%s: %s", __func__, msg);
62eda6f593SDavid van Moolenbroek #define fatalx(msg) log_fatalx("%s: %s", __func__, msg);
63eda6f593SDavid van Moolenbroek 
64eda6f593SDavid van Moolenbroek /* Definition to shut gcc up about unused arguments. */
65eda6f593SDavid van Moolenbroek #define unused __attribute__ ((unused))
66eda6f593SDavid van Moolenbroek 
67eda6f593SDavid van Moolenbroek /* Attribute to make gcc check printf-like arguments. */
68*0a6a1f1dSLionel Sambuc #define vprintflike2 __attribute__ ((format (printf, 2, 0)))
69*0a6a1f1dSLionel Sambuc #define vprintflike3 __attribute__ ((format (printf, 3, 0)))
70*0a6a1f1dSLionel Sambuc #define vprintflike5 __attribute__ ((format (printf, 5, 0)))
71eda6f593SDavid van Moolenbroek #define printflike1 __attribute__ ((format (printf, 1, 2)))
72eda6f593SDavid van Moolenbroek #define printflike2 __attribute__ ((format (printf, 2, 3)))
73eda6f593SDavid van Moolenbroek #define printflike3 __attribute__ ((format (printf, 3, 4)))
74eda6f593SDavid van Moolenbroek #define printflike4 __attribute__ ((format (printf, 4, 5)))
75eda6f593SDavid van Moolenbroek #define printflike5 __attribute__ ((format (printf, 5, 6)))
76eda6f593SDavid van Moolenbroek 
77eda6f593SDavid van Moolenbroek /* Number of items in array. */
78eda6f593SDavid van Moolenbroek #ifndef nitems
79eda6f593SDavid van Moolenbroek #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
80eda6f593SDavid van Moolenbroek #endif
81eda6f593SDavid van Moolenbroek 
82*0a6a1f1dSLionel Sambuc /* Default template for choose-buffer. */
83*0a6a1f1dSLionel Sambuc #define CHOOSE_BUFFER_TEMPLATE					\
84*0a6a1f1dSLionel Sambuc 	"#{line}: #{buffer_size} bytes: \"#{buffer_sample}\""
85*0a6a1f1dSLionel Sambuc 
86*0a6a1f1dSLionel Sambuc /* Default template for choose-client. */
87*0a6a1f1dSLionel Sambuc #define CHOOSE_CLIENT_TEMPLATE					\
88*0a6a1f1dSLionel Sambuc 	"#{client_tty}: #{session_name} "			\
89*0a6a1f1dSLionel Sambuc 	"[#{client_width}x#{client_height} #{client_termname}]"	\
90*0a6a1f1dSLionel Sambuc 	"#{?client_utf8, (utf8),}#{?client_readonly, (ro),} "	\
91*0a6a1f1dSLionel Sambuc 	"(last used #{client_activity_string})"
92*0a6a1f1dSLionel Sambuc 
93*0a6a1f1dSLionel Sambuc /* Default templates for choose-tree. */
94*0a6a1f1dSLionel Sambuc #define CHOOSE_TREE_SESSION_TEMPLATE				\
95*0a6a1f1dSLionel Sambuc 	"#{session_name}: #{session_windows} windows"		\
96*0a6a1f1dSLionel Sambuc 	"#{?session_grouped, (group ,}"				\
97*0a6a1f1dSLionel Sambuc 	"#{session_group}#{?session_grouped,),}"		\
98*0a6a1f1dSLionel Sambuc 	"#{?session_attached, (attached),}"
99*0a6a1f1dSLionel Sambuc #define CHOOSE_TREE_WINDOW_TEMPLATE				\
100*0a6a1f1dSLionel Sambuc 	"#{window_index}: #{window_name}#{window_flags} "	\
101*0a6a1f1dSLionel Sambuc 	"\"#{pane_title}\""
102*0a6a1f1dSLionel Sambuc 
103*0a6a1f1dSLionel Sambuc /* Default template for display-message. */
104*0a6a1f1dSLionel Sambuc #define DISPLAY_MESSAGE_TEMPLATE				\
105*0a6a1f1dSLionel Sambuc 	"[#{session_name}] #{window_index}:"			\
106*0a6a1f1dSLionel Sambuc 	"#{window_name}, current pane #{pane_index} "		\
107*0a6a1f1dSLionel Sambuc 	"- (%H:%M %d-%b-%y)"
108*0a6a1f1dSLionel Sambuc 
109*0a6a1f1dSLionel Sambuc /* Default template for find-window. */
110*0a6a1f1dSLionel Sambuc #define FIND_WINDOW_TEMPLATE					\
111*0a6a1f1dSLionel Sambuc 	"#{window_index}: #{window_name} "			\
112*0a6a1f1dSLionel Sambuc 	"[#{window_width}x#{window_height}] "			\
113*0a6a1f1dSLionel Sambuc 	"(#{window_panes} panes) #{window_find_matches}"
114*0a6a1f1dSLionel Sambuc 
115*0a6a1f1dSLionel Sambuc /* Default template for list-buffers. */
116*0a6a1f1dSLionel Sambuc #define LIST_BUFFERS_TEMPLATE					\
117*0a6a1f1dSLionel Sambuc 	"#{line}: #{buffer_size} bytes: \"#{buffer_sample}\""
118*0a6a1f1dSLionel Sambuc 
119*0a6a1f1dSLionel Sambuc /* Default template for list-clients. */
120*0a6a1f1dSLionel Sambuc #define LIST_CLIENTS_TEMPLATE					\
121*0a6a1f1dSLionel Sambuc 	"#{client_tty}: #{session_name} "			\
122*0a6a1f1dSLionel Sambuc 	"[#{client_width}x#{client_height} #{client_termname}]"	\
123*0a6a1f1dSLionel Sambuc 	"#{?client_utf8, (utf8),} #{?client_readonly, (ro),}"
124*0a6a1f1dSLionel Sambuc 
125*0a6a1f1dSLionel Sambuc /* Default template for list-sessions. */
126*0a6a1f1dSLionel Sambuc #define LIST_SESSIONS_TEMPLATE					\
127*0a6a1f1dSLionel Sambuc 	"#{session_name}: #{session_windows} windows "		\
128*0a6a1f1dSLionel Sambuc 	"(created #{session_created_string}) "			\
129*0a6a1f1dSLionel Sambuc 	"[#{session_width}x#{session_height}]"			\
130*0a6a1f1dSLionel Sambuc 	"#{?session_grouped, (group ,}"				\
131*0a6a1f1dSLionel Sambuc 	"#{session_group}#{?session_grouped,),}"		\
132*0a6a1f1dSLionel Sambuc 	"#{?session_attached, (attached),}"
133*0a6a1f1dSLionel Sambuc 
134*0a6a1f1dSLionel Sambuc /* Default templates for list-windows. */
135*0a6a1f1dSLionel Sambuc #define LIST_WINDOWS_TEMPLATE					\
136*0a6a1f1dSLionel Sambuc 	"#{window_index}: #{window_name}#{window_flags} "	\
137*0a6a1f1dSLionel Sambuc 	"(#{window_panes} panes) "				\
138*0a6a1f1dSLionel Sambuc 	"[#{window_width}x#{window_height}] "			\
139*0a6a1f1dSLionel Sambuc 	"[layout #{window_layout}] #{window_id}"		\
140*0a6a1f1dSLionel Sambuc 	"#{?window_active, (active),}";
141*0a6a1f1dSLionel Sambuc #define LIST_WINDOWS_WITH_SESSION_TEMPLATE			\
142*0a6a1f1dSLionel Sambuc 	"#{session_name}:"					\
143*0a6a1f1dSLionel Sambuc 	"#{window_index}: #{window_name}#{window_flags} "	\
144*0a6a1f1dSLionel Sambuc 	"(#{window_panes} panes) "				\
145*0a6a1f1dSLionel Sambuc 	"[#{window_width}x#{window_height}] "
146*0a6a1f1dSLionel Sambuc 
147*0a6a1f1dSLionel Sambuc /* Default templates for break-pane, new-window and split-window. */
148*0a6a1f1dSLionel Sambuc #define BREAK_PANE_TEMPLATE "#{session_name}:#{window_index}.#{pane_index}"
149*0a6a1f1dSLionel Sambuc #define NEW_SESSION_TEMPLATE "#{session_name}:"
150*0a6a1f1dSLionel Sambuc #define NEW_WINDOW_TEMPLATE BREAK_PANE_TEMPLATE
151*0a6a1f1dSLionel Sambuc #define SPLIT_WINDOW_TEMPLATE BREAK_PANE_TEMPLATE
152*0a6a1f1dSLionel Sambuc 
153eda6f593SDavid van Moolenbroek /* Bell option values. */
154eda6f593SDavid van Moolenbroek #define BELL_NONE 0
155eda6f593SDavid van Moolenbroek #define BELL_ANY 1
156eda6f593SDavid van Moolenbroek #define BELL_CURRENT 2
157eda6f593SDavid van Moolenbroek 
158eda6f593SDavid van Moolenbroek /* Special key codes. */
159eda6f593SDavid van Moolenbroek #define KEYC_NONE 0xfff
160eda6f593SDavid van Moolenbroek #define KEYC_BASE 0x1000
161eda6f593SDavid van Moolenbroek 
162eda6f593SDavid van Moolenbroek /* Key modifier bits. */
163eda6f593SDavid van Moolenbroek #define KEYC_ESCAPE 0x2000
164eda6f593SDavid van Moolenbroek #define KEYC_CTRL 0x4000
165eda6f593SDavid van Moolenbroek #define KEYC_SHIFT 0x8000
166eda6f593SDavid van Moolenbroek #define KEYC_PREFIX 0x10000
167eda6f593SDavid van Moolenbroek 
168eda6f593SDavid van Moolenbroek /* Mask to obtain key w/o modifiers. */
169eda6f593SDavid van Moolenbroek #define KEYC_MASK_MOD (KEYC_ESCAPE|KEYC_CTRL|KEYC_SHIFT|KEYC_PREFIX)
170eda6f593SDavid van Moolenbroek #define KEYC_MASK_KEY (~KEYC_MASK_MOD)
171eda6f593SDavid van Moolenbroek 
172eda6f593SDavid van Moolenbroek /* Other key codes. */
173eda6f593SDavid van Moolenbroek enum key_code {
174eda6f593SDavid van Moolenbroek 	/* Mouse key. */
175eda6f593SDavid van Moolenbroek 	KEYC_MOUSE = KEYC_BASE,
176eda6f593SDavid van Moolenbroek 
177eda6f593SDavid van Moolenbroek 	/* Backspace key. */
178eda6f593SDavid van Moolenbroek 	KEYC_BSPACE,
179eda6f593SDavid van Moolenbroek 
180eda6f593SDavid van Moolenbroek 	/* Function keys. */
181eda6f593SDavid van Moolenbroek 	KEYC_F1,
182eda6f593SDavid van Moolenbroek 	KEYC_F2,
183eda6f593SDavid van Moolenbroek 	KEYC_F3,
184eda6f593SDavid van Moolenbroek 	KEYC_F4,
185eda6f593SDavid van Moolenbroek 	KEYC_F5,
186eda6f593SDavid van Moolenbroek 	KEYC_F6,
187eda6f593SDavid van Moolenbroek 	KEYC_F7,
188eda6f593SDavid van Moolenbroek 	KEYC_F8,
189eda6f593SDavid van Moolenbroek 	KEYC_F9,
190eda6f593SDavid van Moolenbroek 	KEYC_F10,
191eda6f593SDavid van Moolenbroek 	KEYC_F11,
192eda6f593SDavid van Moolenbroek 	KEYC_F12,
193eda6f593SDavid van Moolenbroek 	KEYC_F13,
194eda6f593SDavid van Moolenbroek 	KEYC_F14,
195eda6f593SDavid van Moolenbroek 	KEYC_F15,
196eda6f593SDavid van Moolenbroek 	KEYC_F16,
197eda6f593SDavid van Moolenbroek 	KEYC_F17,
198eda6f593SDavid van Moolenbroek 	KEYC_F18,
199eda6f593SDavid van Moolenbroek 	KEYC_F19,
200eda6f593SDavid van Moolenbroek 	KEYC_F20,
201eda6f593SDavid van Moolenbroek 	KEYC_IC,
202eda6f593SDavid van Moolenbroek 	KEYC_DC,
203eda6f593SDavid van Moolenbroek 	KEYC_HOME,
204eda6f593SDavid van Moolenbroek 	KEYC_END,
205eda6f593SDavid van Moolenbroek 	KEYC_NPAGE,
206eda6f593SDavid van Moolenbroek 	KEYC_PPAGE,
207eda6f593SDavid van Moolenbroek 	KEYC_BTAB,
208eda6f593SDavid van Moolenbroek 
209eda6f593SDavid van Moolenbroek 	/* Arrow keys. */
210eda6f593SDavid van Moolenbroek 	KEYC_UP,
211eda6f593SDavid van Moolenbroek 	KEYC_DOWN,
212eda6f593SDavid van Moolenbroek 	KEYC_LEFT,
213eda6f593SDavid van Moolenbroek 	KEYC_RIGHT,
214eda6f593SDavid van Moolenbroek 
215eda6f593SDavid van Moolenbroek 	/* Numeric keypad. */
216eda6f593SDavid van Moolenbroek 	KEYC_KP_SLASH,
217eda6f593SDavid van Moolenbroek 	KEYC_KP_STAR,
218eda6f593SDavid van Moolenbroek 	KEYC_KP_MINUS,
219eda6f593SDavid van Moolenbroek 	KEYC_KP_SEVEN,
220eda6f593SDavid van Moolenbroek 	KEYC_KP_EIGHT,
221eda6f593SDavid van Moolenbroek 	KEYC_KP_NINE,
222eda6f593SDavid van Moolenbroek 	KEYC_KP_PLUS,
223eda6f593SDavid van Moolenbroek 	KEYC_KP_FOUR,
224eda6f593SDavid van Moolenbroek 	KEYC_KP_FIVE,
225eda6f593SDavid van Moolenbroek 	KEYC_KP_SIX,
226eda6f593SDavid van Moolenbroek 	KEYC_KP_ONE,
227eda6f593SDavid van Moolenbroek 	KEYC_KP_TWO,
228eda6f593SDavid van Moolenbroek 	KEYC_KP_THREE,
229eda6f593SDavid van Moolenbroek 	KEYC_KP_ENTER,
230eda6f593SDavid van Moolenbroek 	KEYC_KP_ZERO,
231eda6f593SDavid van Moolenbroek 	KEYC_KP_PERIOD,
232*0a6a1f1dSLionel Sambuc 
233*0a6a1f1dSLionel Sambuc 	KEYC_FOCUS_IN,
234*0a6a1f1dSLionel Sambuc 	KEYC_FOCUS_OUT,
235eda6f593SDavid van Moolenbroek };
236eda6f593SDavid van Moolenbroek 
237eda6f593SDavid van Moolenbroek /* Termcap codes. */
238eda6f593SDavid van Moolenbroek enum tty_code_code {
239eda6f593SDavid van Moolenbroek 	TTYC_AX = 0,
240eda6f593SDavid van Moolenbroek 	TTYC_ACSC,	/* acs_chars, ac */
241eda6f593SDavid van Moolenbroek 	TTYC_BEL,	/* bell, bl */
242eda6f593SDavid van Moolenbroek 	TTYC_BLINK,	/* enter_blink_mode, mb */
243eda6f593SDavid van Moolenbroek 	TTYC_BOLD,	/* enter_bold_mode, md */
244eda6f593SDavid van Moolenbroek 	TTYC_CIVIS,	/* cursor_invisible, vi */
245eda6f593SDavid van Moolenbroek 	TTYC_CLEAR,	/* clear_screen, cl */
246eda6f593SDavid van Moolenbroek 	TTYC_CNORM,	/* cursor_normal, ve */
247eda6f593SDavid van Moolenbroek 	TTYC_COLORS,	/* max_colors, Co */
248eda6f593SDavid van Moolenbroek 	TTYC_CR,	/* restore cursor colour, Cr */
249*0a6a1f1dSLionel Sambuc 	TTYC_CS,	/* set cursor colour, Cs */
250eda6f593SDavid van Moolenbroek 	TTYC_CSR,	/* change_scroll_region, cs */
251eda6f593SDavid van Moolenbroek 	TTYC_CUB,	/* parm_left_cursor, LE */
252eda6f593SDavid van Moolenbroek 	TTYC_CUB1,	/* cursor_left, le */
253eda6f593SDavid van Moolenbroek 	TTYC_CUD,	/* parm_down_cursor, DO */
254eda6f593SDavid van Moolenbroek 	TTYC_CUD1,	/* cursor_down, do */
255eda6f593SDavid van Moolenbroek 	TTYC_CUF,	/* parm_right_cursor, RI */
256eda6f593SDavid van Moolenbroek 	TTYC_CUF1,	/* cursor_right, nd */
257eda6f593SDavid van Moolenbroek 	TTYC_CUP,	/* cursor_address, cm */
258eda6f593SDavid van Moolenbroek 	TTYC_CUU,	/* parm_up_cursor, UP */
259eda6f593SDavid van Moolenbroek 	TTYC_CUU1,	/* cursor_up, up */
260eda6f593SDavid van Moolenbroek 	TTYC_DCH,	/* parm_dch, DC */
261eda6f593SDavid van Moolenbroek 	TTYC_DCH1,	/* delete_character, dc */
262eda6f593SDavid van Moolenbroek 	TTYC_DIM,	/* enter_dim_mode, mh */
263eda6f593SDavid van Moolenbroek 	TTYC_DL,	/* parm_delete_line, DL */
264eda6f593SDavid van Moolenbroek 	TTYC_DL1,	/* delete_line, dl */
265*0a6a1f1dSLionel Sambuc 	TTYC_E3,
266*0a6a1f1dSLionel Sambuc 	TTYC_ECH,	/* erase_chars, ec */
267eda6f593SDavid van Moolenbroek 	TTYC_EL,	/* clr_eol, ce */
268eda6f593SDavid van Moolenbroek 	TTYC_EL1,	/* clr_bol, cb */
269eda6f593SDavid van Moolenbroek 	TTYC_ENACS,	/* ena_acs, eA */
270eda6f593SDavid van Moolenbroek 	TTYC_FSL,	/* from_status_line, fsl */
271eda6f593SDavid van Moolenbroek 	TTYC_HOME,	/* cursor_home, ho */
272eda6f593SDavid van Moolenbroek 	TTYC_HPA,	/* column_address, ch */
273eda6f593SDavid van Moolenbroek 	TTYC_ICH,	/* parm_ich, IC */
274eda6f593SDavid van Moolenbroek 	TTYC_ICH1,	/* insert_character, ic */
275eda6f593SDavid van Moolenbroek 	TTYC_IL,	/* parm_insert_line, IL */
276eda6f593SDavid van Moolenbroek 	TTYC_IL1,	/* insert_line, il */
277eda6f593SDavid van Moolenbroek 	TTYC_INVIS,	/* enter_secure_mode, mk */
278eda6f593SDavid van Moolenbroek 	TTYC_IS1,	/* init_1string, i1 */
279eda6f593SDavid van Moolenbroek 	TTYC_IS2,	/* init_2string, i2 */
280eda6f593SDavid van Moolenbroek 	TTYC_IS3,	/* init_3string, i3 */
281eda6f593SDavid van Moolenbroek 	TTYC_KCBT,	/* key_btab, kB */
282eda6f593SDavid van Moolenbroek 	TTYC_KCUB1,	/* key_left, kl */
283eda6f593SDavid van Moolenbroek 	TTYC_KCUD1,	/* key_down, kd */
284eda6f593SDavid van Moolenbroek 	TTYC_KCUF1,	/* key_right, kr */
285eda6f593SDavid van Moolenbroek 	TTYC_KCUU1,	/* key_up, ku */
286eda6f593SDavid van Moolenbroek 	TTYC_KDC2,
287eda6f593SDavid van Moolenbroek 	TTYC_KDC3,
288eda6f593SDavid van Moolenbroek 	TTYC_KDC4,
289eda6f593SDavid van Moolenbroek 	TTYC_KDC5,
290eda6f593SDavid van Moolenbroek 	TTYC_KDC6,
291eda6f593SDavid van Moolenbroek 	TTYC_KDC7,
292eda6f593SDavid van Moolenbroek 	TTYC_KDCH1,	/* key_dc, kD */
293eda6f593SDavid van Moolenbroek 	TTYC_KDN2,
294eda6f593SDavid van Moolenbroek 	TTYC_KDN3,
295eda6f593SDavid van Moolenbroek 	TTYC_KDN4,
296eda6f593SDavid van Moolenbroek 	TTYC_KDN5,
297eda6f593SDavid van Moolenbroek 	TTYC_KDN6,
298eda6f593SDavid van Moolenbroek 	TTYC_KDN7,
299eda6f593SDavid van Moolenbroek 	TTYC_KEND,	/* key_end, ke */
300eda6f593SDavid van Moolenbroek 	TTYC_KEND2,
301eda6f593SDavid van Moolenbroek 	TTYC_KEND3,
302eda6f593SDavid van Moolenbroek 	TTYC_KEND4,
303eda6f593SDavid van Moolenbroek 	TTYC_KEND5,
304eda6f593SDavid van Moolenbroek 	TTYC_KEND6,
305eda6f593SDavid van Moolenbroek 	TTYC_KEND7,
306eda6f593SDavid van Moolenbroek 	TTYC_KF1,	/* key_f1, k1 */
307eda6f593SDavid van Moolenbroek 	TTYC_KF10,	/* key_f10, k; */
308eda6f593SDavid van Moolenbroek 	TTYC_KF11,	/* key_f11, F1 */
309eda6f593SDavid van Moolenbroek 	TTYC_KF12,	/* key_f12, F2 */
310eda6f593SDavid van Moolenbroek 	TTYC_KF13,	/* key_f13, F3 */
311eda6f593SDavid van Moolenbroek 	TTYC_KF14,	/* key_f14, F4 */
312eda6f593SDavid van Moolenbroek 	TTYC_KF15,	/* key_f15, F5 */
313eda6f593SDavid van Moolenbroek 	TTYC_KF16,	/* key_f16, F6 */
314eda6f593SDavid van Moolenbroek 	TTYC_KF17,	/* key_f17, F7 */
315eda6f593SDavid van Moolenbroek 	TTYC_KF18,	/* key_f18, F8 */
316eda6f593SDavid van Moolenbroek 	TTYC_KF19,	/* key_f19, F9 */
317eda6f593SDavid van Moolenbroek 	TTYC_KF2,	/* key_f2, k2 */
318eda6f593SDavid van Moolenbroek 	TTYC_KF20,	/* key_f20, F10 */
319eda6f593SDavid van Moolenbroek 	TTYC_KF3,	/* key_f3, k3 */
320eda6f593SDavid van Moolenbroek 	TTYC_KF4,	/* key_f4, k4 */
321eda6f593SDavid van Moolenbroek 	TTYC_KF5,	/* key_f5, k5 */
322eda6f593SDavid van Moolenbroek 	TTYC_KF6,	/* key_f6, k6 */
323eda6f593SDavid van Moolenbroek 	TTYC_KF7,	/* key_f7, k7 */
324eda6f593SDavid van Moolenbroek 	TTYC_KF8,	/* key_f8, k8 */
325eda6f593SDavid van Moolenbroek 	TTYC_KF9,	/* key_f9, k9 */
326eda6f593SDavid van Moolenbroek 	TTYC_KHOM2,
327eda6f593SDavid van Moolenbroek 	TTYC_KHOM3,
328eda6f593SDavid van Moolenbroek 	TTYC_KHOM4,
329eda6f593SDavid van Moolenbroek 	TTYC_KHOM5,
330eda6f593SDavid van Moolenbroek 	TTYC_KHOM6,
331eda6f593SDavid van Moolenbroek 	TTYC_KHOM7,
332eda6f593SDavid van Moolenbroek 	TTYC_KHOME,	/* key_home, kh */
333eda6f593SDavid van Moolenbroek 	TTYC_KIC2,
334eda6f593SDavid van Moolenbroek 	TTYC_KIC3,
335eda6f593SDavid van Moolenbroek 	TTYC_KIC4,
336eda6f593SDavid van Moolenbroek 	TTYC_KIC5,
337eda6f593SDavid van Moolenbroek 	TTYC_KIC6,
338eda6f593SDavid van Moolenbroek 	TTYC_KIC7,
339eda6f593SDavid van Moolenbroek 	TTYC_KICH1,	/* key_ic, kI */
340eda6f593SDavid van Moolenbroek 	TTYC_KLFT2,
341eda6f593SDavid van Moolenbroek 	TTYC_KLFT3,
342eda6f593SDavid van Moolenbroek 	TTYC_KLFT4,
343eda6f593SDavid van Moolenbroek 	TTYC_KLFT5,
344eda6f593SDavid van Moolenbroek 	TTYC_KLFT6,
345eda6f593SDavid van Moolenbroek 	TTYC_KLFT7,
346eda6f593SDavid van Moolenbroek 	TTYC_KMOUS,	/* key_mouse, Km */
347eda6f593SDavid van Moolenbroek 	TTYC_KNP,	/* key_npage, kN */
348eda6f593SDavid van Moolenbroek 	TTYC_KNXT2,
349eda6f593SDavid van Moolenbroek 	TTYC_KNXT3,
350eda6f593SDavid van Moolenbroek 	TTYC_KNXT4,
351eda6f593SDavid van Moolenbroek 	TTYC_KNXT5,
352eda6f593SDavid van Moolenbroek 	TTYC_KNXT6,
353eda6f593SDavid van Moolenbroek 	TTYC_KNXT7,
354eda6f593SDavid van Moolenbroek 	TTYC_KPP,	/* key_ppage, kP */
355eda6f593SDavid van Moolenbroek 	TTYC_KPRV2,
356eda6f593SDavid van Moolenbroek 	TTYC_KPRV3,
357eda6f593SDavid van Moolenbroek 	TTYC_KPRV4,
358eda6f593SDavid van Moolenbroek 	TTYC_KPRV5,
359eda6f593SDavid van Moolenbroek 	TTYC_KPRV6,
360eda6f593SDavid van Moolenbroek 	TTYC_KPRV7,
361eda6f593SDavid van Moolenbroek 	TTYC_KRIT2,
362eda6f593SDavid van Moolenbroek 	TTYC_KRIT3,
363eda6f593SDavid van Moolenbroek 	TTYC_KRIT4,
364eda6f593SDavid van Moolenbroek 	TTYC_KRIT5,
365eda6f593SDavid van Moolenbroek 	TTYC_KRIT6,
366eda6f593SDavid van Moolenbroek 	TTYC_KRIT7,
367eda6f593SDavid van Moolenbroek 	TTYC_KUP2,
368eda6f593SDavid van Moolenbroek 	TTYC_KUP3,
369eda6f593SDavid van Moolenbroek 	TTYC_KUP4,
370eda6f593SDavid van Moolenbroek 	TTYC_KUP5,
371eda6f593SDavid van Moolenbroek 	TTYC_KUP6,
372eda6f593SDavid van Moolenbroek 	TTYC_KUP7,
373eda6f593SDavid van Moolenbroek 	TTYC_MS,	/* modify xterm(1) selection */
374eda6f593SDavid van Moolenbroek 	TTYC_OP,	/* orig_pair, op */
375eda6f593SDavid van Moolenbroek 	TTYC_REV,	/* enter_reverse_mode, mr */
376eda6f593SDavid van Moolenbroek 	TTYC_RI,	/* scroll_reverse, sr */
377eda6f593SDavid van Moolenbroek 	TTYC_RMACS,	/* exit_alt_charset_mode */
378eda6f593SDavid van Moolenbroek 	TTYC_RMCUP,	/* exit_ca_mode, te */
379eda6f593SDavid van Moolenbroek 	TTYC_RMKX,	/* keypad_local, ke */
380*0a6a1f1dSLionel Sambuc 	TTYC_SE,	/* reset cursor style, Se */
381eda6f593SDavid van Moolenbroek 	TTYC_SETAB,	/* set_a_background, AB */
382eda6f593SDavid van Moolenbroek 	TTYC_SETAF,	/* set_a_foreground, AF */
383eda6f593SDavid van Moolenbroek 	TTYC_SGR0,	/* exit_attribute_mode, me */
384eda6f593SDavid van Moolenbroek 	TTYC_SITM,	/* enter_italics_mode, it */
385eda6f593SDavid van Moolenbroek 	TTYC_SMACS,	/* enter_alt_charset_mode, as */
386eda6f593SDavid van Moolenbroek 	TTYC_SMCUP,	/* enter_ca_mode, ti */
387eda6f593SDavid van Moolenbroek 	TTYC_SMKX,	/* keypad_xmit, ks */
388eda6f593SDavid van Moolenbroek 	TTYC_SMSO,	/* enter_standout_mode, so */
389eda6f593SDavid van Moolenbroek 	TTYC_SMUL,	/* enter_underline_mode, us */
390*0a6a1f1dSLionel Sambuc 	TTYC_SS,	/* set cursor style, Ss */
391eda6f593SDavid van Moolenbroek 	TTYC_TSL,	/* to_status_line, tsl */
392eda6f593SDavid van Moolenbroek 	TTYC_VPA,	/* row_address, cv */
393eda6f593SDavid van Moolenbroek 	TTYC_XENL,	/* eat_newline_glitch, xn */
394eda6f593SDavid van Moolenbroek 	TTYC_XT,	/* xterm(1)-compatible title, XT */
395eda6f593SDavid van Moolenbroek };
396eda6f593SDavid van Moolenbroek #define NTTYCODE (TTYC_XT + 1)
397eda6f593SDavid van Moolenbroek 
398eda6f593SDavid van Moolenbroek /* Termcap types. */
399eda6f593SDavid van Moolenbroek enum tty_code_type {
400eda6f593SDavid van Moolenbroek 	TTYCODE_NONE = 0,
401eda6f593SDavid van Moolenbroek 	TTYCODE_STRING,
402eda6f593SDavid van Moolenbroek 	TTYCODE_NUMBER,
403eda6f593SDavid van Moolenbroek 	TTYCODE_FLAG,
404eda6f593SDavid van Moolenbroek };
405eda6f593SDavid van Moolenbroek 
406eda6f593SDavid van Moolenbroek /* Termcap code. */
407eda6f593SDavid van Moolenbroek struct tty_code {
408eda6f593SDavid van Moolenbroek 	enum tty_code_type	type;
409eda6f593SDavid van Moolenbroek 	union {
410eda6f593SDavid van Moolenbroek 		char	       *string;
411eda6f593SDavid van Moolenbroek 		int		number;
412eda6f593SDavid van Moolenbroek 		int		flag;
413eda6f593SDavid van Moolenbroek 	} value;
414eda6f593SDavid van Moolenbroek };
415eda6f593SDavid van Moolenbroek 
416eda6f593SDavid van Moolenbroek /* Entry in terminal code table. */
417eda6f593SDavid van Moolenbroek struct tty_term_code_entry {
418eda6f593SDavid van Moolenbroek 	enum tty_code_code	code;
419eda6f593SDavid van Moolenbroek 	enum tty_code_type	type;
420eda6f593SDavid van Moolenbroek 	const char	       *name;
421eda6f593SDavid van Moolenbroek };
422eda6f593SDavid van Moolenbroek 
423*0a6a1f1dSLionel Sambuc /* List of error causes. */
424*0a6a1f1dSLionel Sambuc ARRAY_DECL(causelist, char *);
425*0a6a1f1dSLionel Sambuc 
426eda6f593SDavid van Moolenbroek /* Message codes. */
427eda6f593SDavid van Moolenbroek enum msgtype {
428*0a6a1f1dSLionel Sambuc 	MSG_VERSION = 12,
429*0a6a1f1dSLionel Sambuc 
430*0a6a1f1dSLionel Sambuc 	MSG_IDENTIFY_FLAGS = 100,
431*0a6a1f1dSLionel Sambuc 	MSG_IDENTIFY_TERM,
432*0a6a1f1dSLionel Sambuc 	MSG_IDENTIFY_TTYNAME,
433*0a6a1f1dSLionel Sambuc 	MSG_IDENTIFY_CWD,
434*0a6a1f1dSLionel Sambuc 	MSG_IDENTIFY_STDIN,
435*0a6a1f1dSLionel Sambuc 	MSG_IDENTIFY_ENVIRON,
436*0a6a1f1dSLionel Sambuc 	MSG_IDENTIFY_DONE,
437*0a6a1f1dSLionel Sambuc 
438*0a6a1f1dSLionel Sambuc 	MSG_COMMAND = 200,
439eda6f593SDavid van Moolenbroek 	MSG_DETACH,
440*0a6a1f1dSLionel Sambuc 	MSG_DETACHKILL,
441eda6f593SDavid van Moolenbroek 	MSG_EXIT,
442eda6f593SDavid van Moolenbroek 	MSG_EXITED,
443eda6f593SDavid van Moolenbroek 	MSG_EXITING,
444*0a6a1f1dSLionel Sambuc 	MSG_LOCK,
445eda6f593SDavid van Moolenbroek 	MSG_READY,
446eda6f593SDavid van Moolenbroek 	MSG_RESIZE,
447eda6f593SDavid van Moolenbroek 	MSG_SHELL,
448*0a6a1f1dSLionel Sambuc 	MSG_SHUTDOWN,
449eda6f593SDavid van Moolenbroek 	MSG_STDERR,
450*0a6a1f1dSLionel Sambuc 	MSG_STDIN,
451eda6f593SDavid van Moolenbroek 	MSG_STDOUT,
452*0a6a1f1dSLionel Sambuc 	MSG_SUSPEND,
453*0a6a1f1dSLionel Sambuc 	MSG_UNLOCK,
454*0a6a1f1dSLionel Sambuc 	MSG_WAKEUP,
455eda6f593SDavid van Moolenbroek };
456eda6f593SDavid van Moolenbroek 
457eda6f593SDavid van Moolenbroek /*
458eda6f593SDavid van Moolenbroek  * Message data.
459eda6f593SDavid van Moolenbroek  *
460eda6f593SDavid van Moolenbroek  * Don't forget to bump PROTOCOL_VERSION if any of these change!
461eda6f593SDavid van Moolenbroek  */
462eda6f593SDavid van Moolenbroek struct msg_command_data {
463eda6f593SDavid van Moolenbroek 	int	argc;
464*0a6a1f1dSLionel Sambuc }; /* followed by packed argv */
465*0a6a1f1dSLionel Sambuc 
466*0a6a1f1dSLionel Sambuc struct msg_stdin_data {
467*0a6a1f1dSLionel Sambuc 	ssize_t	size;
468*0a6a1f1dSLionel Sambuc 	char	data[BUFSIZ];
469eda6f593SDavid van Moolenbroek };
470eda6f593SDavid van Moolenbroek 
471*0a6a1f1dSLionel Sambuc struct msg_stdout_data {
472*0a6a1f1dSLionel Sambuc 	ssize_t	size;
473*0a6a1f1dSLionel Sambuc 	char	data[BUFSIZ];
474eda6f593SDavid van Moolenbroek };
475eda6f593SDavid van Moolenbroek 
476*0a6a1f1dSLionel Sambuc struct msg_stderr_data {
477*0a6a1f1dSLionel Sambuc 	ssize_t	size;
478*0a6a1f1dSLionel Sambuc 	char	data[BUFSIZ];
479eda6f593SDavid van Moolenbroek };
480eda6f593SDavid van Moolenbroek 
481eda6f593SDavid van Moolenbroek /* Mode key commands. */
482eda6f593SDavid van Moolenbroek enum mode_key_cmd {
483eda6f593SDavid van Moolenbroek 	MODEKEY_NONE,
484eda6f593SDavid van Moolenbroek 	MODEKEY_OTHER,
485eda6f593SDavid van Moolenbroek 
486eda6f593SDavid van Moolenbroek 	/* Editing keys. */
487eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_BACKSPACE,
488eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_CANCEL,
489eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_COMPLETE,
490eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_CURSORLEFT,
491eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_CURSORRIGHT,
492eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_DELETE,
493eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_DELETELINE,
494eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_DELETETOENDOFLINE,
495*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_DELETEWORD,
496eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_ENDOFLINE,
497eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_ENTER,
498eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_HISTORYDOWN,
499eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_HISTORYUP,
500*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_NEXTSPACE,
501*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_NEXTSPACEEND,
502*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_NEXTWORD,
503*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_NEXTWORDEND,
504eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_PASTE,
505*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_PREVIOUSSPACE,
506*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_PREVIOUSWORD,
507eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_STARTOFLINE,
508eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_SWITCHMODE,
509eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_SWITCHMODEAPPEND,
510*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_SWITCHMODEAPPENDLINE,
511*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_SWITCHMODEBEGINLINE,
512*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_SWITCHMODECHANGELINE,
513*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_SWITCHMODESUBSTITUTE,
514*0a6a1f1dSLionel Sambuc 	MODEKEYEDIT_SWITCHMODESUBSTITUTELINE,
515eda6f593SDavid van Moolenbroek 	MODEKEYEDIT_TRANSPOSECHARS,
516eda6f593SDavid van Moolenbroek 
517eda6f593SDavid van Moolenbroek 	/* Menu (choice) keys. */
518*0a6a1f1dSLionel Sambuc 	MODEKEYCHOICE_BACKSPACE,
519eda6f593SDavid van Moolenbroek 	MODEKEYCHOICE_CANCEL,
520eda6f593SDavid van Moolenbroek 	MODEKEYCHOICE_CHOOSE,
521eda6f593SDavid van Moolenbroek 	MODEKEYCHOICE_DOWN,
522eda6f593SDavid van Moolenbroek 	MODEKEYCHOICE_PAGEDOWN,
523eda6f593SDavid van Moolenbroek 	MODEKEYCHOICE_PAGEUP,
524eda6f593SDavid van Moolenbroek 	MODEKEYCHOICE_SCROLLDOWN,
525eda6f593SDavid van Moolenbroek 	MODEKEYCHOICE_SCROLLUP,
526*0a6a1f1dSLionel Sambuc 	MODEKEYCHOICE_STARTNUMBERPREFIX,
527*0a6a1f1dSLionel Sambuc 	MODEKEYCHOICE_TREE_COLLAPSE,
528*0a6a1f1dSLionel Sambuc 	MODEKEYCHOICE_TREE_COLLAPSE_ALL,
529*0a6a1f1dSLionel Sambuc 	MODEKEYCHOICE_TREE_EXPAND,
530*0a6a1f1dSLionel Sambuc 	MODEKEYCHOICE_TREE_EXPAND_ALL,
531*0a6a1f1dSLionel Sambuc 	MODEKEYCHOICE_TREE_TOGGLE,
532eda6f593SDavid van Moolenbroek 	MODEKEYCHOICE_UP,
533eda6f593SDavid van Moolenbroek 
534eda6f593SDavid van Moolenbroek 	/* Copy keys. */
535eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_BACKTOINDENTATION,
536eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_BOTTOMLINE,
537eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_CANCEL,
538eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_CLEARSELECTION,
539*0a6a1f1dSLionel Sambuc 	MODEKEYCOPY_COPYPIPE,
540eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_COPYLINE,
541eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_COPYENDOFLINE,
542eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_COPYSELECTION,
543eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_DOWN,
544eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_ENDOFLINE,
545eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_GOTOLINE,
546eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_HALFPAGEDOWN,
547eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_HALFPAGEUP,
548eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_HISTORYBOTTOM,
549eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_HISTORYTOP,
550eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_JUMP,
551eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_JUMPAGAIN,
552eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_JUMPREVERSE,
553eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_JUMPBACK,
554*0a6a1f1dSLionel Sambuc 	MODEKEYCOPY_JUMPTO,
555*0a6a1f1dSLionel Sambuc 	MODEKEYCOPY_JUMPTOBACK,
556eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_LEFT,
557eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_MIDDLELINE,
558eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_NEXTPAGE,
559eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_NEXTSPACE,
560eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_NEXTSPACEEND,
561eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_NEXTWORD,
562eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_NEXTWORDEND,
563*0a6a1f1dSLionel Sambuc 	MODEKEYCOPY_OTHEREND,
564eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_PREVIOUSPAGE,
565eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_PREVIOUSSPACE,
566eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_PREVIOUSWORD,
567eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_RECTANGLETOGGLE,
568eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_RIGHT,
569eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_SCROLLDOWN,
570eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_SCROLLUP,
571eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_SEARCHAGAIN,
572eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_SEARCHDOWN,
573eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_SEARCHREVERSE,
574eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_SEARCHUP,
575eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_SELECTLINE,
576eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_STARTNUMBERPREFIX,
577eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_STARTOFLINE,
578eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_STARTSELECTION,
579eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_TOPLINE,
580eda6f593SDavid van Moolenbroek 	MODEKEYCOPY_UP,
581eda6f593SDavid van Moolenbroek };
582eda6f593SDavid van Moolenbroek 
583eda6f593SDavid van Moolenbroek /* Entry in the default mode key tables. */
584eda6f593SDavid van Moolenbroek struct mode_key_entry {
585eda6f593SDavid van Moolenbroek 	int			key;
586eda6f593SDavid van Moolenbroek 
587eda6f593SDavid van Moolenbroek 	/*
588eda6f593SDavid van Moolenbroek 	 * Editing mode for vi: 0 is edit mode, keys not in the table are
589eda6f593SDavid van Moolenbroek 	 * returned as MODEKEY_OTHER; 1 is command mode, keys not in the table
590eda6f593SDavid van Moolenbroek 	 * are returned as MODEKEY_NONE. This is also matched on, allowing some
591eda6f593SDavid van Moolenbroek 	 * keys to be bound in edit mode.
592eda6f593SDavid van Moolenbroek 	 */
593eda6f593SDavid van Moolenbroek 	int			mode;
594eda6f593SDavid van Moolenbroek 	enum mode_key_cmd	cmd;
595eda6f593SDavid van Moolenbroek };
596eda6f593SDavid van Moolenbroek 
597eda6f593SDavid van Moolenbroek /* Data required while mode keys are in use. */
598eda6f593SDavid van Moolenbroek struct mode_key_data {
599eda6f593SDavid van Moolenbroek 	struct mode_key_tree   *tree;
600eda6f593SDavid van Moolenbroek 	int			mode;
601eda6f593SDavid van Moolenbroek };
602eda6f593SDavid van Moolenbroek #define MODEKEY_EMACS 0
603eda6f593SDavid van Moolenbroek #define MODEKEY_VI 1
604eda6f593SDavid van Moolenbroek 
605eda6f593SDavid van Moolenbroek /* Binding between a key and a command. */
606eda6f593SDavid van Moolenbroek struct mode_key_binding {
607eda6f593SDavid van Moolenbroek 	int				 key;
608eda6f593SDavid van Moolenbroek 
609eda6f593SDavid van Moolenbroek 	int				 mode;
610eda6f593SDavid van Moolenbroek 	enum mode_key_cmd		 cmd;
611*0a6a1f1dSLionel Sambuc 	const char			*arg;
612eda6f593SDavid van Moolenbroek 
613*0a6a1f1dSLionel Sambuc 	RB_ENTRY(mode_key_binding)	 entry;
614eda6f593SDavid van Moolenbroek };
615*0a6a1f1dSLionel Sambuc RB_HEAD(mode_key_tree, mode_key_binding);
616eda6f593SDavid van Moolenbroek 
617eda6f593SDavid van Moolenbroek /* Command to string mapping. */
618eda6f593SDavid van Moolenbroek struct mode_key_cmdstr {
619eda6f593SDavid van Moolenbroek 	enum mode_key_cmd	 cmd;
620eda6f593SDavid van Moolenbroek 	const char		*name;
621eda6f593SDavid van Moolenbroek };
622eda6f593SDavid van Moolenbroek 
623eda6f593SDavid van Moolenbroek /* Named mode key table description. */
624eda6f593SDavid van Moolenbroek struct mode_key_table {
625eda6f593SDavid van Moolenbroek 	const char			*name;
626eda6f593SDavid van Moolenbroek 	const struct mode_key_cmdstr	*cmdstr;
627eda6f593SDavid van Moolenbroek 	struct mode_key_tree		*tree;
628eda6f593SDavid van Moolenbroek 	const struct mode_key_entry	*table;	/* default entries */
629eda6f593SDavid van Moolenbroek };
630eda6f593SDavid van Moolenbroek 
631eda6f593SDavid van Moolenbroek /* Modes. */
632eda6f593SDavid van Moolenbroek #define MODE_CURSOR 0x1
633eda6f593SDavid van Moolenbroek #define MODE_INSERT 0x2
634eda6f593SDavid van Moolenbroek #define MODE_KCURSOR 0x4
635eda6f593SDavid van Moolenbroek #define MODE_KKEYPAD 0x8	/* set = application, clear = number */
636eda6f593SDavid van Moolenbroek #define MODE_WRAP 0x10		/* whether lines wrap */
637eda6f593SDavid van Moolenbroek #define MODE_MOUSE_STANDARD 0x20
638eda6f593SDavid van Moolenbroek #define MODE_MOUSE_BUTTON 0x40
639eda6f593SDavid van Moolenbroek #define MODE_MOUSE_ANY 0x80
640eda6f593SDavid van Moolenbroek #define MODE_MOUSE_UTF8 0x100
641*0a6a1f1dSLionel Sambuc #define MODE_MOUSE_SGR 0x200
642*0a6a1f1dSLionel Sambuc #define MODE_BRACKETPASTE 0x400
643*0a6a1f1dSLionel Sambuc #define MODE_FOCUSON 0x800
644eda6f593SDavid van Moolenbroek 
645eda6f593SDavid van Moolenbroek #define ALL_MOUSE_MODES (MODE_MOUSE_STANDARD|MODE_MOUSE_BUTTON|MODE_MOUSE_ANY)
646eda6f593SDavid van Moolenbroek 
647*0a6a1f1dSLionel Sambuc /* A single UTF-8 character. */
648eda6f593SDavid van Moolenbroek struct utf8_data {
649eda6f593SDavid van Moolenbroek 	u_char	data[UTF8_SIZE];
650eda6f593SDavid van Moolenbroek 
651eda6f593SDavid van Moolenbroek 	size_t	have;
652eda6f593SDavid van Moolenbroek 	size_t	size;
653eda6f593SDavid van Moolenbroek 
654eda6f593SDavid van Moolenbroek 	u_int	width;
655eda6f593SDavid van Moolenbroek };
656eda6f593SDavid van Moolenbroek 
657eda6f593SDavid van Moolenbroek /* Grid output. */
658eda6f593SDavid van Moolenbroek #if defined(DEBUG) && \
659eda6f593SDavid van Moolenbroek     ((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
660eda6f593SDavid van Moolenbroek      (defined(__GNUC__) && __GNUC__ >= 3))
661eda6f593SDavid van Moolenbroek #define GRID_DEBUG(gd, fmt, ...) log_debug2("%s: (sx=%u, sy=%u, hsize=%u) " \
662eda6f593SDavid van Moolenbroek     fmt, __func__, (gd)->sx, (gd)->sy, (gd)->hsize, ## __VA_ARGS__)
663eda6f593SDavid van Moolenbroek #else
664eda6f593SDavid van Moolenbroek #define GRID_DEBUG(...)
665eda6f593SDavid van Moolenbroek #endif
666eda6f593SDavid van Moolenbroek 
667eda6f593SDavid van Moolenbroek /* Grid attributes. */
668eda6f593SDavid van Moolenbroek #define GRID_ATTR_BRIGHT 0x1
669eda6f593SDavid van Moolenbroek #define GRID_ATTR_DIM 0x2
670eda6f593SDavid van Moolenbroek #define GRID_ATTR_UNDERSCORE 0x4
671eda6f593SDavid van Moolenbroek #define GRID_ATTR_BLINK 0x8
672eda6f593SDavid van Moolenbroek #define GRID_ATTR_REVERSE 0x10
673eda6f593SDavid van Moolenbroek #define GRID_ATTR_HIDDEN 0x20
674eda6f593SDavid van Moolenbroek #define GRID_ATTR_ITALICS 0x40
675eda6f593SDavid van Moolenbroek #define GRID_ATTR_CHARSET 0x80	/* alternative character set */
676eda6f593SDavid van Moolenbroek 
677eda6f593SDavid van Moolenbroek /* Grid flags. */
678eda6f593SDavid van Moolenbroek #define GRID_FLAG_FG256 0x1
679eda6f593SDavid van Moolenbroek #define GRID_FLAG_BG256 0x2
680eda6f593SDavid van Moolenbroek #define GRID_FLAG_PADDING 0x4
681eda6f593SDavid van Moolenbroek 
682eda6f593SDavid van Moolenbroek /* Grid line flags. */
683eda6f593SDavid van Moolenbroek #define GRID_LINE_WRAPPED 0x1
684eda6f593SDavid van Moolenbroek 
685eda6f593SDavid van Moolenbroek /* Grid cell data. */
686eda6f593SDavid van Moolenbroek struct grid_cell {
687eda6f593SDavid van Moolenbroek 	u_char	attr;
688eda6f593SDavid van Moolenbroek 	u_char	flags;
689eda6f593SDavid van Moolenbroek 	u_char	fg;
690eda6f593SDavid van Moolenbroek 	u_char	bg;
691eda6f593SDavid van Moolenbroek 
692*0a6a1f1dSLionel Sambuc 	u_char	xstate; /* top 4 bits width, bottom 4 bits size */
693*0a6a1f1dSLionel Sambuc 	u_char	xdata[UTF8_SIZE];
694eda6f593SDavid van Moolenbroek } __packed;
695eda6f593SDavid van Moolenbroek 
696eda6f593SDavid van Moolenbroek /* Grid line. */
697eda6f593SDavid van Moolenbroek struct grid_line {
698eda6f593SDavid van Moolenbroek 	u_int	cellsize;
699eda6f593SDavid van Moolenbroek 	struct grid_cell *celldata;
700eda6f593SDavid van Moolenbroek 
701eda6f593SDavid van Moolenbroek 	int	flags;
702eda6f593SDavid van Moolenbroek } __packed;
703eda6f593SDavid van Moolenbroek 
704eda6f593SDavid van Moolenbroek /* Entire grid of cells. */
705eda6f593SDavid van Moolenbroek struct grid {
706eda6f593SDavid van Moolenbroek 	int	flags;
707eda6f593SDavid van Moolenbroek #define GRID_HISTORY 0x1	/* scroll lines into history */
708eda6f593SDavid van Moolenbroek 
709eda6f593SDavid van Moolenbroek 	u_int	sx;
710eda6f593SDavid van Moolenbroek 	u_int	sy;
711eda6f593SDavid van Moolenbroek 
712eda6f593SDavid van Moolenbroek 	u_int	hsize;
713eda6f593SDavid van Moolenbroek 	u_int	hlimit;
714eda6f593SDavid van Moolenbroek 
715eda6f593SDavid van Moolenbroek 	struct grid_line *linedata;
716eda6f593SDavid van Moolenbroek };
717eda6f593SDavid van Moolenbroek 
718eda6f593SDavid van Moolenbroek /* Option data structures. */
719eda6f593SDavid van Moolenbroek struct options_entry {
720eda6f593SDavid van Moolenbroek 	char		*name;
721eda6f593SDavid van Moolenbroek 
722eda6f593SDavid van Moolenbroek 	enum {
723eda6f593SDavid van Moolenbroek 		OPTIONS_STRING,
724eda6f593SDavid van Moolenbroek 		OPTIONS_NUMBER,
725*0a6a1f1dSLionel Sambuc 		OPTIONS_STYLE
726eda6f593SDavid van Moolenbroek 	} type;
727eda6f593SDavid van Moolenbroek 
728eda6f593SDavid van Moolenbroek 	char			*str;
729eda6f593SDavid van Moolenbroek 	long long	 	 num;
730*0a6a1f1dSLionel Sambuc 	struct grid_cell	 style;
731eda6f593SDavid van Moolenbroek 
732*0a6a1f1dSLionel Sambuc 	RB_ENTRY(options_entry) entry;
733eda6f593SDavid van Moolenbroek };
734eda6f593SDavid van Moolenbroek 
735eda6f593SDavid van Moolenbroek struct options {
736*0a6a1f1dSLionel Sambuc 	RB_HEAD(options_tree, options_entry) tree;
737eda6f593SDavid van Moolenbroek 	struct options	*parent;
738eda6f593SDavid van Moolenbroek };
739eda6f593SDavid van Moolenbroek 
740eda6f593SDavid van Moolenbroek /* Scheduled job. */
741eda6f593SDavid van Moolenbroek struct job {
742eda6f593SDavid van Moolenbroek 	char		*cmd;
743eda6f593SDavid van Moolenbroek 	pid_t		 pid;
744eda6f593SDavid van Moolenbroek 	int		 status;
745eda6f593SDavid van Moolenbroek 
746eda6f593SDavid van Moolenbroek 	int		 fd;
747eda6f593SDavid van Moolenbroek 	struct bufferevent *event;
748eda6f593SDavid van Moolenbroek 
749eda6f593SDavid van Moolenbroek 	void		(*callbackfn)(struct job *);
750eda6f593SDavid van Moolenbroek 	void		(*freefn)(void *);
751eda6f593SDavid van Moolenbroek 	void		*data;
752eda6f593SDavid van Moolenbroek 
753eda6f593SDavid van Moolenbroek 	LIST_ENTRY(job)	 lentry;
754eda6f593SDavid van Moolenbroek };
755eda6f593SDavid van Moolenbroek LIST_HEAD(joblist, job);
756eda6f593SDavid van Moolenbroek 
757eda6f593SDavid van Moolenbroek /* Screen selection. */
758eda6f593SDavid van Moolenbroek struct screen_sel {
759eda6f593SDavid van Moolenbroek 	int		 flag;
760eda6f593SDavid van Moolenbroek 	int		 rectflag;
761eda6f593SDavid van Moolenbroek 
762eda6f593SDavid van Moolenbroek 	u_int		 sx;
763eda6f593SDavid van Moolenbroek 	u_int		 sy;
764eda6f593SDavid van Moolenbroek 
765eda6f593SDavid van Moolenbroek 	u_int		 ex;
766eda6f593SDavid van Moolenbroek 	u_int		 ey;
767eda6f593SDavid van Moolenbroek 
768eda6f593SDavid van Moolenbroek 	struct grid_cell cell;
769eda6f593SDavid van Moolenbroek };
770eda6f593SDavid van Moolenbroek 
771eda6f593SDavid van Moolenbroek /* Virtual screen. */
772eda6f593SDavid van Moolenbroek struct screen {
773eda6f593SDavid van Moolenbroek 	char		*title;
774eda6f593SDavid van Moolenbroek 
775eda6f593SDavid van Moolenbroek 	struct grid	*grid;		/* grid data */
776eda6f593SDavid van Moolenbroek 
777eda6f593SDavid van Moolenbroek 	u_int		 cx;		/* cursor x */
778eda6f593SDavid van Moolenbroek 	u_int		 cy;		/* cursor y */
779eda6f593SDavid van Moolenbroek 
780eda6f593SDavid van Moolenbroek 	u_int		 cstyle;	/* cursor style */
781eda6f593SDavid van Moolenbroek 	char		*ccolour;	/* cursor colour string */
782eda6f593SDavid van Moolenbroek 
783eda6f593SDavid van Moolenbroek 	u_int		 rupper;	/* scroll region top */
784eda6f593SDavid van Moolenbroek 	u_int		 rlower;	/* scroll region bottom */
785eda6f593SDavid van Moolenbroek 
786eda6f593SDavid van Moolenbroek 	int		 mode;
787eda6f593SDavid van Moolenbroek 
788eda6f593SDavid van Moolenbroek 	bitstr_t	*tabs;
789eda6f593SDavid van Moolenbroek 
790eda6f593SDavid van Moolenbroek 	struct screen_sel sel;
791eda6f593SDavid van Moolenbroek };
792eda6f593SDavid van Moolenbroek 
793eda6f593SDavid van Moolenbroek /* Screen write context. */
794eda6f593SDavid van Moolenbroek struct screen_write_ctx {
795eda6f593SDavid van Moolenbroek 	struct window_pane *wp;
796eda6f593SDavid van Moolenbroek 	struct screen	*s;
797eda6f593SDavid van Moolenbroek };
798eda6f593SDavid van Moolenbroek 
799eda6f593SDavid van Moolenbroek /* Screen size. */
800eda6f593SDavid van Moolenbroek #define screen_size_x(s) ((s)->grid->sx)
801eda6f593SDavid van Moolenbroek #define screen_size_y(s) ((s)->grid->sy)
802eda6f593SDavid van Moolenbroek #define screen_hsize(s) ((s)->grid->hsize)
803eda6f593SDavid van Moolenbroek #define screen_hlimit(s) ((s)->grid->hlimit)
804eda6f593SDavid van Moolenbroek 
805eda6f593SDavid van Moolenbroek /* Input parser context. */
806eda6f593SDavid van Moolenbroek struct input_ctx {
807eda6f593SDavid van Moolenbroek 	struct window_pane     *wp;
808eda6f593SDavid van Moolenbroek 	struct screen_write_ctx ctx;
809eda6f593SDavid van Moolenbroek 
810eda6f593SDavid van Moolenbroek 	struct grid_cell	cell;
811eda6f593SDavid van Moolenbroek 
812eda6f593SDavid van Moolenbroek 	struct grid_cell	old_cell;
813eda6f593SDavid van Moolenbroek 	u_int 			old_cx;
814eda6f593SDavid van Moolenbroek 	u_int			old_cy;
815eda6f593SDavid van Moolenbroek 
816eda6f593SDavid van Moolenbroek 	u_char			interm_buf[4];
817eda6f593SDavid van Moolenbroek 	size_t			interm_len;
818eda6f593SDavid van Moolenbroek 
819eda6f593SDavid van Moolenbroek 	u_char			param_buf[64];
820eda6f593SDavid van Moolenbroek 	size_t			param_len;
821eda6f593SDavid van Moolenbroek 
822eda6f593SDavid van Moolenbroek 	u_char			input_buf[256];
823eda6f593SDavid van Moolenbroek 	size_t			input_len;
824eda6f593SDavid van Moolenbroek 
825eda6f593SDavid van Moolenbroek 	int			param_list[24];	/* -1 not present */
826eda6f593SDavid van Moolenbroek 	u_int			param_list_len;
827eda6f593SDavid van Moolenbroek 
828eda6f593SDavid van Moolenbroek 	struct utf8_data	utf8data;
829eda6f593SDavid van Moolenbroek 
830eda6f593SDavid van Moolenbroek 	int			ch;
831eda6f593SDavid van Moolenbroek 	int			flags;
832eda6f593SDavid van Moolenbroek #define INPUT_DISCARD 0x1
833eda6f593SDavid van Moolenbroek 
834eda6f593SDavid van Moolenbroek 	const struct input_state *state;
835*0a6a1f1dSLionel Sambuc 
836*0a6a1f1dSLionel Sambuc 	/*
837*0a6a1f1dSLionel Sambuc 	 * All input received since we were last in the ground state. Sent to
838*0a6a1f1dSLionel Sambuc 	 * control clients on connection.
839*0a6a1f1dSLionel Sambuc 	 */
840*0a6a1f1dSLionel Sambuc 	struct evbuffer	 	*since_ground;
841eda6f593SDavid van Moolenbroek };
842eda6f593SDavid van Moolenbroek 
843eda6f593SDavid van Moolenbroek /*
844eda6f593SDavid van Moolenbroek  * Window mode. Windows can be in several modes and this is used to call the
845eda6f593SDavid van Moolenbroek  * right function to handle input and output.
846eda6f593SDavid van Moolenbroek  */
847eda6f593SDavid van Moolenbroek struct session;
848eda6f593SDavid van Moolenbroek struct window;
849eda6f593SDavid van Moolenbroek struct mouse_event;
850eda6f593SDavid van Moolenbroek struct window_mode {
851eda6f593SDavid van Moolenbroek 	struct screen *(*init)(struct window_pane *);
852eda6f593SDavid van Moolenbroek 	void	(*free)(struct window_pane *);
853eda6f593SDavid van Moolenbroek 	void	(*resize)(struct window_pane *, u_int, u_int);
854eda6f593SDavid van Moolenbroek 	void	(*key)(struct window_pane *, struct session *, int);
855eda6f593SDavid van Moolenbroek 	void	(*mouse)(struct window_pane *,
856eda6f593SDavid van Moolenbroek 		    struct session *, struct mouse_event *);
857eda6f593SDavid van Moolenbroek 	void	(*timer)(struct window_pane *);
858eda6f593SDavid van Moolenbroek };
859eda6f593SDavid van Moolenbroek 
860*0a6a1f1dSLionel Sambuc /* Structures for choose mode. */
861*0a6a1f1dSLionel Sambuc struct window_choose_data {
862*0a6a1f1dSLionel Sambuc 	struct client		*start_client;
863*0a6a1f1dSLionel Sambuc 	struct session		*start_session;
864*0a6a1f1dSLionel Sambuc 
865*0a6a1f1dSLionel Sambuc 	u_int			 idx;
866*0a6a1f1dSLionel Sambuc 	int			 type;
867*0a6a1f1dSLionel Sambuc #define TREE_OTHER 0x0
868*0a6a1f1dSLionel Sambuc #define TREE_WINDOW 0x1
869*0a6a1f1dSLionel Sambuc #define TREE_SESSION 0x2
870*0a6a1f1dSLionel Sambuc 
871*0a6a1f1dSLionel Sambuc 	struct session		*tree_session; /* session of items in tree */
872*0a6a1f1dSLionel Sambuc 
873*0a6a1f1dSLionel Sambuc 	struct winlink		*wl;
874*0a6a1f1dSLionel Sambuc 	int			 pane_id;
875*0a6a1f1dSLionel Sambuc 
876*0a6a1f1dSLionel Sambuc 	char		        *ft_template;
877*0a6a1f1dSLionel Sambuc 	struct format_tree	*ft;
878*0a6a1f1dSLionel Sambuc 
879*0a6a1f1dSLionel Sambuc 	char			*command;
880*0a6a1f1dSLionel Sambuc };
881*0a6a1f1dSLionel Sambuc 
882*0a6a1f1dSLionel Sambuc struct window_choose_mode_item {
883*0a6a1f1dSLionel Sambuc 	struct window_choose_data	*wcd;
884*0a6a1f1dSLionel Sambuc 	char				*name;
885*0a6a1f1dSLionel Sambuc 	int				 pos;
886*0a6a1f1dSLionel Sambuc 	int				 state;
887*0a6a1f1dSLionel Sambuc #define TREE_EXPANDED 0x1
888*0a6a1f1dSLionel Sambuc };
889*0a6a1f1dSLionel Sambuc 
890eda6f593SDavid van Moolenbroek /* Child window structure. */
891eda6f593SDavid van Moolenbroek struct window_utmp;
892eda6f593SDavid van Moolenbroek struct window_pane {
893eda6f593SDavid van Moolenbroek 	u_int		 id;
894eda6f593SDavid van Moolenbroek 
895eda6f593SDavid van Moolenbroek 	struct window	*window;
896*0a6a1f1dSLionel Sambuc 
897eda6f593SDavid van Moolenbroek 	struct layout_cell *layout_cell;
898*0a6a1f1dSLionel Sambuc 	struct layout_cell *saved_layout_cell;
899eda6f593SDavid van Moolenbroek 
900eda6f593SDavid van Moolenbroek 	u_int		 sx;
901eda6f593SDavid van Moolenbroek 	u_int		 sy;
902eda6f593SDavid van Moolenbroek 
903eda6f593SDavid van Moolenbroek 	u_int		 xoff;
904eda6f593SDavid van Moolenbroek 	u_int		 yoff;
905eda6f593SDavid van Moolenbroek 
906eda6f593SDavid van Moolenbroek 	int		 flags;
907eda6f593SDavid van Moolenbroek #define PANE_REDRAW 0x1
908*0a6a1f1dSLionel Sambuc #define PANE_DROP 0x2
909*0a6a1f1dSLionel Sambuc #define PANE_FOCUSED 0x4
910*0a6a1f1dSLionel Sambuc #define PANE_RESIZE 0x8
911*0a6a1f1dSLionel Sambuc #define PANE_FOCUSPUSH 0x10
912eda6f593SDavid van Moolenbroek 
913eda6f593SDavid van Moolenbroek 	char		*cmd;
914eda6f593SDavid van Moolenbroek 	char		*shell;
915*0a6a1f1dSLionel Sambuc 	int		 cwd;
916eda6f593SDavid van Moolenbroek 
917eda6f593SDavid van Moolenbroek 	pid_t		 pid;
918eda6f593SDavid van Moolenbroek 	char		 tty[TTY_NAME_MAX];
919eda6f593SDavid van Moolenbroek 
920*0a6a1f1dSLionel Sambuc 	u_int		 changes;
921*0a6a1f1dSLionel Sambuc 	struct event	 changes_timer;
922*0a6a1f1dSLionel Sambuc 	u_int		 changes_redraw;
923*0a6a1f1dSLionel Sambuc 
924eda6f593SDavid van Moolenbroek 	int		 fd;
925eda6f593SDavid van Moolenbroek 	struct bufferevent *event;
926eda6f593SDavid van Moolenbroek 
927eda6f593SDavid van Moolenbroek 	struct input_ctx ictx;
928eda6f593SDavid van Moolenbroek 
929eda6f593SDavid van Moolenbroek 	int		 pipe_fd;
930eda6f593SDavid van Moolenbroek 	struct bufferevent *pipe_event;
931eda6f593SDavid van Moolenbroek 	size_t		 pipe_off;
932eda6f593SDavid van Moolenbroek 
933eda6f593SDavid van Moolenbroek 	struct screen	*screen;
934eda6f593SDavid van Moolenbroek 	struct screen	 base;
935eda6f593SDavid van Moolenbroek 
936eda6f593SDavid van Moolenbroek 	/* Saved in alternative screen mode. */
937eda6f593SDavid van Moolenbroek 	u_int		 saved_cx;
938eda6f593SDavid van Moolenbroek 	u_int		 saved_cy;
939eda6f593SDavid van Moolenbroek 	struct grid	*saved_grid;
940eda6f593SDavid van Moolenbroek 	struct grid_cell saved_cell;
941eda6f593SDavid van Moolenbroek 
942eda6f593SDavid van Moolenbroek 	const struct window_mode *mode;
943eda6f593SDavid van Moolenbroek 	void		*modedata;
944eda6f593SDavid van Moolenbroek 
945eda6f593SDavid van Moolenbroek 	struct window_utmp *utmp;
946eda6f593SDavid van Moolenbroek 
947eda6f593SDavid van Moolenbroek 	TAILQ_ENTRY(window_pane) entry;
948eda6f593SDavid van Moolenbroek 	RB_ENTRY(window_pane) tree_entry;
949eda6f593SDavid van Moolenbroek };
950eda6f593SDavid van Moolenbroek TAILQ_HEAD(window_panes, window_pane);
951eda6f593SDavid van Moolenbroek RB_HEAD(window_pane_tree, window_pane);
952eda6f593SDavid van Moolenbroek 
953eda6f593SDavid van Moolenbroek /* Window structure. */
954eda6f593SDavid van Moolenbroek struct window {
955*0a6a1f1dSLionel Sambuc 	u_int		 id;
956eda6f593SDavid van Moolenbroek 	char		*name;
957eda6f593SDavid van Moolenbroek 	struct event	 name_timer;
958eda6f593SDavid van Moolenbroek 	struct timeval   silence_timer;
959eda6f593SDavid van Moolenbroek 
960eda6f593SDavid van Moolenbroek 	struct window_pane *active;
961eda6f593SDavid van Moolenbroek 	struct window_pane *last;
962eda6f593SDavid van Moolenbroek 	struct window_panes panes;
963eda6f593SDavid van Moolenbroek 
964eda6f593SDavid van Moolenbroek 	int		 lastlayout;
965eda6f593SDavid van Moolenbroek 	struct layout_cell *layout_root;
966*0a6a1f1dSLionel Sambuc 	struct layout_cell *saved_layout_root;
967eda6f593SDavid van Moolenbroek 
968eda6f593SDavid van Moolenbroek 	u_int		 sx;
969eda6f593SDavid van Moolenbroek 	u_int		 sy;
970eda6f593SDavid van Moolenbroek 
971eda6f593SDavid van Moolenbroek 	int		 flags;
972eda6f593SDavid van Moolenbroek #define WINDOW_BELL 0x1
973eda6f593SDavid van Moolenbroek #define WINDOW_ACTIVITY 0x2
974eda6f593SDavid van Moolenbroek #define WINDOW_REDRAW 0x4
975eda6f593SDavid van Moolenbroek #define WINDOW_SILENCE 0x8
976*0a6a1f1dSLionel Sambuc #define WINDOW_ZOOMED 0x10
977*0a6a1f1dSLionel Sambuc #define WINDOW_ALERTFLAGS (WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_SILENCE)
978eda6f593SDavid van Moolenbroek 
979eda6f593SDavid van Moolenbroek 	struct options	 options;
980eda6f593SDavid van Moolenbroek 
981eda6f593SDavid van Moolenbroek 	u_int		 references;
982eda6f593SDavid van Moolenbroek };
983eda6f593SDavid van Moolenbroek ARRAY_DECL(windows, struct window *);
984eda6f593SDavid van Moolenbroek 
985eda6f593SDavid van Moolenbroek /* Entry on local window list. */
986eda6f593SDavid van Moolenbroek struct winlink {
987eda6f593SDavid van Moolenbroek 	int		 idx;
988eda6f593SDavid van Moolenbroek 	struct window	*window;
989eda6f593SDavid van Moolenbroek 
990eda6f593SDavid van Moolenbroek 	size_t		 status_width;
991eda6f593SDavid van Moolenbroek 	struct grid_cell status_cell;
992eda6f593SDavid van Moolenbroek 	char		*status_text;
993eda6f593SDavid van Moolenbroek 
994eda6f593SDavid van Moolenbroek 	int              flags;
995eda6f593SDavid van Moolenbroek #define WINLINK_BELL 0x1
996eda6f593SDavid van Moolenbroek #define WINLINK_ACTIVITY 0x2
997eda6f593SDavid van Moolenbroek #define WINLINK_CONTENT 0x4
998eda6f593SDavid van Moolenbroek #define WINLINK_SILENCE 0x8
999eda6f593SDavid van Moolenbroek #define WINLINK_ALERTFLAGS \
1000eda6f593SDavid van Moolenbroek     (WINLINK_BELL|WINLINK_ACTIVITY|WINLINK_CONTENT|WINLINK_SILENCE)
1001eda6f593SDavid van Moolenbroek 
1002eda6f593SDavid van Moolenbroek 	RB_ENTRY(winlink) entry;
1003eda6f593SDavid van Moolenbroek 	TAILQ_ENTRY(winlink) sentry;
1004eda6f593SDavid van Moolenbroek };
1005eda6f593SDavid van Moolenbroek RB_HEAD(winlinks, winlink);
1006eda6f593SDavid van Moolenbroek TAILQ_HEAD(winlink_stack, winlink);
1007eda6f593SDavid van Moolenbroek 
1008eda6f593SDavid van Moolenbroek /* Layout direction. */
1009eda6f593SDavid van Moolenbroek enum layout_type {
1010eda6f593SDavid van Moolenbroek 	LAYOUT_LEFTRIGHT,
1011eda6f593SDavid van Moolenbroek 	LAYOUT_TOPBOTTOM,
1012eda6f593SDavid van Moolenbroek 	LAYOUT_WINDOWPANE
1013eda6f593SDavid van Moolenbroek };
1014eda6f593SDavid van Moolenbroek 
1015eda6f593SDavid van Moolenbroek /* Layout cells queue. */
1016eda6f593SDavid van Moolenbroek TAILQ_HEAD(layout_cells, layout_cell);
1017eda6f593SDavid van Moolenbroek 
1018eda6f593SDavid van Moolenbroek /* Layout cell. */
1019eda6f593SDavid van Moolenbroek struct layout_cell {
1020eda6f593SDavid van Moolenbroek 	enum layout_type type;
1021eda6f593SDavid van Moolenbroek 
1022eda6f593SDavid van Moolenbroek 	struct layout_cell *parent;
1023eda6f593SDavid van Moolenbroek 
1024eda6f593SDavid van Moolenbroek 	u_int		 sx;
1025eda6f593SDavid van Moolenbroek 	u_int		 sy;
1026eda6f593SDavid van Moolenbroek 
1027eda6f593SDavid van Moolenbroek 	u_int		 xoff;
1028eda6f593SDavid van Moolenbroek 	u_int		 yoff;
1029eda6f593SDavid van Moolenbroek 
1030eda6f593SDavid van Moolenbroek 	struct window_pane *wp;
1031*0a6a1f1dSLionel Sambuc 	struct window_pane *lastwp;
1032*0a6a1f1dSLionel Sambuc 
1033eda6f593SDavid van Moolenbroek 	struct layout_cells cells;
1034eda6f593SDavid van Moolenbroek 
1035eda6f593SDavid van Moolenbroek 	TAILQ_ENTRY(layout_cell) entry;
1036eda6f593SDavid van Moolenbroek };
1037eda6f593SDavid van Moolenbroek 
1038eda6f593SDavid van Moolenbroek /* Paste buffer. */
1039eda6f593SDavid van Moolenbroek struct paste_buffer {
1040eda6f593SDavid van Moolenbroek 	char		*data;
1041eda6f593SDavid van Moolenbroek 	size_t		 size;
1042eda6f593SDavid van Moolenbroek };
1043eda6f593SDavid van Moolenbroek ARRAY_DECL(paste_stack, struct paste_buffer *);
1044eda6f593SDavid van Moolenbroek 
1045eda6f593SDavid van Moolenbroek /* Environment variable. */
1046eda6f593SDavid van Moolenbroek struct environ_entry {
1047eda6f593SDavid van Moolenbroek 	char		*name;
1048eda6f593SDavid van Moolenbroek 	char		*value;
1049eda6f593SDavid van Moolenbroek 
1050eda6f593SDavid van Moolenbroek 	RB_ENTRY(environ_entry) entry;
1051eda6f593SDavid van Moolenbroek };
1052eda6f593SDavid van Moolenbroek RB_HEAD(environ, environ_entry);
1053eda6f593SDavid van Moolenbroek 
1054eda6f593SDavid van Moolenbroek /* Client session. */
1055eda6f593SDavid van Moolenbroek struct session_group {
1056eda6f593SDavid van Moolenbroek 	TAILQ_HEAD(, session) sessions;
1057eda6f593SDavid van Moolenbroek 
1058eda6f593SDavid van Moolenbroek 	TAILQ_ENTRY(session_group) entry;
1059eda6f593SDavid van Moolenbroek };
1060eda6f593SDavid van Moolenbroek TAILQ_HEAD(session_groups, session_group);
1061eda6f593SDavid van Moolenbroek 
1062eda6f593SDavid van Moolenbroek struct session {
1063*0a6a1f1dSLionel Sambuc 	u_int		 id;
1064eda6f593SDavid van Moolenbroek 
1065eda6f593SDavid van Moolenbroek 	char		*name;
1066*0a6a1f1dSLionel Sambuc 	int		 cwd;
1067eda6f593SDavid van Moolenbroek 
1068eda6f593SDavid van Moolenbroek 	struct timeval	 creation_time;
1069eda6f593SDavid van Moolenbroek 	struct timeval	 activity_time;
1070*0a6a1f1dSLionel Sambuc 	struct timeval	 last_activity_time;
1071eda6f593SDavid van Moolenbroek 
1072eda6f593SDavid van Moolenbroek 	u_int		 sx;
1073eda6f593SDavid van Moolenbroek 	u_int		 sy;
1074eda6f593SDavid van Moolenbroek 
1075eda6f593SDavid van Moolenbroek 	struct winlink	*curw;
1076eda6f593SDavid van Moolenbroek 	struct winlink_stack lastw;
1077eda6f593SDavid van Moolenbroek 	struct winlinks	 windows;
1078eda6f593SDavid van Moolenbroek 
1079eda6f593SDavid van Moolenbroek 	struct options	 options;
1080eda6f593SDavid van Moolenbroek 
1081eda6f593SDavid van Moolenbroek #define SESSION_UNATTACHED 0x1	/* not attached to any clients */
1082eda6f593SDavid van Moolenbroek 	int		 flags;
1083eda6f593SDavid van Moolenbroek 
1084eda6f593SDavid van Moolenbroek 	struct termios	*tio;
1085eda6f593SDavid van Moolenbroek 
1086eda6f593SDavid van Moolenbroek 	struct environ	 environ;
1087eda6f593SDavid van Moolenbroek 
1088eda6f593SDavid van Moolenbroek 	int		 references;
1089eda6f593SDavid van Moolenbroek 
1090eda6f593SDavid van Moolenbroek 	TAILQ_ENTRY(session) gentry;
1091eda6f593SDavid van Moolenbroek 	RB_ENTRY(session)    entry;
1092eda6f593SDavid van Moolenbroek };
1093eda6f593SDavid van Moolenbroek RB_HEAD(sessions, session);
1094eda6f593SDavid van Moolenbroek ARRAY_DECL(sessionslist, struct session *);
1095eda6f593SDavid van Moolenbroek 
1096eda6f593SDavid van Moolenbroek /* TTY information. */
1097eda6f593SDavid van Moolenbroek struct tty_key {
1098eda6f593SDavid van Moolenbroek 	char		 ch;
1099eda6f593SDavid van Moolenbroek 	int		 key;
1100eda6f593SDavid van Moolenbroek 
1101eda6f593SDavid van Moolenbroek 	struct tty_key	*left;
1102eda6f593SDavid van Moolenbroek 	struct tty_key	*right;
1103eda6f593SDavid van Moolenbroek 
1104eda6f593SDavid van Moolenbroek 	struct tty_key	*next;
1105eda6f593SDavid van Moolenbroek };
1106eda6f593SDavid van Moolenbroek 
1107eda6f593SDavid van Moolenbroek struct tty_term {
1108eda6f593SDavid van Moolenbroek 	char		*name;
1109eda6f593SDavid van Moolenbroek 	u_int		 references;
1110eda6f593SDavid van Moolenbroek 
1111eda6f593SDavid van Moolenbroek 	char		 acs[UCHAR_MAX + 1][2];
1112eda6f593SDavid van Moolenbroek 
1113eda6f593SDavid van Moolenbroek 	struct tty_code	 codes[NTTYCODE];
1114eda6f593SDavid van Moolenbroek 
1115eda6f593SDavid van Moolenbroek #define TERM_256COLOURS 0x1
1116*0a6a1f1dSLionel Sambuc #define TERM_EARLYWRAP 0x2
1117eda6f593SDavid van Moolenbroek 	int		 flags;
1118eda6f593SDavid van Moolenbroek 
1119eda6f593SDavid van Moolenbroek 	LIST_ENTRY(tty_term) entry;
1120eda6f593SDavid van Moolenbroek };
1121eda6f593SDavid van Moolenbroek LIST_HEAD(tty_terms, tty_term);
1122eda6f593SDavid van Moolenbroek 
1123*0a6a1f1dSLionel Sambuc /* Mouse wheel states. */
1124*0a6a1f1dSLionel Sambuc #define MOUSE_WHEEL_UP 0
1125*0a6a1f1dSLionel Sambuc #define MOUSE_WHEEL_DOWN 1
1126*0a6a1f1dSLionel Sambuc 
1127*0a6a1f1dSLionel Sambuc /* Mouse events. */
1128*0a6a1f1dSLionel Sambuc #define MOUSE_EVENT_DOWN (1 << 0)
1129*0a6a1f1dSLionel Sambuc #define MOUSE_EVENT_DRAG (1 << 1)
1130*0a6a1f1dSLionel Sambuc #define MOUSE_EVENT_UP (1 << 2)
1131*0a6a1f1dSLionel Sambuc #define MOUSE_EVENT_CLICK (1 << 3)
1132*0a6a1f1dSLionel Sambuc #define MOUSE_EVENT_WHEEL (1 << 4)
1133*0a6a1f1dSLionel Sambuc 
1134*0a6a1f1dSLionel Sambuc /* Mouse flags. */
1135*0a6a1f1dSLionel Sambuc #define MOUSE_RESIZE_PANE (1 << 0)
1136*0a6a1f1dSLionel Sambuc 
1137*0a6a1f1dSLionel Sambuc /*
1138*0a6a1f1dSLionel Sambuc  * Mouse input. When sent by xterm:
1139*0a6a1f1dSLionel Sambuc  *
1140*0a6a1f1dSLionel Sambuc  * - buttons are in the bottom two bits: 0 = b1; 1 = b2; 2 = b3; 3 = released
1141*0a6a1f1dSLionel Sambuc  * - bits 3, 4 and 5 are for keys
1142*0a6a1f1dSLionel Sambuc  * - bit 6 is set for dragging
1143*0a6a1f1dSLionel Sambuc  * - bit 7 for buttons 4 and 5
1144*0a6a1f1dSLionel Sambuc  *
1145*0a6a1f1dSLionel Sambuc  * With the SGR 1006 extension the released button becomes known. Store these
1146*0a6a1f1dSLionel Sambuc  * in separate fields and store the value converted to the old format in xb.
1147*0a6a1f1dSLionel Sambuc  */
1148*0a6a1f1dSLionel Sambuc struct mouse_event {
1149*0a6a1f1dSLionel Sambuc 	u_int	xb;
1150*0a6a1f1dSLionel Sambuc 
1151*0a6a1f1dSLionel Sambuc 	u_int	x;
1152*0a6a1f1dSLionel Sambuc 	u_int	lx;
1153*0a6a1f1dSLionel Sambuc 	u_int	sx;
1154*0a6a1f1dSLionel Sambuc 
1155*0a6a1f1dSLionel Sambuc 	u_int	y;
1156*0a6a1f1dSLionel Sambuc 	u_int	ly;
1157*0a6a1f1dSLionel Sambuc 	u_int	sy;
1158*0a6a1f1dSLionel Sambuc 
1159*0a6a1f1dSLionel Sambuc 	u_int   sgr;		/* whether the input arrived in SGR format */
1160*0a6a1f1dSLionel Sambuc 	u_int   sgr_xb;		/* only for SGR: the unmangled button */
1161*0a6a1f1dSLionel Sambuc 	u_int   sgr_rel;	/* only for SGR: if it is a release event */
1162*0a6a1f1dSLionel Sambuc 
1163*0a6a1f1dSLionel Sambuc 	u_int	button;
1164*0a6a1f1dSLionel Sambuc 	u_int	clicks;
1165*0a6a1f1dSLionel Sambuc 
1166*0a6a1f1dSLionel Sambuc 	int	wheel;
1167*0a6a1f1dSLionel Sambuc 	int     event;
1168*0a6a1f1dSLionel Sambuc 	int     flags;
1169*0a6a1f1dSLionel Sambuc };
1170*0a6a1f1dSLionel Sambuc 
1171eda6f593SDavid van Moolenbroek struct tty {
1172*0a6a1f1dSLionel Sambuc 	struct client	*client;
1173*0a6a1f1dSLionel Sambuc 
1174eda6f593SDavid van Moolenbroek 	char		*path;
1175*0a6a1f1dSLionel Sambuc 	u_int		 class;
1176eda6f593SDavid van Moolenbroek 
1177eda6f593SDavid van Moolenbroek 	u_int		 sx;
1178eda6f593SDavid van Moolenbroek 	u_int		 sy;
1179eda6f593SDavid van Moolenbroek 
1180eda6f593SDavid van Moolenbroek 	u_int		 cx;
1181eda6f593SDavid van Moolenbroek 	u_int		 cy;
1182eda6f593SDavid van Moolenbroek 	u_int		 cstyle;
1183eda6f593SDavid van Moolenbroek 	char		*ccolour;
1184eda6f593SDavid van Moolenbroek 
1185eda6f593SDavid van Moolenbroek 	int		 mode;
1186eda6f593SDavid van Moolenbroek 
1187eda6f593SDavid van Moolenbroek 	u_int		 rlower;
1188eda6f593SDavid van Moolenbroek 	u_int		 rupper;
1189eda6f593SDavid van Moolenbroek 
1190eda6f593SDavid van Moolenbroek 	char		*termname;
1191eda6f593SDavid van Moolenbroek 	struct tty_term	*term;
1192eda6f593SDavid van Moolenbroek 
1193eda6f593SDavid van Moolenbroek 	int		 fd;
1194eda6f593SDavid van Moolenbroek 	struct bufferevent *event;
1195eda6f593SDavid van Moolenbroek 
1196eda6f593SDavid van Moolenbroek 	int		 log_fd;
1197eda6f593SDavid van Moolenbroek 
1198eda6f593SDavid van Moolenbroek 	struct termios	 tio;
1199eda6f593SDavid van Moolenbroek 
1200eda6f593SDavid van Moolenbroek 	struct grid_cell cell;
1201eda6f593SDavid van Moolenbroek 
1202eda6f593SDavid van Moolenbroek #define TTY_NOCURSOR 0x1
1203eda6f593SDavid van Moolenbroek #define TTY_FREEZE 0x2
1204*0a6a1f1dSLionel Sambuc #define TTY_TIMER 0x4
1205eda6f593SDavid van Moolenbroek #define TTY_UTF8 0x8
1206eda6f593SDavid van Moolenbroek #define TTY_STARTED 0x10
1207eda6f593SDavid van Moolenbroek #define TTY_OPENED 0x20
1208*0a6a1f1dSLionel Sambuc #define TTY_FOCUS 0x40
1209eda6f593SDavid van Moolenbroek 	int		 flags;
1210eda6f593SDavid van Moolenbroek 
1211eda6f593SDavid van Moolenbroek 	int		 term_flags;
1212eda6f593SDavid van Moolenbroek 
1213*0a6a1f1dSLionel Sambuc 	struct mouse_event mouse;
1214*0a6a1f1dSLionel Sambuc 
1215eda6f593SDavid van Moolenbroek 	struct event	 key_timer;
1216eda6f593SDavid van Moolenbroek 	struct tty_key	*key_tree;
1217eda6f593SDavid van Moolenbroek };
1218eda6f593SDavid van Moolenbroek 
1219eda6f593SDavid van Moolenbroek /* TTY command context and function pointer. */
1220eda6f593SDavid van Moolenbroek struct tty_ctx {
1221eda6f593SDavid van Moolenbroek 	struct window_pane *wp;
1222eda6f593SDavid van Moolenbroek 
1223eda6f593SDavid van Moolenbroek 	const struct grid_cell *cell;
1224eda6f593SDavid van Moolenbroek 
1225eda6f593SDavid van Moolenbroek 	u_int		 num;
1226eda6f593SDavid van Moolenbroek 	void		*ptr;
1227eda6f593SDavid van Moolenbroek 
1228eda6f593SDavid van Moolenbroek 	/*
1229eda6f593SDavid van Moolenbroek 	 * Cursor and region position before the screen was updated - this is
1230eda6f593SDavid van Moolenbroek 	 * where the command should be applied; the values in the screen have
1231eda6f593SDavid van Moolenbroek 	 * already been updated.
1232eda6f593SDavid van Moolenbroek 	 */
1233eda6f593SDavid van Moolenbroek 	u_int		 ocx;
1234eda6f593SDavid van Moolenbroek 	u_int		 ocy;
1235eda6f593SDavid van Moolenbroek 
1236eda6f593SDavid van Moolenbroek 	u_int		 orupper;
1237eda6f593SDavid van Moolenbroek 	u_int		 orlower;
1238eda6f593SDavid van Moolenbroek 
1239*0a6a1f1dSLionel Sambuc 	u_int		 xoff;
1240*0a6a1f1dSLionel Sambuc 	u_int		 yoff;
1241*0a6a1f1dSLionel Sambuc 
1242eda6f593SDavid van Moolenbroek 	/* Saved last cell on line. */
1243eda6f593SDavid van Moolenbroek 	struct grid_cell last_cell;
1244eda6f593SDavid van Moolenbroek 	u_int		 last_width;
1245eda6f593SDavid van Moolenbroek };
1246eda6f593SDavid van Moolenbroek 
1247eda6f593SDavid van Moolenbroek /* Saved message entry. */
1248eda6f593SDavid van Moolenbroek struct message_entry {
1249eda6f593SDavid van Moolenbroek 	char   *msg;
1250eda6f593SDavid van Moolenbroek 	time_t	msg_time;
1251eda6f593SDavid van Moolenbroek };
1252eda6f593SDavid van Moolenbroek 
1253eda6f593SDavid van Moolenbroek /* Status output data from a job. */
1254eda6f593SDavid van Moolenbroek struct status_out {
1255eda6f593SDavid van Moolenbroek 	char   *cmd;
1256eda6f593SDavid van Moolenbroek 	char   *out;
1257eda6f593SDavid van Moolenbroek 
1258eda6f593SDavid van Moolenbroek 	RB_ENTRY(status_out) entry;
1259eda6f593SDavid van Moolenbroek };
1260eda6f593SDavid van Moolenbroek RB_HEAD(status_out_tree, status_out);
1261eda6f593SDavid van Moolenbroek 
1262eda6f593SDavid van Moolenbroek /* Client connection. */
1263eda6f593SDavid van Moolenbroek struct client {
1264eda6f593SDavid van Moolenbroek 	struct imsgbuf	 ibuf;
1265*0a6a1f1dSLionel Sambuc 
1266*0a6a1f1dSLionel Sambuc 	int		 fd;
1267eda6f593SDavid van Moolenbroek 	struct event	 event;
1268*0a6a1f1dSLionel Sambuc 	int		 retval;
1269eda6f593SDavid van Moolenbroek 
1270eda6f593SDavid van Moolenbroek 	struct timeval	 creation_time;
1271eda6f593SDavid van Moolenbroek 	struct timeval	 activity_time;
1272eda6f593SDavid van Moolenbroek 
1273eda6f593SDavid van Moolenbroek 	struct environ	 environ;
1274eda6f593SDavid van Moolenbroek 
1275eda6f593SDavid van Moolenbroek 	char		*title;
1276*0a6a1f1dSLionel Sambuc 	int		 cwd;
1277eda6f593SDavid van Moolenbroek 
1278*0a6a1f1dSLionel Sambuc 	char		*term;
1279*0a6a1f1dSLionel Sambuc 	char		*ttyname;
1280eda6f593SDavid van Moolenbroek 	struct tty	 tty;
1281eda6f593SDavid van Moolenbroek 
1282*0a6a1f1dSLionel Sambuc 	void		(*stdin_callback)(struct client *, int, void *);
1283*0a6a1f1dSLionel Sambuc 	void		*stdin_callback_data;
1284*0a6a1f1dSLionel Sambuc 	struct evbuffer	*stdin_data;
1285*0a6a1f1dSLionel Sambuc 	int              stdin_closed;
1286*0a6a1f1dSLionel Sambuc 	struct evbuffer	*stdout_data;
1287*0a6a1f1dSLionel Sambuc 	struct evbuffer	*stderr_data;
1288eda6f593SDavid van Moolenbroek 
1289eda6f593SDavid van Moolenbroek 	struct event	 repeat_timer;
1290eda6f593SDavid van Moolenbroek 
1291eda6f593SDavid van Moolenbroek 	struct status_out_tree status_old;
1292eda6f593SDavid van Moolenbroek 	struct status_out_tree status_new;
1293eda6f593SDavid van Moolenbroek 	struct timeval	 status_timer;
1294eda6f593SDavid van Moolenbroek 	struct screen	 status;
1295eda6f593SDavid van Moolenbroek 
1296eda6f593SDavid van Moolenbroek #define CLIENT_TERMINAL 0x1
1297eda6f593SDavid van Moolenbroek #define CLIENT_PREFIX 0x2
1298eda6f593SDavid van Moolenbroek #define CLIENT_EXIT 0x4
1299eda6f593SDavid van Moolenbroek #define CLIENT_REDRAW 0x8
1300eda6f593SDavid van Moolenbroek #define CLIENT_STATUS 0x10
1301*0a6a1f1dSLionel Sambuc #define CLIENT_REPEAT 0x20
1302eda6f593SDavid van Moolenbroek #define CLIENT_SUSPENDED 0x40
1303eda6f593SDavid van Moolenbroek #define CLIENT_BAD 0x80
1304eda6f593SDavid van Moolenbroek #define CLIENT_IDENTIFY 0x100
1305eda6f593SDavid van Moolenbroek #define CLIENT_DEAD 0x200
1306eda6f593SDavid van Moolenbroek #define CLIENT_BORDERS 0x400
1307eda6f593SDavid van Moolenbroek #define CLIENT_READONLY 0x800
1308*0a6a1f1dSLionel Sambuc #define CLIENT_REDRAWWINDOW 0x1000
1309*0a6a1f1dSLionel Sambuc #define CLIENT_CONTROL 0x2000
1310*0a6a1f1dSLionel Sambuc #define CLIENT_CONTROLCONTROL 0x4000
1311*0a6a1f1dSLionel Sambuc #define CLIENT_FOCUSED 0x8000
1312*0a6a1f1dSLionel Sambuc #define CLIENT_UTF8 0x10000
1313*0a6a1f1dSLionel Sambuc #define CLIENT_256COLOURS 0x20000
1314*0a6a1f1dSLionel Sambuc #define CLIENT_IDENTIFIED 0x40000
1315eda6f593SDavid van Moolenbroek 	int		 flags;
1316eda6f593SDavid van Moolenbroek 
1317eda6f593SDavid van Moolenbroek 	struct event	 identify_timer;
1318eda6f593SDavid van Moolenbroek 
1319eda6f593SDavid van Moolenbroek 	char		*message_string;
1320eda6f593SDavid van Moolenbroek 	struct event	 message_timer;
1321eda6f593SDavid van Moolenbroek 	ARRAY_DECL(, struct message_entry) message_log;
1322eda6f593SDavid van Moolenbroek 
1323eda6f593SDavid van Moolenbroek 	char		*prompt_string;
1324eda6f593SDavid van Moolenbroek 	char		*prompt_buffer;
1325eda6f593SDavid van Moolenbroek 	size_t		 prompt_index;
1326eda6f593SDavid van Moolenbroek 	int		 (*prompt_callbackfn)(void *, const char *);
1327eda6f593SDavid van Moolenbroek 	void		 (*prompt_freefn)(void *);
1328eda6f593SDavid van Moolenbroek 	void		*prompt_data;
1329eda6f593SDavid van Moolenbroek 	u_int            prompt_hindex;
1330eda6f593SDavid van Moolenbroek 
1331eda6f593SDavid van Moolenbroek #define PROMPT_SINGLE 0x1
1332eda6f593SDavid van Moolenbroek 	int		 prompt_flags;
1333eda6f593SDavid van Moolenbroek 
1334eda6f593SDavid van Moolenbroek 	struct mode_key_data prompt_mdata;
1335eda6f593SDavid van Moolenbroek 
1336eda6f593SDavid van Moolenbroek 	struct session	*session;
1337eda6f593SDavid van Moolenbroek 	struct session	*last_session;
1338eda6f593SDavid van Moolenbroek 
1339*0a6a1f1dSLionel Sambuc 	int		 wlmouse;
1340eda6f593SDavid van Moolenbroek 
1341*0a6a1f1dSLionel Sambuc 	struct cmd_q	*cmdq;
1342eda6f593SDavid van Moolenbroek 	int		 references;
1343eda6f593SDavid van Moolenbroek };
1344eda6f593SDavid van Moolenbroek ARRAY_DECL(clients, struct client *);
1345eda6f593SDavid van Moolenbroek 
1346*0a6a1f1dSLionel Sambuc /* Parsed arguments structures. */
1347*0a6a1f1dSLionel Sambuc struct args_entry {
1348*0a6a1f1dSLionel Sambuc 	u_char			 flag;
1349*0a6a1f1dSLionel Sambuc 	char			*value;
1350*0a6a1f1dSLionel Sambuc 	RB_ENTRY(args_entry)	 entry;
1351*0a6a1f1dSLionel Sambuc };
1352*0a6a1f1dSLionel Sambuc RB_HEAD(args_tree, args_entry);
1353eda6f593SDavid van Moolenbroek 
1354*0a6a1f1dSLionel Sambuc struct args {
1355*0a6a1f1dSLionel Sambuc 	struct args_tree	  tree;
1356eda6f593SDavid van Moolenbroek 	int		 	  argc;
1357eda6f593SDavid van Moolenbroek 	char	       		**argv;
1358eda6f593SDavid van Moolenbroek };
1359eda6f593SDavid van Moolenbroek 
1360*0a6a1f1dSLionel Sambuc /* Command and list of commands. */
1361eda6f593SDavid van Moolenbroek struct cmd {
1362eda6f593SDavid van Moolenbroek 	const struct cmd_entry	*entry;
1363eda6f593SDavid van Moolenbroek 	struct args		*args;
1364eda6f593SDavid van Moolenbroek 
1365*0a6a1f1dSLionel Sambuc 	char			*file;
1366*0a6a1f1dSLionel Sambuc 	u_int			 line;
1367*0a6a1f1dSLionel Sambuc 
1368*0a6a1f1dSLionel Sambuc #define CMD_CONTROL 0x1
1369*0a6a1f1dSLionel Sambuc 	int			 flags;
1370*0a6a1f1dSLionel Sambuc 
1371eda6f593SDavid van Moolenbroek 	TAILQ_ENTRY(cmd)	 qentry;
1372eda6f593SDavid van Moolenbroek };
1373eda6f593SDavid van Moolenbroek struct cmd_list {
1374eda6f593SDavid van Moolenbroek 	int		 	 references;
1375eda6f593SDavid van Moolenbroek 	TAILQ_HEAD(, cmd) 	 list;
1376eda6f593SDavid van Moolenbroek };
1377eda6f593SDavid van Moolenbroek 
1378*0a6a1f1dSLionel Sambuc /* Command return values. */
1379*0a6a1f1dSLionel Sambuc enum cmd_retval {
1380*0a6a1f1dSLionel Sambuc 	CMD_RETURN_ERROR = -1,
1381*0a6a1f1dSLionel Sambuc 	CMD_RETURN_NORMAL = 0,
1382*0a6a1f1dSLionel Sambuc 	CMD_RETURN_WAIT,
1383*0a6a1f1dSLionel Sambuc 	CMD_RETURN_STOP
1384*0a6a1f1dSLionel Sambuc };
1385*0a6a1f1dSLionel Sambuc 
1386*0a6a1f1dSLionel Sambuc /* Command queue entry. */
1387*0a6a1f1dSLionel Sambuc struct cmd_q_item {
1388*0a6a1f1dSLionel Sambuc 	struct cmd_list		*cmdlist;
1389*0a6a1f1dSLionel Sambuc 	TAILQ_ENTRY(cmd_q_item)	 qentry;
1390*0a6a1f1dSLionel Sambuc };
1391*0a6a1f1dSLionel Sambuc TAILQ_HEAD(cmd_q_items, cmd_q_item);
1392*0a6a1f1dSLionel Sambuc 
1393*0a6a1f1dSLionel Sambuc /* Command queue. */
1394*0a6a1f1dSLionel Sambuc struct cmd_q {
1395*0a6a1f1dSLionel Sambuc 	int			 references;
1396*0a6a1f1dSLionel Sambuc 	int			 dead;
1397*0a6a1f1dSLionel Sambuc 
1398*0a6a1f1dSLionel Sambuc 	struct client		*client;
1399*0a6a1f1dSLionel Sambuc 	int			 client_exit;
1400*0a6a1f1dSLionel Sambuc 
1401*0a6a1f1dSLionel Sambuc 	struct cmd_q_items	 queue;
1402*0a6a1f1dSLionel Sambuc 	struct cmd_q_item	*item;
1403*0a6a1f1dSLionel Sambuc 	struct cmd		*cmd;
1404*0a6a1f1dSLionel Sambuc 
1405*0a6a1f1dSLionel Sambuc 	time_t			 time;
1406*0a6a1f1dSLionel Sambuc 	u_int			 number;
1407*0a6a1f1dSLionel Sambuc 
1408*0a6a1f1dSLionel Sambuc 	void			 (*emptyfn)(struct cmd_q *);
1409*0a6a1f1dSLionel Sambuc 	void			*data;
1410*0a6a1f1dSLionel Sambuc 
1411*0a6a1f1dSLionel Sambuc 	TAILQ_ENTRY(cmd_q)       waitentry;
1412*0a6a1f1dSLionel Sambuc };
1413*0a6a1f1dSLionel Sambuc 
1414*0a6a1f1dSLionel Sambuc /* Command definition. */
1415eda6f593SDavid van Moolenbroek struct cmd_entry {
1416eda6f593SDavid van Moolenbroek 	const char	*name;
1417eda6f593SDavid van Moolenbroek 	const char	*alias;
1418eda6f593SDavid van Moolenbroek 
1419eda6f593SDavid van Moolenbroek 	const char	*args_template;
1420eda6f593SDavid van Moolenbroek 	int		 args_lower;
1421eda6f593SDavid van Moolenbroek 	int		 args_upper;
1422eda6f593SDavid van Moolenbroek 
1423eda6f593SDavid van Moolenbroek 	const char	*usage;
1424eda6f593SDavid van Moolenbroek 
1425eda6f593SDavid van Moolenbroek #define CMD_STARTSERVER 0x1
1426eda6f593SDavid van Moolenbroek #define CMD_CANTNEST 0x2
1427*0a6a1f1dSLionel Sambuc #define CMD_READONLY 0x4
1428eda6f593SDavid van Moolenbroek 	int		 flags;
1429eda6f593SDavid van Moolenbroek 
1430eda6f593SDavid van Moolenbroek 	void		 (*key_binding)(struct cmd *, int);
1431*0a6a1f1dSLionel Sambuc 	enum cmd_retval	 (*exec)(struct cmd *, struct cmd_q *);
1432eda6f593SDavid van Moolenbroek };
1433eda6f593SDavid van Moolenbroek 
1434eda6f593SDavid van Moolenbroek /* Key binding. */
1435eda6f593SDavid van Moolenbroek struct key_binding {
1436eda6f593SDavid van Moolenbroek 	int		 key;
1437eda6f593SDavid van Moolenbroek 	struct cmd_list	*cmdlist;
1438eda6f593SDavid van Moolenbroek 	int		 can_repeat;
1439eda6f593SDavid van Moolenbroek 
1440*0a6a1f1dSLionel Sambuc 	RB_ENTRY(key_binding) entry;
1441eda6f593SDavid van Moolenbroek };
1442*0a6a1f1dSLionel Sambuc RB_HEAD(key_bindings, key_binding);
1443eda6f593SDavid van Moolenbroek 
1444eda6f593SDavid van Moolenbroek /*
1445eda6f593SDavid van Moolenbroek  * Option table entries. The option table is the user-visible part of the
1446eda6f593SDavid van Moolenbroek  * option, as opposed to the internal options (struct option) which are just
1447eda6f593SDavid van Moolenbroek  * number or string.
1448eda6f593SDavid van Moolenbroek  */
1449eda6f593SDavid van Moolenbroek enum options_table_type {
1450eda6f593SDavid van Moolenbroek 	OPTIONS_TABLE_STRING,
1451eda6f593SDavid van Moolenbroek 	OPTIONS_TABLE_NUMBER,
1452*0a6a1f1dSLionel Sambuc 	OPTIONS_TABLE_KEY,
1453eda6f593SDavid van Moolenbroek 	OPTIONS_TABLE_COLOUR,
1454eda6f593SDavid van Moolenbroek 	OPTIONS_TABLE_ATTRIBUTES,
1455eda6f593SDavid van Moolenbroek 	OPTIONS_TABLE_FLAG,
1456*0a6a1f1dSLionel Sambuc 	OPTIONS_TABLE_CHOICE,
1457*0a6a1f1dSLionel Sambuc 	OPTIONS_TABLE_STYLE
1458eda6f593SDavid van Moolenbroek };
1459eda6f593SDavid van Moolenbroek 
1460eda6f593SDavid van Moolenbroek struct options_table_entry {
1461eda6f593SDavid van Moolenbroek 	const char	       *name;
1462eda6f593SDavid van Moolenbroek 	enum options_table_type	type;
1463eda6f593SDavid van Moolenbroek 
1464eda6f593SDavid van Moolenbroek 	u_int		 	minimum;
1465eda6f593SDavid van Moolenbroek 	u_int		 	maximum;
1466eda6f593SDavid van Moolenbroek 	const char	      **choices;
1467eda6f593SDavid van Moolenbroek 
1468eda6f593SDavid van Moolenbroek 	const char	       *default_str;
1469eda6f593SDavid van Moolenbroek 	long long		default_num;
1470*0a6a1f1dSLionel Sambuc 
1471*0a6a1f1dSLionel Sambuc 	const char	       *style;
1472eda6f593SDavid van Moolenbroek };
1473eda6f593SDavid van Moolenbroek 
1474*0a6a1f1dSLionel Sambuc /* Tree of format entries. */
1475*0a6a1f1dSLionel Sambuc struct format_entry {
1476*0a6a1f1dSLionel Sambuc 	char		       *key;
1477*0a6a1f1dSLionel Sambuc 	char		       *value;
1478*0a6a1f1dSLionel Sambuc 
1479*0a6a1f1dSLionel Sambuc 	RB_ENTRY(format_entry)	entry;
1480*0a6a1f1dSLionel Sambuc };
1481*0a6a1f1dSLionel Sambuc RB_HEAD(format_tree, format_entry);
1482eda6f593SDavid van Moolenbroek 
1483eda6f593SDavid van Moolenbroek /* Common command usages. */
1484eda6f593SDavid van Moolenbroek #define CMD_TARGET_PANE_USAGE "[-t target-pane]"
1485eda6f593SDavid van Moolenbroek #define CMD_TARGET_WINDOW_USAGE "[-t target-window]"
1486eda6f593SDavid van Moolenbroek #define CMD_TARGET_SESSION_USAGE "[-t target-session]"
1487eda6f593SDavid van Moolenbroek #define CMD_TARGET_CLIENT_USAGE "[-t target-client]"
1488eda6f593SDavid van Moolenbroek #define CMD_SRCDST_PANE_USAGE "[-s src-pane] [-t dst-pane]"
1489eda6f593SDavid van Moolenbroek #define CMD_SRCDST_WINDOW_USAGE "[-s src-window] [-t dst-window]"
1490eda6f593SDavid van Moolenbroek #define CMD_SRCDST_SESSION_USAGE "[-s src-session] [-t dst-session]"
1491eda6f593SDavid van Moolenbroek #define CMD_SRCDST_CLIENT_USAGE "[-s src-client] [-t dst-client]"
1492eda6f593SDavid van Moolenbroek #define CMD_BUFFER_USAGE "[-b buffer-index]"
1493eda6f593SDavid van Moolenbroek 
1494eda6f593SDavid van Moolenbroek /* tmux.c */
1495eda6f593SDavid van Moolenbroek extern struct options global_options;
1496eda6f593SDavid van Moolenbroek extern struct options global_s_options;
1497eda6f593SDavid van Moolenbroek extern struct options global_w_options;
1498eda6f593SDavid van Moolenbroek extern struct environ global_environ;
1499eda6f593SDavid van Moolenbroek extern struct event_base *ev_base;
1500eda6f593SDavid van Moolenbroek extern char	*cfg_file;
1501eda6f593SDavid van Moolenbroek extern char	*shell_cmd;
1502eda6f593SDavid van Moolenbroek extern int	 debug_level;
1503eda6f593SDavid van Moolenbroek extern time_t	 start_time;
1504eda6f593SDavid van Moolenbroek extern char	 socket_path[MAXPATHLEN];
1505eda6f593SDavid van Moolenbroek extern int	 login_shell;
1506eda6f593SDavid van Moolenbroek extern char	*environ_path;
1507eda6f593SDavid van Moolenbroek void		 logfile(const char *);
1508eda6f593SDavid van Moolenbroek const char	*getshell(void);
1509eda6f593SDavid van Moolenbroek int		 checkshell(const char *);
1510eda6f593SDavid van Moolenbroek int		 areshell(const char *);
1511eda6f593SDavid van Moolenbroek void		 setblocking(int, int);
1512eda6f593SDavid van Moolenbroek __dead void	 shell_exec(const char *, const char *);
1513eda6f593SDavid van Moolenbroek 
1514eda6f593SDavid van Moolenbroek /* cfg.c */
1515*0a6a1f1dSLionel Sambuc extern struct cmd_q *cfg_cmd_q;
1516eda6f593SDavid van Moolenbroek extern int cfg_finished;
1517*0a6a1f1dSLionel Sambuc extern int cfg_references;
1518eda6f593SDavid van Moolenbroek extern struct causelist cfg_causes;
1519*0a6a1f1dSLionel Sambuc extern struct client *cfg_client;
1520*0a6a1f1dSLionel Sambuc int		 load_cfg(const char *, struct cmd_q *, char **);
1521*0a6a1f1dSLionel Sambuc void		 cfg_default_done(struct cmd_q *);
1522*0a6a1f1dSLionel Sambuc void		 cfg_show_causes(struct session *);
1523*0a6a1f1dSLionel Sambuc 
1524*0a6a1f1dSLionel Sambuc /* format.c */
1525*0a6a1f1dSLionel Sambuc int		 format_cmp(struct format_entry *, struct format_entry *);
1526*0a6a1f1dSLionel Sambuc RB_PROTOTYPE(format_tree, format_entry, entry, format_cmp);
1527*0a6a1f1dSLionel Sambuc struct format_tree *format_create(void);
1528*0a6a1f1dSLionel Sambuc void		 format_free(struct format_tree *);
1529*0a6a1f1dSLionel Sambuc void printflike3 format_add(struct format_tree *, const char *, const char *,
1530*0a6a1f1dSLionel Sambuc 		     ...);
1531*0a6a1f1dSLionel Sambuc const char	*format_find(struct format_tree *, const char *);
1532*0a6a1f1dSLionel Sambuc char		*format_expand(struct format_tree *, const char *);
1533*0a6a1f1dSLionel Sambuc void		 format_session(struct format_tree *, struct session *);
1534*0a6a1f1dSLionel Sambuc void		 format_client(struct format_tree *, struct client *);
1535*0a6a1f1dSLionel Sambuc void		 format_window(struct format_tree *, struct window *);
1536*0a6a1f1dSLionel Sambuc void		 format_winlink(struct format_tree *, struct session *,
1537*0a6a1f1dSLionel Sambuc 		     struct winlink *);
1538*0a6a1f1dSLionel Sambuc void		 format_window_pane(struct format_tree *,
1539*0a6a1f1dSLionel Sambuc 		     struct window_pane *);
1540*0a6a1f1dSLionel Sambuc void		 format_paste_buffer(struct format_tree *,
1541*0a6a1f1dSLionel Sambuc 		     struct paste_buffer *);
1542eda6f593SDavid van Moolenbroek 
1543eda6f593SDavid van Moolenbroek /* mode-key.c */
1544eda6f593SDavid van Moolenbroek extern const struct mode_key_table mode_key_tables[];
1545eda6f593SDavid van Moolenbroek extern struct mode_key_tree mode_key_tree_vi_edit;
1546eda6f593SDavid van Moolenbroek extern struct mode_key_tree mode_key_tree_vi_choice;
1547eda6f593SDavid van Moolenbroek extern struct mode_key_tree mode_key_tree_vi_copy;
1548eda6f593SDavid van Moolenbroek extern struct mode_key_tree mode_key_tree_emacs_edit;
1549eda6f593SDavid van Moolenbroek extern struct mode_key_tree mode_key_tree_emacs_choice;
1550eda6f593SDavid van Moolenbroek extern struct mode_key_tree mode_key_tree_emacs_copy;
1551eda6f593SDavid van Moolenbroek int	mode_key_cmp(struct mode_key_binding *, struct mode_key_binding *);
1552*0a6a1f1dSLionel Sambuc RB_PROTOTYPE(mode_key_tree, mode_key_binding, entry, mode_key_cmp);
1553eda6f593SDavid van Moolenbroek const char *mode_key_tostring(const struct mode_key_cmdstr *,
1554eda6f593SDavid van Moolenbroek 	    enum mode_key_cmd);
1555eda6f593SDavid van Moolenbroek enum mode_key_cmd mode_key_fromstring(const struct mode_key_cmdstr *,
1556eda6f593SDavid van Moolenbroek 	    const char *);
1557eda6f593SDavid van Moolenbroek const struct mode_key_table *mode_key_findtable(const char *);
1558eda6f593SDavid van Moolenbroek void	mode_key_init_trees(void);
1559eda6f593SDavid van Moolenbroek void	mode_key_init(struct mode_key_data *, struct mode_key_tree *);
1560*0a6a1f1dSLionel Sambuc enum mode_key_cmd mode_key_lookup(struct mode_key_data *, int, const char **);
1561*0a6a1f1dSLionel Sambuc 
1562*0a6a1f1dSLionel Sambuc /* notify.c */
1563*0a6a1f1dSLionel Sambuc void	notify_enable(void);
1564*0a6a1f1dSLionel Sambuc void	notify_disable(void);
1565*0a6a1f1dSLionel Sambuc void	notify_input(struct window_pane *, struct evbuffer *);
1566*0a6a1f1dSLionel Sambuc void	notify_window_layout_changed(struct window *);
1567*0a6a1f1dSLionel Sambuc void	notify_window_unlinked(struct session *, struct window *);
1568*0a6a1f1dSLionel Sambuc void	notify_window_linked(struct session *, struct window *);
1569*0a6a1f1dSLionel Sambuc void	notify_window_renamed(struct window *);
1570*0a6a1f1dSLionel Sambuc void	notify_attached_session_changed(struct client *);
1571*0a6a1f1dSLionel Sambuc void	notify_session_renamed(struct session *);
1572*0a6a1f1dSLionel Sambuc void	notify_session_created(struct session *);
1573*0a6a1f1dSLionel Sambuc void	notify_session_closed(struct session *);
1574eda6f593SDavid van Moolenbroek 
1575eda6f593SDavid van Moolenbroek /* options.c */
1576eda6f593SDavid van Moolenbroek int	options_cmp(struct options_entry *, struct options_entry *);
1577*0a6a1f1dSLionel Sambuc RB_PROTOTYPE(options_tree, options_entry, entry, options_cmp);
1578eda6f593SDavid van Moolenbroek void	options_init(struct options *, struct options *);
1579eda6f593SDavid van Moolenbroek void	options_free(struct options *);
1580eda6f593SDavid van Moolenbroek struct options_entry *options_find1(struct options *, const char *);
1581eda6f593SDavid van Moolenbroek struct options_entry *options_find(struct options *, const char *);
1582eda6f593SDavid van Moolenbroek void	options_remove(struct options *, const char *);
1583*0a6a1f1dSLionel Sambuc struct options_entry *printflike3 options_set_string(struct options *,
1584*0a6a1f1dSLionel Sambuc 	    const char *, const char *, ...);
1585eda6f593SDavid van Moolenbroek char   *options_get_string(struct options *, const char *);
1586*0a6a1f1dSLionel Sambuc struct options_entry *options_set_number(struct options *, const char *,
1587*0a6a1f1dSLionel Sambuc 	    long long);
1588eda6f593SDavid van Moolenbroek long long options_get_number(struct options *, const char *);
1589*0a6a1f1dSLionel Sambuc struct options_entry *options_set_style(struct options *, const char *,
1590*0a6a1f1dSLionel Sambuc 	    const char *, int);
1591*0a6a1f1dSLionel Sambuc struct grid_cell *options_get_style(struct options *, const char *);
1592eda6f593SDavid van Moolenbroek 
1593eda6f593SDavid van Moolenbroek /* options-table.c */
1594eda6f593SDavid van Moolenbroek extern const struct options_table_entry server_options_table[];
1595eda6f593SDavid van Moolenbroek extern const struct options_table_entry session_options_table[];
1596eda6f593SDavid van Moolenbroek extern const struct options_table_entry window_options_table[];
1597*0a6a1f1dSLionel Sambuc void	options_table_populate_tree(const struct options_table_entry *,
1598*0a6a1f1dSLionel Sambuc 	    struct options *);
1599*0a6a1f1dSLionel Sambuc const char *options_table_print_entry(const struct options_table_entry *,
1600*0a6a1f1dSLionel Sambuc 	    struct options_entry *, int);
1601*0a6a1f1dSLionel Sambuc int	options_table_find(const char *, const struct options_table_entry **,
1602*0a6a1f1dSLionel Sambuc 	    const struct options_table_entry **);
1603eda6f593SDavid van Moolenbroek 
1604eda6f593SDavid van Moolenbroek /* job.c */
1605eda6f593SDavid van Moolenbroek extern struct joblist all_jobs;
1606*0a6a1f1dSLionel Sambuc struct job *job_run(const char *, struct session *,
1607*0a6a1f1dSLionel Sambuc 	    void (*)(struct job *), void (*)(void *), void *);
1608eda6f593SDavid van Moolenbroek void	job_free(struct job *);
1609eda6f593SDavid van Moolenbroek void	job_died(struct job *, int);
1610eda6f593SDavid van Moolenbroek 
1611eda6f593SDavid van Moolenbroek /* environ.c */
1612eda6f593SDavid van Moolenbroek int	environ_cmp(struct environ_entry *, struct environ_entry *);
1613eda6f593SDavid van Moolenbroek RB_PROTOTYPE(environ, environ_entry, entry, environ_cmp);
1614eda6f593SDavid van Moolenbroek void	environ_init(struct environ *);
1615eda6f593SDavid van Moolenbroek void	environ_free(struct environ *);
1616eda6f593SDavid van Moolenbroek void	environ_copy(struct environ *, struct environ *);
1617eda6f593SDavid van Moolenbroek struct environ_entry *environ_find(struct environ *, const char *);
1618eda6f593SDavid van Moolenbroek void	environ_set(struct environ *, const char *, const char *);
1619eda6f593SDavid van Moolenbroek void	environ_put(struct environ *, const char *);
1620eda6f593SDavid van Moolenbroek void	environ_unset(struct environ *, const char *);
1621eda6f593SDavid van Moolenbroek void	environ_update(const char *, struct environ *, struct environ *);
1622eda6f593SDavid van Moolenbroek void	environ_push(struct environ *);
1623eda6f593SDavid van Moolenbroek 
1624eda6f593SDavid van Moolenbroek /* tty.c */
1625*0a6a1f1dSLionel Sambuc void	tty_init_termios(int, struct termios *, struct bufferevent *);
1626eda6f593SDavid van Moolenbroek void	tty_raw(struct tty *, const char *);
1627eda6f593SDavid van Moolenbroek void	tty_attributes(struct tty *, const struct grid_cell *);
1628eda6f593SDavid van Moolenbroek void	tty_reset(struct tty *);
1629eda6f593SDavid van Moolenbroek void	tty_region_pane(struct tty *, const struct tty_ctx *, u_int, u_int);
1630eda6f593SDavid van Moolenbroek void	tty_region(struct tty *, u_int, u_int);
1631eda6f593SDavid van Moolenbroek void	tty_cursor_pane(struct tty *, const struct tty_ctx *, u_int, u_int);
1632eda6f593SDavid van Moolenbroek void	tty_cursor(struct tty *, u_int, u_int);
1633eda6f593SDavid van Moolenbroek void	tty_putcode(struct tty *, enum tty_code_code);
1634eda6f593SDavid van Moolenbroek void	tty_putcode1(struct tty *, enum tty_code_code, int);
1635eda6f593SDavid van Moolenbroek void	tty_putcode2(struct tty *, enum tty_code_code, int, int);
1636eda6f593SDavid van Moolenbroek void	tty_putcode_ptr1(struct tty *, enum tty_code_code, const void *);
1637*0a6a1f1dSLionel Sambuc void	tty_putcode_ptr2(struct tty *, enum tty_code_code, const void *,
1638*0a6a1f1dSLionel Sambuc 	    const void *);
1639eda6f593SDavid van Moolenbroek void	tty_puts(struct tty *, const char *);
1640eda6f593SDavid van Moolenbroek void	tty_putc(struct tty *, u_char);
1641*0a6a1f1dSLionel Sambuc void	tty_putn(struct tty *, const void *, size_t, u_int);
1642*0a6a1f1dSLionel Sambuc void	tty_init(struct tty *, struct client *, int, char *);
1643eda6f593SDavid van Moolenbroek int	tty_resize(struct tty *);
1644*0a6a1f1dSLionel Sambuc int	tty_set_size(struct tty *, u_int, u_int);
1645*0a6a1f1dSLionel Sambuc void	tty_set_class(struct tty *, u_int);
1646eda6f593SDavid van Moolenbroek void	tty_start_tty(struct tty *);
1647eda6f593SDavid van Moolenbroek void	tty_stop_tty(struct tty *);
1648eda6f593SDavid van Moolenbroek void	tty_set_title(struct tty *, const char *);
1649eda6f593SDavid van Moolenbroek void	tty_update_mode(struct tty *, int, struct screen *);
1650eda6f593SDavid van Moolenbroek void	tty_force_cursor_colour(struct tty *, const char *);
1651eda6f593SDavid van Moolenbroek void	tty_draw_line(struct tty *, struct screen *, u_int, u_int, u_int);
1652eda6f593SDavid van Moolenbroek int	tty_open(struct tty *, const char *, char **);
1653eda6f593SDavid van Moolenbroek void	tty_close(struct tty *);
1654eda6f593SDavid van Moolenbroek void	tty_free(struct tty *);
1655*0a6a1f1dSLionel Sambuc void	tty_write(
1656*0a6a1f1dSLionel Sambuc 	    void (*)(struct tty *, const struct tty_ctx *), struct tty_ctx *);
1657eda6f593SDavid van Moolenbroek void	tty_cmd_alignmenttest(struct tty *, const struct tty_ctx *);
1658eda6f593SDavid van Moolenbroek void	tty_cmd_cell(struct tty *, const struct tty_ctx *);
1659eda6f593SDavid van Moolenbroek void	tty_cmd_clearendofline(struct tty *, const struct tty_ctx *);
1660eda6f593SDavid van Moolenbroek void	tty_cmd_clearendofscreen(struct tty *, const struct tty_ctx *);
1661eda6f593SDavid van Moolenbroek void	tty_cmd_clearline(struct tty *, const struct tty_ctx *);
1662eda6f593SDavid van Moolenbroek void	tty_cmd_clearscreen(struct tty *, const struct tty_ctx *);
1663eda6f593SDavid van Moolenbroek void	tty_cmd_clearstartofline(struct tty *, const struct tty_ctx *);
1664eda6f593SDavid van Moolenbroek void	tty_cmd_clearstartofscreen(struct tty *, const struct tty_ctx *);
1665eda6f593SDavid van Moolenbroek void	tty_cmd_deletecharacter(struct tty *, const struct tty_ctx *);
1666*0a6a1f1dSLionel Sambuc void	tty_cmd_clearcharacter(struct tty *, const struct tty_ctx *);
1667eda6f593SDavid van Moolenbroek void	tty_cmd_deleteline(struct tty *, const struct tty_ctx *);
1668eda6f593SDavid van Moolenbroek void	tty_cmd_erasecharacter(struct tty *, const struct tty_ctx *);
1669eda6f593SDavid van Moolenbroek void	tty_cmd_insertcharacter(struct tty *, const struct tty_ctx *);
1670eda6f593SDavid van Moolenbroek void	tty_cmd_insertline(struct tty *, const struct tty_ctx *);
1671eda6f593SDavid van Moolenbroek void	tty_cmd_linefeed(struct tty *, const struct tty_ctx *);
1672eda6f593SDavid van Moolenbroek void	tty_cmd_utf8character(struct tty *, const struct tty_ctx *);
1673eda6f593SDavid van Moolenbroek void	tty_cmd_reverseindex(struct tty *, const struct tty_ctx *);
1674eda6f593SDavid van Moolenbroek void	tty_cmd_setselection(struct tty *, const struct tty_ctx *);
1675eda6f593SDavid van Moolenbroek void	tty_cmd_rawstring(struct tty *, const struct tty_ctx *);
1676*0a6a1f1dSLionel Sambuc void	tty_bell(struct tty *);
1677eda6f593SDavid van Moolenbroek 
1678eda6f593SDavid van Moolenbroek /* tty-term.c */
1679eda6f593SDavid van Moolenbroek extern struct tty_terms tty_terms;
1680eda6f593SDavid van Moolenbroek extern const struct tty_term_code_entry tty_term_codes[NTTYCODE];
1681eda6f593SDavid van Moolenbroek struct tty_term *tty_term_find(char *, int, const char *, char **);
1682eda6f593SDavid van Moolenbroek void		 tty_term_free(struct tty_term *);
1683eda6f593SDavid van Moolenbroek int		 tty_term_has(struct tty_term *, enum tty_code_code);
1684eda6f593SDavid van Moolenbroek const char	*tty_term_string(struct tty_term *, enum tty_code_code);
1685eda6f593SDavid van Moolenbroek const char	*tty_term_string1(struct tty_term *, enum tty_code_code, int);
1686eda6f593SDavid van Moolenbroek const char	*tty_term_string2(
1687eda6f593SDavid van Moolenbroek 		     struct tty_term *, enum tty_code_code, int, int);
1688eda6f593SDavid van Moolenbroek const char	*tty_term_ptr1(
1689eda6f593SDavid van Moolenbroek 		     struct tty_term *, enum tty_code_code, const void *);
1690*0a6a1f1dSLionel Sambuc const char	*tty_term_ptr2(struct tty_term *, enum tty_code_code,
1691*0a6a1f1dSLionel Sambuc 		     const void *, const void *);
1692eda6f593SDavid van Moolenbroek int		 tty_term_number(struct tty_term *, enum tty_code_code);
1693eda6f593SDavid van Moolenbroek int		 tty_term_flag(struct tty_term *, enum tty_code_code);
1694eda6f593SDavid van Moolenbroek 
1695eda6f593SDavid van Moolenbroek /* tty-acs.c */
1696eda6f593SDavid van Moolenbroek const char	*tty_acs_get(struct tty *, u_char);
1697eda6f593SDavid van Moolenbroek 
1698eda6f593SDavid van Moolenbroek /* tty-keys.c */
1699*0a6a1f1dSLionel Sambuc void	tty_keys_build(struct tty *);
1700eda6f593SDavid van Moolenbroek void	tty_keys_free(struct tty *);
1701eda6f593SDavid van Moolenbroek int	tty_keys_next(struct tty *);
1702eda6f593SDavid van Moolenbroek 
1703eda6f593SDavid van Moolenbroek /* paste.c */
1704eda6f593SDavid van Moolenbroek struct paste_buffer *paste_walk_stack(struct paste_stack *, u_int *);
1705eda6f593SDavid van Moolenbroek struct paste_buffer *paste_get_top(struct paste_stack *);
1706eda6f593SDavid van Moolenbroek struct paste_buffer *paste_get_index(struct paste_stack *, u_int);
1707eda6f593SDavid van Moolenbroek int		 paste_free_top(struct paste_stack *);
1708eda6f593SDavid van Moolenbroek int		 paste_free_index(struct paste_stack *, u_int);
1709eda6f593SDavid van Moolenbroek void		 paste_add(struct paste_stack *, char *, size_t, u_int);
1710eda6f593SDavid van Moolenbroek int		 paste_replace(struct paste_stack *, u_int, char *, size_t);
1711eda6f593SDavid van Moolenbroek char		*paste_print(struct paste_buffer *, size_t);
1712*0a6a1f1dSLionel Sambuc void		 paste_send_pane(struct paste_buffer *, struct window_pane *,
1713*0a6a1f1dSLionel Sambuc 		     const char *, int);
1714eda6f593SDavid van Moolenbroek 
1715eda6f593SDavid van Moolenbroek /* clock.c */
1716eda6f593SDavid van Moolenbroek extern const char clock_table[14][5][5];
1717eda6f593SDavid van Moolenbroek void		 clock_draw(struct screen_write_ctx *, int, int);
1718eda6f593SDavid van Moolenbroek 
1719eda6f593SDavid van Moolenbroek /* arguments.c */
1720*0a6a1f1dSLionel Sambuc int		 args_cmp(struct args_entry *, struct args_entry *);
1721*0a6a1f1dSLionel Sambuc RB_PROTOTYPE(args_tree, args_entry, entry, args_cmp);
1722eda6f593SDavid van Moolenbroek struct args	*args_create(int, ...);
1723eda6f593SDavid van Moolenbroek struct args	*args_parse(const char *, int, char **);
1724eda6f593SDavid van Moolenbroek void		 args_free(struct args *);
1725eda6f593SDavid van Moolenbroek size_t		 args_print(struct args *, char *, size_t);
1726eda6f593SDavid van Moolenbroek int		 args_has(struct args *, u_char);
1727eda6f593SDavid van Moolenbroek void		 args_set(struct args *, u_char, const char *);
1728eda6f593SDavid van Moolenbroek const char	*args_get(struct args *, u_char);
1729eda6f593SDavid van Moolenbroek long long	 args_strtonum(
1730eda6f593SDavid van Moolenbroek 		    struct args *, u_char, long long, long long, char **);
1731eda6f593SDavid van Moolenbroek 
1732eda6f593SDavid van Moolenbroek /* cmd.c */
1733eda6f593SDavid van Moolenbroek int		 cmd_pack_argv(int, char **, char *, size_t);
1734eda6f593SDavid van Moolenbroek int		 cmd_unpack_argv(char *, size_t, int, char ***);
1735eda6f593SDavid van Moolenbroek char	       **cmd_copy_argv(int, char *const *);
1736eda6f593SDavid van Moolenbroek void		 cmd_free_argv(int, char **);
1737*0a6a1f1dSLionel Sambuc struct cmd	*cmd_parse(int, char **, const char *, u_int, char **);
1738eda6f593SDavid van Moolenbroek size_t		 cmd_print(struct cmd *, char *, size_t);
1739*0a6a1f1dSLionel Sambuc struct session	*cmd_current_session(struct cmd_q *, int);
1740*0a6a1f1dSLionel Sambuc struct client	*cmd_current_client(struct cmd_q *);
1741*0a6a1f1dSLionel Sambuc struct client	*cmd_find_client(struct cmd_q *, const char *, int);
1742*0a6a1f1dSLionel Sambuc struct session	*cmd_find_session(struct cmd_q *, const char *, int);
1743*0a6a1f1dSLionel Sambuc struct winlink	*cmd_find_window(struct cmd_q *, const char *,
1744*0a6a1f1dSLionel Sambuc 		     struct session **);
1745*0a6a1f1dSLionel Sambuc int		 cmd_find_index(struct cmd_q *, const char *,
1746*0a6a1f1dSLionel Sambuc 		     struct session **);
1747*0a6a1f1dSLionel Sambuc struct winlink	*cmd_find_pane(struct cmd_q *, const char *, struct session **,
1748*0a6a1f1dSLionel Sambuc 		     struct window_pane **);
1749*0a6a1f1dSLionel Sambuc char		*cmd_template_replace(const char *, const char *, int);
1750*0a6a1f1dSLionel Sambuc struct window	*cmd_lookup_windowid(const char *);
1751*0a6a1f1dSLionel Sambuc struct window_pane *cmd_lookup_paneid(const char *);
1752eda6f593SDavid van Moolenbroek extern const struct cmd_entry *cmd_table[];
1753eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_attach_session_entry;
1754eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_bind_key_entry;
1755eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_break_pane_entry;
1756eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_capture_pane_entry;
1757eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_choose_buffer_entry;
1758eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_choose_client_entry;
1759*0a6a1f1dSLionel Sambuc extern const struct cmd_entry cmd_choose_list_entry;
1760eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_choose_session_entry;
1761*0a6a1f1dSLionel Sambuc extern const struct cmd_entry cmd_choose_tree_entry;
1762eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_choose_window_entry;
1763eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_clear_history_entry;
1764eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_clock_mode_entry;
1765eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_command_prompt_entry;
1766eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_confirm_before_entry;
1767eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_copy_mode_entry;
1768eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_delete_buffer_entry;
1769eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_detach_client_entry;
1770eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_display_message_entry;
1771eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_display_panes_entry;
1772eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_down_pane_entry;
1773eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_find_window_entry;
1774eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_has_session_entry;
1775eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_if_shell_entry;
1776eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_join_pane_entry;
1777eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_kill_pane_entry;
1778eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_kill_server_entry;
1779eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_kill_session_entry;
1780eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_kill_window_entry;
1781eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_last_pane_entry;
1782eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_last_window_entry;
1783eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_link_window_entry;
1784eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_list_buffers_entry;
1785eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_list_clients_entry;
1786eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_list_commands_entry;
1787eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_list_keys_entry;
1788eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_list_panes_entry;
1789eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_list_sessions_entry;
1790eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_list_windows_entry;
1791eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_load_buffer_entry;
1792eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_lock_client_entry;
1793eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_lock_server_entry;
1794eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_lock_session_entry;
1795*0a6a1f1dSLionel Sambuc extern const struct cmd_entry cmd_move_pane_entry;
1796eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_move_window_entry;
1797eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_new_session_entry;
1798eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_new_window_entry;
1799eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_next_layout_entry;
1800eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_next_window_entry;
1801eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_paste_buffer_entry;
1802eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_pipe_pane_entry;
1803eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_previous_layout_entry;
1804eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_previous_window_entry;
1805eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_refresh_client_entry;
1806eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_rename_session_entry;
1807eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_rename_window_entry;
1808eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_resize_pane_entry;
1809eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_respawn_pane_entry;
1810eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_respawn_window_entry;
1811eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_rotate_window_entry;
1812eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_run_shell_entry;
1813eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_save_buffer_entry;
1814eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_select_layout_entry;
1815eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_select_pane_entry;
1816eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_select_window_entry;
1817eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_send_keys_entry;
1818eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_send_prefix_entry;
1819eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_server_info_entry;
1820eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_set_buffer_entry;
1821eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_set_environment_entry;
1822eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_set_option_entry;
1823eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_set_window_option_entry;
1824eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_show_buffer_entry;
1825eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_show_environment_entry;
1826eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_show_messages_entry;
1827eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_show_options_entry;
1828eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_show_window_options_entry;
1829eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_source_file_entry;
1830eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_split_window_entry;
1831eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_start_server_entry;
1832eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_suspend_client_entry;
1833eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_swap_pane_entry;
1834eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_swap_window_entry;
1835eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_switch_client_entry;
1836eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_unbind_key_entry;
1837eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_unlink_window_entry;
1838eda6f593SDavid van Moolenbroek extern const struct cmd_entry cmd_up_pane_entry;
1839*0a6a1f1dSLionel Sambuc extern const struct cmd_entry cmd_wait_for_entry;
1840*0a6a1f1dSLionel Sambuc 
1841*0a6a1f1dSLionel Sambuc /* cmd-attach-session.c */
1842*0a6a1f1dSLionel Sambuc enum cmd_retval	 cmd_attach_session(struct cmd_q *, const char *, int, int,
1843*0a6a1f1dSLionel Sambuc 		     const char *);
1844eda6f593SDavid van Moolenbroek 
1845eda6f593SDavid van Moolenbroek /* cmd-list.c */
1846*0a6a1f1dSLionel Sambuc struct cmd_list	*cmd_list_parse(int, char **, const char *, u_int, char **);
1847eda6f593SDavid van Moolenbroek void		 cmd_list_free(struct cmd_list *);
1848eda6f593SDavid van Moolenbroek size_t		 cmd_list_print(struct cmd_list *, char *, size_t);
1849eda6f593SDavid van Moolenbroek 
1850*0a6a1f1dSLionel Sambuc /* cmd-queue.c */
1851*0a6a1f1dSLionel Sambuc struct cmd_q	*cmdq_new(struct client *);
1852*0a6a1f1dSLionel Sambuc int		 cmdq_free(struct cmd_q *);
1853*0a6a1f1dSLionel Sambuc void printflike2 cmdq_print(struct cmd_q *, const char *, ...);
1854*0a6a1f1dSLionel Sambuc void printflike2 cmdq_info(struct cmd_q *, const char *, ...);
1855*0a6a1f1dSLionel Sambuc void printflike2 cmdq_error(struct cmd_q *, const char *, ...);
1856*0a6a1f1dSLionel Sambuc int		 cmdq_guard(struct cmd_q *, const char *, int);
1857*0a6a1f1dSLionel Sambuc void		 cmdq_run(struct cmd_q *, struct cmd_list *);
1858*0a6a1f1dSLionel Sambuc void		 cmdq_append(struct cmd_q *, struct cmd_list *);
1859*0a6a1f1dSLionel Sambuc int		 cmdq_continue(struct cmd_q *);
1860*0a6a1f1dSLionel Sambuc void		 cmdq_flush(struct cmd_q *);
1861*0a6a1f1dSLionel Sambuc 
1862eda6f593SDavid van Moolenbroek /* cmd-string.c */
1863*0a6a1f1dSLionel Sambuc int	cmd_string_parse(const char *, struct cmd_list **, const char *,
1864*0a6a1f1dSLionel Sambuc 	    u_int, char **);
1865eda6f593SDavid van Moolenbroek 
1866eda6f593SDavid van Moolenbroek /* client.c */
1867eda6f593SDavid van Moolenbroek int	client_main(int, char **, int);
1868eda6f593SDavid van Moolenbroek 
1869eda6f593SDavid van Moolenbroek /* key-bindings.c */
1870eda6f593SDavid van Moolenbroek extern struct key_bindings key_bindings;
1871eda6f593SDavid van Moolenbroek int	 key_bindings_cmp(struct key_binding *, struct key_binding *);
1872*0a6a1f1dSLionel Sambuc RB_PROTOTYPE(key_bindings, key_binding, entry, key_bindings_cmp);
1873eda6f593SDavid van Moolenbroek struct key_binding *key_bindings_lookup(int);
1874eda6f593SDavid van Moolenbroek void	 key_bindings_add(int, int, struct cmd_list *);
1875eda6f593SDavid van Moolenbroek void	 key_bindings_remove(int);
1876eda6f593SDavid van Moolenbroek void	 key_bindings_clean(void);
1877eda6f593SDavid van Moolenbroek void	 key_bindings_init(void);
1878eda6f593SDavid van Moolenbroek void	 key_bindings_dispatch(struct key_binding *, struct client *);
1879eda6f593SDavid van Moolenbroek 
1880eda6f593SDavid van Moolenbroek /* key-string.c */
1881eda6f593SDavid van Moolenbroek int	 key_string_lookup_string(const char *);
1882eda6f593SDavid van Moolenbroek const char *key_string_lookup_key(int);
1883eda6f593SDavid van Moolenbroek 
1884eda6f593SDavid van Moolenbroek /* server.c */
1885eda6f593SDavid van Moolenbroek extern struct clients clients;
1886eda6f593SDavid van Moolenbroek extern struct clients dead_clients;
1887eda6f593SDavid van Moolenbroek extern struct paste_stack global_buffers;
1888*0a6a1f1dSLionel Sambuc int	 server_start(int, char *);
1889eda6f593SDavid van Moolenbroek void	 server_update_socket(void);
1890*0a6a1f1dSLionel Sambuc void	 server_add_accept(int);
1891eda6f593SDavid van Moolenbroek 
1892eda6f593SDavid van Moolenbroek /* server-client.c */
1893*0a6a1f1dSLionel Sambuc void	 server_client_handle_key(struct client *, int);
1894eda6f593SDavid van Moolenbroek void	 server_client_create(int);
1895*0a6a1f1dSLionel Sambuc int      server_client_open(struct client *, struct session *, char **);
1896eda6f593SDavid van Moolenbroek void	 server_client_lost(struct client *);
1897eda6f593SDavid van Moolenbroek void	 server_client_callback(int, short, void *);
1898eda6f593SDavid van Moolenbroek void	 server_client_status_timer(void);
1899eda6f593SDavid van Moolenbroek void	 server_client_loop(void);
1900eda6f593SDavid van Moolenbroek 
1901eda6f593SDavid van Moolenbroek /* server-window.c */
1902eda6f593SDavid van Moolenbroek void	 server_window_loop(void);
1903eda6f593SDavid van Moolenbroek 
1904eda6f593SDavid van Moolenbroek /* server-fn.c */
1905eda6f593SDavid van Moolenbroek void	 server_fill_environ(struct session *, struct environ *);
1906*0a6a1f1dSLionel Sambuc void	 server_write_ready(struct client *);
1907*0a6a1f1dSLionel Sambuc int	 server_write_client(struct client *, enum msgtype, const void *,
1908*0a6a1f1dSLionel Sambuc 	     size_t);
1909*0a6a1f1dSLionel Sambuc void	 server_write_session(struct session *, enum msgtype, const void *,
1910*0a6a1f1dSLionel Sambuc 	     size_t);
1911eda6f593SDavid van Moolenbroek void	 server_redraw_client(struct client *);
1912eda6f593SDavid van Moolenbroek void	 server_status_client(struct client *);
1913eda6f593SDavid van Moolenbroek void	 server_redraw_session(struct session *);
1914eda6f593SDavid van Moolenbroek void	 server_redraw_session_group(struct session *);
1915eda6f593SDavid van Moolenbroek void	 server_status_session(struct session *);
1916eda6f593SDavid van Moolenbroek void	 server_status_session_group(struct session *);
1917eda6f593SDavid van Moolenbroek void	 server_redraw_window(struct window *);
1918eda6f593SDavid van Moolenbroek void	 server_redraw_window_borders(struct window *);
1919eda6f593SDavid van Moolenbroek void	 server_status_window(struct window *);
1920eda6f593SDavid van Moolenbroek void	 server_lock(void);
1921eda6f593SDavid van Moolenbroek void	 server_lock_session(struct session *);
1922eda6f593SDavid van Moolenbroek void	 server_lock_client(struct client *);
1923eda6f593SDavid van Moolenbroek int	 server_unlock(const char *);
1924eda6f593SDavid van Moolenbroek void	 server_kill_window(struct window *);
1925eda6f593SDavid van Moolenbroek int	 server_link_window(struct session *,
1926eda6f593SDavid van Moolenbroek 	     struct winlink *, struct session *, int, int, int, char **);
1927eda6f593SDavid van Moolenbroek void	 server_unlink_window(struct session *, struct winlink *);
1928eda6f593SDavid van Moolenbroek void	 server_destroy_pane(struct window_pane *);
1929eda6f593SDavid van Moolenbroek void	 server_destroy_session_group(struct session *);
1930eda6f593SDavid van Moolenbroek void	 server_destroy_session(struct session *);
1931eda6f593SDavid van Moolenbroek void	 server_check_unattached(void);
1932eda6f593SDavid van Moolenbroek void	 server_set_identify(struct client *);
1933eda6f593SDavid van Moolenbroek void	 server_clear_identify(struct client *);
1934eda6f593SDavid van Moolenbroek void	 server_update_event(struct client *);
1935*0a6a1f1dSLionel Sambuc void	 server_push_stdout(struct client *);
1936*0a6a1f1dSLionel Sambuc void	 server_push_stderr(struct client *);
1937*0a6a1f1dSLionel Sambuc int	 server_set_stdin_callback(struct client *, void (*)(struct client *,
1938*0a6a1f1dSLionel Sambuc 	     int, void *), void *, char **);
1939*0a6a1f1dSLionel Sambuc void	 server_unzoom_window(struct window *);
1940eda6f593SDavid van Moolenbroek 
1941eda6f593SDavid van Moolenbroek /* status.c */
1942eda6f593SDavid van Moolenbroek int	 status_out_cmp(struct status_out *, struct status_out *);
1943eda6f593SDavid van Moolenbroek RB_PROTOTYPE(status_out_tree, status_out, entry, status_out_cmp);
1944*0a6a1f1dSLionel Sambuc int	 status_at_line(struct client *);
1945eda6f593SDavid van Moolenbroek void	 status_free_jobs(struct status_out_tree *);
1946eda6f593SDavid van Moolenbroek void	 status_update_jobs(struct client *);
1947eda6f593SDavid van Moolenbroek void	 status_set_window_at(struct client *, u_int);
1948eda6f593SDavid van Moolenbroek int	 status_redraw(struct client *);
1949eda6f593SDavid van Moolenbroek char	*status_replace(struct client *, struct session *,
1950eda6f593SDavid van Moolenbroek 	     struct winlink *, struct window_pane *, const char *, time_t, int)
1951eda6f593SDavid van Moolenbroek     __attribute__((__format__(__strftime__, 5, 0)));
1952eda6f593SDavid van Moolenbroek void printflike2 status_message_set(struct client *, const char *, ...);
1953eda6f593SDavid van Moolenbroek void	 status_message_clear(struct client *);
1954eda6f593SDavid van Moolenbroek int	 status_message_redraw(struct client *);
1955eda6f593SDavid van Moolenbroek void	 status_prompt_set(struct client *, const char *, const char *,
1956eda6f593SDavid van Moolenbroek 	     int (*)(void *, const char *), void (*)(void *), void *, int);
1957eda6f593SDavid van Moolenbroek void	 status_prompt_clear(struct client *);
1958eda6f593SDavid van Moolenbroek int	 status_prompt_redraw(struct client *);
1959eda6f593SDavid van Moolenbroek void	 status_prompt_key(struct client *, int);
1960eda6f593SDavid van Moolenbroek void	 status_prompt_update(struct client *, const char *, const char *);
1961eda6f593SDavid van Moolenbroek 
1962eda6f593SDavid van Moolenbroek /* resize.c */
1963eda6f593SDavid van Moolenbroek void	 recalculate_sizes(void);
1964eda6f593SDavid van Moolenbroek 
1965eda6f593SDavid van Moolenbroek /* input.c */
1966eda6f593SDavid van Moolenbroek void	 input_init(struct window_pane *);
1967eda6f593SDavid van Moolenbroek void	 input_free(struct window_pane *);
1968eda6f593SDavid van Moolenbroek void	 input_parse(struct window_pane *);
1969eda6f593SDavid van Moolenbroek 
1970eda6f593SDavid van Moolenbroek /* input-key.c */
1971eda6f593SDavid van Moolenbroek void	 input_key(struct window_pane *, int);
1972*0a6a1f1dSLionel Sambuc void	 input_mouse(struct window_pane *, struct session *,
1973*0a6a1f1dSLionel Sambuc 	     struct mouse_event *);
1974eda6f593SDavid van Moolenbroek 
1975eda6f593SDavid van Moolenbroek /* xterm-keys.c */
1976eda6f593SDavid van Moolenbroek char	*xterm_keys_lookup(int);
1977eda6f593SDavid van Moolenbroek int	 xterm_keys_find(const char *, size_t, size_t *, int *);
1978eda6f593SDavid van Moolenbroek 
1979eda6f593SDavid van Moolenbroek /* colour.c */
1980eda6f593SDavid van Moolenbroek void	 colour_set_fg(struct grid_cell *, int);
1981eda6f593SDavid van Moolenbroek void	 colour_set_bg(struct grid_cell *, int);
1982eda6f593SDavid van Moolenbroek const char *colour_tostring(int);
1983eda6f593SDavid van Moolenbroek int	 colour_fromstring(const char *);
1984eda6f593SDavid van Moolenbroek u_char	 colour_256to16(u_char);
1985eda6f593SDavid van Moolenbroek 
1986eda6f593SDavid van Moolenbroek /* attributes.c */
1987eda6f593SDavid van Moolenbroek const char *attributes_tostring(u_char);
1988eda6f593SDavid van Moolenbroek int	 attributes_fromstring(const char *);
1989eda6f593SDavid van Moolenbroek 
1990eda6f593SDavid van Moolenbroek /* grid.c */
1991eda6f593SDavid van Moolenbroek extern const struct grid_cell grid_default_cell;
1992*0a6a1f1dSLionel Sambuc extern const struct grid_cell grid_marker_cell;
1993eda6f593SDavid van Moolenbroek struct grid *grid_create(u_int, u_int, u_int);
1994eda6f593SDavid van Moolenbroek void	 grid_destroy(struct grid *);
1995eda6f593SDavid van Moolenbroek int	 grid_compare(struct grid *, struct grid *);
1996eda6f593SDavid van Moolenbroek void	 grid_collect_history(struct grid *);
1997eda6f593SDavid van Moolenbroek void	 grid_scroll_history(struct grid *);
1998eda6f593SDavid van Moolenbroek void	 grid_scroll_history_region(struct grid *, u_int, u_int);
1999eda6f593SDavid van Moolenbroek void	 grid_expand_line(struct grid *, u_int, u_int);
2000eda6f593SDavid van Moolenbroek const struct grid_cell *grid_peek_cell(struct grid *, u_int, u_int);
2001*0a6a1f1dSLionel Sambuc const struct grid_line *grid_peek_line(struct grid *, u_int);
2002eda6f593SDavid van Moolenbroek struct grid_cell *grid_get_cell(struct grid *, u_int, u_int);
2003eda6f593SDavid van Moolenbroek void	 grid_set_cell(struct grid *, u_int, u_int, const struct grid_cell *);
2004eda6f593SDavid van Moolenbroek void	 grid_clear(struct grid *, u_int, u_int, u_int, u_int);
2005eda6f593SDavid van Moolenbroek void	 grid_clear_lines(struct grid *, u_int, u_int);
2006eda6f593SDavid van Moolenbroek void	 grid_move_lines(struct grid *, u_int, u_int, u_int);
2007eda6f593SDavid van Moolenbroek void	 grid_move_cells(struct grid *, u_int, u_int, u_int, u_int);
2008*0a6a1f1dSLionel Sambuc char	*grid_string_cells(struct grid *, u_int, u_int, u_int,
2009*0a6a1f1dSLionel Sambuc 	     struct grid_cell **, int, int, int);
2010eda6f593SDavid van Moolenbroek void	 grid_duplicate_lines(
2011eda6f593SDavid van Moolenbroek 	     struct grid *, u_int, struct grid *, u_int, u_int);
2012*0a6a1f1dSLionel Sambuc u_int	 grid_reflow(struct grid *, struct grid *, u_int);
2013eda6f593SDavid van Moolenbroek 
2014*0a6a1f1dSLionel Sambuc /* grid-cell.c */
2015*0a6a1f1dSLionel Sambuc u_int	 grid_cell_width(const struct grid_cell *);
2016*0a6a1f1dSLionel Sambuc void	 grid_cell_get(const struct grid_cell *, struct utf8_data *);
2017*0a6a1f1dSLionel Sambuc void	 grid_cell_set(struct grid_cell *, const struct utf8_data *);
2018*0a6a1f1dSLionel Sambuc void	 grid_cell_one(struct grid_cell *, u_char);
2019eda6f593SDavid van Moolenbroek 
2020eda6f593SDavid van Moolenbroek /* grid-view.c */
2021eda6f593SDavid van Moolenbroek const struct grid_cell *grid_view_peek_cell(struct grid *, u_int, u_int);
2022eda6f593SDavid van Moolenbroek struct grid_cell *grid_view_get_cell(struct grid *, u_int, u_int);
2023eda6f593SDavid van Moolenbroek void	 grid_view_set_cell(
2024eda6f593SDavid van Moolenbroek 	     struct grid *, u_int, u_int, const struct grid_cell *);
2025eda6f593SDavid van Moolenbroek void	 grid_view_clear_history(struct grid *);
2026eda6f593SDavid van Moolenbroek void	 grid_view_clear(struct grid *, u_int, u_int, u_int, u_int);
2027eda6f593SDavid van Moolenbroek void	 grid_view_scroll_region_up(struct grid *, u_int, u_int);
2028eda6f593SDavid van Moolenbroek void	 grid_view_scroll_region_down(struct grid *, u_int, u_int);
2029eda6f593SDavid van Moolenbroek void	 grid_view_insert_lines(struct grid *, u_int, u_int);
2030eda6f593SDavid van Moolenbroek void	 grid_view_insert_lines_region(struct grid *, u_int, u_int, u_int);
2031eda6f593SDavid van Moolenbroek void	 grid_view_delete_lines(struct grid *, u_int, u_int);
2032eda6f593SDavid van Moolenbroek void	 grid_view_delete_lines_region(struct grid *, u_int, u_int, u_int);
2033eda6f593SDavid van Moolenbroek void	 grid_view_insert_cells(struct grid *, u_int, u_int, u_int);
2034eda6f593SDavid van Moolenbroek void	 grid_view_delete_cells(struct grid *, u_int, u_int, u_int);
2035eda6f593SDavid van Moolenbroek char	*grid_view_string_cells(struct grid *, u_int, u_int, u_int);
2036eda6f593SDavid van Moolenbroek 
2037eda6f593SDavid van Moolenbroek /* screen-write.c */
2038eda6f593SDavid van Moolenbroek void	 screen_write_start(
2039eda6f593SDavid van Moolenbroek 	     struct screen_write_ctx *, struct window_pane *, struct screen *);
2040eda6f593SDavid van Moolenbroek void	 screen_write_stop(struct screen_write_ctx *);
2041*0a6a1f1dSLionel Sambuc void	 screen_write_reset(struct screen_write_ctx *);
2042eda6f593SDavid van Moolenbroek size_t printflike2 screen_write_cstrlen(int, const char *, ...);
2043eda6f593SDavid van Moolenbroek void printflike5 screen_write_cnputs(struct screen_write_ctx *,
2044eda6f593SDavid van Moolenbroek 	     ssize_t, struct grid_cell *, int, const char *, ...);
2045eda6f593SDavid van Moolenbroek size_t printflike2 screen_write_strlen(int, const char *, ...);
2046eda6f593SDavid van Moolenbroek void printflike3 screen_write_puts(struct screen_write_ctx *,
2047eda6f593SDavid van Moolenbroek 	     struct grid_cell *, const char *, ...);
2048eda6f593SDavid van Moolenbroek void printflike5 screen_write_nputs(struct screen_write_ctx *,
2049eda6f593SDavid van Moolenbroek 	     ssize_t, struct grid_cell *, int, const char *, ...);
2050*0a6a1f1dSLionel Sambuc void vprintflike5 screen_write_vnputs(struct screen_write_ctx *,
2051eda6f593SDavid van Moolenbroek 	     ssize_t, struct grid_cell *, int, const char *, va_list);
2052eda6f593SDavid van Moolenbroek void	 screen_write_putc(
2053eda6f593SDavid van Moolenbroek 	     struct screen_write_ctx *, struct grid_cell *, u_char);
2054eda6f593SDavid van Moolenbroek void	 screen_write_copy(struct screen_write_ctx *,
2055eda6f593SDavid van Moolenbroek 	     struct screen *, u_int, u_int, u_int, u_int);
2056eda6f593SDavid van Moolenbroek void	 screen_write_backspace(struct screen_write_ctx *);
2057*0a6a1f1dSLionel Sambuc void	 screen_write_mode_set(struct screen_write_ctx *, int);
2058*0a6a1f1dSLionel Sambuc void	 screen_write_mode_clear(struct screen_write_ctx *, int);
2059eda6f593SDavid van Moolenbroek void	 screen_write_cursorup(struct screen_write_ctx *, u_int);
2060eda6f593SDavid van Moolenbroek void	 screen_write_cursordown(struct screen_write_ctx *, u_int);
2061eda6f593SDavid van Moolenbroek void	 screen_write_cursorright(struct screen_write_ctx *, u_int);
2062eda6f593SDavid van Moolenbroek void	 screen_write_cursorleft(struct screen_write_ctx *, u_int);
2063eda6f593SDavid van Moolenbroek void	 screen_write_alignmenttest(struct screen_write_ctx *);
2064eda6f593SDavid van Moolenbroek void	 screen_write_insertcharacter(struct screen_write_ctx *, u_int);
2065eda6f593SDavid van Moolenbroek void	 screen_write_deletecharacter(struct screen_write_ctx *, u_int);
2066*0a6a1f1dSLionel Sambuc void	 screen_write_clearcharacter(struct screen_write_ctx *, u_int);
2067eda6f593SDavid van Moolenbroek void	 screen_write_insertline(struct screen_write_ctx *, u_int);
2068eda6f593SDavid van Moolenbroek void	 screen_write_deleteline(struct screen_write_ctx *, u_int);
2069eda6f593SDavid van Moolenbroek void	 screen_write_clearline(struct screen_write_ctx *);
2070eda6f593SDavid van Moolenbroek void	 screen_write_clearendofline(struct screen_write_ctx *);
2071eda6f593SDavid van Moolenbroek void	 screen_write_clearstartofline(struct screen_write_ctx *);
2072eda6f593SDavid van Moolenbroek void	 screen_write_cursormove(struct screen_write_ctx *, u_int, u_int);
2073eda6f593SDavid van Moolenbroek void	 screen_write_reverseindex(struct screen_write_ctx *);
2074eda6f593SDavid van Moolenbroek void	 screen_write_scrollregion(struct screen_write_ctx *, u_int, u_int);
2075eda6f593SDavid van Moolenbroek void	 screen_write_linefeed(struct screen_write_ctx *, int);
2076eda6f593SDavid van Moolenbroek void	 screen_write_linefeedscreen(struct screen_write_ctx *, int);
2077eda6f593SDavid van Moolenbroek void	 screen_write_carriagereturn(struct screen_write_ctx *);
2078eda6f593SDavid van Moolenbroek void	 screen_write_clearendofscreen(struct screen_write_ctx *);
2079eda6f593SDavid van Moolenbroek void	 screen_write_clearstartofscreen(struct screen_write_ctx *);
2080eda6f593SDavid van Moolenbroek void	 screen_write_clearscreen(struct screen_write_ctx *);
2081*0a6a1f1dSLionel Sambuc void	 screen_write_clearhistory(struct screen_write_ctx *);
2082*0a6a1f1dSLionel Sambuc void	 screen_write_cell(struct screen_write_ctx *, const struct grid_cell *);
2083eda6f593SDavid van Moolenbroek void	 screen_write_setselection(struct screen_write_ctx *, u_char *, u_int);
2084eda6f593SDavid van Moolenbroek void	 screen_write_rawstring(struct screen_write_ctx *, u_char *, u_int);
2085eda6f593SDavid van Moolenbroek 
2086eda6f593SDavid van Moolenbroek /* screen-redraw.c */
2087*0a6a1f1dSLionel Sambuc void	 screen_redraw_screen(struct client *, int, int, int);
2088eda6f593SDavid van Moolenbroek void	 screen_redraw_pane(struct client *, struct window_pane *);
2089eda6f593SDavid van Moolenbroek 
2090eda6f593SDavid van Moolenbroek /* screen.c */
2091eda6f593SDavid van Moolenbroek void	 screen_init(struct screen *, u_int, u_int, u_int);
2092eda6f593SDavid van Moolenbroek void	 screen_reinit(struct screen *);
2093eda6f593SDavid van Moolenbroek void	 screen_free(struct screen *);
2094eda6f593SDavid van Moolenbroek void	 screen_reset_tabs(struct screen *);
2095eda6f593SDavid van Moolenbroek void	 screen_set_cursor_style(struct screen *, u_int);
2096eda6f593SDavid van Moolenbroek void	 screen_set_cursor_colour(struct screen *, const char *);
2097eda6f593SDavid van Moolenbroek void	 screen_set_title(struct screen *, const char *);
2098*0a6a1f1dSLionel Sambuc void	 screen_resize(struct screen *, u_int, u_int, int);
2099eda6f593SDavid van Moolenbroek void	 screen_set_selection(struct screen *,
2100eda6f593SDavid van Moolenbroek 	     u_int, u_int, u_int, u_int, u_int, struct grid_cell *);
2101eda6f593SDavid van Moolenbroek void	 screen_clear_selection(struct screen *);
2102eda6f593SDavid van Moolenbroek int	 screen_check_selection(struct screen *, u_int, u_int);
2103*0a6a1f1dSLionel Sambuc void	 screen_reflow(struct screen *, u_int);
2104eda6f593SDavid van Moolenbroek 
2105eda6f593SDavid van Moolenbroek /* window.c */
2106eda6f593SDavid van Moolenbroek extern struct windows windows;
2107eda6f593SDavid van Moolenbroek extern struct window_pane_tree all_window_panes;
2108eda6f593SDavid van Moolenbroek int		 winlink_cmp(struct winlink *, struct winlink *);
2109eda6f593SDavid van Moolenbroek RB_PROTOTYPE(winlinks, winlink, entry, winlink_cmp);
2110eda6f593SDavid van Moolenbroek int		 window_pane_cmp(struct window_pane *, struct window_pane *);
2111eda6f593SDavid van Moolenbroek RB_PROTOTYPE(window_pane_tree, window_pane, tree_entry, window_pane_cmp);
2112eda6f593SDavid van Moolenbroek struct winlink	*winlink_find_by_index(struct winlinks *, int);
2113eda6f593SDavid van Moolenbroek struct winlink	*winlink_find_by_window(struct winlinks *, struct window *);
2114*0a6a1f1dSLionel Sambuc struct winlink	*winlink_find_by_window_id(struct winlinks *, u_int);
2115eda6f593SDavid van Moolenbroek int		 winlink_next_index(struct winlinks *, int);
2116eda6f593SDavid van Moolenbroek u_int		 winlink_count(struct winlinks *);
2117eda6f593SDavid van Moolenbroek struct winlink	*winlink_add(struct winlinks *, int);
2118eda6f593SDavid van Moolenbroek void		 winlink_set_window(struct winlink *, struct window *);
2119eda6f593SDavid van Moolenbroek void		 winlink_remove(struct winlinks *, struct winlink *);
2120eda6f593SDavid van Moolenbroek struct winlink	*winlink_next(struct winlink *);
2121eda6f593SDavid van Moolenbroek struct winlink	*winlink_previous(struct winlink *);
2122eda6f593SDavid van Moolenbroek struct winlink	*winlink_next_by_number(struct winlink *, struct session *,
2123eda6f593SDavid van Moolenbroek 		     int);
2124eda6f593SDavid van Moolenbroek struct winlink	*winlink_previous_by_number(struct winlink *, struct session *,
2125eda6f593SDavid van Moolenbroek 		     int);
2126eda6f593SDavid van Moolenbroek void		 winlink_stack_push(struct winlink_stack *, struct winlink *);
2127eda6f593SDavid van Moolenbroek void		 winlink_stack_remove(struct winlink_stack *, struct winlink *);
2128eda6f593SDavid van Moolenbroek int		 window_index(struct window *, u_int *);
2129*0a6a1f1dSLionel Sambuc struct window	*window_find_by_id(u_int);
2130eda6f593SDavid van Moolenbroek struct window	*window_create1(u_int, u_int);
2131*0a6a1f1dSLionel Sambuc struct window	*window_create(const char *, const char *, const char *, int,
2132*0a6a1f1dSLionel Sambuc 		     struct environ *, struct termios *, u_int, u_int, u_int,
2133*0a6a1f1dSLionel Sambuc 		     char **);
2134eda6f593SDavid van Moolenbroek void		 window_destroy(struct window *);
2135eda6f593SDavid van Moolenbroek struct window_pane *window_get_active_at(struct window *, u_int, u_int);
2136eda6f593SDavid van Moolenbroek void		 window_set_active_at(struct window *, u_int, u_int);
2137eda6f593SDavid van Moolenbroek struct window_pane *window_find_string(struct window *, const char *);
2138eda6f593SDavid van Moolenbroek void		 window_set_active_pane(struct window *, struct window_pane *);
2139eda6f593SDavid van Moolenbroek struct window_pane *window_add_pane(struct window *, u_int);
2140eda6f593SDavid van Moolenbroek void		 window_resize(struct window *, u_int, u_int);
2141*0a6a1f1dSLionel Sambuc int		 window_zoom(struct window_pane *);
2142*0a6a1f1dSLionel Sambuc int		 window_unzoom(struct window *);
2143eda6f593SDavid van Moolenbroek void		 window_remove_pane(struct window *, struct window_pane *);
2144eda6f593SDavid van Moolenbroek struct window_pane *window_pane_at_index(struct window *, u_int);
2145eda6f593SDavid van Moolenbroek struct window_pane *window_pane_next_by_number(struct window *,
2146eda6f593SDavid van Moolenbroek 		        struct window_pane *, u_int);
2147eda6f593SDavid van Moolenbroek struct window_pane *window_pane_previous_by_number(struct window *,
2148eda6f593SDavid van Moolenbroek 		        struct window_pane *, u_int);
2149*0a6a1f1dSLionel Sambuc int		 window_pane_index(struct window_pane *, u_int *);
2150eda6f593SDavid van Moolenbroek u_int		 window_count_panes(struct window *);
2151eda6f593SDavid van Moolenbroek void		 window_destroy_panes(struct window *);
2152eda6f593SDavid van Moolenbroek struct window_pane *window_pane_find_by_id(u_int);
2153eda6f593SDavid van Moolenbroek struct window_pane *window_pane_create(struct window *, u_int, u_int, u_int);
2154eda6f593SDavid van Moolenbroek void		 window_pane_destroy(struct window_pane *);
2155*0a6a1f1dSLionel Sambuc void		 window_pane_timer_start(struct window_pane *);
2156eda6f593SDavid van Moolenbroek int		 window_pane_spawn(struct window_pane *, const char *,
2157*0a6a1f1dSLionel Sambuc 		     const char *, int, struct environ *, struct termios *,
2158*0a6a1f1dSLionel Sambuc 		     char **);
2159eda6f593SDavid van Moolenbroek void		 window_pane_resize(struct window_pane *, u_int, u_int);
2160*0a6a1f1dSLionel Sambuc void		 window_pane_alternate_on(struct window_pane *,
2161*0a6a1f1dSLionel Sambuc 		     struct grid_cell *, int);
2162*0a6a1f1dSLionel Sambuc void		 window_pane_alternate_off(struct window_pane *,
2163*0a6a1f1dSLionel Sambuc 		     struct grid_cell *, int);
2164eda6f593SDavid van Moolenbroek int		 window_pane_set_mode(
2165eda6f593SDavid van Moolenbroek 		     struct window_pane *, const struct window_mode *);
2166eda6f593SDavid van Moolenbroek void		 window_pane_reset_mode(struct window_pane *);
2167eda6f593SDavid van Moolenbroek void		 window_pane_key(struct window_pane *, struct session *, int);
2168eda6f593SDavid van Moolenbroek void		 window_pane_mouse(struct window_pane *,
2169eda6f593SDavid van Moolenbroek 		     struct session *, struct mouse_event *);
2170eda6f593SDavid van Moolenbroek int		 window_pane_visible(struct window_pane *);
2171eda6f593SDavid van Moolenbroek char		*window_pane_search(
2172eda6f593SDavid van Moolenbroek 		     struct window_pane *, const char *, u_int *);
2173eda6f593SDavid van Moolenbroek char		*window_printable_flags(struct session *, struct winlink *);
2174eda6f593SDavid van Moolenbroek struct window_pane *window_pane_find_up(struct window_pane *);
2175eda6f593SDavid van Moolenbroek struct window_pane *window_pane_find_down(struct window_pane *);
2176eda6f593SDavid van Moolenbroek struct window_pane *window_pane_find_left(struct window_pane *);
2177eda6f593SDavid van Moolenbroek struct window_pane *window_pane_find_right(struct window_pane *);
2178*0a6a1f1dSLionel Sambuc void		 window_set_name(struct window *, const char *);
2179*0a6a1f1dSLionel Sambuc void		 window_remove_ref(struct window *);
2180*0a6a1f1dSLionel Sambuc void		 winlink_clear_flags(struct winlink *);
2181eda6f593SDavid van Moolenbroek 
2182eda6f593SDavid van Moolenbroek /* layout.c */
2183eda6f593SDavid van Moolenbroek u_int		 layout_count_cells(struct layout_cell *);
2184eda6f593SDavid van Moolenbroek struct layout_cell *layout_create_cell(struct layout_cell *);
2185eda6f593SDavid van Moolenbroek void		 layout_free_cell(struct layout_cell *);
2186eda6f593SDavid van Moolenbroek void		 layout_print_cell(struct layout_cell *, const char *, u_int);
2187eda6f593SDavid van Moolenbroek void		 layout_destroy_cell(struct layout_cell *, struct layout_cell **);
2188eda6f593SDavid van Moolenbroek void		 layout_set_size(
2189eda6f593SDavid van Moolenbroek 		     struct layout_cell *, u_int, u_int, u_int, u_int);
2190eda6f593SDavid van Moolenbroek void		 layout_make_leaf(
2191eda6f593SDavid van Moolenbroek 		     struct layout_cell *, struct window_pane *);
2192eda6f593SDavid van Moolenbroek void		 layout_make_node(struct layout_cell *, enum layout_type);
2193eda6f593SDavid van Moolenbroek void		 layout_fix_offsets(struct layout_cell *);
2194eda6f593SDavid van Moolenbroek void		 layout_fix_panes(struct window *, u_int, u_int);
2195eda6f593SDavid van Moolenbroek u_int		 layout_resize_check(struct layout_cell *, enum layout_type);
2196eda6f593SDavid van Moolenbroek void		 layout_resize_adjust(
2197eda6f593SDavid van Moolenbroek 		     struct layout_cell *, enum layout_type, int);
2198*0a6a1f1dSLionel Sambuc void		 layout_init(struct window *, struct window_pane *);
2199eda6f593SDavid van Moolenbroek void		 layout_free(struct window *);
2200eda6f593SDavid van Moolenbroek void		 layout_resize(struct window *, u_int, u_int);
2201*0a6a1f1dSLionel Sambuc void		 layout_resize_pane(struct window_pane *, enum layout_type,
2202*0a6a1f1dSLionel Sambuc 		     int);
2203*0a6a1f1dSLionel Sambuc void		 layout_resize_pane_to(struct window_pane *, enum layout_type,
2204*0a6a1f1dSLionel Sambuc 		     u_int);
2205*0a6a1f1dSLionel Sambuc void		 layout_resize_pane_mouse(struct client *);
2206eda6f593SDavid van Moolenbroek void		 layout_assign_pane(struct layout_cell *, struct window_pane *);
2207eda6f593SDavid van Moolenbroek struct layout_cell *layout_split_pane(
2208*0a6a1f1dSLionel Sambuc 		     struct window_pane *, enum layout_type, int, int);
2209eda6f593SDavid van Moolenbroek void		 layout_close_pane(struct window_pane *);
2210eda6f593SDavid van Moolenbroek 
2211eda6f593SDavid van Moolenbroek /* layout-custom.c */
2212eda6f593SDavid van Moolenbroek char		*layout_dump(struct window *);
2213eda6f593SDavid van Moolenbroek int		 layout_parse(struct window *, const char *);
2214eda6f593SDavid van Moolenbroek 
2215eda6f593SDavid van Moolenbroek /* layout-set.c */
2216eda6f593SDavid van Moolenbroek const char	*layout_set_name(u_int);
2217eda6f593SDavid van Moolenbroek int		 layout_set_lookup(const char *);
2218eda6f593SDavid van Moolenbroek u_int		 layout_set_select(struct window *, u_int);
2219eda6f593SDavid van Moolenbroek u_int		 layout_set_next(struct window *);
2220eda6f593SDavid van Moolenbroek u_int		 layout_set_previous(struct window *);
2221eda6f593SDavid van Moolenbroek void		 layout_set_active_changed(struct window *);
2222eda6f593SDavid van Moolenbroek 
2223eda6f593SDavid van Moolenbroek /* window-clock.c */
2224eda6f593SDavid van Moolenbroek extern const struct window_mode window_clock_mode;
2225eda6f593SDavid van Moolenbroek 
2226eda6f593SDavid van Moolenbroek /* window-copy.c */
2227eda6f593SDavid van Moolenbroek extern const struct window_mode window_copy_mode;
2228eda6f593SDavid van Moolenbroek void		 window_copy_init_from_pane(struct window_pane *);
2229eda6f593SDavid van Moolenbroek void		 window_copy_init_for_output(struct window_pane *);
2230*0a6a1f1dSLionel Sambuc void printflike2 window_copy_add(struct window_pane *, const char *, ...);
2231*0a6a1f1dSLionel Sambuc void vprintflike2 window_copy_vadd(struct window_pane *, const char *, va_list);
2232eda6f593SDavid van Moolenbroek void		 window_copy_pageup(struct window_pane *);
2233eda6f593SDavid van Moolenbroek 
2234eda6f593SDavid van Moolenbroek /* window-choose.c */
2235eda6f593SDavid van Moolenbroek extern const struct window_mode window_choose_mode;
2236*0a6a1f1dSLionel Sambuc void		 window_choose_add(struct window_pane *,
2237*0a6a1f1dSLionel Sambuc 			 struct window_choose_data *);
2238eda6f593SDavid van Moolenbroek void		 window_choose_ready(struct window_pane *,
2239*0a6a1f1dSLionel Sambuc 		     u_int, void (*)(struct window_choose_data *));
2240*0a6a1f1dSLionel Sambuc struct window_choose_data	*window_choose_data_create (int,
2241*0a6a1f1dSLionel Sambuc 		     struct client *, struct session *);
2242*0a6a1f1dSLionel Sambuc void	window_choose_data_free(struct window_choose_data *);
2243*0a6a1f1dSLionel Sambuc void	window_choose_data_run(struct window_choose_data *);
2244*0a6a1f1dSLionel Sambuc struct window_choose_data	*window_choose_add_window(struct window_pane *,
2245*0a6a1f1dSLionel Sambuc 			struct client *, struct session *, struct winlink *,
2246*0a6a1f1dSLionel Sambuc 			const char *, const char *, u_int);
2247*0a6a1f1dSLionel Sambuc struct window_choose_data	*window_choose_add_session(struct window_pane *,
2248*0a6a1f1dSLionel Sambuc 			struct client *, struct session *, const char *,
2249*0a6a1f1dSLionel Sambuc 			const char *, u_int);
2250*0a6a1f1dSLionel Sambuc struct window_choose_data	*window_choose_add_item(struct window_pane *,
2251*0a6a1f1dSLionel Sambuc 			struct client *, struct winlink *, const char *,
2252*0a6a1f1dSLionel Sambuc 			const char *, u_int);
2253*0a6a1f1dSLionel Sambuc void	window_choose_expand_all(struct window_pane *);
2254*0a6a1f1dSLionel Sambuc void	window_choose_collapse_all(struct window_pane *);
2255*0a6a1f1dSLionel Sambuc void	window_choose_set_current(struct window_pane *, u_int);
2256eda6f593SDavid van Moolenbroek 
2257eda6f593SDavid van Moolenbroek /* names.c */
2258eda6f593SDavid van Moolenbroek void	 queue_window_name(struct window *);
2259eda6f593SDavid van Moolenbroek char	*default_window_name(struct window *);
2260*0a6a1f1dSLionel Sambuc char	*format_window_name(struct window *);
2261*0a6a1f1dSLionel Sambuc char	*parse_window_name(const char *);
2262eda6f593SDavid van Moolenbroek 
2263eda6f593SDavid van Moolenbroek /* signal.c */
2264eda6f593SDavid van Moolenbroek void	set_signals(void(*)(int, short, void *));
2265eda6f593SDavid van Moolenbroek void	clear_signals(int);
2266eda6f593SDavid van Moolenbroek 
2267*0a6a1f1dSLionel Sambuc /* control.c */
2268*0a6a1f1dSLionel Sambuc void	control_callback(struct client *, int, void*);
2269*0a6a1f1dSLionel Sambuc void printflike2 control_write(struct client *, const char *, ...);
2270*0a6a1f1dSLionel Sambuc void	control_write_buffer(struct client *, struct evbuffer *);
2271*0a6a1f1dSLionel Sambuc 
2272*0a6a1f1dSLionel Sambuc /* control-notify.c */
2273*0a6a1f1dSLionel Sambuc void	control_notify_input(struct client *, struct window_pane *,
2274*0a6a1f1dSLionel Sambuc 	    struct evbuffer *);
2275*0a6a1f1dSLionel Sambuc void	control_notify_window_layout_changed(struct window *);
2276*0a6a1f1dSLionel Sambuc void	control_notify_window_unlinked(struct session *, struct window *);
2277*0a6a1f1dSLionel Sambuc void	control_notify_window_linked(struct session *, struct window *);
2278*0a6a1f1dSLionel Sambuc void	control_notify_window_renamed(struct window *);
2279*0a6a1f1dSLionel Sambuc void	control_notify_attached_session_changed(struct client *);
2280*0a6a1f1dSLionel Sambuc void	control_notify_session_renamed(struct session *);
2281*0a6a1f1dSLionel Sambuc void	control_notify_session_created(struct session *);
2282*0a6a1f1dSLionel Sambuc void	control_notify_session_close(struct session *);
2283*0a6a1f1dSLionel Sambuc 
2284eda6f593SDavid van Moolenbroek /* session.c */
2285eda6f593SDavid van Moolenbroek extern struct sessions sessions;
2286eda6f593SDavid van Moolenbroek extern struct sessions dead_sessions;
2287eda6f593SDavid van Moolenbroek extern struct session_groups session_groups;
2288eda6f593SDavid van Moolenbroek int	session_cmp(struct session *, struct session *);
2289eda6f593SDavid van Moolenbroek RB_PROTOTYPE(sessions, session, entry, session_cmp);
2290eda6f593SDavid van Moolenbroek int		 session_alive(struct session *);
2291eda6f593SDavid van Moolenbroek struct session	*session_find(const char *);
2292*0a6a1f1dSLionel Sambuc struct session	*session_find_by_id(u_int);
2293*0a6a1f1dSLionel Sambuc struct session	*session_create(const char *, const char *, int,
2294eda6f593SDavid van Moolenbroek 		     struct environ *, struct termios *, int, u_int, u_int,
2295eda6f593SDavid van Moolenbroek 		     char **);
2296eda6f593SDavid van Moolenbroek void		 session_destroy(struct session *);
2297eda6f593SDavid van Moolenbroek int		 session_check_name(const char *);
2298eda6f593SDavid van Moolenbroek void		 session_update_activity(struct session *);
2299eda6f593SDavid van Moolenbroek struct session	*session_next_session(struct session *);
2300eda6f593SDavid van Moolenbroek struct session	*session_previous_session(struct session *);
2301*0a6a1f1dSLionel Sambuc struct winlink	*session_new(struct session *, const char *, const char *, int,
2302*0a6a1f1dSLionel Sambuc 		     int, char **);
2303eda6f593SDavid van Moolenbroek struct winlink	*session_attach(
2304eda6f593SDavid van Moolenbroek 		     struct session *, struct window *, int, char **);
2305eda6f593SDavid van Moolenbroek int		 session_detach(struct session *, struct winlink *);
2306eda6f593SDavid van Moolenbroek struct winlink*	 session_has(struct session *, struct window *);
2307eda6f593SDavid van Moolenbroek int		 session_next(struct session *, int);
2308eda6f593SDavid van Moolenbroek int		 session_previous(struct session *, int);
2309eda6f593SDavid van Moolenbroek int		 session_select(struct session *, int);
2310eda6f593SDavid van Moolenbroek int		 session_last(struct session *);
2311*0a6a1f1dSLionel Sambuc int		 session_set_current(struct session *, struct winlink *);
2312eda6f593SDavid van Moolenbroek struct session_group *session_group_find(struct session *);
2313eda6f593SDavid van Moolenbroek u_int		 session_group_index(struct session_group *);
2314eda6f593SDavid van Moolenbroek void		 session_group_add(struct session *, struct session *);
2315eda6f593SDavid van Moolenbroek void		 session_group_remove(struct session *);
2316eda6f593SDavid van Moolenbroek void		 session_group_synchronize_to(struct session *);
2317eda6f593SDavid van Moolenbroek void		 session_group_synchronize_from(struct session *);
2318eda6f593SDavid van Moolenbroek void		 session_group_synchronize1(struct session *, struct session *);
2319*0a6a1f1dSLionel Sambuc void		 session_renumber_windows(struct session *);
2320eda6f593SDavid van Moolenbroek 
2321eda6f593SDavid van Moolenbroek /* utf8.c */
2322eda6f593SDavid van Moolenbroek void	utf8_build(void);
2323eda6f593SDavid van Moolenbroek int	utf8_open(struct utf8_data *, u_char);
2324eda6f593SDavid van Moolenbroek int	utf8_append(struct utf8_data *, u_char);
2325eda6f593SDavid van Moolenbroek u_int	utf8_combine(const struct utf8_data *);
2326eda6f593SDavid van Moolenbroek u_int	utf8_split2(u_int, u_char *);
2327eda6f593SDavid van Moolenbroek 
2328eda6f593SDavid van Moolenbroek /* osdep-*.c */
2329eda6f593SDavid van Moolenbroek char		*osdep_get_name(int, char *);
2330*0a6a1f1dSLionel Sambuc char		*osdep_get_cwd(int);
2331eda6f593SDavid van Moolenbroek struct event_base *osdep_event_init(void);
2332eda6f593SDavid van Moolenbroek 
2333eda6f593SDavid van Moolenbroek /* log.c */
2334*0a6a1f1dSLionel Sambuc void		 log_open(int, const char *);
2335eda6f593SDavid van Moolenbroek void		 log_close(void);
2336eda6f593SDavid van Moolenbroek void printflike1 log_warn(const char *, ...);
2337eda6f593SDavid van Moolenbroek void printflike1 log_warnx(const char *, ...);
2338eda6f593SDavid van Moolenbroek void printflike1 log_info(const char *, ...);
2339eda6f593SDavid van Moolenbroek void printflike1 log_debug(const char *, ...);
2340eda6f593SDavid van Moolenbroek void printflike1 log_debug2(const char *, ...);
2341eda6f593SDavid van Moolenbroek __dead void printflike1 log_fatal(const char *, ...);
2342eda6f593SDavid van Moolenbroek __dead void printflike1 log_fatalx(const char *, ...);
2343eda6f593SDavid van Moolenbroek 
2344eda6f593SDavid van Moolenbroek /* xmalloc.c */
2345eda6f593SDavid van Moolenbroek char		*xstrdup(const char *);
2346eda6f593SDavid van Moolenbroek void		*xcalloc(size_t, size_t);
2347eda6f593SDavid van Moolenbroek void		*xmalloc(size_t);
2348eda6f593SDavid van Moolenbroek void		*xrealloc(void *, size_t, size_t);
2349eda6f593SDavid van Moolenbroek int printflike2	 xasprintf(char **, const char *, ...);
2350*0a6a1f1dSLionel Sambuc int vprintflike2 xvasprintf(char **, const char *, va_list);
2351eda6f593SDavid van Moolenbroek int printflike3	 xsnprintf(char *, size_t, const char *, ...);
2352*0a6a1f1dSLionel Sambuc int vprintflike3 xvsnprintf(char *, size_t, const char *, va_list);
2353eda6f593SDavid van Moolenbroek 
2354eda6f593SDavid van Moolenbroek /* utmp.c */
2355eda6f593SDavid van Moolenbroek struct window_utmp *utmp_create(const char *);
2356eda6f593SDavid van Moolenbroek void		 utmp_destroy(struct window_utmp *);
2357eda6f593SDavid van Moolenbroek 
2358*0a6a1f1dSLionel Sambuc /* style.c */
2359*0a6a1f1dSLionel Sambuc int		 style_parse(const struct grid_cell *,
2360*0a6a1f1dSLionel Sambuc 		     struct grid_cell *, const char *);
2361*0a6a1f1dSLionel Sambuc const char	*style_tostring(struct grid_cell *);
2362*0a6a1f1dSLionel Sambuc void		 style_update_new(struct options *, const char *, const char *);
2363*0a6a1f1dSLionel Sambuc void		 style_update_old(struct options *, const char *,
2364*0a6a1f1dSLionel Sambuc 		     struct grid_cell *);
2365*0a6a1f1dSLionel Sambuc void	style_apply(struct grid_cell *, struct options *, const char *);
2366*0a6a1f1dSLionel Sambuc void	style_apply_update(struct grid_cell *, struct options *, const char *);
2367*0a6a1f1dSLionel Sambuc 
2368eda6f593SDavid van Moolenbroek #endif /* TMUX_H */
2369