xref: /openbsd-src/usr.bin/tmux/input.c (revision c90a81c56dcebd6a1b73fe4aff9b03385b8e63b3)
1 /* $OpenBSD: input.c,v 1.140 2018/12/17 21:52:59 nicm Exp $ */
2 
3 /*
4  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/types.h>
20 
21 #include <netinet/in.h>
22 
23 #include <resolv.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <time.h>
27 
28 #include "tmux.h"
29 
30 /*
31  * Based on the description by Paul Williams at:
32  *
33  * https://vt100.net/emu/dec_ansi_parser
34  *
35  * With the following changes:
36  *
37  * - 7-bit only.
38  *
39  * - Support for UTF-8.
40  *
41  * - OSC (but not APC) may be terminated by \007 as well as ST.
42  *
43  * - A state for APC similar to OSC. Some terminals appear to use this to set
44  *   the title.
45  *
46  * - A state for the screen \033k...\033\\ sequence to rename a window. This is
47  *   pretty stupid but not supporting it is more trouble than it is worth.
48  *
49  * - Special handling for ESC inside a DCS to allow arbitrary byte sequences to
50  *   be passed to the underlying terminals.
51  */
52 
53 /* Input parser cell. */
54 struct input_cell {
55 	struct grid_cell	cell;
56 	int			set;
57 	int			g0set;	/* 1 if ACS */
58 	int			g1set;	/* 1 if ACS */
59 };
60 
61 /* Input parser argument. */
62 struct input_param {
63 	enum {
64 		INPUT_MISSING,
65 		INPUT_NUMBER,
66 		INPUT_STRING
67 	}                       type;
68 	union {
69 		int		num;
70 		char	       *str;
71 	};
72 };
73 
74 /* Input parser context. */
75 struct input_ctx {
76 	struct window_pane     *wp;
77 	struct screen_write_ctx ctx;
78 
79 	struct input_cell	cell;
80 
81 	struct input_cell	old_cell;
82 	u_int 			old_cx;
83 	u_int			old_cy;
84 
85 	u_char			interm_buf[4];
86 	size_t			interm_len;
87 
88 	u_char			param_buf[64];
89 	size_t			param_len;
90 
91 #define INPUT_BUF_START 32
92 #define INPUT_BUF_LIMIT 1048576
93 	u_char		       *input_buf;
94 	size_t			input_len;
95 	size_t			input_space;
96 	enum {
97 		INPUT_END_ST,
98 		INPUT_END_BEL
99 	}			input_end;
100 
101 	struct input_param	param_list[24];
102 	u_int			param_list_len;
103 
104 	struct utf8_data	utf8data;
105 	int			utf8started;
106 
107 	int			ch;
108 	int			last;
109 
110 	int			flags;
111 #define INPUT_DISCARD 0x1
112 
113 	const struct input_state *state;
114 
115 	struct event		timer;
116 
117 	/*
118 	 * All input received since we were last in the ground state. Sent to
119 	 * control clients on connection.
120 	 */
121 	struct evbuffer	 	*since_ground;
122 };
123 
124 /* Helper functions. */
125 struct input_transition;
126 static int	input_split(struct input_ctx *);
127 static int	input_get(struct input_ctx *, u_int, int, int);
128 static void printflike(2, 3) input_reply(struct input_ctx *, const char *, ...);
129 static void	input_set_state(struct window_pane *,
130 		    const struct input_transition *);
131 static void	input_reset_cell(struct input_ctx *);
132 
133 static void	input_osc_4(struct input_ctx *, const char *);
134 static void	input_osc_10(struct input_ctx *, const char *);
135 static void	input_osc_11(struct input_ctx *, const char *);
136 static void	input_osc_52(struct input_ctx *, const char *);
137 static void	input_osc_104(struct input_ctx *, const char *);
138 
139 /* Transition entry/exit handlers. */
140 static void	input_clear(struct input_ctx *);
141 static void	input_ground(struct input_ctx *);
142 static void	input_enter_dcs(struct input_ctx *);
143 static void	input_enter_osc(struct input_ctx *);
144 static void	input_exit_osc(struct input_ctx *);
145 static void	input_enter_apc(struct input_ctx *);
146 static void	input_exit_apc(struct input_ctx *);
147 static void	input_enter_rename(struct input_ctx *);
148 static void	input_exit_rename(struct input_ctx *);
149 
150 /* Input state handlers. */
151 static int	input_print(struct input_ctx *);
152 static int	input_intermediate(struct input_ctx *);
153 static int	input_parameter(struct input_ctx *);
154 static int	input_input(struct input_ctx *);
155 static int	input_c0_dispatch(struct input_ctx *);
156 static int	input_esc_dispatch(struct input_ctx *);
157 static int	input_csi_dispatch(struct input_ctx *);
158 static void	input_csi_dispatch_rm(struct input_ctx *);
159 static void	input_csi_dispatch_rm_private(struct input_ctx *);
160 static void	input_csi_dispatch_sm(struct input_ctx *);
161 static void	input_csi_dispatch_sm_private(struct input_ctx *);
162 static void	input_csi_dispatch_winops(struct input_ctx *);
163 static void	input_csi_dispatch_sgr_256(struct input_ctx *, int, u_int *);
164 static void	input_csi_dispatch_sgr_rgb(struct input_ctx *, int, u_int *);
165 static void	input_csi_dispatch_sgr(struct input_ctx *);
166 static int	input_dcs_dispatch(struct input_ctx *);
167 static int	input_top_bit_set(struct input_ctx *);
168 static int	input_end_bel(struct input_ctx *);
169 
170 /* Command table comparison function. */
171 static int	input_table_compare(const void *, const void *);
172 
173 /* Command table entry. */
174 struct input_table_entry {
175 	int		ch;
176 	const char     *interm;
177 	int		type;
178 };
179 
180 /* Escape commands. */
181 enum input_esc_type {
182 	INPUT_ESC_DECALN,
183 	INPUT_ESC_DECKPAM,
184 	INPUT_ESC_DECKPNM,
185 	INPUT_ESC_DECRC,
186 	INPUT_ESC_DECSC,
187 	INPUT_ESC_HTS,
188 	INPUT_ESC_IND,
189 	INPUT_ESC_NEL,
190 	INPUT_ESC_RI,
191 	INPUT_ESC_RIS,
192 	INPUT_ESC_SCSG0_OFF,
193 	INPUT_ESC_SCSG0_ON,
194 	INPUT_ESC_SCSG1_OFF,
195 	INPUT_ESC_SCSG1_ON,
196 	INPUT_ESC_ST,
197 };
198 
199 /* Escape command table. */
200 static const struct input_table_entry input_esc_table[] = {
201 	{ '0', "(", INPUT_ESC_SCSG0_ON },
202 	{ '0', ")", INPUT_ESC_SCSG1_ON },
203 	{ '7', "",  INPUT_ESC_DECSC },
204 	{ '8', "",  INPUT_ESC_DECRC },
205 	{ '8', "#", INPUT_ESC_DECALN },
206 	{ '=', "",  INPUT_ESC_DECKPAM },
207 	{ '>', "",  INPUT_ESC_DECKPNM },
208 	{ 'B', "(", INPUT_ESC_SCSG0_OFF },
209 	{ 'B', ")", INPUT_ESC_SCSG1_OFF },
210 	{ 'D', "",  INPUT_ESC_IND },
211 	{ 'E', "",  INPUT_ESC_NEL },
212 	{ 'H', "",  INPUT_ESC_HTS },
213 	{ 'M', "",  INPUT_ESC_RI },
214 	{ '\\', "", INPUT_ESC_ST },
215 	{ 'c', "",  INPUT_ESC_RIS },
216 };
217 
218 /* Control (CSI) commands. */
219 enum input_csi_type {
220 	INPUT_CSI_CBT,
221 	INPUT_CSI_CNL,
222 	INPUT_CSI_CPL,
223 	INPUT_CSI_CUB,
224 	INPUT_CSI_CUD,
225 	INPUT_CSI_CUF,
226 	INPUT_CSI_CUP,
227 	INPUT_CSI_CUU,
228 	INPUT_CSI_DA,
229 	INPUT_CSI_DA_TWO,
230 	INPUT_CSI_DCH,
231 	INPUT_CSI_DECSCUSR,
232 	INPUT_CSI_DECSTBM,
233 	INPUT_CSI_DL,
234 	INPUT_CSI_DSR,
235 	INPUT_CSI_ECH,
236 	INPUT_CSI_ED,
237 	INPUT_CSI_EL,
238 	INPUT_CSI_HPA,
239 	INPUT_CSI_ICH,
240 	INPUT_CSI_IL,
241 	INPUT_CSI_RCP,
242 	INPUT_CSI_REP,
243 	INPUT_CSI_RM,
244 	INPUT_CSI_RM_PRIVATE,
245 	INPUT_CSI_SCP,
246 	INPUT_CSI_SGR,
247 	INPUT_CSI_SM,
248 	INPUT_CSI_SM_PRIVATE,
249 	INPUT_CSI_SU,
250 	INPUT_CSI_TBC,
251 	INPUT_CSI_VPA,
252 	INPUT_CSI_WINOPS,
253 };
254 
255 /* Control (CSI) command table. */
256 static const struct input_table_entry input_csi_table[] = {
257 	{ '@', "",  INPUT_CSI_ICH },
258 	{ 'A', "",  INPUT_CSI_CUU },
259 	{ 'B', "",  INPUT_CSI_CUD },
260 	{ 'C', "",  INPUT_CSI_CUF },
261 	{ 'D', "",  INPUT_CSI_CUB },
262 	{ 'E', "",  INPUT_CSI_CNL },
263 	{ 'F', "",  INPUT_CSI_CPL },
264 	{ 'G', "",  INPUT_CSI_HPA },
265 	{ 'H', "",  INPUT_CSI_CUP },
266 	{ 'J', "",  INPUT_CSI_ED },
267 	{ 'K', "",  INPUT_CSI_EL },
268 	{ 'L', "",  INPUT_CSI_IL },
269 	{ 'M', "",  INPUT_CSI_DL },
270 	{ 'P', "",  INPUT_CSI_DCH },
271 	{ 'S', "",  INPUT_CSI_SU },
272 	{ 'X', "",  INPUT_CSI_ECH },
273 	{ 'Z', "",  INPUT_CSI_CBT },
274 	{ 'b', "",  INPUT_CSI_REP },
275 	{ 'c', "",  INPUT_CSI_DA },
276 	{ 'c', ">", INPUT_CSI_DA_TWO },
277 	{ 'd', "",  INPUT_CSI_VPA },
278 	{ 'f', "",  INPUT_CSI_CUP },
279 	{ 'g', "",  INPUT_CSI_TBC },
280 	{ 'h', "",  INPUT_CSI_SM },
281 	{ 'h', "?", INPUT_CSI_SM_PRIVATE },
282 	{ 'l', "",  INPUT_CSI_RM },
283 	{ 'l', "?", INPUT_CSI_RM_PRIVATE },
284 	{ 'm', "",  INPUT_CSI_SGR },
285 	{ 'n', "",  INPUT_CSI_DSR },
286 	{ 'q', " ", INPUT_CSI_DECSCUSR },
287 	{ 'r', "",  INPUT_CSI_DECSTBM },
288 	{ 's', "",  INPUT_CSI_SCP },
289 	{ 't', "",  INPUT_CSI_WINOPS },
290 	{ 'u', "",  INPUT_CSI_RCP },
291 };
292 
293 /* Input transition. */
294 struct input_transition {
295 	int				first;
296 	int				last;
297 
298 	int				(*handler)(struct input_ctx *);
299 	const struct input_state       *state;
300 };
301 
302 /* Input state. */
303 struct input_state {
304 	const char			*name;
305 	void				(*enter)(struct input_ctx *);
306 	void				(*exit)(struct input_ctx *);
307 	const struct input_transition	*transitions;
308 };
309 
310 /* State transitions available from all states. */
311 #define INPUT_STATE_ANYWHERE \
312 	{ 0x18, 0x18, input_c0_dispatch, &input_state_ground }, \
313 	{ 0x1a, 0x1a, input_c0_dispatch, &input_state_ground }, \
314 	{ 0x1b, 0x1b, NULL,		 &input_state_esc_enter }
315 
316 /* Forward declarations of state tables. */
317 static const struct input_transition input_state_ground_table[];
318 static const struct input_transition input_state_esc_enter_table[];
319 static const struct input_transition input_state_esc_intermediate_table[];
320 static const struct input_transition input_state_csi_enter_table[];
321 static const struct input_transition input_state_csi_parameter_table[];
322 static const struct input_transition input_state_csi_intermediate_table[];
323 static const struct input_transition input_state_csi_ignore_table[];
324 static const struct input_transition input_state_dcs_enter_table[];
325 static const struct input_transition input_state_dcs_parameter_table[];
326 static const struct input_transition input_state_dcs_intermediate_table[];
327 static const struct input_transition input_state_dcs_handler_table[];
328 static const struct input_transition input_state_dcs_escape_table[];
329 static const struct input_transition input_state_dcs_ignore_table[];
330 static const struct input_transition input_state_osc_string_table[];
331 static const struct input_transition input_state_apc_string_table[];
332 static const struct input_transition input_state_rename_string_table[];
333 static const struct input_transition input_state_consume_st_table[];
334 
335 /* ground state definition. */
336 static const struct input_state input_state_ground = {
337 	"ground",
338 	input_ground, NULL,
339 	input_state_ground_table
340 };
341 
342 /* esc_enter state definition. */
343 static const struct input_state input_state_esc_enter = {
344 	"esc_enter",
345 	input_clear, NULL,
346 	input_state_esc_enter_table
347 };
348 
349 /* esc_intermediate state definition. */
350 static const struct input_state input_state_esc_intermediate = {
351 	"esc_intermediate",
352 	NULL, NULL,
353 	input_state_esc_intermediate_table
354 };
355 
356 /* csi_enter state definition. */
357 static const struct input_state input_state_csi_enter = {
358 	"csi_enter",
359 	input_clear, NULL,
360 	input_state_csi_enter_table
361 };
362 
363 /* csi_parameter state definition. */
364 static const struct input_state input_state_csi_parameter = {
365 	"csi_parameter",
366 	NULL, NULL,
367 	input_state_csi_parameter_table
368 };
369 
370 /* csi_intermediate state definition. */
371 static const struct input_state input_state_csi_intermediate = {
372 	"csi_intermediate",
373 	NULL, NULL,
374 	input_state_csi_intermediate_table
375 };
376 
377 /* csi_ignore state definition. */
378 static const struct input_state input_state_csi_ignore = {
379 	"csi_ignore",
380 	NULL, NULL,
381 	input_state_csi_ignore_table
382 };
383 
384 /* dcs_enter state definition. */
385 static const struct input_state input_state_dcs_enter = {
386 	"dcs_enter",
387 	input_enter_dcs, NULL,
388 	input_state_dcs_enter_table
389 };
390 
391 /* dcs_parameter state definition. */
392 static const struct input_state input_state_dcs_parameter = {
393 	"dcs_parameter",
394 	NULL, NULL,
395 	input_state_dcs_parameter_table
396 };
397 
398 /* dcs_intermediate state definition. */
399 static const struct input_state input_state_dcs_intermediate = {
400 	"dcs_intermediate",
401 	NULL, NULL,
402 	input_state_dcs_intermediate_table
403 };
404 
405 /* dcs_handler state definition. */
406 static const struct input_state input_state_dcs_handler = {
407 	"dcs_handler",
408 	NULL, NULL,
409 	input_state_dcs_handler_table
410 };
411 
412 /* dcs_escape state definition. */
413 static const struct input_state input_state_dcs_escape = {
414 	"dcs_escape",
415 	NULL, NULL,
416 	input_state_dcs_escape_table
417 };
418 
419 /* dcs_ignore state definition. */
420 static const struct input_state input_state_dcs_ignore = {
421 	"dcs_ignore",
422 	NULL, NULL,
423 	input_state_dcs_ignore_table
424 };
425 
426 /* osc_string state definition. */
427 static const struct input_state input_state_osc_string = {
428 	"osc_string",
429 	input_enter_osc, input_exit_osc,
430 	input_state_osc_string_table
431 };
432 
433 /* apc_string state definition. */
434 static const struct input_state input_state_apc_string = {
435 	"apc_string",
436 	input_enter_apc, input_exit_apc,
437 	input_state_apc_string_table
438 };
439 
440 /* rename_string state definition. */
441 static const struct input_state input_state_rename_string = {
442 	"rename_string",
443 	input_enter_rename, input_exit_rename,
444 	input_state_rename_string_table
445 };
446 
447 /* consume_st state definition. */
448 static const struct input_state input_state_consume_st = {
449 	"consume_st",
450 	input_enter_rename, NULL, /* rename also waits for ST */
451 	input_state_consume_st_table
452 };
453 
454 /* ground state table. */
455 static const struct input_transition input_state_ground_table[] = {
456 	INPUT_STATE_ANYWHERE,
457 
458 	{ 0x00, 0x17, input_c0_dispatch, NULL },
459 	{ 0x19, 0x19, input_c0_dispatch, NULL },
460 	{ 0x1c, 0x1f, input_c0_dispatch, NULL },
461 	{ 0x20, 0x7e, input_print,	 NULL },
462 	{ 0x7f, 0x7f, NULL,		 NULL },
463 	{ 0x80, 0xff, input_top_bit_set, NULL },
464 
465 	{ -1, -1, NULL, NULL }
466 };
467 
468 /* esc_enter state table. */
469 static const struct input_transition input_state_esc_enter_table[] = {
470 	INPUT_STATE_ANYWHERE,
471 
472 	{ 0x00, 0x17, input_c0_dispatch,  NULL },
473 	{ 0x19, 0x19, input_c0_dispatch,  NULL },
474 	{ 0x1c, 0x1f, input_c0_dispatch,  NULL },
475 	{ 0x20, 0x2f, input_intermediate, &input_state_esc_intermediate },
476 	{ 0x30, 0x4f, input_esc_dispatch, &input_state_ground },
477 	{ 0x50, 0x50, NULL,		  &input_state_dcs_enter },
478 	{ 0x51, 0x57, input_esc_dispatch, &input_state_ground },
479 	{ 0x58, 0x58, NULL,		  &input_state_consume_st },
480 	{ 0x59, 0x59, input_esc_dispatch, &input_state_ground },
481 	{ 0x5a, 0x5a, input_esc_dispatch, &input_state_ground },
482 	{ 0x5b, 0x5b, NULL,		  &input_state_csi_enter },
483 	{ 0x5c, 0x5c, input_esc_dispatch, &input_state_ground },
484 	{ 0x5d, 0x5d, NULL,		  &input_state_osc_string },
485 	{ 0x5e, 0x5e, NULL,		  &input_state_consume_st },
486 	{ 0x5f, 0x5f, NULL,		  &input_state_apc_string },
487 	{ 0x60, 0x6a, input_esc_dispatch, &input_state_ground },
488 	{ 0x6b, 0x6b, NULL,		  &input_state_rename_string },
489 	{ 0x6c, 0x7e, input_esc_dispatch, &input_state_ground },
490 	{ 0x7f, 0xff, NULL,		  NULL },
491 
492 	{ -1, -1, NULL, NULL }
493 };
494 
495 /* esc_intermediate state table. */
496 static const struct input_transition input_state_esc_intermediate_table[] = {
497 	INPUT_STATE_ANYWHERE,
498 
499 	{ 0x00, 0x17, input_c0_dispatch,  NULL },
500 	{ 0x19, 0x19, input_c0_dispatch,  NULL },
501 	{ 0x1c, 0x1f, input_c0_dispatch,  NULL },
502 	{ 0x20, 0x2f, input_intermediate, NULL },
503 	{ 0x30, 0x7e, input_esc_dispatch, &input_state_ground },
504 	{ 0x7f, 0xff, NULL,		  NULL },
505 
506 	{ -1, -1, NULL, NULL }
507 };
508 
509 /* csi_enter state table. */
510 static const struct input_transition input_state_csi_enter_table[] = {
511 	INPUT_STATE_ANYWHERE,
512 
513 	{ 0x00, 0x17, input_c0_dispatch,  NULL },
514 	{ 0x19, 0x19, input_c0_dispatch,  NULL },
515 	{ 0x1c, 0x1f, input_c0_dispatch,  NULL },
516 	{ 0x20, 0x2f, input_intermediate, &input_state_csi_intermediate },
517 	{ 0x30, 0x39, input_parameter,	  &input_state_csi_parameter },
518 	{ 0x3a, 0x3a, input_parameter,	  &input_state_csi_parameter },
519 	{ 0x3b, 0x3b, input_parameter,	  &input_state_csi_parameter },
520 	{ 0x3c, 0x3f, input_intermediate, &input_state_csi_parameter },
521 	{ 0x40, 0x7e, input_csi_dispatch, &input_state_ground },
522 	{ 0x7f, 0xff, NULL,		  NULL },
523 
524 	{ -1, -1, NULL, NULL }
525 };
526 
527 /* csi_parameter state table. */
528 static const struct input_transition input_state_csi_parameter_table[] = {
529 	INPUT_STATE_ANYWHERE,
530 
531 	{ 0x00, 0x17, input_c0_dispatch,  NULL },
532 	{ 0x19, 0x19, input_c0_dispatch,  NULL },
533 	{ 0x1c, 0x1f, input_c0_dispatch,  NULL },
534 	{ 0x20, 0x2f, input_intermediate, &input_state_csi_intermediate },
535 	{ 0x30, 0x39, input_parameter,	  NULL },
536 	{ 0x3a, 0x3a, input_parameter,	  NULL },
537 	{ 0x3b, 0x3b, input_parameter,	  NULL },
538 	{ 0x3c, 0x3f, NULL,		  &input_state_csi_ignore },
539 	{ 0x40, 0x7e, input_csi_dispatch, &input_state_ground },
540 	{ 0x7f, 0xff, NULL,		  NULL },
541 
542 	{ -1, -1, NULL, NULL }
543 };
544 
545 /* csi_intermediate state table. */
546 static const struct input_transition input_state_csi_intermediate_table[] = {
547 	INPUT_STATE_ANYWHERE,
548 
549 	{ 0x00, 0x17, input_c0_dispatch,  NULL },
550 	{ 0x19, 0x19, input_c0_dispatch,  NULL },
551 	{ 0x1c, 0x1f, input_c0_dispatch,  NULL },
552 	{ 0x20, 0x2f, input_intermediate, NULL },
553 	{ 0x30, 0x3f, NULL,		  &input_state_csi_ignore },
554 	{ 0x40, 0x7e, input_csi_dispatch, &input_state_ground },
555 	{ 0x7f, 0xff, NULL,		  NULL },
556 
557 	{ -1, -1, NULL, NULL }
558 };
559 
560 /* csi_ignore state table. */
561 static const struct input_transition input_state_csi_ignore_table[] = {
562 	INPUT_STATE_ANYWHERE,
563 
564 	{ 0x00, 0x17, input_c0_dispatch, NULL },
565 	{ 0x19, 0x19, input_c0_dispatch, NULL },
566 	{ 0x1c, 0x1f, input_c0_dispatch, NULL },
567 	{ 0x20, 0x3f, NULL,		 NULL },
568 	{ 0x40, 0x7e, NULL,		 &input_state_ground },
569 	{ 0x7f, 0xff, NULL,		 NULL },
570 
571 	{ -1, -1, NULL, NULL }
572 };
573 
574 /* dcs_enter state table. */
575 static const struct input_transition input_state_dcs_enter_table[] = {
576 	INPUT_STATE_ANYWHERE,
577 
578 	{ 0x00, 0x17, NULL,		  NULL },
579 	{ 0x19, 0x19, NULL,		  NULL },
580 	{ 0x1c, 0x1f, NULL,		  NULL },
581 	{ 0x20, 0x2f, input_intermediate, &input_state_dcs_intermediate },
582 	{ 0x30, 0x39, input_parameter,	  &input_state_dcs_parameter },
583 	{ 0x3a, 0x3a, NULL,		  &input_state_dcs_ignore },
584 	{ 0x3b, 0x3b, input_parameter,	  &input_state_dcs_parameter },
585 	{ 0x3c, 0x3f, input_intermediate, &input_state_dcs_parameter },
586 	{ 0x40, 0x7e, input_input,	  &input_state_dcs_handler },
587 	{ 0x7f, 0xff, NULL,		  NULL },
588 
589 	{ -1, -1, NULL, NULL }
590 };
591 
592 /* dcs_parameter state table. */
593 static const struct input_transition input_state_dcs_parameter_table[] = {
594 	INPUT_STATE_ANYWHERE,
595 
596 	{ 0x00, 0x17, NULL,		  NULL },
597 	{ 0x19, 0x19, NULL,		  NULL },
598 	{ 0x1c, 0x1f, NULL,		  NULL },
599 	{ 0x20, 0x2f, input_intermediate, &input_state_dcs_intermediate },
600 	{ 0x30, 0x39, input_parameter,	  NULL },
601 	{ 0x3a, 0x3a, NULL,		  &input_state_dcs_ignore },
602 	{ 0x3b, 0x3b, input_parameter,	  NULL },
603 	{ 0x3c, 0x3f, NULL,		  &input_state_dcs_ignore },
604 	{ 0x40, 0x7e, input_input,	  &input_state_dcs_handler },
605 	{ 0x7f, 0xff, NULL,		  NULL },
606 
607 	{ -1, -1, NULL, NULL }
608 };
609 
610 /* dcs_intermediate state table. */
611 static const struct input_transition input_state_dcs_intermediate_table[] = {
612 	INPUT_STATE_ANYWHERE,
613 
614 	{ 0x00, 0x17, NULL,		  NULL },
615 	{ 0x19, 0x19, NULL,		  NULL },
616 	{ 0x1c, 0x1f, NULL,		  NULL },
617 	{ 0x20, 0x2f, input_intermediate, NULL },
618 	{ 0x30, 0x3f, NULL,		  &input_state_dcs_ignore },
619 	{ 0x40, 0x7e, input_input,	  &input_state_dcs_handler },
620 	{ 0x7f, 0xff, NULL,		  NULL },
621 
622 	{ -1, -1, NULL, NULL }
623 };
624 
625 /* dcs_handler state table. */
626 static const struct input_transition input_state_dcs_handler_table[] = {
627 	/* No INPUT_STATE_ANYWHERE */
628 
629 	{ 0x00, 0x1a, input_input,  NULL },
630 	{ 0x1b, 0x1b, NULL,	    &input_state_dcs_escape },
631 	{ 0x1c, 0xff, input_input,  NULL },
632 
633 	{ -1, -1, NULL, NULL }
634 };
635 
636 /* dcs_escape state table. */
637 static const struct input_transition input_state_dcs_escape_table[] = {
638 	/* No INPUT_STATE_ANYWHERE */
639 
640 	{ 0x00, 0x5b, input_input,	  &input_state_dcs_handler },
641 	{ 0x5c, 0x5c, input_dcs_dispatch, &input_state_ground },
642 	{ 0x5d, 0xff, input_input,	  &input_state_dcs_handler },
643 
644 	{ -1, -1, NULL, NULL }
645 };
646 
647 /* dcs_ignore state table. */
648 static const struct input_transition input_state_dcs_ignore_table[] = {
649 	INPUT_STATE_ANYWHERE,
650 
651 	{ 0x00, 0x17, NULL,	    NULL },
652 	{ 0x19, 0x19, NULL,	    NULL },
653 	{ 0x1c, 0x1f, NULL,	    NULL },
654 	{ 0x20, 0xff, NULL,	    NULL },
655 
656 	{ -1, -1, NULL, NULL }
657 };
658 
659 /* osc_string state table. */
660 static const struct input_transition input_state_osc_string_table[] = {
661 	INPUT_STATE_ANYWHERE,
662 
663 	{ 0x00, 0x06, NULL,	     NULL },
664 	{ 0x07, 0x07, input_end_bel, &input_state_ground },
665 	{ 0x08, 0x17, NULL,	     NULL },
666 	{ 0x19, 0x19, NULL,	     NULL },
667 	{ 0x1c, 0x1f, NULL,	     NULL },
668 	{ 0x20, 0xff, input_input,   NULL },
669 
670 	{ -1, -1, NULL, NULL }
671 };
672 
673 /* apc_string state table. */
674 static const struct input_transition input_state_apc_string_table[] = {
675 	INPUT_STATE_ANYWHERE,
676 
677 	{ 0x00, 0x17, NULL,	    NULL },
678 	{ 0x19, 0x19, NULL,	    NULL },
679 	{ 0x1c, 0x1f, NULL,	    NULL },
680 	{ 0x20, 0xff, input_input,  NULL },
681 
682 	{ -1, -1, NULL, NULL }
683 };
684 
685 /* rename_string state table. */
686 static const struct input_transition input_state_rename_string_table[] = {
687 	INPUT_STATE_ANYWHERE,
688 
689 	{ 0x00, 0x17, NULL,	    NULL },
690 	{ 0x19, 0x19, NULL,	    NULL },
691 	{ 0x1c, 0x1f, NULL,	    NULL },
692 	{ 0x20, 0xff, input_input,  NULL },
693 
694 	{ -1, -1, NULL, NULL }
695 };
696 
697 /* consume_st state table. */
698 static const struct input_transition input_state_consume_st_table[] = {
699 	INPUT_STATE_ANYWHERE,
700 
701 	{ 0x00, 0x17, NULL,	    NULL },
702 	{ 0x19, 0x19, NULL,	    NULL },
703 	{ 0x1c, 0x1f, NULL,	    NULL },
704 	{ 0x20, 0xff, NULL,	    NULL },
705 
706 	{ -1, -1, NULL, NULL }
707 };
708 
709 /* Input table compare. */
710 static int
711 input_table_compare(const void *key, const void *value)
712 {
713 	const struct input_ctx		*ictx = key;
714 	const struct input_table_entry	*entry = value;
715 
716 	if (ictx->ch != entry->ch)
717 		return (ictx->ch - entry->ch);
718 	return (strcmp(ictx->interm_buf, entry->interm));
719 }
720 
721 /*
722  * Timer - if this expires then have been waiting for a terminator for too
723  * long, so reset to ground.
724  */
725 static void
726 input_timer_callback(__unused int fd, __unused short events, void *arg)
727 {
728 	struct input_ctx	*ictx = arg;
729 	struct window_pane	*wp = ictx->wp;
730 
731 	log_debug("%s: %%%u %s expired" , __func__, wp->id, ictx->state->name);
732 	input_reset(wp, 0);
733 }
734 
735 /* Start the timer. */
736 static void
737 input_start_timer(struct input_ctx *ictx)
738 {
739 	struct timeval	tv = { .tv_usec = 100000 };
740 
741 	event_del(&ictx->timer);
742 	event_add(&ictx->timer, &tv);
743 }
744 
745 /* Reset cell state to default. */
746 static void
747 input_reset_cell(struct input_ctx *ictx)
748 {
749 	memcpy(&ictx->cell.cell, &grid_default_cell, sizeof ictx->cell.cell);
750 	ictx->cell.set = 0;
751 	ictx->cell.g0set = ictx->cell.g1set = 0;
752 
753 	memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
754 	ictx->old_cx = 0;
755 	ictx->old_cy = 0;
756 }
757 
758 /* Initialise input parser. */
759 void
760 input_init(struct window_pane *wp)
761 {
762 	struct input_ctx	*ictx;
763 
764 	ictx = wp->ictx = xcalloc(1, sizeof *ictx);
765 
766 	ictx->input_space = INPUT_BUF_START;
767 	ictx->input_buf = xmalloc(INPUT_BUF_START);
768 
769 	ictx->since_ground = evbuffer_new();
770 	if (ictx->since_ground == NULL)
771 		fatalx("out of memory");
772 
773 	evtimer_set(&ictx->timer, input_timer_callback, ictx);
774 
775 	input_reset(wp, 0);
776 }
777 
778 /* Destroy input parser. */
779 void
780 input_free(struct window_pane *wp)
781 {
782 	struct input_ctx	*ictx = wp->ictx;
783 	u_int			 i;
784 
785 	for (i = 0; i < ictx->param_list_len; i++) {
786 		if (ictx->param_list[i].type == INPUT_STRING)
787 			free(ictx->param_list[i].str);
788 	}
789 
790 	event_del(&ictx->timer);
791 
792 	free(ictx->input_buf);
793 	evbuffer_free(ictx->since_ground);
794 
795 	free(ictx);
796 	wp->ictx = NULL;
797 }
798 
799 /* Reset input state and clear screen. */
800 void
801 input_reset(struct window_pane *wp, int clear)
802 {
803 	struct input_ctx	*ictx = wp->ictx;
804 
805 	input_reset_cell(ictx);
806 
807 	if (clear) {
808 		if (wp->mode == NULL)
809 			screen_write_start(&ictx->ctx, wp, &wp->base);
810 		else
811 			screen_write_start(&ictx->ctx, NULL, &wp->base);
812 		screen_write_reset(&ictx->ctx);
813 		screen_write_stop(&ictx->ctx);
814 	}
815 
816 	input_clear(ictx);
817 
818 	ictx->last = -1;
819 
820 	ictx->state = &input_state_ground;
821 	ictx->flags = 0;
822 }
823 
824 /* Return pending data. */
825 struct evbuffer *
826 input_pending(struct window_pane *wp)
827 {
828 	return (wp->ictx->since_ground);
829 }
830 
831 /* Change input state. */
832 static void
833 input_set_state(struct window_pane *wp, const struct input_transition *itr)
834 {
835 	struct input_ctx	*ictx = wp->ictx;
836 
837 	if (ictx->state->exit != NULL)
838 		ictx->state->exit(ictx);
839 	ictx->state = itr->state;
840 	if (ictx->state->enter != NULL)
841 		ictx->state->enter(ictx);
842 }
843 
844 /* Parse input. */
845 void
846 input_parse(struct window_pane *wp)
847 {
848 	struct input_ctx		*ictx = wp->ictx;
849 	const struct input_transition	*itr;
850 	struct evbuffer			*evb = wp->event->input;
851 	u_char				*buf;
852 	size_t				 len, off;
853 
854 	if (EVBUFFER_LENGTH(evb) == 0)
855 		return;
856 
857 	window_update_activity(wp->window);
858 	wp->flags |= PANE_CHANGED;
859 
860 	/*
861 	 * Open the screen. Use NULL wp if there is a mode set as don't want to
862 	 * update the tty.
863 	 */
864 	if (wp->mode == NULL)
865 		screen_write_start(&ictx->ctx, wp, &wp->base);
866 	else
867 		screen_write_start(&ictx->ctx, NULL, &wp->base);
868 	ictx->wp = wp;
869 
870 	buf = EVBUFFER_DATA(evb);
871 	len = EVBUFFER_LENGTH(evb);
872 	off = 0;
873 
874 	notify_input(wp, evb);
875 
876 	log_debug("%s: %%%u %s, %zu bytes: %.*s", __func__, wp->id,
877 	    ictx->state->name, len, (int)len, buf);
878 
879 	/* Parse the input. */
880 	while (off < len) {
881 		ictx->ch = buf[off++];
882 
883 		/* Find the transition. */
884 		itr = ictx->state->transitions;
885 		while (itr->first != -1 && itr->last != -1) {
886 			if (ictx->ch >= itr->first && ictx->ch <= itr->last)
887 				break;
888 			itr++;
889 		}
890 		if (itr->first == -1 || itr->last == -1) {
891 			/* No transition? Eh? */
892 			fatalx("no transition from state");
893 		}
894 
895 		/*
896 		 * Any state except print stops the current collection. This is
897 		 * an optimization to avoid checking if the attributes have
898 		 * changed for every character. It will stop unnecessarily for
899 		 * sequences that don't make a terminal change, but they should
900 		 * be the minority.
901 		 */
902 		if (itr->handler != input_print)
903 			screen_write_collect_end(&ictx->ctx);
904 
905 		/*
906 		 * Execute the handler, if any. Don't switch state if it
907 		 * returns non-zero.
908 		 */
909 		if (itr->handler != NULL && itr->handler(ictx) != 0)
910 			continue;
911 
912 		/* And switch state, if necessary. */
913 		if (itr->state != NULL)
914 			input_set_state(wp, itr);
915 
916 		/* If not in ground state, save input. */
917 		if (ictx->state != &input_state_ground)
918 			evbuffer_add(ictx->since_ground, &ictx->ch, 1);
919 	}
920 
921 	/* Close the screen. */
922 	screen_write_stop(&ictx->ctx);
923 
924 	evbuffer_drain(evb, len);
925 }
926 
927 /* Split the parameter list (if any). */
928 static int
929 input_split(struct input_ctx *ictx)
930 {
931 	const char		*errstr;
932 	char			*ptr, *out;
933 	struct input_param	*ip;
934 	u_int			 i;
935 
936 	for (i = 0; i < ictx->param_list_len; i++) {
937 		if (ictx->param_list[i].type == INPUT_STRING)
938 			free(ictx->param_list[i].str);
939 	}
940 	ictx->param_list_len = 0;
941 
942 	if (ictx->param_len == 0)
943 		return (0);
944 	ip = &ictx->param_list[0];
945 
946 	ptr = ictx->param_buf;
947 	while ((out = strsep(&ptr, ";")) != NULL) {
948 		if (*out == '\0')
949 			ip->type = INPUT_MISSING;
950 		else {
951 			if (strchr(out, ':') != NULL) {
952 				ip->type = INPUT_STRING;
953 				ip->str = xstrdup(out);
954 			} else {
955 				ip->type = INPUT_NUMBER;
956 				ip->num = strtonum(out, 0, INT_MAX, &errstr);
957 				if (errstr != NULL)
958 					return (-1);
959 			}
960 		}
961 		ip = &ictx->param_list[++ictx->param_list_len];
962 		if (ictx->param_list_len == nitems(ictx->param_list))
963 			return (-1);
964 	}
965 
966 	for (i = 0; i < ictx->param_list_len; i++) {
967 		ip = &ictx->param_list[i];
968 		if (ip->type == INPUT_MISSING)
969 			log_debug("parameter %u: missing", i);
970 		else if (ip->type == INPUT_STRING)
971 			log_debug("parameter %u: string %s", i, ip->str);
972 		else if (ip->type == INPUT_NUMBER)
973 			log_debug("parameter %u: number %d", i, ip->num);
974 	}
975 
976 	return (0);
977 }
978 
979 /* Get an argument or return default value. */
980 static int
981 input_get(struct input_ctx *ictx, u_int validx, int minval, int defval)
982 {
983 	struct input_param	*ip;
984 	int			 retval;
985 
986 	if (validx >= ictx->param_list_len)
987 	    return (defval);
988 	ip = &ictx->param_list[validx];
989 	if (ip->type == INPUT_MISSING)
990 		return (defval);
991 	if (ip->type == INPUT_STRING)
992 		return (-1);
993 	retval = ip->num;
994 	if (retval < minval)
995 		return (minval);
996 	return (retval);
997 }
998 
999 /* Reply to terminal query. */
1000 static void
1001 input_reply(struct input_ctx *ictx, const char *fmt, ...)
1002 {
1003 	va_list	 ap;
1004 	char	*reply;
1005 
1006 	va_start(ap, fmt);
1007 	xvasprintf(&reply, fmt, ap);
1008 	va_end(ap);
1009 
1010 	bufferevent_write(ictx->wp->event, reply, strlen(reply));
1011 	free(reply);
1012 }
1013 
1014 /* Clear saved state. */
1015 static void
1016 input_clear(struct input_ctx *ictx)
1017 {
1018 	event_del(&ictx->timer);
1019 
1020 	*ictx->interm_buf = '\0';
1021 	ictx->interm_len = 0;
1022 
1023 	*ictx->param_buf = '\0';
1024 	ictx->param_len = 0;
1025 
1026 	*ictx->input_buf = '\0';
1027 	ictx->input_len = 0;
1028 
1029 	ictx->input_end = INPUT_END_ST;
1030 
1031 	ictx->flags &= ~INPUT_DISCARD;
1032 }
1033 
1034 /* Reset for ground state. */
1035 static void
1036 input_ground(struct input_ctx *ictx)
1037 {
1038 	event_del(&ictx->timer);
1039 	evbuffer_drain(ictx->since_ground, EVBUFFER_LENGTH(ictx->since_ground));
1040 
1041 	if (ictx->input_space > INPUT_BUF_START) {
1042 		ictx->input_space = INPUT_BUF_START;
1043 		ictx->input_buf = xrealloc(ictx->input_buf, INPUT_BUF_START);
1044 	}
1045 }
1046 
1047 /* Output this character to the screen. */
1048 static int
1049 input_print(struct input_ctx *ictx)
1050 {
1051 	int	set;
1052 
1053 	ictx->utf8started = 0; /* can't be valid UTF-8 */
1054 
1055 	set = ictx->cell.set == 0 ? ictx->cell.g0set : ictx->cell.g1set;
1056 	if (set == 1)
1057 		ictx->cell.cell.attr |= GRID_ATTR_CHARSET;
1058 	else
1059 		ictx->cell.cell.attr &= ~GRID_ATTR_CHARSET;
1060 
1061 	utf8_set(&ictx->cell.cell.data, ictx->ch);
1062 	screen_write_collect_add(&ictx->ctx, &ictx->cell.cell);
1063 	ictx->last = ictx->ch;
1064 
1065 	ictx->cell.cell.attr &= ~GRID_ATTR_CHARSET;
1066 
1067 	return (0);
1068 }
1069 
1070 /* Collect intermediate string. */
1071 static int
1072 input_intermediate(struct input_ctx *ictx)
1073 {
1074 	if (ictx->interm_len == (sizeof ictx->interm_buf) - 1)
1075 		ictx->flags |= INPUT_DISCARD;
1076 	else {
1077 		ictx->interm_buf[ictx->interm_len++] = ictx->ch;
1078 		ictx->interm_buf[ictx->interm_len] = '\0';
1079 	}
1080 
1081 	return (0);
1082 }
1083 
1084 /* Collect parameter string. */
1085 static int
1086 input_parameter(struct input_ctx *ictx)
1087 {
1088 	if (ictx->param_len == (sizeof ictx->param_buf) - 1)
1089 		ictx->flags |= INPUT_DISCARD;
1090 	else {
1091 		ictx->param_buf[ictx->param_len++] = ictx->ch;
1092 		ictx->param_buf[ictx->param_len] = '\0';
1093 	}
1094 
1095 	return (0);
1096 }
1097 
1098 /* Collect input string. */
1099 static int
1100 input_input(struct input_ctx *ictx)
1101 {
1102 	size_t available;
1103 
1104 	available = ictx->input_space;
1105 	while (ictx->input_len + 1 >= available) {
1106 		available *= 2;
1107 		if (available > INPUT_BUF_LIMIT) {
1108 			ictx->flags |= INPUT_DISCARD;
1109 			return (0);
1110 		}
1111 		ictx->input_buf = xrealloc(ictx->input_buf, available);
1112 		ictx->input_space = available;
1113 	}
1114 	ictx->input_buf[ictx->input_len++] = ictx->ch;
1115 	ictx->input_buf[ictx->input_len] = '\0';
1116 
1117 	return (0);
1118 }
1119 
1120 /* Execute C0 control sequence. */
1121 static int
1122 input_c0_dispatch(struct input_ctx *ictx)
1123 {
1124 	struct screen_write_ctx	*sctx = &ictx->ctx;
1125 	struct window_pane	*wp = ictx->wp;
1126 	struct screen		*s = sctx->s;
1127 
1128 	ictx->utf8started = 0; /* can't be valid UTF-8 */
1129 
1130 	log_debug("%s: '%c'", __func__, ictx->ch);
1131 
1132 	switch (ictx->ch) {
1133 	case '\000':	/* NUL */
1134 		break;
1135 	case '\007':	/* BEL */
1136 		alerts_queue(wp->window, WINDOW_BELL);
1137 		break;
1138 	case '\010':	/* BS */
1139 		screen_write_backspace(sctx);
1140 		break;
1141 	case '\011':	/* HT */
1142 		/* Don't tab beyond the end of the line. */
1143 		if (s->cx >= screen_size_x(s) - 1)
1144 			break;
1145 
1146 		/* Find the next tab point, or use the last column if none. */
1147 		do {
1148 			s->cx++;
1149 			if (bit_test(s->tabs, s->cx))
1150 				break;
1151 		} while (s->cx < screen_size_x(s) - 1);
1152 		break;
1153 	case '\012':	/* LF */
1154 	case '\013':	/* VT */
1155 	case '\014':	/* FF */
1156 		screen_write_linefeed(sctx, 0, ictx->cell.cell.bg);
1157 		break;
1158 	case '\015':	/* CR */
1159 		screen_write_carriagereturn(sctx);
1160 		break;
1161 	case '\016':	/* SO */
1162 		ictx->cell.set = 1;
1163 		break;
1164 	case '\017':	/* SI */
1165 		ictx->cell.set = 0;
1166 		break;
1167 	default:
1168 		log_debug("%s: unknown '%c'", __func__, ictx->ch);
1169 		break;
1170 	}
1171 
1172 	ictx->last = -1;
1173 	return (0);
1174 }
1175 
1176 /* Execute escape sequence. */
1177 static int
1178 input_esc_dispatch(struct input_ctx *ictx)
1179 {
1180 	struct screen_write_ctx		*sctx = &ictx->ctx;
1181 	struct screen			*s = sctx->s;
1182 	struct input_table_entry	*entry;
1183 
1184 	if (ictx->flags & INPUT_DISCARD)
1185 		return (0);
1186 	log_debug("%s: '%c', %s", __func__, ictx->ch, ictx->interm_buf);
1187 
1188 	entry = bsearch(ictx, input_esc_table, nitems(input_esc_table),
1189 	    sizeof input_esc_table[0], input_table_compare);
1190 	if (entry == NULL) {
1191 		log_debug("%s: unknown '%c'", __func__, ictx->ch);
1192 		return (0);
1193 	}
1194 
1195 	switch (entry->type) {
1196 	case INPUT_ESC_RIS:
1197 		window_pane_reset_palette(ictx->wp);
1198 		input_reset_cell(ictx);
1199 		screen_write_reset(sctx);
1200 		screen_write_clearhistory(sctx);
1201 		break;
1202 	case INPUT_ESC_IND:
1203 		screen_write_linefeed(sctx, 0, ictx->cell.cell.bg);
1204 		break;
1205 	case INPUT_ESC_NEL:
1206 		screen_write_carriagereturn(sctx);
1207 		screen_write_linefeed(sctx, 0, ictx->cell.cell.bg);
1208 		break;
1209 	case INPUT_ESC_HTS:
1210 		if (s->cx < screen_size_x(s))
1211 			bit_set(s->tabs, s->cx);
1212 		break;
1213 	case INPUT_ESC_RI:
1214 		screen_write_reverseindex(sctx, ictx->cell.cell.bg);
1215 		break;
1216 	case INPUT_ESC_DECKPAM:
1217 		screen_write_mode_set(sctx, MODE_KKEYPAD);
1218 		break;
1219 	case INPUT_ESC_DECKPNM:
1220 		screen_write_mode_clear(sctx, MODE_KKEYPAD);
1221 		break;
1222 	case INPUT_ESC_DECSC:
1223 		memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
1224 		ictx->old_cx = s->cx;
1225 		ictx->old_cy = s->cy;
1226 		break;
1227 	case INPUT_ESC_DECRC:
1228 		memcpy(&ictx->cell, &ictx->old_cell, sizeof ictx->cell);
1229 		screen_write_cursormove(sctx, ictx->old_cx, ictx->old_cy);
1230 		break;
1231 	case INPUT_ESC_DECALN:
1232 		screen_write_alignmenttest(sctx);
1233 		break;
1234 	case INPUT_ESC_SCSG0_ON:
1235 		ictx->cell.g0set = 1;
1236 		break;
1237 	case INPUT_ESC_SCSG0_OFF:
1238 		ictx->cell.g0set = 0;
1239 		break;
1240 	case INPUT_ESC_SCSG1_ON:
1241 		ictx->cell.g1set = 1;
1242 		break;
1243 	case INPUT_ESC_SCSG1_OFF:
1244 		ictx->cell.g1set = 0;
1245 		break;
1246 	case INPUT_ESC_ST:
1247 		/* ST terminates OSC but the state transition already did it. */
1248 		break;
1249 	}
1250 
1251 	ictx->last = -1;
1252 	return (0);
1253 }
1254 
1255 /* Execute control sequence. */
1256 static int
1257 input_csi_dispatch(struct input_ctx *ictx)
1258 {
1259 	struct screen_write_ctx	       *sctx = &ictx->ctx;
1260 	struct screen		       *s = sctx->s;
1261 	struct input_table_entry       *entry;
1262 	int				i, n, m;
1263 	u_int				cx, bg = ictx->cell.cell.bg;
1264 
1265 	if (ictx->flags & INPUT_DISCARD)
1266 		return (0);
1267 
1268 	log_debug("%s: '%c' \"%s\" \"%s\"",
1269 	    __func__, ictx->ch, ictx->interm_buf, ictx->param_buf);
1270 
1271 	if (input_split(ictx) != 0)
1272 		return (0);
1273 
1274 	entry = bsearch(ictx, input_csi_table, nitems(input_csi_table),
1275 	    sizeof input_csi_table[0], input_table_compare);
1276 	if (entry == NULL) {
1277 		log_debug("%s: unknown '%c'", __func__, ictx->ch);
1278 		return (0);
1279 	}
1280 
1281 	switch (entry->type) {
1282 	case INPUT_CSI_CBT:
1283 		/* Find the previous tab point, n times. */
1284 		cx = s->cx;
1285 		if (cx > screen_size_x(s) - 1)
1286 			cx = screen_size_x(s) - 1;
1287 		n = input_get(ictx, 0, 1, 1);
1288 		if (n == -1)
1289 			break;
1290 		while (cx > 0 && n-- > 0) {
1291 			do
1292 				cx--;
1293 			while (cx > 0 && !bit_test(s->tabs, cx));
1294 		}
1295 		s->cx = cx;
1296 		break;
1297 	case INPUT_CSI_CUB:
1298 		n = input_get(ictx, 0, 1, 1);
1299 		if (n != -1)
1300 			screen_write_cursorleft(sctx, n);
1301 		break;
1302 	case INPUT_CSI_CUD:
1303 		n = input_get(ictx, 0, 1, 1);
1304 		if (n != -1)
1305 			screen_write_cursordown(sctx, n);
1306 		break;
1307 	case INPUT_CSI_CUF:
1308 		n = input_get(ictx, 0, 1, 1);
1309 		if (n != -1)
1310 			screen_write_cursorright(sctx, n);
1311 		break;
1312 	case INPUT_CSI_CUP:
1313 		n = input_get(ictx, 0, 1, 1);
1314 		m = input_get(ictx, 1, 1, 1);
1315 		if (n != -1 && m != -1)
1316 			screen_write_cursormove(sctx, m - 1, n - 1);
1317 		break;
1318 	case INPUT_CSI_WINOPS:
1319 		input_csi_dispatch_winops(ictx);
1320 		break;
1321 	case INPUT_CSI_CUU:
1322 		n = input_get(ictx, 0, 1, 1);
1323 		if (n != -1)
1324 			screen_write_cursorup(sctx, n);
1325 		break;
1326 	case INPUT_CSI_CNL:
1327 		n = input_get(ictx, 0, 1, 1);
1328 		if (n != -1) {
1329 			screen_write_carriagereturn(sctx);
1330 			screen_write_cursordown(sctx, n);
1331 		}
1332 		break;
1333 	case INPUT_CSI_CPL:
1334 		n = input_get(ictx, 0, 1, 1);
1335 		if (n != -1) {
1336 			screen_write_carriagereturn(sctx);
1337 			screen_write_cursorup(sctx, n);
1338 		}
1339 		break;
1340 	case INPUT_CSI_DA:
1341 		switch (input_get(ictx, 0, 0, 0)) {
1342 		case -1:
1343 			break;
1344 		case 0:
1345 			input_reply(ictx, "\033[?1;2c");
1346 			break;
1347 		default:
1348 			log_debug("%s: unknown '%c'", __func__, ictx->ch);
1349 			break;
1350 		}
1351 		break;
1352 	case INPUT_CSI_DA_TWO:
1353 		switch (input_get(ictx, 0, 0, 0)) {
1354 		case -1:
1355 			break;
1356 		case 0:
1357 			input_reply(ictx, "\033[>84;0;0c");
1358 			break;
1359 		default:
1360 			log_debug("%s: unknown '%c'", __func__, ictx->ch);
1361 			break;
1362 		}
1363 		break;
1364 	case INPUT_CSI_ECH:
1365 		n = input_get(ictx, 0, 1, 1);
1366 		if (n != -1)
1367 			screen_write_clearcharacter(sctx, n, bg);
1368 		break;
1369 	case INPUT_CSI_DCH:
1370 		n = input_get(ictx, 0, 1, 1);
1371 		if (n != -1)
1372 			screen_write_deletecharacter(sctx, n, bg);
1373 		break;
1374 	case INPUT_CSI_DECSTBM:
1375 		n = input_get(ictx, 0, 1, 1);
1376 		m = input_get(ictx, 1, 1, screen_size_y(s));
1377 		if (n != -1 && m != -1)
1378 			screen_write_scrollregion(sctx, n - 1, m - 1);
1379 		break;
1380 	case INPUT_CSI_DL:
1381 		n = input_get(ictx, 0, 1, 1);
1382 		if (n != -1)
1383 			screen_write_deleteline(sctx, n, bg);
1384 		break;
1385 	case INPUT_CSI_DSR:
1386 		switch (input_get(ictx, 0, 0, 0)) {
1387 		case -1:
1388 			break;
1389 		case 5:
1390 			input_reply(ictx, "\033[0n");
1391 			break;
1392 		case 6:
1393 			input_reply(ictx, "\033[%u;%uR", s->cy + 1, s->cx + 1);
1394 			break;
1395 		default:
1396 			log_debug("%s: unknown '%c'", __func__, ictx->ch);
1397 			break;
1398 		}
1399 		break;
1400 	case INPUT_CSI_ED:
1401 		switch (input_get(ictx, 0, 0, 0)) {
1402 		case -1:
1403 			break;
1404 		case 0:
1405 			screen_write_clearendofscreen(sctx, bg);
1406 			break;
1407 		case 1:
1408 			screen_write_clearstartofscreen(sctx, bg);
1409 			break;
1410 		case 2:
1411 			screen_write_clearscreen(sctx, bg);
1412 			break;
1413 		case 3:
1414 			if (input_get(ictx, 1, 0, 0) == 0) {
1415 				/*
1416 				 * Linux console extension to clear history
1417 				 * (for example before locking the screen).
1418 				 */
1419 				screen_write_clearhistory(sctx);
1420 			}
1421 			break;
1422 		default:
1423 			log_debug("%s: unknown '%c'", __func__, ictx->ch);
1424 			break;
1425 		}
1426 		break;
1427 	case INPUT_CSI_EL:
1428 		switch (input_get(ictx, 0, 0, 0)) {
1429 		case -1:
1430 			break;
1431 		case 0:
1432 			screen_write_clearendofline(sctx, bg);
1433 			break;
1434 		case 1:
1435 			screen_write_clearstartofline(sctx, bg);
1436 			break;
1437 		case 2:
1438 			screen_write_clearline(sctx, bg);
1439 			break;
1440 		default:
1441 			log_debug("%s: unknown '%c'", __func__, ictx->ch);
1442 			break;
1443 		}
1444 		break;
1445 	case INPUT_CSI_HPA:
1446 		n = input_get(ictx, 0, 1, 1);
1447 		if (n != -1)
1448 			screen_write_cursormove(sctx, n - 1, s->cy);
1449 		break;
1450 	case INPUT_CSI_ICH:
1451 		n = input_get(ictx, 0, 1, 1);
1452 		if (n != -1)
1453 			screen_write_insertcharacter(sctx, n, bg);
1454 		break;
1455 	case INPUT_CSI_IL:
1456 		n = input_get(ictx, 0, 1, 1);
1457 		if (n != -1)
1458 			screen_write_insertline(sctx, n, bg);
1459 		break;
1460 	case INPUT_CSI_REP:
1461 		n = input_get(ictx, 0, 1, 1);
1462 		if (n == -1)
1463 			break;
1464 
1465 		if (ictx->last == -1)
1466 			break;
1467 		ictx->ch = ictx->last;
1468 
1469 		for (i = 0; i < n; i++)
1470 			input_print(ictx);
1471 		break;
1472 	case INPUT_CSI_RCP:
1473 		memcpy(&ictx->cell, &ictx->old_cell, sizeof ictx->cell);
1474 		screen_write_cursormove(sctx, ictx->old_cx, ictx->old_cy);
1475 		break;
1476 	case INPUT_CSI_RM:
1477 		input_csi_dispatch_rm(ictx);
1478 		break;
1479 	case INPUT_CSI_RM_PRIVATE:
1480 		input_csi_dispatch_rm_private(ictx);
1481 		break;
1482 	case INPUT_CSI_SCP:
1483 		memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
1484 		ictx->old_cx = s->cx;
1485 		ictx->old_cy = s->cy;
1486 		break;
1487 	case INPUT_CSI_SGR:
1488 		input_csi_dispatch_sgr(ictx);
1489 		break;
1490 	case INPUT_CSI_SM:
1491 		input_csi_dispatch_sm(ictx);
1492 		break;
1493 	case INPUT_CSI_SM_PRIVATE:
1494 		input_csi_dispatch_sm_private(ictx);
1495 		break;
1496 	case INPUT_CSI_SU:
1497 		n = input_get(ictx, 0, 1, 1);
1498 		if (n != -1)
1499 			screen_write_scrollup(sctx, n, bg);
1500 		break;
1501 	case INPUT_CSI_TBC:
1502 		switch (input_get(ictx, 0, 0, 0)) {
1503 		case -1:
1504 			break;
1505 		case 0:
1506 			if (s->cx < screen_size_x(s))
1507 				bit_clear(s->tabs, s->cx);
1508 			break;
1509 		case 3:
1510 			bit_nclear(s->tabs, 0, screen_size_x(s) - 1);
1511 			break;
1512 		default:
1513 			log_debug("%s: unknown '%c'", __func__, ictx->ch);
1514 			break;
1515 		}
1516 		break;
1517 	case INPUT_CSI_VPA:
1518 		n = input_get(ictx, 0, 1, 1);
1519 		if (n != -1)
1520 			screen_write_cursormove(sctx, s->cx, n - 1);
1521 		break;
1522 	case INPUT_CSI_DECSCUSR:
1523 		n = input_get(ictx, 0, 0, 0);
1524 		if (n != -1)
1525 			screen_set_cursor_style(s, n);
1526 		break;
1527 	}
1528 
1529 	ictx->last = -1;
1530 	return (0);
1531 }
1532 
1533 /* Handle CSI RM. */
1534 static void
1535 input_csi_dispatch_rm(struct input_ctx *ictx)
1536 {
1537 	u_int	i;
1538 
1539 	for (i = 0; i < ictx->param_list_len; i++) {
1540 		switch (input_get(ictx, i, 0, -1)) {
1541 		case -1:
1542 			break;
1543 		case 4:		/* IRM */
1544 			screen_write_mode_clear(&ictx->ctx, MODE_INSERT);
1545 			break;
1546 		case 34:
1547 			screen_write_mode_set(&ictx->ctx, MODE_BLINKING);
1548 			break;
1549 		default:
1550 			log_debug("%s: unknown '%c'", __func__, ictx->ch);
1551 			break;
1552 		}
1553 	}
1554 }
1555 
1556 /* Handle CSI private RM. */
1557 static void
1558 input_csi_dispatch_rm_private(struct input_ctx *ictx)
1559 {
1560 	struct window_pane	*wp = ictx->wp;
1561 	u_int			 i;
1562 
1563 	for (i = 0; i < ictx->param_list_len; i++) {
1564 		switch (input_get(ictx, i, 0, -1)) {
1565 		case -1:
1566 			break;
1567 		case 1:		/* DECCKM */
1568 			screen_write_mode_clear(&ictx->ctx, MODE_KCURSOR);
1569 			break;
1570 		case 3:		/* DECCOLM */
1571 			screen_write_cursormove(&ictx->ctx, 0, 0);
1572 			screen_write_clearscreen(&ictx->ctx,
1573 			    ictx->cell.cell.bg);
1574 			break;
1575 		case 7:		/* DECAWM */
1576 			screen_write_mode_clear(&ictx->ctx, MODE_WRAP);
1577 			break;
1578 		case 12:
1579 			screen_write_mode_clear(&ictx->ctx, MODE_BLINKING);
1580 			break;
1581 		case 25:	/* TCEM */
1582 			screen_write_mode_clear(&ictx->ctx, MODE_CURSOR);
1583 			break;
1584 		case 1000:
1585 		case 1001:
1586 		case 1002:
1587 		case 1003:
1588 			screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
1589 			break;
1590 		case 1004:
1591 			screen_write_mode_clear(&ictx->ctx, MODE_FOCUSON);
1592 			break;
1593 		case 1005:
1594 			screen_write_mode_clear(&ictx->ctx, MODE_MOUSE_UTF8);
1595 			break;
1596 		case 1006:
1597 			screen_write_mode_clear(&ictx->ctx, MODE_MOUSE_SGR);
1598 			break;
1599 		case 47:
1600 		case 1047:
1601 			window_pane_alternate_off(wp, &ictx->cell.cell, 0);
1602 			break;
1603 		case 1049:
1604 			window_pane_alternate_off(wp, &ictx->cell.cell, 1);
1605 			break;
1606 		case 2004:
1607 			screen_write_mode_clear(&ictx->ctx, MODE_BRACKETPASTE);
1608 			break;
1609 		default:
1610 			log_debug("%s: unknown '%c'", __func__, ictx->ch);
1611 			break;
1612 		}
1613 	}
1614 }
1615 
1616 /* Handle CSI SM. */
1617 static void
1618 input_csi_dispatch_sm(struct input_ctx *ictx)
1619 {
1620 	u_int	i;
1621 
1622 	for (i = 0; i < ictx->param_list_len; i++) {
1623 		switch (input_get(ictx, i, 0, -1)) {
1624 		case -1:
1625 			break;
1626 		case 4:		/* IRM */
1627 			screen_write_mode_set(&ictx->ctx, MODE_INSERT);
1628 			break;
1629 		case 34:
1630 			screen_write_mode_clear(&ictx->ctx, MODE_BLINKING);
1631 			break;
1632 		default:
1633 			log_debug("%s: unknown '%c'", __func__, ictx->ch);
1634 			break;
1635 		}
1636 	}
1637 }
1638 
1639 /* Handle CSI private SM. */
1640 static void
1641 input_csi_dispatch_sm_private(struct input_ctx *ictx)
1642 {
1643 	struct window_pane	*wp = ictx->wp;
1644 	u_int			 i;
1645 
1646 	for (i = 0; i < ictx->param_list_len; i++) {
1647 		switch (input_get(ictx, i, 0, -1)) {
1648 		case -1:
1649 			break;
1650 		case 1:		/* DECCKM */
1651 			screen_write_mode_set(&ictx->ctx, MODE_KCURSOR);
1652 			break;
1653 		case 3:		/* DECCOLM */
1654 			screen_write_cursormove(&ictx->ctx, 0, 0);
1655 			screen_write_clearscreen(&ictx->ctx,
1656 			    ictx->cell.cell.bg);
1657 			break;
1658 		case 7:		/* DECAWM */
1659 			screen_write_mode_set(&ictx->ctx, MODE_WRAP);
1660 			break;
1661 		case 12:
1662 			screen_write_mode_set(&ictx->ctx, MODE_BLINKING);
1663 			break;
1664 		case 25:	/* TCEM */
1665 			screen_write_mode_set(&ictx->ctx, MODE_CURSOR);
1666 			break;
1667 		case 1000:
1668 			screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
1669 			screen_write_mode_set(&ictx->ctx, MODE_MOUSE_STANDARD);
1670 			break;
1671 		case 1002:
1672 			screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
1673 			screen_write_mode_set(&ictx->ctx, MODE_MOUSE_BUTTON);
1674 			break;
1675 		case 1003:
1676 			screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
1677 			screen_write_mode_set(&ictx->ctx, MODE_MOUSE_ALL);
1678 			break;
1679 		case 1004:
1680 			if (ictx->ctx.s->mode & MODE_FOCUSON)
1681 				break;
1682 			screen_write_mode_set(&ictx->ctx, MODE_FOCUSON);
1683 			wp->flags |= PANE_FOCUSPUSH; /* force update */
1684 			break;
1685 		case 1005:
1686 			screen_write_mode_set(&ictx->ctx, MODE_MOUSE_UTF8);
1687 			break;
1688 		case 1006:
1689 			screen_write_mode_set(&ictx->ctx, MODE_MOUSE_SGR);
1690 			break;
1691 		case 47:
1692 		case 1047:
1693 			window_pane_alternate_on(wp, &ictx->cell.cell, 0);
1694 			break;
1695 		case 1049:
1696 			window_pane_alternate_on(wp, &ictx->cell.cell, 1);
1697 			break;
1698 		case 2004:
1699 			screen_write_mode_set(&ictx->ctx, MODE_BRACKETPASTE);
1700 			break;
1701 		default:
1702 			log_debug("%s: unknown '%c'", __func__, ictx->ch);
1703 			break;
1704 		}
1705 	}
1706 }
1707 
1708 /* Handle CSI window operations. */
1709 static void
1710 input_csi_dispatch_winops(struct input_ctx *ictx)
1711 {
1712 	struct window_pane	*wp = ictx->wp;
1713 	int			 n, m;
1714 
1715 	m = 0;
1716 	while ((n = input_get(ictx, m, 0, -1)) != -1) {
1717 		switch (n) {
1718 		case 1:
1719 		case 2:
1720 		case 5:
1721 		case 6:
1722 		case 7:
1723 		case 11:
1724 		case 13:
1725 		case 14:
1726 		case 19:
1727 		case 20:
1728 		case 21:
1729 		case 24:
1730 			break;
1731 		case 3:
1732 		case 4:
1733 		case 8:
1734 			m++;
1735 			if (input_get(ictx, m, 0, -1) == -1)
1736 				return;
1737 			/* FALLTHROUGH */
1738 		case 9:
1739 		case 10:
1740 			m++;
1741 			if (input_get(ictx, m, 0, -1) == -1)
1742 				return;
1743 			break;
1744 		case 22:
1745 			m++;
1746 			switch (input_get(ictx, m, 0, -1)) {
1747 			case -1:
1748 				return;
1749 			case 0:
1750 			case 2:
1751 				screen_push_title(ictx->ctx.s);
1752 				break;
1753 			}
1754 			break;
1755 		case 23:
1756 			m++;
1757 			switch (input_get(ictx, m, 0, -1)) {
1758 			case -1:
1759 				return;
1760 			case 0:
1761 			case 2:
1762 				screen_pop_title(ictx->ctx.s);
1763 				server_status_window(ictx->wp->window);
1764 				break;
1765 			}
1766 			break;
1767 		case 18:
1768 			input_reply(ictx, "\033[8;%u;%ut", wp->sy, wp->sx);
1769 			break;
1770 		default:
1771 			log_debug("%s: unknown '%c'", __func__, ictx->ch);
1772 			break;
1773 		}
1774 		m++;
1775 	}
1776 }
1777 
1778 /* Helper for 256 colour SGR. */
1779 static int
1780 input_csi_dispatch_sgr_256_do(struct input_ctx *ictx, int fgbg, int c)
1781 {
1782 	struct grid_cell	*gc = &ictx->cell.cell;
1783 
1784 	if (c == -1 || c > 255) {
1785 		if (fgbg == 38)
1786 			gc->fg = 8;
1787 		else if (fgbg == 48)
1788 			gc->bg = 8;
1789 	} else {
1790 		if (fgbg == 38)
1791 			gc->fg = c | COLOUR_FLAG_256;
1792 		else if (fgbg == 48)
1793 			gc->bg = c | COLOUR_FLAG_256;
1794 	}
1795 	return (1);
1796 }
1797 
1798 /* Handle CSI SGR for 256 colours. */
1799 static void
1800 input_csi_dispatch_sgr_256(struct input_ctx *ictx, int fgbg, u_int *i)
1801 {
1802 	int	c;
1803 
1804 	c = input_get(ictx, (*i) + 1, 0, -1);
1805 	if (input_csi_dispatch_sgr_256_do(ictx, fgbg, c))
1806 		(*i)++;
1807 }
1808 
1809 /* Helper for RGB colour SGR. */
1810 static int
1811 input_csi_dispatch_sgr_rgb_do(struct input_ctx *ictx, int fgbg, int r, int g,
1812     int b)
1813 {
1814 	struct grid_cell	*gc = &ictx->cell.cell;
1815 
1816 	if (r == -1 || r > 255)
1817 		return (0);
1818 	if (g == -1 || g > 255)
1819 		return (0);
1820 	if (b == -1 || b > 255)
1821 		return (0);
1822 
1823 	if (fgbg == 38)
1824 		gc->fg = colour_join_rgb(r, g, b);
1825 	else if (fgbg == 48)
1826 		gc->bg = colour_join_rgb(r, g, b);
1827 	return (1);
1828 }
1829 
1830 /* Handle CSI SGR for RGB colours. */
1831 static void
1832 input_csi_dispatch_sgr_rgb(struct input_ctx *ictx, int fgbg, u_int *i)
1833 {
1834 	int	r, g, b;
1835 
1836 	r = input_get(ictx, (*i) + 1, 0, -1);
1837 	g = input_get(ictx, (*i) + 2, 0, -1);
1838 	b = input_get(ictx, (*i) + 3, 0, -1);
1839 	if (input_csi_dispatch_sgr_rgb_do(ictx, fgbg, r, g, b))
1840 		(*i) += 3;
1841 }
1842 
1843 /* Handle CSI SGR with a ISO parameter. */
1844 static void
1845 input_csi_dispatch_sgr_colon(struct input_ctx *ictx, u_int i)
1846 {
1847 	struct grid_cell	*gc = &ictx->cell.cell;
1848 	char			*s = ictx->param_list[i].str, *copy, *ptr, *out;
1849 	int			 p[8];
1850 	u_int			 n;
1851 	const char		*errstr;
1852 
1853 	for (n = 0; n < nitems(p); n++)
1854 		p[n] = -1;
1855 	n = 0;
1856 
1857 	ptr = copy = xstrdup(s);
1858 	while ((out = strsep(&ptr, ":")) != NULL) {
1859 		if (*out != '\0') {
1860 			p[n++] = strtonum(out, 0, INT_MAX, &errstr);
1861 			if (errstr != NULL || n == nitems(p)) {
1862 				free(copy);
1863 				return;
1864 			}
1865 		} else
1866 			n++;
1867 		log_debug("%s: %u = %d", __func__, n - 1, p[n - 1]);
1868 	}
1869 	free(copy);
1870 
1871 	if (n == 0)
1872 		return;
1873 	if (p[0] == 4) {
1874 		if (n != 2)
1875 			return;
1876 		switch (p[1]) {
1877 		case 0:
1878 			gc->attr &= ~GRID_ATTR_ALL_UNDERSCORE;
1879 			break;
1880 		case 1:
1881 			gc->attr &= ~GRID_ATTR_ALL_UNDERSCORE;
1882 			gc->attr |= GRID_ATTR_UNDERSCORE;
1883 			break;
1884 		case 2:
1885 			gc->attr &= ~GRID_ATTR_ALL_UNDERSCORE;
1886 			gc->attr |= GRID_ATTR_UNDERSCORE_2;
1887 			break;
1888 		case 3:
1889 			gc->attr &= ~GRID_ATTR_ALL_UNDERSCORE;
1890 			gc->attr |= GRID_ATTR_UNDERSCORE_3;
1891 			break;
1892 		case 4:
1893 			gc->attr &= ~GRID_ATTR_ALL_UNDERSCORE;
1894 			gc->attr |= GRID_ATTR_UNDERSCORE_4;
1895 			break;
1896 		case 5:
1897 			gc->attr &= ~GRID_ATTR_ALL_UNDERSCORE;
1898 			gc->attr |= GRID_ATTR_UNDERSCORE_5;
1899 			break;
1900 		}
1901 		return;
1902 	}
1903 	if (p[0] != 38 && p[0] != 48)
1904 		return;
1905 	if (p[1] == -1)
1906 		i = 2;
1907 	else
1908 		i = 1;
1909 	switch (p[i]) {
1910 	case 2:
1911 		if (n < i + 4)
1912 			break;
1913 		input_csi_dispatch_sgr_rgb_do(ictx, p[0], p[i + 1], p[i + 2],
1914 		    p[i + 3]);
1915 		break;
1916 	case 5:
1917 		if (n < i + 2)
1918 			break;
1919 		input_csi_dispatch_sgr_256_do(ictx, p[0], p[i + 1]);
1920 		break;
1921 	}
1922 }
1923 
1924 /* Handle CSI SGR. */
1925 static void
1926 input_csi_dispatch_sgr(struct input_ctx *ictx)
1927 {
1928 	struct grid_cell	*gc = &ictx->cell.cell;
1929 	u_int			 i;
1930 	int			 n;
1931 
1932 	if (ictx->param_list_len == 0) {
1933 		memcpy(gc, &grid_default_cell, sizeof *gc);
1934 		return;
1935 	}
1936 
1937 	for (i = 0; i < ictx->param_list_len; i++) {
1938 		if (ictx->param_list[i].type == INPUT_STRING) {
1939 			input_csi_dispatch_sgr_colon(ictx, i);
1940 			continue;
1941 		}
1942 		n = input_get(ictx, i, 0, 0);
1943 		if (n == -1)
1944 			continue;
1945 
1946 		if (n == 38 || n == 48) {
1947 			i++;
1948 			switch (input_get(ictx, i, 0, -1)) {
1949 			case 2:
1950 				input_csi_dispatch_sgr_rgb(ictx, n, &i);
1951 				break;
1952 			case 5:
1953 				input_csi_dispatch_sgr_256(ictx, n, &i);
1954 				break;
1955 			}
1956 			continue;
1957 		}
1958 
1959 		switch (n) {
1960 		case 0:
1961 			memcpy(gc, &grid_default_cell, sizeof *gc);
1962 			break;
1963 		case 1:
1964 			gc->attr |= GRID_ATTR_BRIGHT;
1965 			break;
1966 		case 2:
1967 			gc->attr |= GRID_ATTR_DIM;
1968 			break;
1969 		case 3:
1970 			gc->attr |= GRID_ATTR_ITALICS;
1971 			break;
1972 		case 4:
1973 			gc->attr &= ~GRID_ATTR_ALL_UNDERSCORE;
1974 			gc->attr |= GRID_ATTR_UNDERSCORE;
1975 			break;
1976 		case 5:
1977 			gc->attr |= GRID_ATTR_BLINK;
1978 			break;
1979 		case 7:
1980 			gc->attr |= GRID_ATTR_REVERSE;
1981 			break;
1982 		case 8:
1983 			gc->attr |= GRID_ATTR_HIDDEN;
1984 			break;
1985 		case 9:
1986 			gc->attr |= GRID_ATTR_STRIKETHROUGH;
1987 			break;
1988 		case 22:
1989 			gc->attr &= ~(GRID_ATTR_BRIGHT|GRID_ATTR_DIM);
1990 			break;
1991 		case 23:
1992 			gc->attr &= ~GRID_ATTR_ITALICS;
1993 			break;
1994 		case 24:
1995 			gc->attr &= ~GRID_ATTR_ALL_UNDERSCORE;
1996 			break;
1997 		case 25:
1998 			gc->attr &= ~GRID_ATTR_BLINK;
1999 			break;
2000 		case 27:
2001 			gc->attr &= ~GRID_ATTR_REVERSE;
2002 			break;
2003 		case 28:
2004 			gc->attr &= ~GRID_ATTR_HIDDEN;
2005 			break;
2006 		case 29:
2007 			gc->attr &= ~GRID_ATTR_STRIKETHROUGH;
2008 			break;
2009 		case 30:
2010 		case 31:
2011 		case 32:
2012 		case 33:
2013 		case 34:
2014 		case 35:
2015 		case 36:
2016 		case 37:
2017 			gc->fg = n - 30;
2018 			break;
2019 		case 39:
2020 			gc->fg = 8;
2021 			break;
2022 		case 40:
2023 		case 41:
2024 		case 42:
2025 		case 43:
2026 		case 44:
2027 		case 45:
2028 		case 46:
2029 		case 47:
2030 			gc->bg = n - 40;
2031 			break;
2032 		case 49:
2033 			gc->bg = 8;
2034 			break;
2035 		case 90:
2036 		case 91:
2037 		case 92:
2038 		case 93:
2039 		case 94:
2040 		case 95:
2041 		case 96:
2042 		case 97:
2043 			gc->fg = n;
2044 			break;
2045 		case 100:
2046 		case 101:
2047 		case 102:
2048 		case 103:
2049 		case 104:
2050 		case 105:
2051 		case 106:
2052 		case 107:
2053 			gc->bg = n - 10;
2054 			break;
2055 		}
2056 	}
2057 }
2058 
2059 /* End of input with BEL. */
2060 static int
2061 input_end_bel(struct input_ctx *ictx)
2062 {
2063 	log_debug("%s", __func__);
2064 
2065 	ictx->input_end = INPUT_END_BEL;
2066 
2067 	return (0);
2068 }
2069 
2070 /* DCS string started. */
2071 static void
2072 input_enter_dcs(struct input_ctx *ictx)
2073 {
2074 	log_debug("%s", __func__);
2075 
2076 	input_clear(ictx);
2077 	input_start_timer(ictx);
2078 	ictx->last = -1;
2079 }
2080 
2081 /* DCS terminator (ST) received. */
2082 static int
2083 input_dcs_dispatch(struct input_ctx *ictx)
2084 {
2085 	const char	prefix[] = "tmux;";
2086 	const u_int	prefix_len = (sizeof prefix) - 1;
2087 
2088 	if (ictx->flags & INPUT_DISCARD)
2089 		return (0);
2090 
2091 	log_debug("%s: \"%s\"", __func__, ictx->input_buf);
2092 
2093 	/* Check for tmux prefix. */
2094 	if (ictx->input_len >= prefix_len &&
2095 	    strncmp(ictx->input_buf, prefix, prefix_len) == 0) {
2096 		screen_write_rawstring(&ictx->ctx,
2097 		    ictx->input_buf + prefix_len, ictx->input_len - prefix_len);
2098 	}
2099 
2100 	return (0);
2101 }
2102 
2103 /* OSC string started. */
2104 static void
2105 input_enter_osc(struct input_ctx *ictx)
2106 {
2107 	log_debug("%s", __func__);
2108 
2109 	input_clear(ictx);
2110 	input_start_timer(ictx);
2111 	ictx->last = -1;
2112 }
2113 
2114 /* OSC terminator (ST) received. */
2115 static void
2116 input_exit_osc(struct input_ctx *ictx)
2117 {
2118 	u_char	*p = ictx->input_buf;
2119 	u_int	 option;
2120 
2121 	if (ictx->flags & INPUT_DISCARD)
2122 		return;
2123 	if (ictx->input_len < 1 || *p < '0' || *p > '9')
2124 		return;
2125 
2126 	log_debug("%s: \"%s\" (end %s)", __func__, p,
2127 	    ictx->input_end == INPUT_END_ST ? "ST" : "BEL");
2128 
2129 	option = 0;
2130 	while (*p >= '0' && *p <= '9')
2131 		option = option * 10 + *p++ - '0';
2132 	if (*p == ';')
2133 		p++;
2134 
2135 	switch (option) {
2136 	case 0:
2137 	case 2:
2138 		if (utf8_isvalid(p)) {
2139 			screen_set_title(ictx->ctx.s, p);
2140 			server_status_window(ictx->wp->window);
2141 		}
2142 		break;
2143 	case 4:
2144 		input_osc_4(ictx, p);
2145 		break;
2146 	case 10:
2147 		input_osc_10(ictx, p);
2148 		break;
2149 	case 11:
2150 		input_osc_11(ictx, p);
2151 		break;
2152 	case 12:
2153 		if (utf8_isvalid(p) && *p != '?') /* ? is colour request */
2154 			screen_set_cursor_colour(ictx->ctx.s, p);
2155 		break;
2156 	case 52:
2157 		input_osc_52(ictx, p);
2158 		break;
2159 	case 104:
2160 		input_osc_104(ictx, p);
2161 		break;
2162 	case 112:
2163 		if (*p == '\0') /* no arguments allowed */
2164 			screen_set_cursor_colour(ictx->ctx.s, "");
2165 		break;
2166 	default:
2167 		log_debug("%s: unknown '%u'", __func__, option);
2168 		break;
2169 	}
2170 }
2171 
2172 /* APC string started. */
2173 static void
2174 input_enter_apc(struct input_ctx *ictx)
2175 {
2176 	log_debug("%s", __func__);
2177 
2178 	input_clear(ictx);
2179 	input_start_timer(ictx);
2180 	ictx->last = -1;
2181 }
2182 
2183 /* APC terminator (ST) received. */
2184 static void
2185 input_exit_apc(struct input_ctx *ictx)
2186 {
2187 	if (ictx->flags & INPUT_DISCARD)
2188 		return;
2189 	log_debug("%s: \"%s\"", __func__, ictx->input_buf);
2190 
2191 	if (!utf8_isvalid(ictx->input_buf))
2192 		return;
2193 	screen_set_title(ictx->ctx.s, ictx->input_buf);
2194 	server_status_window(ictx->wp->window);
2195 }
2196 
2197 /* Rename string started. */
2198 static void
2199 input_enter_rename(struct input_ctx *ictx)
2200 {
2201 	log_debug("%s", __func__);
2202 
2203 	input_clear(ictx);
2204 	input_start_timer(ictx);
2205 	ictx->last = -1;
2206 }
2207 
2208 /* Rename terminator (ST) received. */
2209 static void
2210 input_exit_rename(struct input_ctx *ictx)
2211 {
2212 	if (ictx->flags & INPUT_DISCARD)
2213 		return;
2214 	if (!options_get_number(ictx->wp->window->options, "allow-rename"))
2215 		return;
2216 	log_debug("%s: \"%s\"", __func__, ictx->input_buf);
2217 
2218 	if (!utf8_isvalid(ictx->input_buf))
2219 		return;
2220 	window_set_name(ictx->wp->window, ictx->input_buf);
2221 	options_set_number(ictx->wp->window->options, "automatic-rename", 0);
2222 	server_status_window(ictx->wp->window);
2223 }
2224 
2225 /* Open UTF-8 character. */
2226 static int
2227 input_top_bit_set(struct input_ctx *ictx)
2228 {
2229 	struct utf8_data	*ud = &ictx->utf8data;
2230 
2231 	ictx->last = -1;
2232 
2233 	if (!ictx->utf8started) {
2234 		if (utf8_open(ud, ictx->ch) != UTF8_MORE)
2235 			return (0);
2236 		ictx->utf8started = 1;
2237 		return (0);
2238 	}
2239 
2240 	switch (utf8_append(ud, ictx->ch)) {
2241 	case UTF8_MORE:
2242 		return (0);
2243 	case UTF8_ERROR:
2244 		ictx->utf8started = 0;
2245 		return (0);
2246 	case UTF8_DONE:
2247 		break;
2248 	}
2249 	ictx->utf8started = 0;
2250 
2251 	log_debug("%s %hhu '%*s' (width %hhu)", __func__, ud->size,
2252 	    (int)ud->size, ud->data, ud->width);
2253 
2254 	utf8_copy(&ictx->cell.cell.data, ud);
2255 	screen_write_collect_add(&ictx->ctx, &ictx->cell.cell);
2256 
2257 	return (0);
2258 }
2259 
2260 /* Handle the OSC 4 sequence for setting (multiple) palette entries. */
2261 static void
2262 input_osc_4(struct input_ctx *ictx, const char *p)
2263 {
2264 	struct window_pane	*wp = ictx->wp;
2265 	char			*copy, *s, *next = NULL;
2266 	long	 		idx;
2267 	u_int			 r, g, b;
2268 
2269 	copy = s = xstrdup(p);
2270 	while (s != NULL && *s != '\0') {
2271 		idx = strtol(s, &next, 10);
2272 		if (*next++ != ';')
2273 			goto bad;
2274 		if (idx < 0 || idx >= 0x100)
2275 			goto bad;
2276 
2277 		s = strsep(&next, ";");
2278 		if (sscanf(s, "rgb:%2x/%2x/%2x", &r, &g, &b) != 3) {
2279 			s = next;
2280 			continue;
2281 		}
2282 
2283 		window_pane_set_palette(wp, idx, colour_join_rgb(r, g, b));
2284 		s = next;
2285 	}
2286 
2287 	free(copy);
2288 	return;
2289 
2290 bad:
2291 	log_debug("bad OSC 4: %s", p);
2292 	free(copy);
2293 }
2294 
2295 /* Handle the OSC 10 sequence for setting foreground colour. */
2296 static void
2297 input_osc_10(struct input_ctx *ictx, const char *p)
2298 {
2299 	struct window_pane	*wp = ictx->wp;
2300 	u_int			 r, g, b;
2301 
2302 	if (sscanf(p, "rgb:%2x/%2x/%2x", &r, &g, &b) != 3)
2303 	    goto bad;
2304 
2305 	wp->colgc.fg = colour_join_rgb(r, g, b);
2306 	wp->flags |= PANE_REDRAW;
2307 
2308 	return;
2309 
2310 bad:
2311 	log_debug("bad OSC 10: %s", p);
2312 }
2313 
2314 /* Handle the OSC 11 sequence for setting background colour. */
2315 static void
2316 input_osc_11(struct input_ctx *ictx, const char *p)
2317 {
2318 	struct window_pane	*wp = ictx->wp;
2319 	u_int			 r, g, b;
2320 
2321 	if (sscanf(p, "rgb:%2x/%2x/%2x", &r, &g, &b) != 3)
2322 	    goto bad;
2323 
2324 	wp->colgc.bg = colour_join_rgb(r, g, b);
2325 	wp->flags |= PANE_REDRAW;
2326 
2327 	return;
2328 
2329 bad:
2330 	log_debug("bad OSC 11: %s", p);
2331 }
2332 
2333 /* Handle the OSC 52 sequence for setting the clipboard. */
2334 static void
2335 input_osc_52(struct input_ctx *ictx, const char *p)
2336 {
2337 	struct window_pane	*wp = ictx->wp;
2338 	char			*end;
2339 	const char		*buf;
2340 	size_t			 len;
2341 	u_char			*out;
2342 	int			 outlen, state;
2343 	struct screen_write_ctx	 ctx;
2344 	struct paste_buffer	*pb;
2345 
2346 	state = options_get_number(global_options, "set-clipboard");
2347 	if (state != 2)
2348 		return;
2349 
2350 	if ((end = strchr(p, ';')) == NULL)
2351 		return;
2352 	end++;
2353 	if (*end == '\0')
2354 		return;
2355 	log_debug("%s: %s", __func__, end);
2356 
2357 	if (strcmp(end, "?") == 0) {
2358 		if ((pb = paste_get_top(NULL)) != NULL) {
2359 			buf = paste_buffer_data(pb, &len);
2360 			outlen = 4 * ((len + 2) / 3) + 1;
2361 			out = xmalloc(outlen);
2362 			if ((outlen = b64_ntop(buf, len, out, outlen)) == -1) {
2363 				abort();
2364 				free(out);
2365 				return;
2366 			}
2367 		} else {
2368 			outlen = 0;
2369 			out = NULL;
2370 		}
2371 		bufferevent_write(wp->event, "\033]52;;", 6);
2372 		if (outlen != 0)
2373 			bufferevent_write(wp->event, out, outlen);
2374 		if (ictx->input_end == INPUT_END_BEL)
2375 			bufferevent_write(wp->event, "\007", 1);
2376 		else
2377 			bufferevent_write(wp->event, "\033\\", 2);
2378 		free(out);
2379 		return;
2380 	}
2381 
2382 	len = (strlen(end) / 4) * 3;
2383 	if (len == 0)
2384 		return;
2385 
2386 	out = xmalloc(len);
2387 	if ((outlen = b64_pton(end, out, len)) == -1) {
2388 		free(out);
2389 		return;
2390 	}
2391 
2392 	screen_write_start(&ctx, wp, NULL);
2393 	screen_write_setselection(&ctx, out, outlen);
2394 	screen_write_stop(&ctx);
2395 	notify_pane("pane-set-clipboard", wp);
2396 
2397 	paste_add(out, outlen);
2398 }
2399 
2400 /* Handle the OSC 104 sequence for unsetting (multiple) palette entries. */
2401 static void
2402 input_osc_104(struct input_ctx *ictx, const char *p)
2403 {
2404 	struct window_pane	*wp = ictx->wp;
2405 	char			*copy, *s;
2406 	long			idx;
2407 
2408 	if (*p == '\0') {
2409 		window_pane_reset_palette(wp);
2410 		return;
2411 	}
2412 
2413 	copy = s = xstrdup(p);
2414 	while (*s != '\0') {
2415 		idx = strtol(s, &s, 10);
2416 		if (*s != '\0' && *s != ';')
2417 			goto bad;
2418 		if (idx < 0 || idx >= 0x100)
2419 			goto bad;
2420 
2421 		window_pane_unset_palette(wp, idx);
2422 		if (*s == ';')
2423 			s++;
2424 	}
2425 	free(copy);
2426 	return;
2427 
2428 bad:
2429 	log_debug("bad OSC 104: %s", p);
2430 	free(copy);
2431 }
2432