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 #include <sys/types.h>
20eda6f593SDavid van Moolenbroek
21eda6f593SDavid van Moolenbroek #include <stdlib.h>
22eda6f593SDavid van Moolenbroek #include <string.h>
23eda6f593SDavid van Moolenbroek
24eda6f593SDavid van Moolenbroek #include "tmux.h"
25eda6f593SDavid van Moolenbroek
26eda6f593SDavid van Moolenbroek /*
27eda6f593SDavid van Moolenbroek * Based on the description by Paul Williams at:
28eda6f593SDavid van Moolenbroek *
29eda6f593SDavid van Moolenbroek * http://vt100.net/emu/dec_ansi_parser
30eda6f593SDavid van Moolenbroek *
31eda6f593SDavid van Moolenbroek * With the following changes:
32eda6f593SDavid van Moolenbroek *
33eda6f593SDavid van Moolenbroek * - 7-bit only.
34eda6f593SDavid van Moolenbroek *
35eda6f593SDavid van Moolenbroek * - Support for UTF-8.
36eda6f593SDavid van Moolenbroek *
37eda6f593SDavid van Moolenbroek * - OSC (but not APC) may be terminated by \007 as well as ST.
38eda6f593SDavid van Moolenbroek *
39eda6f593SDavid van Moolenbroek * - A state for APC similar to OSC. Some terminals appear to use this to set
40eda6f593SDavid van Moolenbroek * the title.
41eda6f593SDavid van Moolenbroek *
42eda6f593SDavid van Moolenbroek * - A state for the screen \033k...\033\\ sequence to rename a window. This is
43eda6f593SDavid van Moolenbroek * pretty stupid but not supporting it is more trouble than it is worth.
44eda6f593SDavid van Moolenbroek *
45eda6f593SDavid van Moolenbroek * - Special handling for ESC inside a DCS to allow arbitrary byte sequences to
46eda6f593SDavid van Moolenbroek * be passed to the underlying teminal(s).
47eda6f593SDavid van Moolenbroek */
48eda6f593SDavid van Moolenbroek
49eda6f593SDavid van Moolenbroek /* Helper functions. */
50*0a6a1f1dSLionel Sambuc struct input_transition;
51eda6f593SDavid van Moolenbroek int input_split(struct input_ctx *);
52eda6f593SDavid van Moolenbroek int input_get(struct input_ctx *, u_int, int, int);
53*0a6a1f1dSLionel Sambuc void input_reply(struct input_ctx *, const char *, ...) __printflike(2, 3);
54*0a6a1f1dSLionel Sambuc void input_set_state(struct window_pane *, const struct input_transition *);
55eda6f593SDavid van Moolenbroek
56eda6f593SDavid van Moolenbroek /* Transition entry/exit handlers. */
57eda6f593SDavid van Moolenbroek void input_clear(struct input_ctx *);
58eda6f593SDavid van Moolenbroek void input_enter_osc(struct input_ctx *);
59eda6f593SDavid van Moolenbroek void input_exit_osc(struct input_ctx *);
60eda6f593SDavid van Moolenbroek void input_enter_apc(struct input_ctx *);
61eda6f593SDavid van Moolenbroek void input_exit_apc(struct input_ctx *);
62eda6f593SDavid van Moolenbroek void input_enter_rename(struct input_ctx *);
63eda6f593SDavid van Moolenbroek void input_exit_rename(struct input_ctx *);
64eda6f593SDavid van Moolenbroek
65eda6f593SDavid van Moolenbroek /* Input state handlers. */
66eda6f593SDavid van Moolenbroek int input_print(struct input_ctx *);
67eda6f593SDavid van Moolenbroek int input_intermediate(struct input_ctx *);
68eda6f593SDavid van Moolenbroek int input_parameter(struct input_ctx *);
69eda6f593SDavid van Moolenbroek int input_input(struct input_ctx *);
70eda6f593SDavid van Moolenbroek int input_c0_dispatch(struct input_ctx *);
71eda6f593SDavid van Moolenbroek int input_esc_dispatch(struct input_ctx *);
72eda6f593SDavid van Moolenbroek int input_csi_dispatch(struct input_ctx *);
73*0a6a1f1dSLionel Sambuc void input_csi_dispatch_rm(struct input_ctx *);
74*0a6a1f1dSLionel Sambuc void input_csi_dispatch_rm_private(struct input_ctx *);
75*0a6a1f1dSLionel Sambuc void input_csi_dispatch_sm(struct input_ctx *);
76*0a6a1f1dSLionel Sambuc void input_csi_dispatch_sm_private(struct input_ctx *);
77*0a6a1f1dSLionel Sambuc void input_csi_dispatch_winops(struct input_ctx *);
78eda6f593SDavid van Moolenbroek void input_csi_dispatch_sgr(struct input_ctx *);
79eda6f593SDavid van Moolenbroek int input_dcs_dispatch(struct input_ctx *);
80eda6f593SDavid van Moolenbroek int input_utf8_open(struct input_ctx *);
81eda6f593SDavid van Moolenbroek int input_utf8_add(struct input_ctx *);
82eda6f593SDavid van Moolenbroek int input_utf8_close(struct input_ctx *);
83eda6f593SDavid van Moolenbroek
84eda6f593SDavid van Moolenbroek /* Command table comparison function. */
85eda6f593SDavid van Moolenbroek int input_table_compare(const void *, const void *);
86eda6f593SDavid van Moolenbroek
87eda6f593SDavid van Moolenbroek /* Command table entry. */
88eda6f593SDavid van Moolenbroek struct input_table_entry {
89eda6f593SDavid van Moolenbroek int ch;
90eda6f593SDavid van Moolenbroek const char *interm;
91eda6f593SDavid van Moolenbroek int type;
92eda6f593SDavid van Moolenbroek };
93eda6f593SDavid van Moolenbroek
94eda6f593SDavid van Moolenbroek /* Escape commands. */
95eda6f593SDavid van Moolenbroek enum input_esc_type {
96eda6f593SDavid van Moolenbroek INPUT_ESC_DECALN,
97eda6f593SDavid van Moolenbroek INPUT_ESC_DECKPAM,
98eda6f593SDavid van Moolenbroek INPUT_ESC_DECKPNM,
99eda6f593SDavid van Moolenbroek INPUT_ESC_DECRC,
100eda6f593SDavid van Moolenbroek INPUT_ESC_DECSC,
101eda6f593SDavid van Moolenbroek INPUT_ESC_HTS,
102eda6f593SDavid van Moolenbroek INPUT_ESC_IND,
103eda6f593SDavid van Moolenbroek INPUT_ESC_NEL,
104eda6f593SDavid van Moolenbroek INPUT_ESC_RI,
105eda6f593SDavid van Moolenbroek INPUT_ESC_RIS,
106eda6f593SDavid van Moolenbroek INPUT_ESC_SCSOFF_G0,
107eda6f593SDavid van Moolenbroek INPUT_ESC_SCSON_G0,
108eda6f593SDavid van Moolenbroek };
109eda6f593SDavid van Moolenbroek
110eda6f593SDavid van Moolenbroek /* Escape command table. */
111eda6f593SDavid van Moolenbroek const struct input_table_entry input_esc_table[] = {
112eda6f593SDavid van Moolenbroek { '0', "(", INPUT_ESC_SCSOFF_G0 },
113eda6f593SDavid van Moolenbroek { '7', "", INPUT_ESC_DECSC },
114eda6f593SDavid van Moolenbroek { '8', "", INPUT_ESC_DECRC },
115eda6f593SDavid van Moolenbroek { '8', "#", INPUT_ESC_DECALN },
116eda6f593SDavid van Moolenbroek { '=', "", INPUT_ESC_DECKPAM },
117eda6f593SDavid van Moolenbroek { '>', "", INPUT_ESC_DECKPNM },
118eda6f593SDavid van Moolenbroek { 'B', "(", INPUT_ESC_SCSON_G0 },
119eda6f593SDavid van Moolenbroek { 'D', "", INPUT_ESC_IND },
120eda6f593SDavid van Moolenbroek { 'E', "", INPUT_ESC_NEL },
121eda6f593SDavid van Moolenbroek { 'H', "", INPUT_ESC_HTS },
122eda6f593SDavid van Moolenbroek { 'M', "", INPUT_ESC_RI },
123eda6f593SDavid van Moolenbroek { 'c', "", INPUT_ESC_RIS },
124eda6f593SDavid van Moolenbroek };
125eda6f593SDavid van Moolenbroek
126eda6f593SDavid van Moolenbroek /* Control (CSI) commands. */
127eda6f593SDavid van Moolenbroek enum input_csi_type {
128eda6f593SDavid van Moolenbroek INPUT_CSI_CBT,
129*0a6a1f1dSLionel Sambuc INPUT_CSI_CNL,
130*0a6a1f1dSLionel Sambuc INPUT_CSI_CPL,
131eda6f593SDavid van Moolenbroek INPUT_CSI_CUB,
132eda6f593SDavid van Moolenbroek INPUT_CSI_CUD,
133eda6f593SDavid van Moolenbroek INPUT_CSI_CUF,
134eda6f593SDavid van Moolenbroek INPUT_CSI_CUP,
135eda6f593SDavid van Moolenbroek INPUT_CSI_CUU,
136eda6f593SDavid van Moolenbroek INPUT_CSI_DA,
137*0a6a1f1dSLionel Sambuc INPUT_CSI_DA_TWO,
138eda6f593SDavid van Moolenbroek INPUT_CSI_DCH,
139eda6f593SDavid van Moolenbroek INPUT_CSI_DECSCUSR,
140eda6f593SDavid van Moolenbroek INPUT_CSI_DECSTBM,
141eda6f593SDavid van Moolenbroek INPUT_CSI_DL,
142eda6f593SDavid van Moolenbroek INPUT_CSI_DSR,
143*0a6a1f1dSLionel Sambuc INPUT_CSI_ECH,
144eda6f593SDavid van Moolenbroek INPUT_CSI_ED,
145eda6f593SDavid van Moolenbroek INPUT_CSI_EL,
146eda6f593SDavid van Moolenbroek INPUT_CSI_HPA,
147eda6f593SDavid van Moolenbroek INPUT_CSI_ICH,
148eda6f593SDavid van Moolenbroek INPUT_CSI_IL,
149*0a6a1f1dSLionel Sambuc INPUT_CSI_RCP,
150eda6f593SDavid van Moolenbroek INPUT_CSI_RM,
151eda6f593SDavid van Moolenbroek INPUT_CSI_RM_PRIVATE,
152*0a6a1f1dSLionel Sambuc INPUT_CSI_SCP,
153eda6f593SDavid van Moolenbroek INPUT_CSI_SGR,
154eda6f593SDavid van Moolenbroek INPUT_CSI_SM,
155eda6f593SDavid van Moolenbroek INPUT_CSI_SM_PRIVATE,
156eda6f593SDavid van Moolenbroek INPUT_CSI_TBC,
157eda6f593SDavid van Moolenbroek INPUT_CSI_VPA,
158*0a6a1f1dSLionel Sambuc INPUT_CSI_WINOPS,
159eda6f593SDavid van Moolenbroek };
160eda6f593SDavid van Moolenbroek
161eda6f593SDavid van Moolenbroek /* Control (CSI) command table. */
162eda6f593SDavid van Moolenbroek const struct input_table_entry input_csi_table[] = {
163eda6f593SDavid van Moolenbroek { '@', "", INPUT_CSI_ICH },
164eda6f593SDavid van Moolenbroek { 'A', "", INPUT_CSI_CUU },
165eda6f593SDavid van Moolenbroek { 'B', "", INPUT_CSI_CUD },
166eda6f593SDavid van Moolenbroek { 'C', "", INPUT_CSI_CUF },
167eda6f593SDavid van Moolenbroek { 'D', "", INPUT_CSI_CUB },
168*0a6a1f1dSLionel Sambuc { 'E', "", INPUT_CSI_CNL },
169*0a6a1f1dSLionel Sambuc { 'F', "", INPUT_CSI_CPL },
170eda6f593SDavid van Moolenbroek { 'G', "", INPUT_CSI_HPA },
171eda6f593SDavid van Moolenbroek { 'H', "", INPUT_CSI_CUP },
172eda6f593SDavid van Moolenbroek { 'J', "", INPUT_CSI_ED },
173eda6f593SDavid van Moolenbroek { 'K', "", INPUT_CSI_EL },
174eda6f593SDavid van Moolenbroek { 'L', "", INPUT_CSI_IL },
175eda6f593SDavid van Moolenbroek { 'M', "", INPUT_CSI_DL },
176eda6f593SDavid van Moolenbroek { 'P', "", INPUT_CSI_DCH },
177*0a6a1f1dSLionel Sambuc { 'X', "", INPUT_CSI_ECH },
178eda6f593SDavid van Moolenbroek { 'Z', "", INPUT_CSI_CBT },
179eda6f593SDavid van Moolenbroek { 'c', "", INPUT_CSI_DA },
180*0a6a1f1dSLionel Sambuc { 'c', ">", INPUT_CSI_DA_TWO },
181eda6f593SDavid van Moolenbroek { 'd', "", INPUT_CSI_VPA },
182eda6f593SDavid van Moolenbroek { 'f', "", INPUT_CSI_CUP },
183eda6f593SDavid van Moolenbroek { 'g', "", INPUT_CSI_TBC },
184eda6f593SDavid van Moolenbroek { 'h', "", INPUT_CSI_SM },
185eda6f593SDavid van Moolenbroek { 'h', "?", INPUT_CSI_SM_PRIVATE },
186eda6f593SDavid van Moolenbroek { 'l', "", INPUT_CSI_RM },
187eda6f593SDavid van Moolenbroek { 'l', "?", INPUT_CSI_RM_PRIVATE },
188eda6f593SDavid van Moolenbroek { 'm', "", INPUT_CSI_SGR },
189eda6f593SDavid van Moolenbroek { 'n', "", INPUT_CSI_DSR },
190eda6f593SDavid van Moolenbroek { 'q', " ", INPUT_CSI_DECSCUSR },
191eda6f593SDavid van Moolenbroek { 'r', "", INPUT_CSI_DECSTBM },
192*0a6a1f1dSLionel Sambuc { 's', "", INPUT_CSI_SCP },
193*0a6a1f1dSLionel Sambuc { 't', "", INPUT_CSI_WINOPS },
194*0a6a1f1dSLionel Sambuc { 'u', "", INPUT_CSI_RCP },
195eda6f593SDavid van Moolenbroek };
196eda6f593SDavid van Moolenbroek
197eda6f593SDavid van Moolenbroek /* Input transition. */
198eda6f593SDavid van Moolenbroek struct input_transition {
199eda6f593SDavid van Moolenbroek int first;
200eda6f593SDavid van Moolenbroek int last;
201eda6f593SDavid van Moolenbroek
202eda6f593SDavid van Moolenbroek int (*handler)(struct input_ctx *);
203eda6f593SDavid van Moolenbroek const struct input_state *state;
204eda6f593SDavid van Moolenbroek };
205eda6f593SDavid van Moolenbroek
206eda6f593SDavid van Moolenbroek /* Input state. */
207eda6f593SDavid van Moolenbroek struct input_state {
208eda6f593SDavid van Moolenbroek const char *name;
209eda6f593SDavid van Moolenbroek void (*enter)(struct input_ctx *);
210eda6f593SDavid van Moolenbroek void (*exit)(struct input_ctx *);
211eda6f593SDavid van Moolenbroek const struct input_transition *transitions;
212eda6f593SDavid van Moolenbroek };
213eda6f593SDavid van Moolenbroek
214eda6f593SDavid van Moolenbroek /* State transitions available from all states. */
215eda6f593SDavid van Moolenbroek #define INPUT_STATE_ANYWHERE \
216eda6f593SDavid van Moolenbroek { 0x18, 0x18, input_c0_dispatch, &input_state_ground }, \
217eda6f593SDavid van Moolenbroek { 0x1a, 0x1a, input_c0_dispatch, &input_state_ground }, \
218eda6f593SDavid van Moolenbroek { 0x1b, 0x1b, NULL, &input_state_esc_enter }
219eda6f593SDavid van Moolenbroek
220eda6f593SDavid van Moolenbroek /* Forward declarations of state tables. */
221eda6f593SDavid van Moolenbroek const struct input_transition input_state_ground_table[];
222eda6f593SDavid van Moolenbroek const struct input_transition input_state_esc_enter_table[];
223eda6f593SDavid van Moolenbroek const struct input_transition input_state_esc_intermediate_table[];
224eda6f593SDavid van Moolenbroek const struct input_transition input_state_csi_enter_table[];
225eda6f593SDavid van Moolenbroek const struct input_transition input_state_csi_parameter_table[];
226eda6f593SDavid van Moolenbroek const struct input_transition input_state_csi_intermediate_table[];
227eda6f593SDavid van Moolenbroek const struct input_transition input_state_csi_ignore_table[];
228eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_enter_table[];
229eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_parameter_table[];
230eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_intermediate_table[];
231eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_handler_table[];
232eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_escape_table[];
233eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_ignore_table[];
234eda6f593SDavid van Moolenbroek const struct input_transition input_state_osc_string_table[];
235eda6f593SDavid van Moolenbroek const struct input_transition input_state_apc_string_table[];
236eda6f593SDavid van Moolenbroek const struct input_transition input_state_rename_string_table[];
237eda6f593SDavid van Moolenbroek const struct input_transition input_state_consume_st_table[];
238eda6f593SDavid van Moolenbroek const struct input_transition input_state_utf8_three_table[];
239eda6f593SDavid van Moolenbroek const struct input_transition input_state_utf8_two_table[];
240eda6f593SDavid van Moolenbroek const struct input_transition input_state_utf8_one_table[];
241eda6f593SDavid van Moolenbroek
242eda6f593SDavid van Moolenbroek /* ground state definition. */
243eda6f593SDavid van Moolenbroek const struct input_state input_state_ground = {
244eda6f593SDavid van Moolenbroek "ground",
245eda6f593SDavid van Moolenbroek NULL, NULL,
246eda6f593SDavid van Moolenbroek input_state_ground_table
247eda6f593SDavid van Moolenbroek };
248eda6f593SDavid van Moolenbroek
249eda6f593SDavid van Moolenbroek /* esc_enter state definition. */
250eda6f593SDavid van Moolenbroek const struct input_state input_state_esc_enter = {
251eda6f593SDavid van Moolenbroek "esc_enter",
252eda6f593SDavid van Moolenbroek input_clear, NULL,
253eda6f593SDavid van Moolenbroek input_state_esc_enter_table
254eda6f593SDavid van Moolenbroek };
255eda6f593SDavid van Moolenbroek
256eda6f593SDavid van Moolenbroek /* esc_intermediate state definition. */
257eda6f593SDavid van Moolenbroek const struct input_state input_state_esc_intermediate = {
258eda6f593SDavid van Moolenbroek "esc_intermediate",
259eda6f593SDavid van Moolenbroek NULL, NULL,
260eda6f593SDavid van Moolenbroek input_state_esc_intermediate_table
261eda6f593SDavid van Moolenbroek };
262eda6f593SDavid van Moolenbroek
263eda6f593SDavid van Moolenbroek /* csi_enter state definition. */
264eda6f593SDavid van Moolenbroek const struct input_state input_state_csi_enter = {
265eda6f593SDavid van Moolenbroek "csi_enter",
266eda6f593SDavid van Moolenbroek input_clear, NULL,
267eda6f593SDavid van Moolenbroek input_state_csi_enter_table
268eda6f593SDavid van Moolenbroek };
269eda6f593SDavid van Moolenbroek
270eda6f593SDavid van Moolenbroek /* csi_parameter state definition. */
271eda6f593SDavid van Moolenbroek const struct input_state input_state_csi_parameter = {
272eda6f593SDavid van Moolenbroek "csi_parameter",
273eda6f593SDavid van Moolenbroek NULL, NULL,
274eda6f593SDavid van Moolenbroek input_state_csi_parameter_table
275eda6f593SDavid van Moolenbroek };
276eda6f593SDavid van Moolenbroek
277eda6f593SDavid van Moolenbroek /* csi_intermediate state definition. */
278eda6f593SDavid van Moolenbroek const struct input_state input_state_csi_intermediate = {
279eda6f593SDavid van Moolenbroek "csi_intermediate",
280eda6f593SDavid van Moolenbroek NULL, NULL,
281eda6f593SDavid van Moolenbroek input_state_csi_intermediate_table
282eda6f593SDavid van Moolenbroek };
283eda6f593SDavid van Moolenbroek
284eda6f593SDavid van Moolenbroek /* csi_ignore state definition. */
285eda6f593SDavid van Moolenbroek const struct input_state input_state_csi_ignore = {
286eda6f593SDavid van Moolenbroek "csi_ignore",
287eda6f593SDavid van Moolenbroek NULL, NULL,
288eda6f593SDavid van Moolenbroek input_state_csi_ignore_table
289eda6f593SDavid van Moolenbroek };
290eda6f593SDavid van Moolenbroek
291eda6f593SDavid van Moolenbroek /* dcs_enter state definition. */
292eda6f593SDavid van Moolenbroek const struct input_state input_state_dcs_enter = {
293eda6f593SDavid van Moolenbroek "dcs_enter",
294eda6f593SDavid van Moolenbroek input_clear, NULL,
295eda6f593SDavid van Moolenbroek input_state_dcs_enter_table
296eda6f593SDavid van Moolenbroek };
297eda6f593SDavid van Moolenbroek
298eda6f593SDavid van Moolenbroek /* dcs_parameter state definition. */
299eda6f593SDavid van Moolenbroek const struct input_state input_state_dcs_parameter = {
300eda6f593SDavid van Moolenbroek "dcs_parameter",
301eda6f593SDavid van Moolenbroek NULL, NULL,
302eda6f593SDavid van Moolenbroek input_state_dcs_parameter_table
303eda6f593SDavid van Moolenbroek };
304eda6f593SDavid van Moolenbroek
305eda6f593SDavid van Moolenbroek /* dcs_intermediate state definition. */
306eda6f593SDavid van Moolenbroek const struct input_state input_state_dcs_intermediate = {
307eda6f593SDavid van Moolenbroek "dcs_intermediate",
308eda6f593SDavid van Moolenbroek NULL, NULL,
309eda6f593SDavid van Moolenbroek input_state_dcs_intermediate_table
310eda6f593SDavid van Moolenbroek };
311eda6f593SDavid van Moolenbroek
312eda6f593SDavid van Moolenbroek /* dcs_handler state definition. */
313eda6f593SDavid van Moolenbroek const struct input_state input_state_dcs_handler = {
314eda6f593SDavid van Moolenbroek "dcs_handler",
315eda6f593SDavid van Moolenbroek NULL, NULL,
316eda6f593SDavid van Moolenbroek input_state_dcs_handler_table
317eda6f593SDavid van Moolenbroek };
318eda6f593SDavid van Moolenbroek
319eda6f593SDavid van Moolenbroek /* dcs_escape state definition. */
320eda6f593SDavid van Moolenbroek const struct input_state input_state_dcs_escape = {
321eda6f593SDavid van Moolenbroek "dcs_escape",
322eda6f593SDavid van Moolenbroek NULL, NULL,
323eda6f593SDavid van Moolenbroek input_state_dcs_escape_table
324eda6f593SDavid van Moolenbroek };
325eda6f593SDavid van Moolenbroek
326eda6f593SDavid van Moolenbroek /* dcs_ignore state definition. */
327eda6f593SDavid van Moolenbroek const struct input_state input_state_dcs_ignore = {
328eda6f593SDavid van Moolenbroek "dcs_ignore",
329eda6f593SDavid van Moolenbroek NULL, NULL,
330eda6f593SDavid van Moolenbroek input_state_dcs_ignore_table
331eda6f593SDavid van Moolenbroek };
332eda6f593SDavid van Moolenbroek
333eda6f593SDavid van Moolenbroek /* osc_string state definition. */
334eda6f593SDavid van Moolenbroek const struct input_state input_state_osc_string = {
335eda6f593SDavid van Moolenbroek "osc_string",
336eda6f593SDavid van Moolenbroek input_enter_osc, input_exit_osc,
337eda6f593SDavid van Moolenbroek input_state_osc_string_table
338eda6f593SDavid van Moolenbroek };
339eda6f593SDavid van Moolenbroek
340eda6f593SDavid van Moolenbroek /* apc_string state definition. */
341eda6f593SDavid van Moolenbroek const struct input_state input_state_apc_string = {
342eda6f593SDavid van Moolenbroek "apc_string",
343eda6f593SDavid van Moolenbroek input_enter_apc, input_exit_apc,
344eda6f593SDavid van Moolenbroek input_state_apc_string_table
345eda6f593SDavid van Moolenbroek };
346eda6f593SDavid van Moolenbroek
347eda6f593SDavid van Moolenbroek /* rename_string state definition. */
348eda6f593SDavid van Moolenbroek const struct input_state input_state_rename_string = {
349eda6f593SDavid van Moolenbroek "rename_string",
350eda6f593SDavid van Moolenbroek input_enter_rename, input_exit_rename,
351eda6f593SDavid van Moolenbroek input_state_rename_string_table
352eda6f593SDavid van Moolenbroek };
353eda6f593SDavid van Moolenbroek
354eda6f593SDavid van Moolenbroek /* consume_st state definition. */
355eda6f593SDavid van Moolenbroek const struct input_state input_state_consume_st = {
356eda6f593SDavid van Moolenbroek "consume_st",
357eda6f593SDavid van Moolenbroek NULL, NULL,
358eda6f593SDavid van Moolenbroek input_state_consume_st_table
359eda6f593SDavid van Moolenbroek };
360eda6f593SDavid van Moolenbroek
361eda6f593SDavid van Moolenbroek /* utf8_three state definition. */
362eda6f593SDavid van Moolenbroek const struct input_state input_state_utf8_three = {
363eda6f593SDavid van Moolenbroek "utf8_three",
364eda6f593SDavid van Moolenbroek NULL, NULL,
365eda6f593SDavid van Moolenbroek input_state_utf8_three_table
366eda6f593SDavid van Moolenbroek };
367eda6f593SDavid van Moolenbroek
368eda6f593SDavid van Moolenbroek /* utf8_two state definition. */
369eda6f593SDavid van Moolenbroek const struct input_state input_state_utf8_two = {
370eda6f593SDavid van Moolenbroek "utf8_two",
371eda6f593SDavid van Moolenbroek NULL, NULL,
372eda6f593SDavid van Moolenbroek input_state_utf8_two_table
373eda6f593SDavid van Moolenbroek };
374eda6f593SDavid van Moolenbroek
375eda6f593SDavid van Moolenbroek /* utf8_one state definition. */
376eda6f593SDavid van Moolenbroek const struct input_state input_state_utf8_one = {
377eda6f593SDavid van Moolenbroek "utf8_one",
378eda6f593SDavid van Moolenbroek NULL, NULL,
379eda6f593SDavid van Moolenbroek input_state_utf8_one_table
380eda6f593SDavid van Moolenbroek };
381eda6f593SDavid van Moolenbroek
382eda6f593SDavid van Moolenbroek /* ground state table. */
383eda6f593SDavid van Moolenbroek const struct input_transition input_state_ground_table[] = {
384eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
385eda6f593SDavid van Moolenbroek
386eda6f593SDavid van Moolenbroek { 0x00, 0x17, input_c0_dispatch, NULL },
387eda6f593SDavid van Moolenbroek { 0x19, 0x19, input_c0_dispatch, NULL },
388eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, input_c0_dispatch, NULL },
389eda6f593SDavid van Moolenbroek { 0x20, 0x7e, input_print, NULL },
390eda6f593SDavid van Moolenbroek { 0x7f, 0x7f, NULL, NULL },
391eda6f593SDavid van Moolenbroek { 0x80, 0xc1, input_print, NULL },
392eda6f593SDavid van Moolenbroek { 0xc2, 0xdf, input_utf8_open, &input_state_utf8_one },
393eda6f593SDavid van Moolenbroek { 0xe0, 0xef, input_utf8_open, &input_state_utf8_two },
394eda6f593SDavid van Moolenbroek { 0xf0, 0xf4, input_utf8_open, &input_state_utf8_three },
395eda6f593SDavid van Moolenbroek { 0xf5, 0xff, input_print, NULL },
396eda6f593SDavid van Moolenbroek
397eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
398eda6f593SDavid van Moolenbroek };
399eda6f593SDavid van Moolenbroek
400eda6f593SDavid van Moolenbroek /* esc_enter state table. */
401eda6f593SDavid van Moolenbroek const struct input_transition input_state_esc_enter_table[] = {
402eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
403eda6f593SDavid van Moolenbroek
404eda6f593SDavid van Moolenbroek { 0x00, 0x17, input_c0_dispatch, NULL },
405eda6f593SDavid van Moolenbroek { 0x19, 0x19, input_c0_dispatch, NULL },
406eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, input_c0_dispatch, NULL },
407eda6f593SDavid van Moolenbroek { 0x20, 0x2f, input_intermediate, &input_state_esc_intermediate },
408eda6f593SDavid van Moolenbroek { 0x30, 0x4f, input_esc_dispatch, &input_state_ground },
409eda6f593SDavid van Moolenbroek { 0x50, 0x50, NULL, &input_state_dcs_enter },
410eda6f593SDavid van Moolenbroek { 0x51, 0x57, input_esc_dispatch, &input_state_ground },
411eda6f593SDavid van Moolenbroek { 0x58, 0x58, NULL, &input_state_consume_st },
412eda6f593SDavid van Moolenbroek { 0x59, 0x59, input_esc_dispatch, &input_state_ground },
413eda6f593SDavid van Moolenbroek { 0x5a, 0x5a, input_esc_dispatch, &input_state_ground },
414eda6f593SDavid van Moolenbroek { 0x5b, 0x5b, NULL, &input_state_csi_enter },
415eda6f593SDavid van Moolenbroek { 0x5c, 0x5c, input_esc_dispatch, &input_state_ground },
416eda6f593SDavid van Moolenbroek { 0x5d, 0x5d, NULL, &input_state_osc_string },
417eda6f593SDavid van Moolenbroek { 0x5e, 0x5e, NULL, &input_state_consume_st },
418eda6f593SDavid van Moolenbroek { 0x5f, 0x5f, NULL, &input_state_apc_string },
419eda6f593SDavid van Moolenbroek { 0x60, 0x6a, input_esc_dispatch, &input_state_ground },
420eda6f593SDavid van Moolenbroek { 0x6b, 0x6b, NULL, &input_state_rename_string },
421eda6f593SDavid van Moolenbroek { 0x6c, 0x7e, input_esc_dispatch, &input_state_ground },
422eda6f593SDavid van Moolenbroek { 0x7f, 0xff, NULL, NULL },
423eda6f593SDavid van Moolenbroek
424eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
425eda6f593SDavid van Moolenbroek };
426eda6f593SDavid van Moolenbroek
427eda6f593SDavid van Moolenbroek /* esc_interm state table. */
428eda6f593SDavid van Moolenbroek const struct input_transition input_state_esc_intermediate_table[] = {
429eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
430eda6f593SDavid van Moolenbroek
431eda6f593SDavid van Moolenbroek { 0x00, 0x17, input_c0_dispatch, NULL },
432eda6f593SDavid van Moolenbroek { 0x19, 0x19, input_c0_dispatch, NULL },
433eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, input_c0_dispatch, NULL },
434eda6f593SDavid van Moolenbroek { 0x20, 0x2f, input_intermediate, NULL },
435eda6f593SDavid van Moolenbroek { 0x30, 0x7e, input_esc_dispatch, &input_state_ground },
436eda6f593SDavid van Moolenbroek { 0x7f, 0xff, NULL, NULL },
437eda6f593SDavid van Moolenbroek
438eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
439eda6f593SDavid van Moolenbroek };
440eda6f593SDavid van Moolenbroek
441eda6f593SDavid van Moolenbroek /* csi_enter state table. */
442eda6f593SDavid van Moolenbroek const struct input_transition input_state_csi_enter_table[] = {
443eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
444eda6f593SDavid van Moolenbroek
445eda6f593SDavid van Moolenbroek { 0x00, 0x17, input_c0_dispatch, NULL },
446eda6f593SDavid van Moolenbroek { 0x19, 0x19, input_c0_dispatch, NULL },
447eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, input_c0_dispatch, NULL },
448eda6f593SDavid van Moolenbroek { 0x20, 0x2f, input_intermediate, &input_state_csi_intermediate },
449eda6f593SDavid van Moolenbroek { 0x30, 0x39, input_parameter, &input_state_csi_parameter },
450eda6f593SDavid van Moolenbroek { 0x3a, 0x3a, NULL, &input_state_csi_ignore },
451eda6f593SDavid van Moolenbroek { 0x3b, 0x3b, input_parameter, &input_state_csi_parameter },
452eda6f593SDavid van Moolenbroek { 0x3c, 0x3f, input_intermediate, &input_state_csi_parameter },
453eda6f593SDavid van Moolenbroek { 0x40, 0x7e, input_csi_dispatch, &input_state_ground },
454eda6f593SDavid van Moolenbroek { 0x7f, 0xff, NULL, NULL },
455eda6f593SDavid van Moolenbroek
456eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
457eda6f593SDavid van Moolenbroek };
458eda6f593SDavid van Moolenbroek
459eda6f593SDavid van Moolenbroek /* csi_parameter state table. */
460eda6f593SDavid van Moolenbroek const struct input_transition input_state_csi_parameter_table[] = {
461eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
462eda6f593SDavid van Moolenbroek
463eda6f593SDavid van Moolenbroek { 0x00, 0x17, input_c0_dispatch, NULL },
464eda6f593SDavid van Moolenbroek { 0x19, 0x19, input_c0_dispatch, NULL },
465eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, input_c0_dispatch, NULL },
466eda6f593SDavid van Moolenbroek { 0x20, 0x2f, input_intermediate, &input_state_csi_intermediate },
467eda6f593SDavid van Moolenbroek { 0x30, 0x39, input_parameter, NULL },
468eda6f593SDavid van Moolenbroek { 0x3a, 0x3a, NULL, &input_state_csi_ignore },
469eda6f593SDavid van Moolenbroek { 0x3b, 0x3b, input_parameter, NULL },
470eda6f593SDavid van Moolenbroek { 0x3c, 0x3f, NULL, &input_state_csi_ignore },
471eda6f593SDavid van Moolenbroek { 0x40, 0x7e, input_csi_dispatch, &input_state_ground },
472eda6f593SDavid van Moolenbroek { 0x7f, 0xff, NULL, NULL },
473eda6f593SDavid van Moolenbroek
474eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
475eda6f593SDavid van Moolenbroek };
476eda6f593SDavid van Moolenbroek
477eda6f593SDavid van Moolenbroek /* csi_intermediate state table. */
478eda6f593SDavid van Moolenbroek const struct input_transition input_state_csi_intermediate_table[] = {
479eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
480eda6f593SDavid van Moolenbroek
481eda6f593SDavid van Moolenbroek { 0x00, 0x17, input_c0_dispatch, NULL },
482eda6f593SDavid van Moolenbroek { 0x19, 0x19, input_c0_dispatch, NULL },
483eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, input_c0_dispatch, NULL },
484eda6f593SDavid van Moolenbroek { 0x20, 0x2f, input_intermediate, NULL },
485eda6f593SDavid van Moolenbroek { 0x30, 0x3f, NULL, &input_state_csi_ignore },
486eda6f593SDavid van Moolenbroek { 0x40, 0x7e, input_csi_dispatch, &input_state_ground },
487eda6f593SDavid van Moolenbroek { 0x7f, 0xff, NULL, NULL },
488eda6f593SDavid van Moolenbroek
489eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
490eda6f593SDavid van Moolenbroek };
491eda6f593SDavid van Moolenbroek
492eda6f593SDavid van Moolenbroek /* csi_ignore state table. */
493eda6f593SDavid van Moolenbroek const struct input_transition input_state_csi_ignore_table[] = {
494eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
495eda6f593SDavid van Moolenbroek
496eda6f593SDavid van Moolenbroek { 0x00, 0x17, input_c0_dispatch, NULL },
497eda6f593SDavid van Moolenbroek { 0x19, 0x19, input_c0_dispatch, NULL },
498eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, input_c0_dispatch, NULL },
499eda6f593SDavid van Moolenbroek { 0x20, 0x3f, NULL, NULL },
500eda6f593SDavid van Moolenbroek { 0x40, 0x7e, NULL, &input_state_ground },
501eda6f593SDavid van Moolenbroek { 0x7f, 0xff, NULL, NULL },
502eda6f593SDavid van Moolenbroek
503eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
504eda6f593SDavid van Moolenbroek };
505eda6f593SDavid van Moolenbroek
506eda6f593SDavid van Moolenbroek /* dcs_enter state table. */
507eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_enter_table[] = {
508eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
509eda6f593SDavid van Moolenbroek
510eda6f593SDavid van Moolenbroek { 0x00, 0x17, NULL, NULL },
511eda6f593SDavid van Moolenbroek { 0x19, 0x19, NULL, NULL },
512eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, NULL, NULL },
513eda6f593SDavid van Moolenbroek { 0x20, 0x2f, input_intermediate, &input_state_dcs_intermediate },
514eda6f593SDavid van Moolenbroek { 0x30, 0x39, input_parameter, &input_state_dcs_parameter },
515eda6f593SDavid van Moolenbroek { 0x3a, 0x3a, NULL, &input_state_dcs_ignore },
516eda6f593SDavid van Moolenbroek { 0x3b, 0x3b, input_parameter, &input_state_dcs_parameter },
517eda6f593SDavid van Moolenbroek { 0x3c, 0x3f, input_intermediate, &input_state_dcs_parameter },
518eda6f593SDavid van Moolenbroek { 0x40, 0x7e, input_input, &input_state_dcs_handler },
519eda6f593SDavid van Moolenbroek { 0x7f, 0xff, NULL, NULL },
520eda6f593SDavid van Moolenbroek
521eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
522eda6f593SDavid van Moolenbroek };
523eda6f593SDavid van Moolenbroek
524eda6f593SDavid van Moolenbroek /* dcs_parameter state table. */
525eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_parameter_table[] = {
526eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
527eda6f593SDavid van Moolenbroek
528eda6f593SDavid van Moolenbroek { 0x00, 0x17, NULL, NULL },
529eda6f593SDavid van Moolenbroek { 0x19, 0x19, NULL, NULL },
530eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, NULL, NULL },
531eda6f593SDavid van Moolenbroek { 0x20, 0x2f, input_intermediate, &input_state_dcs_intermediate },
532eda6f593SDavid van Moolenbroek { 0x30, 0x39, input_parameter, NULL },
533eda6f593SDavid van Moolenbroek { 0x3a, 0x3a, NULL, &input_state_dcs_ignore },
534eda6f593SDavid van Moolenbroek { 0x3b, 0x3b, input_parameter, NULL },
535eda6f593SDavid van Moolenbroek { 0x3c, 0x3f, NULL, &input_state_dcs_ignore },
536eda6f593SDavid van Moolenbroek { 0x40, 0x7e, input_input, &input_state_dcs_handler },
537eda6f593SDavid van Moolenbroek { 0x7f, 0xff, NULL, NULL },
538eda6f593SDavid van Moolenbroek
539eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
540eda6f593SDavid van Moolenbroek };
541eda6f593SDavid van Moolenbroek
542eda6f593SDavid van Moolenbroek /* dcs_interm state table. */
543eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_intermediate_table[] = {
544eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
545eda6f593SDavid van Moolenbroek
546eda6f593SDavid van Moolenbroek { 0x00, 0x17, NULL, NULL },
547eda6f593SDavid van Moolenbroek { 0x19, 0x19, NULL, NULL },
548eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, NULL, NULL },
549eda6f593SDavid van Moolenbroek { 0x20, 0x2f, input_intermediate, NULL },
550eda6f593SDavid van Moolenbroek { 0x30, 0x3f, NULL, &input_state_dcs_ignore },
551eda6f593SDavid van Moolenbroek { 0x40, 0x7e, input_input, &input_state_dcs_handler },
552eda6f593SDavid van Moolenbroek { 0x7f, 0xff, NULL, NULL },
553eda6f593SDavid van Moolenbroek
554eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
555eda6f593SDavid van Moolenbroek };
556eda6f593SDavid van Moolenbroek
557eda6f593SDavid van Moolenbroek /* dcs_handler state table. */
558eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_handler_table[] = {
559eda6f593SDavid van Moolenbroek /* No INPUT_STATE_ANYWHERE */
560eda6f593SDavid van Moolenbroek
561eda6f593SDavid van Moolenbroek { 0x00, 0x1a, input_input, NULL },
562eda6f593SDavid van Moolenbroek { 0x1b, 0x1b, NULL, &input_state_dcs_escape },
563eda6f593SDavid van Moolenbroek { 0x1c, 0xff, input_input, NULL },
564eda6f593SDavid van Moolenbroek
565eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
566eda6f593SDavid van Moolenbroek };
567eda6f593SDavid van Moolenbroek
568eda6f593SDavid van Moolenbroek /* dcs_escape state table. */
569eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_escape_table[] = {
570eda6f593SDavid van Moolenbroek /* No INPUT_STATE_ANYWHERE */
571eda6f593SDavid van Moolenbroek
572eda6f593SDavid van Moolenbroek { 0x00, 0x5b, input_input, &input_state_dcs_handler },
573eda6f593SDavid van Moolenbroek { 0x5c, 0x5c, input_dcs_dispatch, &input_state_ground },
574eda6f593SDavid van Moolenbroek { 0x5d, 0xff, input_input, &input_state_dcs_handler },
575eda6f593SDavid van Moolenbroek
576eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
577eda6f593SDavid van Moolenbroek };
578eda6f593SDavid van Moolenbroek
579eda6f593SDavid van Moolenbroek /* dcs_ignore state table. */
580eda6f593SDavid van Moolenbroek const struct input_transition input_state_dcs_ignore_table[] = {
581eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
582eda6f593SDavid van Moolenbroek
583eda6f593SDavid van Moolenbroek { 0x00, 0x17, NULL, NULL },
584eda6f593SDavid van Moolenbroek { 0x19, 0x19, NULL, NULL },
585eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, NULL, NULL },
586eda6f593SDavid van Moolenbroek { 0x20, 0xff, NULL, NULL },
587eda6f593SDavid van Moolenbroek
588eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
589eda6f593SDavid van Moolenbroek };
590eda6f593SDavid van Moolenbroek
591eda6f593SDavid van Moolenbroek /* osc_string state table. */
592eda6f593SDavid van Moolenbroek const struct input_transition input_state_osc_string_table[] = {
593eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
594eda6f593SDavid van Moolenbroek
595eda6f593SDavid van Moolenbroek { 0x00, 0x06, NULL, NULL },
596eda6f593SDavid van Moolenbroek { 0x07, 0x07, NULL, &input_state_ground },
597eda6f593SDavid van Moolenbroek { 0x08, 0x17, NULL, NULL },
598eda6f593SDavid van Moolenbroek { 0x19, 0x19, NULL, NULL },
599eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, NULL, NULL },
600eda6f593SDavid van Moolenbroek { 0x20, 0xff, input_input, NULL },
601eda6f593SDavid van Moolenbroek
602eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
603eda6f593SDavid van Moolenbroek };
604eda6f593SDavid van Moolenbroek
605eda6f593SDavid van Moolenbroek /* apc_string state table. */
606eda6f593SDavid van Moolenbroek const struct input_transition input_state_apc_string_table[] = {
607eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
608eda6f593SDavid van Moolenbroek
609eda6f593SDavid van Moolenbroek { 0x00, 0x17, NULL, NULL },
610eda6f593SDavid van Moolenbroek { 0x19, 0x19, NULL, NULL },
611eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, NULL, NULL },
612eda6f593SDavid van Moolenbroek { 0x20, 0xff, input_input, NULL },
613eda6f593SDavid van Moolenbroek
614eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
615eda6f593SDavid van Moolenbroek };
616eda6f593SDavid van Moolenbroek
617eda6f593SDavid van Moolenbroek /* rename_string state table. */
618eda6f593SDavid van Moolenbroek const struct input_transition input_state_rename_string_table[] = {
619eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
620eda6f593SDavid van Moolenbroek
621eda6f593SDavid van Moolenbroek { 0x00, 0x17, NULL, NULL },
622eda6f593SDavid van Moolenbroek { 0x19, 0x19, NULL, NULL },
623eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, NULL, NULL },
624eda6f593SDavid van Moolenbroek { 0x20, 0xff, input_input, NULL },
625eda6f593SDavid van Moolenbroek
626eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
627eda6f593SDavid van Moolenbroek };
628eda6f593SDavid van Moolenbroek
629eda6f593SDavid van Moolenbroek /* consume_st state table. */
630eda6f593SDavid van Moolenbroek const struct input_transition input_state_consume_st_table[] = {
631eda6f593SDavid van Moolenbroek INPUT_STATE_ANYWHERE,
632eda6f593SDavid van Moolenbroek
633eda6f593SDavid van Moolenbroek { 0x00, 0x17, NULL, NULL },
634eda6f593SDavid van Moolenbroek { 0x19, 0x19, NULL, NULL },
635eda6f593SDavid van Moolenbroek { 0x1c, 0x1f, NULL, NULL },
636eda6f593SDavid van Moolenbroek { 0x20, 0xff, NULL, NULL },
637eda6f593SDavid van Moolenbroek
638eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
639eda6f593SDavid van Moolenbroek };
640eda6f593SDavid van Moolenbroek
641eda6f593SDavid van Moolenbroek /* utf8_three state table. */
642eda6f593SDavid van Moolenbroek const struct input_transition input_state_utf8_three_table[] = {
643eda6f593SDavid van Moolenbroek /* No INPUT_STATE_ANYWHERE */
644eda6f593SDavid van Moolenbroek
645eda6f593SDavid van Moolenbroek { 0x00, 0x7f, NULL, &input_state_ground },
646eda6f593SDavid van Moolenbroek { 0x80, 0xbf, input_utf8_add, &input_state_utf8_two },
647eda6f593SDavid van Moolenbroek { 0xc0, 0xff, NULL, &input_state_ground },
648eda6f593SDavid van Moolenbroek
649eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
650eda6f593SDavid van Moolenbroek };
651eda6f593SDavid van Moolenbroek
652eda6f593SDavid van Moolenbroek /* utf8_two state table. */
653eda6f593SDavid van Moolenbroek const struct input_transition input_state_utf8_two_table[] = {
654eda6f593SDavid van Moolenbroek /* No INPUT_STATE_ANYWHERE */
655eda6f593SDavid van Moolenbroek
656eda6f593SDavid van Moolenbroek { 0x00, 0x7f, NULL, &input_state_ground },
657eda6f593SDavid van Moolenbroek { 0x80, 0xbf, input_utf8_add, &input_state_utf8_one },
658eda6f593SDavid van Moolenbroek { 0xc0, 0xff, NULL, &input_state_ground },
659eda6f593SDavid van Moolenbroek
660eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
661eda6f593SDavid van Moolenbroek };
662eda6f593SDavid van Moolenbroek
663eda6f593SDavid van Moolenbroek /* utf8_one state table. */
664eda6f593SDavid van Moolenbroek const struct input_transition input_state_utf8_one_table[] = {
665eda6f593SDavid van Moolenbroek /* No INPUT_STATE_ANYWHERE */
666eda6f593SDavid van Moolenbroek
667eda6f593SDavid van Moolenbroek { 0x00, 0x7f, NULL, &input_state_ground },
668eda6f593SDavid van Moolenbroek { 0x80, 0xbf, input_utf8_close, &input_state_ground },
669eda6f593SDavid van Moolenbroek { 0xc0, 0xff, NULL, &input_state_ground },
670eda6f593SDavid van Moolenbroek
671eda6f593SDavid van Moolenbroek { -1, -1, NULL, NULL }
672eda6f593SDavid van Moolenbroek };
673eda6f593SDavid van Moolenbroek
674eda6f593SDavid van Moolenbroek /* Input table compare. */
675eda6f593SDavid van Moolenbroek int
input_table_compare(const void * key,const void * value)676eda6f593SDavid van Moolenbroek input_table_compare(const void *key, const void *value)
677eda6f593SDavid van Moolenbroek {
678eda6f593SDavid van Moolenbroek const struct input_ctx *ictx = key;
679eda6f593SDavid van Moolenbroek const struct input_table_entry *entry = value;
680eda6f593SDavid van Moolenbroek
681eda6f593SDavid van Moolenbroek if (ictx->ch != entry->ch)
682eda6f593SDavid van Moolenbroek return (ictx->ch - entry->ch);
683eda6f593SDavid van Moolenbroek return (strcmp((const char *)ictx->interm_buf, entry->interm));
684eda6f593SDavid van Moolenbroek }
685eda6f593SDavid van Moolenbroek
686eda6f593SDavid van Moolenbroek /* Initialise input parser. */
687eda6f593SDavid van Moolenbroek void
input_init(struct window_pane * wp)688eda6f593SDavid van Moolenbroek input_init(struct window_pane *wp)
689eda6f593SDavid van Moolenbroek {
690eda6f593SDavid van Moolenbroek struct input_ctx *ictx = &wp->ictx;
691eda6f593SDavid van Moolenbroek
692eda6f593SDavid van Moolenbroek memcpy(&ictx->cell, &grid_default_cell, sizeof ictx->cell);
693eda6f593SDavid van Moolenbroek
694eda6f593SDavid van Moolenbroek memcpy(&ictx->old_cell, &grid_default_cell, sizeof ictx->old_cell);
695eda6f593SDavid van Moolenbroek ictx->old_cx = 0;
696eda6f593SDavid van Moolenbroek ictx->old_cy = 0;
697eda6f593SDavid van Moolenbroek
698eda6f593SDavid van Moolenbroek *ictx->interm_buf = '\0';
699eda6f593SDavid van Moolenbroek ictx->interm_len = 0;
700eda6f593SDavid van Moolenbroek
701eda6f593SDavid van Moolenbroek *ictx->param_buf = '\0';
702eda6f593SDavid van Moolenbroek ictx->param_len = 0;
703eda6f593SDavid van Moolenbroek
704eda6f593SDavid van Moolenbroek ictx->state = &input_state_ground;
705eda6f593SDavid van Moolenbroek ictx->flags = 0;
706*0a6a1f1dSLionel Sambuc
707*0a6a1f1dSLionel Sambuc ictx->since_ground = evbuffer_new();
708eda6f593SDavid van Moolenbroek }
709eda6f593SDavid van Moolenbroek
710eda6f593SDavid van Moolenbroek /* Destroy input parser. */
711eda6f593SDavid van Moolenbroek void
input_free(struct window_pane * wp)712*0a6a1f1dSLionel Sambuc input_free(struct window_pane *wp)
713eda6f593SDavid van Moolenbroek {
714*0a6a1f1dSLionel Sambuc if (wp != NULL)
715*0a6a1f1dSLionel Sambuc evbuffer_free(wp->ictx.since_ground);
716*0a6a1f1dSLionel Sambuc }
717*0a6a1f1dSLionel Sambuc
718*0a6a1f1dSLionel Sambuc /* Change input state. */
719*0a6a1f1dSLionel Sambuc void
input_set_state(struct window_pane * wp,const struct input_transition * itr)720*0a6a1f1dSLionel Sambuc input_set_state(struct window_pane *wp, const struct input_transition *itr)
721*0a6a1f1dSLionel Sambuc {
722*0a6a1f1dSLionel Sambuc struct input_ctx *ictx = &wp->ictx;
723*0a6a1f1dSLionel Sambuc struct evbuffer *ground_evb = ictx->since_ground;
724*0a6a1f1dSLionel Sambuc
725*0a6a1f1dSLionel Sambuc if (ictx->state->exit != NULL)
726*0a6a1f1dSLionel Sambuc ictx->state->exit(ictx);
727*0a6a1f1dSLionel Sambuc
728*0a6a1f1dSLionel Sambuc if (itr->state == &input_state_ground)
729*0a6a1f1dSLionel Sambuc evbuffer_drain(ground_evb, EVBUFFER_LENGTH(ground_evb));
730*0a6a1f1dSLionel Sambuc
731*0a6a1f1dSLionel Sambuc ictx->state = itr->state;
732*0a6a1f1dSLionel Sambuc if (ictx->state->enter != NULL)
733*0a6a1f1dSLionel Sambuc ictx->state->enter(ictx);
734eda6f593SDavid van Moolenbroek }
735eda6f593SDavid van Moolenbroek
736eda6f593SDavid van Moolenbroek /* Parse input. */
737eda6f593SDavid van Moolenbroek void
input_parse(struct window_pane * wp)738eda6f593SDavid van Moolenbroek input_parse(struct window_pane *wp)
739eda6f593SDavid van Moolenbroek {
740eda6f593SDavid van Moolenbroek struct input_ctx *ictx = &wp->ictx;
741eda6f593SDavid van Moolenbroek const struct input_transition *itr;
742eda6f593SDavid van Moolenbroek struct evbuffer *evb = wp->event->input;
743eda6f593SDavid van Moolenbroek u_char *buf;
744eda6f593SDavid van Moolenbroek size_t len, off;
745eda6f593SDavid van Moolenbroek
746eda6f593SDavid van Moolenbroek if (EVBUFFER_LENGTH(evb) == 0)
747eda6f593SDavid van Moolenbroek return;
748eda6f593SDavid van Moolenbroek
749eda6f593SDavid van Moolenbroek wp->window->flags |= WINDOW_ACTIVITY;
750eda6f593SDavid van Moolenbroek wp->window->flags &= ~WINDOW_SILENCE;
751eda6f593SDavid van Moolenbroek
752eda6f593SDavid van Moolenbroek /*
753eda6f593SDavid van Moolenbroek * Open the screen. Use NULL wp if there is a mode set as don't want to
754eda6f593SDavid van Moolenbroek * update the tty.
755eda6f593SDavid van Moolenbroek */
756eda6f593SDavid van Moolenbroek if (wp->mode == NULL)
757eda6f593SDavid van Moolenbroek screen_write_start(&ictx->ctx, wp, &wp->base);
758eda6f593SDavid van Moolenbroek else
759eda6f593SDavid van Moolenbroek screen_write_start(&ictx->ctx, NULL, &wp->base);
760eda6f593SDavid van Moolenbroek ictx->wp = wp;
761eda6f593SDavid van Moolenbroek
762eda6f593SDavid van Moolenbroek buf = EVBUFFER_DATA(evb);
763eda6f593SDavid van Moolenbroek len = EVBUFFER_LENGTH(evb);
764*0a6a1f1dSLionel Sambuc notify_input(wp, evb);
765eda6f593SDavid van Moolenbroek off = 0;
766eda6f593SDavid van Moolenbroek
767eda6f593SDavid van Moolenbroek /* Parse the input. */
768eda6f593SDavid van Moolenbroek while (off < len) {
769eda6f593SDavid van Moolenbroek ictx->ch = buf[off++];
770eda6f593SDavid van Moolenbroek log_debug("%s: '%c' %s", __func__, ictx->ch, ictx->state->name);
771eda6f593SDavid van Moolenbroek
772eda6f593SDavid van Moolenbroek /* Find the transition. */
773eda6f593SDavid van Moolenbroek itr = ictx->state->transitions;
774eda6f593SDavid van Moolenbroek while (itr->first != -1 && itr->last != -1) {
775eda6f593SDavid van Moolenbroek if (ictx->ch >= itr->first && ictx->ch <= itr->last)
776eda6f593SDavid van Moolenbroek break;
777eda6f593SDavid van Moolenbroek itr++;
778eda6f593SDavid van Moolenbroek }
779eda6f593SDavid van Moolenbroek if (itr->first == -1 || itr->last == -1) {
780eda6f593SDavid van Moolenbroek /* No transition? Eh? */
781eda6f593SDavid van Moolenbroek fatalx("No transition from state!");
782eda6f593SDavid van Moolenbroek }
783eda6f593SDavid van Moolenbroek
784eda6f593SDavid van Moolenbroek /*
785eda6f593SDavid van Moolenbroek * Execute the handler, if any. Don't switch state if it
786eda6f593SDavid van Moolenbroek * returns non-zero.
787eda6f593SDavid van Moolenbroek */
788eda6f593SDavid van Moolenbroek if (itr->handler != NULL && itr->handler(ictx) != 0)
789eda6f593SDavid van Moolenbroek continue;
790eda6f593SDavid van Moolenbroek
791eda6f593SDavid van Moolenbroek /* And switch state, if necessary. */
792*0a6a1f1dSLionel Sambuc if (itr->state != NULL)
793*0a6a1f1dSLionel Sambuc input_set_state(wp, itr);
794*0a6a1f1dSLionel Sambuc
795*0a6a1f1dSLionel Sambuc /* If not in ground state, save input. */
796*0a6a1f1dSLionel Sambuc if (ictx->state != &input_state_ground)
797*0a6a1f1dSLionel Sambuc evbuffer_add(ictx->since_ground, &ictx->ch, 1);
798eda6f593SDavid van Moolenbroek }
799eda6f593SDavid van Moolenbroek
800eda6f593SDavid van Moolenbroek /* Close the screen. */
801eda6f593SDavid van Moolenbroek screen_write_stop(&ictx->ctx);
802eda6f593SDavid van Moolenbroek
803eda6f593SDavid van Moolenbroek evbuffer_drain(evb, len);
804eda6f593SDavid van Moolenbroek }
805eda6f593SDavid van Moolenbroek
806eda6f593SDavid van Moolenbroek /* Split the parameter list (if any). */
807eda6f593SDavid van Moolenbroek int
input_split(struct input_ctx * ictx)808eda6f593SDavid van Moolenbroek input_split(struct input_ctx *ictx)
809eda6f593SDavid van Moolenbroek
810eda6f593SDavid van Moolenbroek {
811eda6f593SDavid van Moolenbroek const char *errstr;
812eda6f593SDavid van Moolenbroek char *ptr, *out;
813eda6f593SDavid van Moolenbroek int n;
814eda6f593SDavid van Moolenbroek
815eda6f593SDavid van Moolenbroek ictx->param_list_len = 0;
816eda6f593SDavid van Moolenbroek if (ictx->param_len == 0)
817eda6f593SDavid van Moolenbroek return (0);
818eda6f593SDavid van Moolenbroek
819eda6f593SDavid van Moolenbroek ptr = (char *)ictx->param_buf;
820eda6f593SDavid van Moolenbroek while ((out = strsep(&ptr, ";")) != NULL) {
821eda6f593SDavid van Moolenbroek if (*out == '\0')
822eda6f593SDavid van Moolenbroek n = -1;
823eda6f593SDavid van Moolenbroek else {
824eda6f593SDavid van Moolenbroek n = strtonum(out, 0, INT_MAX, &errstr);
825eda6f593SDavid van Moolenbroek if (errstr != NULL)
826eda6f593SDavid van Moolenbroek return (-1);
827eda6f593SDavid van Moolenbroek }
828eda6f593SDavid van Moolenbroek
829eda6f593SDavid van Moolenbroek ictx->param_list[ictx->param_list_len++] = n;
830eda6f593SDavid van Moolenbroek if (ictx->param_list_len == nitems(ictx->param_list))
831eda6f593SDavid van Moolenbroek return (-1);
832eda6f593SDavid van Moolenbroek }
833eda6f593SDavid van Moolenbroek
834eda6f593SDavid van Moolenbroek return (0);
835eda6f593SDavid van Moolenbroek }
836eda6f593SDavid van Moolenbroek
837eda6f593SDavid van Moolenbroek /* Get an argument or return default value. */
838eda6f593SDavid van Moolenbroek int
input_get(struct input_ctx * ictx,u_int validx,int minval,int defval)839eda6f593SDavid van Moolenbroek input_get(struct input_ctx *ictx, u_int validx, int minval, int defval)
840eda6f593SDavid van Moolenbroek {
841eda6f593SDavid van Moolenbroek int retval;
842eda6f593SDavid van Moolenbroek
843eda6f593SDavid van Moolenbroek if (validx >= ictx->param_list_len)
844eda6f593SDavid van Moolenbroek return (defval);
845eda6f593SDavid van Moolenbroek
846eda6f593SDavid van Moolenbroek retval = ictx->param_list[validx];
847eda6f593SDavid van Moolenbroek if (retval == -1)
848eda6f593SDavid van Moolenbroek return (defval);
849eda6f593SDavid van Moolenbroek if (retval < minval)
850eda6f593SDavid van Moolenbroek return (minval);
851eda6f593SDavid van Moolenbroek return (retval);
852eda6f593SDavid van Moolenbroek }
853eda6f593SDavid van Moolenbroek
854eda6f593SDavid van Moolenbroek /* Reply to terminal query. */
855eda6f593SDavid van Moolenbroek void
input_reply(struct input_ctx * ictx,const char * fmt,...)856eda6f593SDavid van Moolenbroek input_reply(struct input_ctx *ictx, const char *fmt, ...)
857eda6f593SDavid van Moolenbroek {
858eda6f593SDavid van Moolenbroek va_list ap;
859eda6f593SDavid van Moolenbroek char *reply;
860eda6f593SDavid van Moolenbroek
861eda6f593SDavid van Moolenbroek va_start(ap, fmt);
862eda6f593SDavid van Moolenbroek vasprintf(&reply, fmt, ap);
863eda6f593SDavid van Moolenbroek va_end(ap);
864eda6f593SDavid van Moolenbroek
865eda6f593SDavid van Moolenbroek bufferevent_write(ictx->wp->event, reply, strlen(reply));
866*0a6a1f1dSLionel Sambuc free(reply);
867eda6f593SDavid van Moolenbroek }
868eda6f593SDavid van Moolenbroek
869eda6f593SDavid van Moolenbroek /* Clear saved state. */
870eda6f593SDavid van Moolenbroek void
input_clear(struct input_ctx * ictx)871eda6f593SDavid van Moolenbroek input_clear(struct input_ctx *ictx)
872eda6f593SDavid van Moolenbroek {
873eda6f593SDavid van Moolenbroek *ictx->interm_buf = '\0';
874eda6f593SDavid van Moolenbroek ictx->interm_len = 0;
875eda6f593SDavid van Moolenbroek
876eda6f593SDavid van Moolenbroek *ictx->param_buf = '\0';
877eda6f593SDavid van Moolenbroek ictx->param_len = 0;
878eda6f593SDavid van Moolenbroek
879eda6f593SDavid van Moolenbroek *ictx->input_buf = '\0';
880eda6f593SDavid van Moolenbroek ictx->input_len = 0;
881eda6f593SDavid van Moolenbroek
882eda6f593SDavid van Moolenbroek ictx->flags &= ~INPUT_DISCARD;
883eda6f593SDavid van Moolenbroek }
884eda6f593SDavid van Moolenbroek
885eda6f593SDavid van Moolenbroek /* Output this character to the screen. */
886eda6f593SDavid van Moolenbroek int
input_print(struct input_ctx * ictx)887eda6f593SDavid van Moolenbroek input_print(struct input_ctx *ictx)
888eda6f593SDavid van Moolenbroek {
889*0a6a1f1dSLionel Sambuc grid_cell_one(&ictx->cell, ictx->ch);
890*0a6a1f1dSLionel Sambuc screen_write_cell(&ictx->ctx, &ictx->cell);
891eda6f593SDavid van Moolenbroek
892eda6f593SDavid van Moolenbroek return (0);
893eda6f593SDavid van Moolenbroek }
894eda6f593SDavid van Moolenbroek
895eda6f593SDavid van Moolenbroek /* Collect intermediate string. */
896eda6f593SDavid van Moolenbroek int
input_intermediate(struct input_ctx * ictx)897eda6f593SDavid van Moolenbroek input_intermediate(struct input_ctx *ictx)
898eda6f593SDavid van Moolenbroek {
899eda6f593SDavid van Moolenbroek if (ictx->interm_len == (sizeof ictx->interm_buf) - 1)
900eda6f593SDavid van Moolenbroek ictx->flags |= INPUT_DISCARD;
901eda6f593SDavid van Moolenbroek else {
902eda6f593SDavid van Moolenbroek ictx->interm_buf[ictx->interm_len++] = ictx->ch;
903eda6f593SDavid van Moolenbroek ictx->interm_buf[ictx->interm_len] = '\0';
904eda6f593SDavid van Moolenbroek }
905eda6f593SDavid van Moolenbroek
906eda6f593SDavid van Moolenbroek return (0);
907eda6f593SDavid van Moolenbroek }
908eda6f593SDavid van Moolenbroek
909eda6f593SDavid van Moolenbroek /* Collect parameter string. */
910eda6f593SDavid van Moolenbroek int
input_parameter(struct input_ctx * ictx)911eda6f593SDavid van Moolenbroek input_parameter(struct input_ctx *ictx)
912eda6f593SDavid van Moolenbroek {
913eda6f593SDavid van Moolenbroek if (ictx->param_len == (sizeof ictx->param_buf) - 1)
914eda6f593SDavid van Moolenbroek ictx->flags |= INPUT_DISCARD;
915eda6f593SDavid van Moolenbroek else {
916eda6f593SDavid van Moolenbroek ictx->param_buf[ictx->param_len++] = ictx->ch;
917eda6f593SDavid van Moolenbroek ictx->param_buf[ictx->param_len] = '\0';
918eda6f593SDavid van Moolenbroek }
919eda6f593SDavid van Moolenbroek
920eda6f593SDavid van Moolenbroek return (0);
921eda6f593SDavid van Moolenbroek }
922eda6f593SDavid van Moolenbroek
923eda6f593SDavid van Moolenbroek /* Collect input string. */
924eda6f593SDavid van Moolenbroek int
input_input(struct input_ctx * ictx)925eda6f593SDavid van Moolenbroek input_input(struct input_ctx *ictx)
926eda6f593SDavid van Moolenbroek {
927eda6f593SDavid van Moolenbroek if (ictx->input_len == (sizeof ictx->input_buf) - 1)
928eda6f593SDavid van Moolenbroek ictx->flags |= INPUT_DISCARD;
929eda6f593SDavid van Moolenbroek else {
930eda6f593SDavid van Moolenbroek ictx->input_buf[ictx->input_len++] = ictx->ch;
931eda6f593SDavid van Moolenbroek ictx->input_buf[ictx->input_len] = '\0';
932eda6f593SDavid van Moolenbroek }
933eda6f593SDavid van Moolenbroek
934eda6f593SDavid van Moolenbroek return (0);
935eda6f593SDavid van Moolenbroek }
936eda6f593SDavid van Moolenbroek
937eda6f593SDavid van Moolenbroek /* Execute C0 control sequence. */
938eda6f593SDavid van Moolenbroek int
input_c0_dispatch(struct input_ctx * ictx)939eda6f593SDavid van Moolenbroek input_c0_dispatch(struct input_ctx *ictx)
940eda6f593SDavid van Moolenbroek {
941eda6f593SDavid van Moolenbroek struct screen_write_ctx *sctx = &ictx->ctx;
942eda6f593SDavid van Moolenbroek struct window_pane *wp = ictx->wp;
943eda6f593SDavid van Moolenbroek struct screen *s = sctx->s;
944*0a6a1f1dSLionel Sambuc u_int trigger;
945eda6f593SDavid van Moolenbroek
946eda6f593SDavid van Moolenbroek log_debug("%s: '%c", __func__, ictx->ch);
947eda6f593SDavid van Moolenbroek
948eda6f593SDavid van Moolenbroek switch (ictx->ch) {
949eda6f593SDavid van Moolenbroek case '\000': /* NUL */
950eda6f593SDavid van Moolenbroek break;
951eda6f593SDavid van Moolenbroek case '\007': /* BEL */
952eda6f593SDavid van Moolenbroek wp->window->flags |= WINDOW_BELL;
953eda6f593SDavid van Moolenbroek break;
954eda6f593SDavid van Moolenbroek case '\010': /* BS */
955eda6f593SDavid van Moolenbroek screen_write_backspace(sctx);
956*0a6a1f1dSLionel Sambuc goto count_c0;
957eda6f593SDavid van Moolenbroek case '\011': /* HT */
958eda6f593SDavid van Moolenbroek /* Don't tab beyond the end of the line. */
959eda6f593SDavid van Moolenbroek if (s->cx >= screen_size_x(s) - 1)
960eda6f593SDavid van Moolenbroek break;
961eda6f593SDavid van Moolenbroek
962eda6f593SDavid van Moolenbroek /* Find the next tab point, or use the last column if none. */
963eda6f593SDavid van Moolenbroek do {
964eda6f593SDavid van Moolenbroek s->cx++;
965eda6f593SDavid van Moolenbroek if (bit_test(s->tabs, s->cx))
966eda6f593SDavid van Moolenbroek break;
967eda6f593SDavid van Moolenbroek } while (s->cx < screen_size_x(s) - 1);
968eda6f593SDavid van Moolenbroek break;
969eda6f593SDavid van Moolenbroek case '\012': /* LF */
970eda6f593SDavid van Moolenbroek case '\013': /* VT */
971eda6f593SDavid van Moolenbroek case '\014': /* FF */
972eda6f593SDavid van Moolenbroek screen_write_linefeed(sctx, 0);
973*0a6a1f1dSLionel Sambuc goto count_c0;
974eda6f593SDavid van Moolenbroek case '\015': /* CR */
975eda6f593SDavid van Moolenbroek screen_write_carriagereturn(sctx);
976*0a6a1f1dSLionel Sambuc goto count_c0;
977eda6f593SDavid van Moolenbroek case '\016': /* SO */
978eda6f593SDavid van Moolenbroek ictx->cell.attr |= GRID_ATTR_CHARSET;
979eda6f593SDavid van Moolenbroek break;
980eda6f593SDavid van Moolenbroek case '\017': /* SI */
981eda6f593SDavid van Moolenbroek ictx->cell.attr &= ~GRID_ATTR_CHARSET;
982eda6f593SDavid van Moolenbroek break;
983eda6f593SDavid van Moolenbroek default:
984eda6f593SDavid van Moolenbroek log_debug("%s: unknown '%c'", __func__, ictx->ch);
985eda6f593SDavid van Moolenbroek break;
986eda6f593SDavid van Moolenbroek }
987eda6f593SDavid van Moolenbroek
988eda6f593SDavid van Moolenbroek return (0);
989*0a6a1f1dSLionel Sambuc
990*0a6a1f1dSLionel Sambuc count_c0:
991*0a6a1f1dSLionel Sambuc trigger = options_get_number(&wp->window->options, "c0-change-trigger");
992*0a6a1f1dSLionel Sambuc if (++wp->changes == trigger) {
993*0a6a1f1dSLionel Sambuc wp->flags |= PANE_DROP;
994*0a6a1f1dSLionel Sambuc window_pane_timer_start(wp);
995*0a6a1f1dSLionel Sambuc }
996*0a6a1f1dSLionel Sambuc
997*0a6a1f1dSLionel Sambuc return (0);
998eda6f593SDavid van Moolenbroek }
999eda6f593SDavid van Moolenbroek
1000eda6f593SDavid van Moolenbroek /* Execute escape sequence. */
1001eda6f593SDavid van Moolenbroek int
input_esc_dispatch(struct input_ctx * ictx)1002eda6f593SDavid van Moolenbroek input_esc_dispatch(struct input_ctx *ictx)
1003eda6f593SDavid van Moolenbroek {
1004eda6f593SDavid van Moolenbroek struct screen_write_ctx *sctx = &ictx->ctx;
1005eda6f593SDavid van Moolenbroek struct screen *s = sctx->s;
1006eda6f593SDavid van Moolenbroek struct input_table_entry *entry;
1007eda6f593SDavid van Moolenbroek
1008eda6f593SDavid van Moolenbroek if (ictx->flags & INPUT_DISCARD)
1009eda6f593SDavid van Moolenbroek return (0);
1010eda6f593SDavid van Moolenbroek log_debug("%s: '%c', %s", __func__, ictx->ch, ictx->interm_buf);
1011eda6f593SDavid van Moolenbroek
1012eda6f593SDavid van Moolenbroek entry = bsearch(ictx, input_esc_table, nitems(input_esc_table),
1013eda6f593SDavid van Moolenbroek sizeof input_esc_table[0], input_table_compare);
1014eda6f593SDavid van Moolenbroek if (entry == NULL) {
1015eda6f593SDavid van Moolenbroek log_debug("%s: unknown '%c'", __func__, ictx->ch);
1016eda6f593SDavid van Moolenbroek return (0);
1017eda6f593SDavid van Moolenbroek }
1018eda6f593SDavid van Moolenbroek
1019eda6f593SDavid van Moolenbroek switch (entry->type) {
1020eda6f593SDavid van Moolenbroek case INPUT_ESC_RIS:
1021eda6f593SDavid van Moolenbroek memcpy(&ictx->cell, &grid_default_cell, sizeof ictx->cell);
1022eda6f593SDavid van Moolenbroek memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
1023eda6f593SDavid van Moolenbroek ictx->old_cx = 0;
1024eda6f593SDavid van Moolenbroek ictx->old_cy = 0;
1025eda6f593SDavid van Moolenbroek
1026*0a6a1f1dSLionel Sambuc screen_write_reset(sctx);
1027eda6f593SDavid van Moolenbroek break;
1028eda6f593SDavid van Moolenbroek case INPUT_ESC_IND:
1029eda6f593SDavid van Moolenbroek screen_write_linefeed(sctx, 0);
1030eda6f593SDavid van Moolenbroek break;
1031eda6f593SDavid van Moolenbroek case INPUT_ESC_NEL:
1032eda6f593SDavid van Moolenbroek screen_write_carriagereturn(sctx);
1033eda6f593SDavid van Moolenbroek screen_write_linefeed(sctx, 0);
1034eda6f593SDavid van Moolenbroek break;
1035eda6f593SDavid van Moolenbroek case INPUT_ESC_HTS:
1036eda6f593SDavid van Moolenbroek if (s->cx < screen_size_x(s))
1037eda6f593SDavid van Moolenbroek bit_set(s->tabs, s->cx);
1038eda6f593SDavid van Moolenbroek break;
1039eda6f593SDavid van Moolenbroek case INPUT_ESC_RI:
1040eda6f593SDavid van Moolenbroek screen_write_reverseindex(sctx);
1041eda6f593SDavid van Moolenbroek break;
1042eda6f593SDavid van Moolenbroek case INPUT_ESC_DECKPAM:
1043*0a6a1f1dSLionel Sambuc screen_write_mode_set(sctx, MODE_KKEYPAD);
1044eda6f593SDavid van Moolenbroek break;
1045eda6f593SDavid van Moolenbroek case INPUT_ESC_DECKPNM:
1046*0a6a1f1dSLionel Sambuc screen_write_mode_clear(sctx, MODE_KKEYPAD);
1047eda6f593SDavid van Moolenbroek break;
1048eda6f593SDavid van Moolenbroek case INPUT_ESC_DECSC:
1049eda6f593SDavid van Moolenbroek memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
1050eda6f593SDavid van Moolenbroek ictx->old_cx = s->cx;
1051eda6f593SDavid van Moolenbroek ictx->old_cy = s->cy;
1052eda6f593SDavid van Moolenbroek break;
1053eda6f593SDavid van Moolenbroek case INPUT_ESC_DECRC:
1054eda6f593SDavid van Moolenbroek memcpy(&ictx->cell, &ictx->old_cell, sizeof ictx->cell);
1055eda6f593SDavid van Moolenbroek screen_write_cursormove(sctx, ictx->old_cx, ictx->old_cy);
1056eda6f593SDavid van Moolenbroek break;
1057eda6f593SDavid van Moolenbroek case INPUT_ESC_DECALN:
1058eda6f593SDavid van Moolenbroek screen_write_alignmenttest(sctx);
1059eda6f593SDavid van Moolenbroek break;
1060eda6f593SDavid van Moolenbroek case INPUT_ESC_SCSON_G0:
1061eda6f593SDavid van Moolenbroek /*
1062eda6f593SDavid van Moolenbroek * Not really supported, but fake it up enough for those that
1063eda6f593SDavid van Moolenbroek * use it to switch character sets (by redefining G0 to
1064eda6f593SDavid van Moolenbroek * graphics set, rather than switching to G1).
1065eda6f593SDavid van Moolenbroek */
1066eda6f593SDavid van Moolenbroek ictx->cell.attr &= ~GRID_ATTR_CHARSET;
1067eda6f593SDavid van Moolenbroek break;
1068eda6f593SDavid van Moolenbroek case INPUT_ESC_SCSOFF_G0:
1069eda6f593SDavid van Moolenbroek ictx->cell.attr |= GRID_ATTR_CHARSET;
1070eda6f593SDavid van Moolenbroek break;
1071eda6f593SDavid van Moolenbroek }
1072eda6f593SDavid van Moolenbroek
1073eda6f593SDavid van Moolenbroek return (0);
1074eda6f593SDavid van Moolenbroek }
1075eda6f593SDavid van Moolenbroek
1076eda6f593SDavid van Moolenbroek /* Execute control sequence. */
1077eda6f593SDavid van Moolenbroek int
input_csi_dispatch(struct input_ctx * ictx)1078eda6f593SDavid van Moolenbroek input_csi_dispatch(struct input_ctx *ictx)
1079eda6f593SDavid van Moolenbroek {
1080eda6f593SDavid van Moolenbroek struct screen_write_ctx *sctx = &ictx->ctx;
1081eda6f593SDavid van Moolenbroek struct screen *s = sctx->s;
1082eda6f593SDavid van Moolenbroek struct input_table_entry *entry;
1083eda6f593SDavid van Moolenbroek int n, m;
1084eda6f593SDavid van Moolenbroek
1085eda6f593SDavid van Moolenbroek if (ictx->flags & INPUT_DISCARD)
1086eda6f593SDavid van Moolenbroek return (0);
1087eda6f593SDavid van Moolenbroek if (input_split(ictx) != 0)
1088eda6f593SDavid van Moolenbroek return (0);
1089eda6f593SDavid van Moolenbroek log_debug("%s: '%c' \"%s\" \"%s\"",
1090eda6f593SDavid van Moolenbroek __func__, ictx->ch, ictx->interm_buf, ictx->param_buf);
1091eda6f593SDavid van Moolenbroek
1092eda6f593SDavid van Moolenbroek entry = bsearch(ictx, input_csi_table, nitems(input_csi_table),
1093eda6f593SDavid van Moolenbroek sizeof input_csi_table[0], input_table_compare);
1094eda6f593SDavid van Moolenbroek if (entry == NULL) {
1095eda6f593SDavid van Moolenbroek log_debug("%s: unknown '%c'", __func__, ictx->ch);
1096eda6f593SDavid van Moolenbroek return (0);
1097eda6f593SDavid van Moolenbroek }
1098eda6f593SDavid van Moolenbroek
1099eda6f593SDavid van Moolenbroek switch (entry->type) {
1100eda6f593SDavid van Moolenbroek case INPUT_CSI_CBT:
1101eda6f593SDavid van Moolenbroek /* Find the previous tab point, n times. */
1102eda6f593SDavid van Moolenbroek n = input_get(ictx, 0, 1, 1);
1103eda6f593SDavid van Moolenbroek while (s->cx > 0 && n-- > 0) {
1104eda6f593SDavid van Moolenbroek do
1105eda6f593SDavid van Moolenbroek s->cx--;
1106eda6f593SDavid van Moolenbroek while (s->cx > 0 && !bit_test(s->tabs, s->cx));
1107eda6f593SDavid van Moolenbroek }
1108eda6f593SDavid van Moolenbroek break;
1109eda6f593SDavid van Moolenbroek case INPUT_CSI_CUB:
1110eda6f593SDavid van Moolenbroek screen_write_cursorleft(sctx, input_get(ictx, 0, 1, 1));
1111eda6f593SDavid van Moolenbroek break;
1112eda6f593SDavid van Moolenbroek case INPUT_CSI_CUD:
1113eda6f593SDavid van Moolenbroek screen_write_cursordown(sctx, input_get(ictx, 0, 1, 1));
1114eda6f593SDavid van Moolenbroek break;
1115eda6f593SDavid van Moolenbroek case INPUT_CSI_CUF:
1116eda6f593SDavid van Moolenbroek screen_write_cursorright(sctx, input_get(ictx, 0, 1, 1));
1117eda6f593SDavid van Moolenbroek break;
1118eda6f593SDavid van Moolenbroek case INPUT_CSI_CUP:
1119eda6f593SDavid van Moolenbroek n = input_get(ictx, 0, 1, 1);
1120eda6f593SDavid van Moolenbroek m = input_get(ictx, 1, 1, 1);
1121eda6f593SDavid van Moolenbroek screen_write_cursormove(sctx, m - 1, n - 1);
1122eda6f593SDavid van Moolenbroek break;
1123*0a6a1f1dSLionel Sambuc case INPUT_CSI_WINOPS:
1124*0a6a1f1dSLionel Sambuc input_csi_dispatch_winops(ictx);
1125*0a6a1f1dSLionel Sambuc break;
1126eda6f593SDavid van Moolenbroek case INPUT_CSI_CUU:
1127eda6f593SDavid van Moolenbroek screen_write_cursorup(sctx, input_get(ictx, 0, 1, 1));
1128eda6f593SDavid van Moolenbroek break;
1129*0a6a1f1dSLionel Sambuc case INPUT_CSI_CNL:
1130*0a6a1f1dSLionel Sambuc screen_write_carriagereturn(sctx);
1131*0a6a1f1dSLionel Sambuc screen_write_cursordown(sctx, input_get(ictx, 0, 1, 1));
1132*0a6a1f1dSLionel Sambuc break;
1133*0a6a1f1dSLionel Sambuc case INPUT_CSI_CPL:
1134*0a6a1f1dSLionel Sambuc screen_write_carriagereturn(sctx);
1135*0a6a1f1dSLionel Sambuc screen_write_cursorup(sctx, input_get(ictx, 0, 1, 1));
1136*0a6a1f1dSLionel Sambuc break;
1137eda6f593SDavid van Moolenbroek case INPUT_CSI_DA:
1138eda6f593SDavid van Moolenbroek switch (input_get(ictx, 0, 0, 0)) {
1139eda6f593SDavid van Moolenbroek case 0:
1140eda6f593SDavid van Moolenbroek input_reply(ictx, "\033[?1;2c");
1141eda6f593SDavid van Moolenbroek break;
1142eda6f593SDavid van Moolenbroek default:
1143eda6f593SDavid van Moolenbroek log_debug("%s: unknown '%c'", __func__, ictx->ch);
1144eda6f593SDavid van Moolenbroek break;
1145eda6f593SDavid van Moolenbroek }
1146eda6f593SDavid van Moolenbroek break;
1147*0a6a1f1dSLionel Sambuc case INPUT_CSI_DA_TWO:
1148*0a6a1f1dSLionel Sambuc switch (input_get(ictx, 0, 0, 0)) {
1149*0a6a1f1dSLionel Sambuc case 0:
1150*0a6a1f1dSLionel Sambuc input_reply(ictx, "\033[>0;95;0c");
1151*0a6a1f1dSLionel Sambuc break;
1152*0a6a1f1dSLionel Sambuc default:
1153*0a6a1f1dSLionel Sambuc log_debug("%s: unknown '%c'", __func__, ictx->ch);
1154*0a6a1f1dSLionel Sambuc break;
1155*0a6a1f1dSLionel Sambuc }
1156*0a6a1f1dSLionel Sambuc break;
1157*0a6a1f1dSLionel Sambuc case INPUT_CSI_ECH:
1158*0a6a1f1dSLionel Sambuc screen_write_clearcharacter(sctx, input_get(ictx, 0, 1, 1));
1159*0a6a1f1dSLionel Sambuc break;
1160eda6f593SDavid van Moolenbroek case INPUT_CSI_DCH:
1161eda6f593SDavid van Moolenbroek screen_write_deletecharacter(sctx, input_get(ictx, 0, 1, 1));
1162eda6f593SDavid van Moolenbroek break;
1163eda6f593SDavid van Moolenbroek case INPUT_CSI_DECSTBM:
1164eda6f593SDavid van Moolenbroek n = input_get(ictx, 0, 1, 1);
1165eda6f593SDavid van Moolenbroek m = input_get(ictx, 1, 1, screen_size_y(s));
1166eda6f593SDavid van Moolenbroek screen_write_scrollregion(sctx, n - 1, m - 1);
1167eda6f593SDavid van Moolenbroek break;
1168eda6f593SDavid van Moolenbroek case INPUT_CSI_DL:
1169eda6f593SDavid van Moolenbroek screen_write_deleteline(sctx, input_get(ictx, 0, 1, 1));
1170eda6f593SDavid van Moolenbroek break;
1171eda6f593SDavid van Moolenbroek case INPUT_CSI_DSR:
1172eda6f593SDavid van Moolenbroek switch (input_get(ictx, 0, 0, 0)) {
1173eda6f593SDavid van Moolenbroek case 5:
1174eda6f593SDavid van Moolenbroek input_reply(ictx, "\033[0n");
1175eda6f593SDavid van Moolenbroek break;
1176eda6f593SDavid van Moolenbroek case 6:
1177eda6f593SDavid van Moolenbroek input_reply(ictx, "\033[%u;%uR", s->cy + 1, s->cx + 1);
1178eda6f593SDavid van Moolenbroek break;
1179eda6f593SDavid van Moolenbroek default:
1180eda6f593SDavid van Moolenbroek log_debug("%s: unknown '%c'", __func__, ictx->ch);
1181eda6f593SDavid van Moolenbroek break;
1182eda6f593SDavid van Moolenbroek }
1183eda6f593SDavid van Moolenbroek break;
1184eda6f593SDavid van Moolenbroek case INPUT_CSI_ED:
1185eda6f593SDavid van Moolenbroek switch (input_get(ictx, 0, 0, 0)) {
1186eda6f593SDavid van Moolenbroek case 0:
1187eda6f593SDavid van Moolenbroek screen_write_clearendofscreen(sctx);
1188eda6f593SDavid van Moolenbroek break;
1189eda6f593SDavid van Moolenbroek case 1:
1190eda6f593SDavid van Moolenbroek screen_write_clearstartofscreen(sctx);
1191eda6f593SDavid van Moolenbroek break;
1192eda6f593SDavid van Moolenbroek case 2:
1193eda6f593SDavid van Moolenbroek screen_write_clearscreen(sctx);
1194eda6f593SDavid van Moolenbroek break;
1195*0a6a1f1dSLionel Sambuc case 3:
1196*0a6a1f1dSLionel Sambuc switch (input_get(ictx, 1, 0, 0)) {
1197*0a6a1f1dSLionel Sambuc case 0:
1198*0a6a1f1dSLionel Sambuc /*
1199*0a6a1f1dSLionel Sambuc * Linux console extension to clear history
1200*0a6a1f1dSLionel Sambuc * (for example before locking the screen).
1201*0a6a1f1dSLionel Sambuc */
1202*0a6a1f1dSLionel Sambuc screen_write_clearhistory(sctx);
1203*0a6a1f1dSLionel Sambuc break;
1204*0a6a1f1dSLionel Sambuc }
1205*0a6a1f1dSLionel Sambuc break;
1206eda6f593SDavid van Moolenbroek default:
1207eda6f593SDavid van Moolenbroek log_debug("%s: unknown '%c'", __func__, ictx->ch);
1208eda6f593SDavid van Moolenbroek break;
1209eda6f593SDavid van Moolenbroek }
1210eda6f593SDavid van Moolenbroek break;
1211eda6f593SDavid van Moolenbroek case INPUT_CSI_EL:
1212eda6f593SDavid van Moolenbroek switch (input_get(ictx, 0, 0, 0)) {
1213eda6f593SDavid van Moolenbroek case 0:
1214eda6f593SDavid van Moolenbroek screen_write_clearendofline(sctx);
1215eda6f593SDavid van Moolenbroek break;
1216eda6f593SDavid van Moolenbroek case 1:
1217eda6f593SDavid van Moolenbroek screen_write_clearstartofline(sctx);
1218eda6f593SDavid van Moolenbroek break;
1219eda6f593SDavid van Moolenbroek case 2:
1220eda6f593SDavid van Moolenbroek screen_write_clearline(sctx);
1221eda6f593SDavid van Moolenbroek break;
1222eda6f593SDavid van Moolenbroek default:
1223eda6f593SDavid van Moolenbroek log_debug("%s: unknown '%c'", __func__, ictx->ch);
1224eda6f593SDavid van Moolenbroek break;
1225eda6f593SDavid van Moolenbroek }
1226eda6f593SDavid van Moolenbroek break;
1227eda6f593SDavid van Moolenbroek case INPUT_CSI_HPA:
1228eda6f593SDavid van Moolenbroek n = input_get(ictx, 0, 1, 1);
1229eda6f593SDavid van Moolenbroek screen_write_cursormove(sctx, n - 1, s->cy);
1230eda6f593SDavid van Moolenbroek break;
1231eda6f593SDavid van Moolenbroek case INPUT_CSI_ICH:
1232eda6f593SDavid van Moolenbroek screen_write_insertcharacter(sctx, input_get(ictx, 0, 1, 1));
1233eda6f593SDavid van Moolenbroek break;
1234eda6f593SDavid van Moolenbroek case INPUT_CSI_IL:
1235eda6f593SDavid van Moolenbroek screen_write_insertline(sctx, input_get(ictx, 0, 1, 1));
1236eda6f593SDavid van Moolenbroek break;
1237*0a6a1f1dSLionel Sambuc case INPUT_CSI_RCP:
1238*0a6a1f1dSLionel Sambuc memcpy(&ictx->cell, &ictx->old_cell, sizeof ictx->cell);
1239*0a6a1f1dSLionel Sambuc screen_write_cursormove(sctx, ictx->old_cx, ictx->old_cy);
1240*0a6a1f1dSLionel Sambuc break;
1241eda6f593SDavid van Moolenbroek case INPUT_CSI_RM:
1242*0a6a1f1dSLionel Sambuc input_csi_dispatch_rm(ictx);
1243eda6f593SDavid van Moolenbroek break;
1244eda6f593SDavid van Moolenbroek case INPUT_CSI_RM_PRIVATE:
1245*0a6a1f1dSLionel Sambuc input_csi_dispatch_rm_private(ictx);
1246eda6f593SDavid van Moolenbroek break;
1247*0a6a1f1dSLionel Sambuc case INPUT_CSI_SCP:
1248*0a6a1f1dSLionel Sambuc memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
1249*0a6a1f1dSLionel Sambuc ictx->old_cx = s->cx;
1250*0a6a1f1dSLionel Sambuc ictx->old_cy = s->cy;
1251eda6f593SDavid van Moolenbroek break;
1252eda6f593SDavid van Moolenbroek case INPUT_CSI_SGR:
1253eda6f593SDavid van Moolenbroek input_csi_dispatch_sgr(ictx);
1254eda6f593SDavid van Moolenbroek break;
1255eda6f593SDavid van Moolenbroek case INPUT_CSI_SM:
1256*0a6a1f1dSLionel Sambuc input_csi_dispatch_sm(ictx);
1257eda6f593SDavid van Moolenbroek break;
1258eda6f593SDavid van Moolenbroek case INPUT_CSI_SM_PRIVATE:
1259*0a6a1f1dSLionel Sambuc input_csi_dispatch_sm_private(ictx);
1260eda6f593SDavid van Moolenbroek break;
1261eda6f593SDavid van Moolenbroek case INPUT_CSI_TBC:
1262eda6f593SDavid van Moolenbroek switch (input_get(ictx, 0, 0, 0)) {
1263eda6f593SDavid van Moolenbroek case 0:
1264eda6f593SDavid van Moolenbroek if (s->cx < screen_size_x(s))
1265eda6f593SDavid van Moolenbroek bit_clear(s->tabs, s->cx);
1266eda6f593SDavid van Moolenbroek break;
1267eda6f593SDavid van Moolenbroek case 3:
1268eda6f593SDavid van Moolenbroek bit_nclear(s->tabs, 0, screen_size_x(s) - 1);
1269eda6f593SDavid van Moolenbroek break;
1270eda6f593SDavid van Moolenbroek default:
1271eda6f593SDavid van Moolenbroek log_debug("%s: unknown '%c'", __func__, ictx->ch);
1272eda6f593SDavid van Moolenbroek break;
1273eda6f593SDavid van Moolenbroek }
1274eda6f593SDavid van Moolenbroek break;
1275eda6f593SDavid van Moolenbroek case INPUT_CSI_VPA:
1276eda6f593SDavid van Moolenbroek n = input_get(ictx, 0, 1, 1);
1277eda6f593SDavid van Moolenbroek screen_write_cursormove(sctx, s->cx, n - 1);
1278eda6f593SDavid van Moolenbroek break;
1279eda6f593SDavid van Moolenbroek case INPUT_CSI_DECSCUSR:
1280eda6f593SDavid van Moolenbroek n = input_get(ictx, 0, 0, 0);
1281eda6f593SDavid van Moolenbroek screen_set_cursor_style(s, n);
1282eda6f593SDavid van Moolenbroek break;
1283eda6f593SDavid van Moolenbroek }
1284eda6f593SDavid van Moolenbroek
1285eda6f593SDavid van Moolenbroek return (0);
1286eda6f593SDavid van Moolenbroek }
1287eda6f593SDavid van Moolenbroek
1288*0a6a1f1dSLionel Sambuc /* Handle CSI RM. */
1289*0a6a1f1dSLionel Sambuc void
input_csi_dispatch_rm(struct input_ctx * ictx)1290*0a6a1f1dSLionel Sambuc input_csi_dispatch_rm(struct input_ctx *ictx)
1291*0a6a1f1dSLionel Sambuc {
1292*0a6a1f1dSLionel Sambuc u_int i;
1293*0a6a1f1dSLionel Sambuc
1294*0a6a1f1dSLionel Sambuc for (i = 0; i < ictx->param_list_len; i++) {
1295*0a6a1f1dSLionel Sambuc switch (input_get(ictx, i, 0, -1)) {
1296*0a6a1f1dSLionel Sambuc case 4: /* IRM */
1297*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, MODE_INSERT);
1298*0a6a1f1dSLionel Sambuc break;
1299*0a6a1f1dSLionel Sambuc default:
1300*0a6a1f1dSLionel Sambuc log_debug("%s: unknown '%c'", __func__, ictx->ch);
1301*0a6a1f1dSLionel Sambuc break;
1302*0a6a1f1dSLionel Sambuc }
1303*0a6a1f1dSLionel Sambuc }
1304*0a6a1f1dSLionel Sambuc }
1305*0a6a1f1dSLionel Sambuc
1306*0a6a1f1dSLionel Sambuc /* Handle CSI private RM. */
1307*0a6a1f1dSLionel Sambuc void
input_csi_dispatch_rm_private(struct input_ctx * ictx)1308*0a6a1f1dSLionel Sambuc input_csi_dispatch_rm_private(struct input_ctx *ictx)
1309*0a6a1f1dSLionel Sambuc {
1310*0a6a1f1dSLionel Sambuc u_int i;
1311*0a6a1f1dSLionel Sambuc
1312*0a6a1f1dSLionel Sambuc for (i = 0; i < ictx->param_list_len; i++) {
1313*0a6a1f1dSLionel Sambuc switch (input_get(ictx, i, 0, -1)) {
1314*0a6a1f1dSLionel Sambuc case 1: /* DECCKM */
1315*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, MODE_KCURSOR);
1316*0a6a1f1dSLionel Sambuc break;
1317*0a6a1f1dSLionel Sambuc case 3: /* DECCOLM */
1318*0a6a1f1dSLionel Sambuc screen_write_cursormove(&ictx->ctx, 0, 0);
1319*0a6a1f1dSLionel Sambuc screen_write_clearscreen(&ictx->ctx);
1320*0a6a1f1dSLionel Sambuc break;
1321*0a6a1f1dSLionel Sambuc case 7: /* DECAWM */
1322*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, MODE_WRAP);
1323*0a6a1f1dSLionel Sambuc break;
1324*0a6a1f1dSLionel Sambuc case 25: /* TCEM */
1325*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, MODE_CURSOR);
1326*0a6a1f1dSLionel Sambuc break;
1327*0a6a1f1dSLionel Sambuc case 1000:
1328*0a6a1f1dSLionel Sambuc case 1001:
1329*0a6a1f1dSLionel Sambuc case 1002:
1330*0a6a1f1dSLionel Sambuc case 1003:
1331*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
1332*0a6a1f1dSLionel Sambuc break;
1333*0a6a1f1dSLionel Sambuc case 1004:
1334*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, MODE_FOCUSON);
1335*0a6a1f1dSLionel Sambuc break;
1336*0a6a1f1dSLionel Sambuc case 1005:
1337*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, MODE_MOUSE_UTF8);
1338*0a6a1f1dSLionel Sambuc break;
1339*0a6a1f1dSLionel Sambuc case 1006:
1340*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, MODE_MOUSE_SGR);
1341*0a6a1f1dSLionel Sambuc break;
1342*0a6a1f1dSLionel Sambuc case 47:
1343*0a6a1f1dSLionel Sambuc case 1047:
1344*0a6a1f1dSLionel Sambuc window_pane_alternate_off(ictx->wp, &ictx->cell, 0);
1345*0a6a1f1dSLionel Sambuc break;
1346*0a6a1f1dSLionel Sambuc case 1049:
1347*0a6a1f1dSLionel Sambuc window_pane_alternate_off(ictx->wp, &ictx->cell, 1);
1348*0a6a1f1dSLionel Sambuc break;
1349*0a6a1f1dSLionel Sambuc case 2004:
1350*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, MODE_BRACKETPASTE);
1351*0a6a1f1dSLionel Sambuc break;
1352*0a6a1f1dSLionel Sambuc default:
1353*0a6a1f1dSLionel Sambuc log_debug("%s: unknown '%c'", __func__, ictx->ch);
1354*0a6a1f1dSLionel Sambuc break;
1355*0a6a1f1dSLionel Sambuc }
1356*0a6a1f1dSLionel Sambuc }
1357*0a6a1f1dSLionel Sambuc }
1358*0a6a1f1dSLionel Sambuc
1359*0a6a1f1dSLionel Sambuc /* Handle CSI SM. */
1360*0a6a1f1dSLionel Sambuc void
input_csi_dispatch_sm(struct input_ctx * ictx)1361*0a6a1f1dSLionel Sambuc input_csi_dispatch_sm(struct input_ctx *ictx)
1362*0a6a1f1dSLionel Sambuc {
1363*0a6a1f1dSLionel Sambuc u_int i;
1364*0a6a1f1dSLionel Sambuc
1365*0a6a1f1dSLionel Sambuc for (i = 0; i < ictx->param_list_len; i++) {
1366*0a6a1f1dSLionel Sambuc switch (input_get(ictx, i, 0, -1)) {
1367*0a6a1f1dSLionel Sambuc case 4: /* IRM */
1368*0a6a1f1dSLionel Sambuc screen_write_mode_set(&ictx->ctx, MODE_INSERT);
1369*0a6a1f1dSLionel Sambuc break;
1370*0a6a1f1dSLionel Sambuc default:
1371*0a6a1f1dSLionel Sambuc log_debug("%s: unknown '%c'", __func__, ictx->ch);
1372*0a6a1f1dSLionel Sambuc break;
1373*0a6a1f1dSLionel Sambuc }
1374*0a6a1f1dSLionel Sambuc }
1375*0a6a1f1dSLionel Sambuc }
1376*0a6a1f1dSLionel Sambuc
1377*0a6a1f1dSLionel Sambuc /* Handle CSI private SM. */
1378*0a6a1f1dSLionel Sambuc void
input_csi_dispatch_sm_private(struct input_ctx * ictx)1379*0a6a1f1dSLionel Sambuc input_csi_dispatch_sm_private(struct input_ctx *ictx)
1380*0a6a1f1dSLionel Sambuc {
1381*0a6a1f1dSLionel Sambuc u_int i;
1382*0a6a1f1dSLionel Sambuc
1383*0a6a1f1dSLionel Sambuc for (i = 0; i < ictx->param_list_len; i++) {
1384*0a6a1f1dSLionel Sambuc switch (input_get(ictx, i, 0, -1)) {
1385*0a6a1f1dSLionel Sambuc case 1: /* DECCKM */
1386*0a6a1f1dSLionel Sambuc screen_write_mode_set(&ictx->ctx, MODE_KCURSOR);
1387*0a6a1f1dSLionel Sambuc break;
1388*0a6a1f1dSLionel Sambuc case 3: /* DECCOLM */
1389*0a6a1f1dSLionel Sambuc screen_write_cursormove(&ictx->ctx, 0, 0);
1390*0a6a1f1dSLionel Sambuc screen_write_clearscreen(&ictx->ctx);
1391*0a6a1f1dSLionel Sambuc break;
1392*0a6a1f1dSLionel Sambuc case 7: /* DECAWM */
1393*0a6a1f1dSLionel Sambuc screen_write_mode_set(&ictx->ctx, MODE_WRAP);
1394*0a6a1f1dSLionel Sambuc break;
1395*0a6a1f1dSLionel Sambuc case 25: /* TCEM */
1396*0a6a1f1dSLionel Sambuc screen_write_mode_set(&ictx->ctx, MODE_CURSOR);
1397*0a6a1f1dSLionel Sambuc break;
1398*0a6a1f1dSLionel Sambuc case 1000:
1399*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
1400*0a6a1f1dSLionel Sambuc screen_write_mode_set(&ictx->ctx, MODE_MOUSE_STANDARD);
1401*0a6a1f1dSLionel Sambuc break;
1402*0a6a1f1dSLionel Sambuc case 1002:
1403*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
1404*0a6a1f1dSLionel Sambuc screen_write_mode_set(&ictx->ctx, MODE_MOUSE_BUTTON);
1405*0a6a1f1dSLionel Sambuc break;
1406*0a6a1f1dSLionel Sambuc case 1003:
1407*0a6a1f1dSLionel Sambuc screen_write_mode_clear(&ictx->ctx, ALL_MOUSE_MODES);
1408*0a6a1f1dSLionel Sambuc screen_write_mode_set(&ictx->ctx, MODE_MOUSE_ANY);
1409*0a6a1f1dSLionel Sambuc break;
1410*0a6a1f1dSLionel Sambuc case 1004:
1411*0a6a1f1dSLionel Sambuc if (ictx->ctx.s->mode & MODE_FOCUSON)
1412*0a6a1f1dSLionel Sambuc break;
1413*0a6a1f1dSLionel Sambuc screen_write_mode_set(&ictx->ctx, MODE_FOCUSON);
1414*0a6a1f1dSLionel Sambuc ictx->wp->flags |= PANE_FOCUSPUSH; /* force update */
1415*0a6a1f1dSLionel Sambuc break;
1416*0a6a1f1dSLionel Sambuc case 1005:
1417*0a6a1f1dSLionel Sambuc screen_write_mode_set(&ictx->ctx, MODE_MOUSE_UTF8);
1418*0a6a1f1dSLionel Sambuc break;
1419*0a6a1f1dSLionel Sambuc case 1006:
1420*0a6a1f1dSLionel Sambuc screen_write_mode_set(&ictx->ctx, MODE_MOUSE_SGR);
1421*0a6a1f1dSLionel Sambuc break;
1422*0a6a1f1dSLionel Sambuc case 47:
1423*0a6a1f1dSLionel Sambuc case 1047:
1424*0a6a1f1dSLionel Sambuc window_pane_alternate_on(ictx->wp, &ictx->cell, 0);
1425*0a6a1f1dSLionel Sambuc break;
1426*0a6a1f1dSLionel Sambuc case 1049:
1427*0a6a1f1dSLionel Sambuc window_pane_alternate_on(ictx->wp, &ictx->cell, 1);
1428*0a6a1f1dSLionel Sambuc break;
1429*0a6a1f1dSLionel Sambuc case 2004:
1430*0a6a1f1dSLionel Sambuc screen_write_mode_set(&ictx->ctx, MODE_BRACKETPASTE);
1431*0a6a1f1dSLionel Sambuc break;
1432*0a6a1f1dSLionel Sambuc default:
1433*0a6a1f1dSLionel Sambuc log_debug("%s: unknown '%c'", __func__, ictx->ch);
1434*0a6a1f1dSLionel Sambuc break;
1435*0a6a1f1dSLionel Sambuc }
1436*0a6a1f1dSLionel Sambuc }
1437*0a6a1f1dSLionel Sambuc }
1438*0a6a1f1dSLionel Sambuc
1439*0a6a1f1dSLionel Sambuc /* Handle CSI window operations. */
1440*0a6a1f1dSLionel Sambuc void
input_csi_dispatch_winops(struct input_ctx * ictx)1441*0a6a1f1dSLionel Sambuc input_csi_dispatch_winops(struct input_ctx *ictx)
1442*0a6a1f1dSLionel Sambuc {
1443*0a6a1f1dSLionel Sambuc struct window_pane *wp = ictx->wp;
1444*0a6a1f1dSLionel Sambuc int n, m;
1445*0a6a1f1dSLionel Sambuc
1446*0a6a1f1dSLionel Sambuc m = 0;
1447*0a6a1f1dSLionel Sambuc while ((n = input_get(ictx, m, 0, -1)) != -1) {
1448*0a6a1f1dSLionel Sambuc switch (n) {
1449*0a6a1f1dSLionel Sambuc case 1:
1450*0a6a1f1dSLionel Sambuc case 2:
1451*0a6a1f1dSLionel Sambuc case 5:
1452*0a6a1f1dSLionel Sambuc case 6:
1453*0a6a1f1dSLionel Sambuc case 7:
1454*0a6a1f1dSLionel Sambuc case 11:
1455*0a6a1f1dSLionel Sambuc case 13:
1456*0a6a1f1dSLionel Sambuc case 14:
1457*0a6a1f1dSLionel Sambuc case 19:
1458*0a6a1f1dSLionel Sambuc case 20:
1459*0a6a1f1dSLionel Sambuc case 21:
1460*0a6a1f1dSLionel Sambuc case 24:
1461*0a6a1f1dSLionel Sambuc break;
1462*0a6a1f1dSLionel Sambuc case 3:
1463*0a6a1f1dSLionel Sambuc case 4:
1464*0a6a1f1dSLionel Sambuc case 8:
1465*0a6a1f1dSLionel Sambuc m++;
1466*0a6a1f1dSLionel Sambuc if (input_get(ictx, m, 0, -1) == -1)
1467*0a6a1f1dSLionel Sambuc return;
1468*0a6a1f1dSLionel Sambuc /* FALLTHROUGH */
1469*0a6a1f1dSLionel Sambuc case 9:
1470*0a6a1f1dSLionel Sambuc case 10:
1471*0a6a1f1dSLionel Sambuc case 22:
1472*0a6a1f1dSLionel Sambuc case 23:
1473*0a6a1f1dSLionel Sambuc m++;
1474*0a6a1f1dSLionel Sambuc if (input_get(ictx, m, 0, -1) == -1)
1475*0a6a1f1dSLionel Sambuc return;
1476*0a6a1f1dSLionel Sambuc break;
1477*0a6a1f1dSLionel Sambuc case 18:
1478*0a6a1f1dSLionel Sambuc input_reply(ictx, "\033[8;%u;%u", wp->sy, wp->sx);
1479*0a6a1f1dSLionel Sambuc break;
1480*0a6a1f1dSLionel Sambuc default:
1481*0a6a1f1dSLionel Sambuc log_debug("%s: unknown '%c'", __func__, ictx->ch);
1482*0a6a1f1dSLionel Sambuc break;
1483*0a6a1f1dSLionel Sambuc }
1484*0a6a1f1dSLionel Sambuc m++;
1485*0a6a1f1dSLionel Sambuc }
1486*0a6a1f1dSLionel Sambuc }
1487*0a6a1f1dSLionel Sambuc
1488eda6f593SDavid van Moolenbroek /* Handle CSI SGR. */
1489eda6f593SDavid van Moolenbroek void
input_csi_dispatch_sgr(struct input_ctx * ictx)1490eda6f593SDavid van Moolenbroek input_csi_dispatch_sgr(struct input_ctx *ictx)
1491eda6f593SDavid van Moolenbroek {
1492eda6f593SDavid van Moolenbroek struct grid_cell *gc = &ictx->cell;
1493eda6f593SDavid van Moolenbroek u_int i;
1494eda6f593SDavid van Moolenbroek int n, m;
1495eda6f593SDavid van Moolenbroek u_char attr;
1496eda6f593SDavid van Moolenbroek
1497eda6f593SDavid van Moolenbroek if (ictx->param_list_len == 0) {
1498eda6f593SDavid van Moolenbroek attr = gc->attr;
1499eda6f593SDavid van Moolenbroek memcpy(gc, &grid_default_cell, sizeof *gc);
1500eda6f593SDavid van Moolenbroek gc->attr |= (attr & GRID_ATTR_CHARSET);
1501eda6f593SDavid van Moolenbroek return;
1502eda6f593SDavid van Moolenbroek }
1503eda6f593SDavid van Moolenbroek
1504eda6f593SDavid van Moolenbroek for (i = 0; i < ictx->param_list_len; i++) {
1505eda6f593SDavid van Moolenbroek n = input_get(ictx, i, 0, 0);
1506eda6f593SDavid van Moolenbroek
1507eda6f593SDavid van Moolenbroek if (n == 38 || n == 48) {
1508eda6f593SDavid van Moolenbroek i++;
1509eda6f593SDavid van Moolenbroek if (input_get(ictx, i, 0, -1) != 5)
1510eda6f593SDavid van Moolenbroek continue;
1511eda6f593SDavid van Moolenbroek
1512eda6f593SDavid van Moolenbroek i++;
1513eda6f593SDavid van Moolenbroek m = input_get(ictx, i, 0, -1);
1514eda6f593SDavid van Moolenbroek if (m == -1) {
1515eda6f593SDavid van Moolenbroek if (n == 38) {
1516eda6f593SDavid van Moolenbroek gc->flags &= ~GRID_FLAG_FG256;
1517eda6f593SDavid van Moolenbroek gc->fg = 8;
1518eda6f593SDavid van Moolenbroek } else if (n == 48) {
1519eda6f593SDavid van Moolenbroek gc->flags &= ~GRID_FLAG_BG256;
1520eda6f593SDavid van Moolenbroek gc->bg = 8;
1521eda6f593SDavid van Moolenbroek }
1522eda6f593SDavid van Moolenbroek
1523eda6f593SDavid van Moolenbroek } else {
1524eda6f593SDavid van Moolenbroek if (n == 38) {
1525eda6f593SDavid van Moolenbroek gc->flags |= GRID_FLAG_FG256;
1526eda6f593SDavid van Moolenbroek gc->fg = m;
1527eda6f593SDavid van Moolenbroek } else if (n == 48) {
1528eda6f593SDavid van Moolenbroek gc->flags |= GRID_FLAG_BG256;
1529eda6f593SDavid van Moolenbroek gc->bg = m;
1530eda6f593SDavid van Moolenbroek }
1531eda6f593SDavid van Moolenbroek }
1532eda6f593SDavid van Moolenbroek continue;
1533eda6f593SDavid van Moolenbroek }
1534eda6f593SDavid van Moolenbroek
1535eda6f593SDavid van Moolenbroek switch (n) {
1536eda6f593SDavid van Moolenbroek case 0:
1537eda6f593SDavid van Moolenbroek case 10:
1538eda6f593SDavid van Moolenbroek attr = gc->attr;
1539eda6f593SDavid van Moolenbroek memcpy(gc, &grid_default_cell, sizeof *gc);
1540eda6f593SDavid van Moolenbroek gc->attr |= (attr & GRID_ATTR_CHARSET);
1541eda6f593SDavid van Moolenbroek break;
1542eda6f593SDavid van Moolenbroek case 1:
1543eda6f593SDavid van Moolenbroek gc->attr |= GRID_ATTR_BRIGHT;
1544eda6f593SDavid van Moolenbroek break;
1545eda6f593SDavid van Moolenbroek case 2:
1546eda6f593SDavid van Moolenbroek gc->attr |= GRID_ATTR_DIM;
1547eda6f593SDavid van Moolenbroek break;
1548eda6f593SDavid van Moolenbroek case 3:
1549eda6f593SDavid van Moolenbroek gc->attr |= GRID_ATTR_ITALICS;
1550eda6f593SDavid van Moolenbroek break;
1551eda6f593SDavid van Moolenbroek case 4:
1552eda6f593SDavid van Moolenbroek gc->attr |= GRID_ATTR_UNDERSCORE;
1553eda6f593SDavid van Moolenbroek break;
1554eda6f593SDavid van Moolenbroek case 5:
1555eda6f593SDavid van Moolenbroek gc->attr |= GRID_ATTR_BLINK;
1556eda6f593SDavid van Moolenbroek break;
1557eda6f593SDavid van Moolenbroek case 7:
1558eda6f593SDavid van Moolenbroek gc->attr |= GRID_ATTR_REVERSE;
1559eda6f593SDavid van Moolenbroek break;
1560eda6f593SDavid van Moolenbroek case 8:
1561eda6f593SDavid van Moolenbroek gc->attr |= GRID_ATTR_HIDDEN;
1562eda6f593SDavid van Moolenbroek break;
1563eda6f593SDavid van Moolenbroek case 22:
1564eda6f593SDavid van Moolenbroek gc->attr &= ~(GRID_ATTR_BRIGHT|GRID_ATTR_DIM);
1565eda6f593SDavid van Moolenbroek break;
1566eda6f593SDavid van Moolenbroek case 23:
1567eda6f593SDavid van Moolenbroek gc->attr &= ~GRID_ATTR_ITALICS;
1568eda6f593SDavid van Moolenbroek break;
1569eda6f593SDavid van Moolenbroek case 24:
1570eda6f593SDavid van Moolenbroek gc->attr &= ~GRID_ATTR_UNDERSCORE;
1571eda6f593SDavid van Moolenbroek break;
1572eda6f593SDavid van Moolenbroek case 25:
1573eda6f593SDavid van Moolenbroek gc->attr &= ~GRID_ATTR_BLINK;
1574eda6f593SDavid van Moolenbroek break;
1575eda6f593SDavid van Moolenbroek case 27:
1576eda6f593SDavid van Moolenbroek gc->attr &= ~GRID_ATTR_REVERSE;
1577eda6f593SDavid van Moolenbroek break;
1578eda6f593SDavid van Moolenbroek case 30:
1579eda6f593SDavid van Moolenbroek case 31:
1580eda6f593SDavid van Moolenbroek case 32:
1581eda6f593SDavid van Moolenbroek case 33:
1582eda6f593SDavid van Moolenbroek case 34:
1583eda6f593SDavid van Moolenbroek case 35:
1584eda6f593SDavid van Moolenbroek case 36:
1585eda6f593SDavid van Moolenbroek case 37:
1586eda6f593SDavid van Moolenbroek gc->flags &= ~GRID_FLAG_FG256;
1587eda6f593SDavid van Moolenbroek gc->fg = n - 30;
1588eda6f593SDavid van Moolenbroek break;
1589eda6f593SDavid van Moolenbroek case 39:
1590eda6f593SDavid van Moolenbroek gc->flags &= ~GRID_FLAG_FG256;
1591eda6f593SDavid van Moolenbroek gc->fg = 8;
1592eda6f593SDavid van Moolenbroek break;
1593eda6f593SDavid van Moolenbroek case 40:
1594eda6f593SDavid van Moolenbroek case 41:
1595eda6f593SDavid van Moolenbroek case 42:
1596eda6f593SDavid van Moolenbroek case 43:
1597eda6f593SDavid van Moolenbroek case 44:
1598eda6f593SDavid van Moolenbroek case 45:
1599eda6f593SDavid van Moolenbroek case 46:
1600eda6f593SDavid van Moolenbroek case 47:
1601eda6f593SDavid van Moolenbroek gc->flags &= ~GRID_FLAG_BG256;
1602eda6f593SDavid van Moolenbroek gc->bg = n - 40;
1603eda6f593SDavid van Moolenbroek break;
1604eda6f593SDavid van Moolenbroek case 49:
1605eda6f593SDavid van Moolenbroek gc->flags &= ~GRID_FLAG_BG256;
1606eda6f593SDavid van Moolenbroek gc->bg = 8;
1607eda6f593SDavid van Moolenbroek break;
1608eda6f593SDavid van Moolenbroek case 90:
1609eda6f593SDavid van Moolenbroek case 91:
1610eda6f593SDavid van Moolenbroek case 92:
1611eda6f593SDavid van Moolenbroek case 93:
1612eda6f593SDavid van Moolenbroek case 94:
1613eda6f593SDavid van Moolenbroek case 95:
1614eda6f593SDavid van Moolenbroek case 96:
1615eda6f593SDavid van Moolenbroek case 97:
1616eda6f593SDavid van Moolenbroek gc->flags &= ~GRID_FLAG_FG256;
1617eda6f593SDavid van Moolenbroek gc->fg = n;
1618eda6f593SDavid van Moolenbroek break;
1619eda6f593SDavid van Moolenbroek case 100:
1620eda6f593SDavid van Moolenbroek case 101:
1621eda6f593SDavid van Moolenbroek case 102:
1622eda6f593SDavid van Moolenbroek case 103:
1623eda6f593SDavid van Moolenbroek case 104:
1624eda6f593SDavid van Moolenbroek case 105:
1625eda6f593SDavid van Moolenbroek case 106:
1626eda6f593SDavid van Moolenbroek case 107:
1627eda6f593SDavid van Moolenbroek gc->flags &= ~GRID_FLAG_BG256;
1628*0a6a1f1dSLionel Sambuc gc->bg = n - 10;
1629eda6f593SDavid van Moolenbroek break;
1630eda6f593SDavid van Moolenbroek }
1631eda6f593SDavid van Moolenbroek }
1632eda6f593SDavid van Moolenbroek }
1633eda6f593SDavid van Moolenbroek
1634eda6f593SDavid van Moolenbroek /* DCS terminator (ST) received. */
1635eda6f593SDavid van Moolenbroek int
input_dcs_dispatch(struct input_ctx * ictx)1636eda6f593SDavid van Moolenbroek input_dcs_dispatch(struct input_ctx *ictx)
1637eda6f593SDavid van Moolenbroek {
1638eda6f593SDavid van Moolenbroek const char prefix[] = "tmux;";
1639eda6f593SDavid van Moolenbroek const u_int prefix_len = (sizeof prefix) - 1;
1640eda6f593SDavid van Moolenbroek
1641eda6f593SDavid van Moolenbroek if (ictx->flags & INPUT_DISCARD)
1642eda6f593SDavid van Moolenbroek return (0);
1643eda6f593SDavid van Moolenbroek
1644eda6f593SDavid van Moolenbroek log_debug("%s: \"%s\"", __func__, ictx->input_buf);
1645eda6f593SDavid van Moolenbroek
1646eda6f593SDavid van Moolenbroek /* Check for tmux prefix. */
1647eda6f593SDavid van Moolenbroek if (ictx->input_len >= prefix_len &&
1648eda6f593SDavid van Moolenbroek strncmp((const char *)ictx->input_buf, prefix, prefix_len) == 0) {
1649eda6f593SDavid van Moolenbroek screen_write_rawstring(&ictx->ctx,
1650eda6f593SDavid van Moolenbroek ictx->input_buf + prefix_len, ictx->input_len - prefix_len);
1651eda6f593SDavid van Moolenbroek }
1652eda6f593SDavid van Moolenbroek
1653eda6f593SDavid van Moolenbroek return (0);
1654eda6f593SDavid van Moolenbroek }
1655eda6f593SDavid van Moolenbroek
1656eda6f593SDavid van Moolenbroek /* OSC string started. */
1657eda6f593SDavid van Moolenbroek void
input_enter_osc(struct input_ctx * ictx)1658eda6f593SDavid van Moolenbroek input_enter_osc(struct input_ctx *ictx)
1659eda6f593SDavid van Moolenbroek {
1660eda6f593SDavid van Moolenbroek log_debug("%s", __func__);
1661eda6f593SDavid van Moolenbroek
1662eda6f593SDavid van Moolenbroek input_clear(ictx);
1663eda6f593SDavid van Moolenbroek }
1664eda6f593SDavid van Moolenbroek
1665eda6f593SDavid van Moolenbroek /* OSC terminator (ST) received. */
1666eda6f593SDavid van Moolenbroek void
input_exit_osc(struct input_ctx * ictx)1667eda6f593SDavid van Moolenbroek input_exit_osc(struct input_ctx *ictx)
1668eda6f593SDavid van Moolenbroek {
1669eda6f593SDavid van Moolenbroek u_char *p = ictx->input_buf;
1670eda6f593SDavid van Moolenbroek int option;
1671eda6f593SDavid van Moolenbroek
1672eda6f593SDavid van Moolenbroek if (ictx->flags & INPUT_DISCARD)
1673eda6f593SDavid van Moolenbroek return;
1674eda6f593SDavid van Moolenbroek if (ictx->input_len < 1 || *p < '0' || *p > '9')
1675eda6f593SDavid van Moolenbroek return;
1676eda6f593SDavid van Moolenbroek
1677eda6f593SDavid van Moolenbroek log_debug("%s: \"%s\"", __func__, p);
1678eda6f593SDavid van Moolenbroek
1679eda6f593SDavid van Moolenbroek option = 0;
1680eda6f593SDavid van Moolenbroek while (*p >= '0' && *p <= '9')
1681eda6f593SDavid van Moolenbroek option = option * 10 + *p++ - '0';
1682eda6f593SDavid van Moolenbroek if (*p == ';')
1683eda6f593SDavid van Moolenbroek p++;
1684eda6f593SDavid van Moolenbroek
1685eda6f593SDavid van Moolenbroek switch (option) {
1686eda6f593SDavid van Moolenbroek case 0:
1687eda6f593SDavid van Moolenbroek case 2:
1688eda6f593SDavid van Moolenbroek screen_set_title(ictx->ctx.s, (const char *)p);
1689eda6f593SDavid van Moolenbroek server_status_window(ictx->wp->window);
1690eda6f593SDavid van Moolenbroek break;
1691eda6f593SDavid van Moolenbroek case 12:
1692*0a6a1f1dSLionel Sambuc if (*p != '?') /* ? is colour request */
1693eda6f593SDavid van Moolenbroek screen_set_cursor_colour(ictx->ctx.s, (const char *)p);
1694eda6f593SDavid van Moolenbroek break;
1695eda6f593SDavid van Moolenbroek case 112:
1696*0a6a1f1dSLionel Sambuc if (*p == '\0') /* no arguments allowed */
1697eda6f593SDavid van Moolenbroek screen_set_cursor_colour(ictx->ctx.s, "");
1698eda6f593SDavid van Moolenbroek break;
1699eda6f593SDavid van Moolenbroek default:
1700eda6f593SDavid van Moolenbroek log_debug("%s: unknown '%u'", __func__, option);
1701eda6f593SDavid van Moolenbroek break;
1702eda6f593SDavid van Moolenbroek }
1703eda6f593SDavid van Moolenbroek }
1704eda6f593SDavid van Moolenbroek
1705eda6f593SDavid van Moolenbroek /* APC string started. */
1706eda6f593SDavid van Moolenbroek void
input_enter_apc(struct input_ctx * ictx)1707eda6f593SDavid van Moolenbroek input_enter_apc(struct input_ctx *ictx)
1708eda6f593SDavid van Moolenbroek {
1709eda6f593SDavid van Moolenbroek log_debug("%s", __func__);
1710eda6f593SDavid van Moolenbroek
1711eda6f593SDavid van Moolenbroek input_clear(ictx);
1712eda6f593SDavid van Moolenbroek }
1713eda6f593SDavid van Moolenbroek
1714eda6f593SDavid van Moolenbroek /* APC terminator (ST) received. */
1715eda6f593SDavid van Moolenbroek void
input_exit_apc(struct input_ctx * ictx)1716eda6f593SDavid van Moolenbroek input_exit_apc(struct input_ctx *ictx)
1717eda6f593SDavid van Moolenbroek {
1718eda6f593SDavid van Moolenbroek if (ictx->flags & INPUT_DISCARD)
1719eda6f593SDavid van Moolenbroek return;
1720eda6f593SDavid van Moolenbroek log_debug("%s: \"%s\"", __func__, ictx->input_buf);
1721eda6f593SDavid van Moolenbroek
1722eda6f593SDavid van Moolenbroek screen_set_title(ictx->ctx.s, (const char *)ictx->input_buf);
1723eda6f593SDavid van Moolenbroek server_status_window(ictx->wp->window);
1724eda6f593SDavid van Moolenbroek }
1725eda6f593SDavid van Moolenbroek
1726eda6f593SDavid van Moolenbroek /* Rename string started. */
1727eda6f593SDavid van Moolenbroek void
input_enter_rename(struct input_ctx * ictx)1728eda6f593SDavid van Moolenbroek input_enter_rename(struct input_ctx *ictx)
1729eda6f593SDavid van Moolenbroek {
1730eda6f593SDavid van Moolenbroek log_debug("%s", __func__);
1731eda6f593SDavid van Moolenbroek
1732eda6f593SDavid van Moolenbroek input_clear(ictx);
1733eda6f593SDavid van Moolenbroek }
1734eda6f593SDavid van Moolenbroek
1735eda6f593SDavid van Moolenbroek /* Rename terminator (ST) received. */
1736eda6f593SDavid van Moolenbroek void
input_exit_rename(struct input_ctx * ictx)1737eda6f593SDavid van Moolenbroek input_exit_rename(struct input_ctx *ictx)
1738eda6f593SDavid van Moolenbroek {
1739eda6f593SDavid van Moolenbroek if (ictx->flags & INPUT_DISCARD)
1740eda6f593SDavid van Moolenbroek return;
1741*0a6a1f1dSLionel Sambuc if (!options_get_number(&ictx->wp->window->options, "allow-rename"))
1742*0a6a1f1dSLionel Sambuc return;
1743eda6f593SDavid van Moolenbroek log_debug("%s: \"%s\"", __func__, ictx->input_buf);
1744eda6f593SDavid van Moolenbroek
1745*0a6a1f1dSLionel Sambuc window_set_name(ictx->wp->window, (const char *)ictx->input_buf);
1746eda6f593SDavid van Moolenbroek options_set_number(&ictx->wp->window->options, "automatic-rename", 0);
1747eda6f593SDavid van Moolenbroek
1748eda6f593SDavid van Moolenbroek server_status_window(ictx->wp->window);
1749eda6f593SDavid van Moolenbroek }
1750eda6f593SDavid van Moolenbroek
1751eda6f593SDavid van Moolenbroek /* Open UTF-8 character. */
1752eda6f593SDavid van Moolenbroek int
input_utf8_open(struct input_ctx * ictx)1753eda6f593SDavid van Moolenbroek input_utf8_open(struct input_ctx *ictx)
1754eda6f593SDavid van Moolenbroek {
1755eda6f593SDavid van Moolenbroek if (!options_get_number(&ictx->wp->window->options, "utf8")) {
1756eda6f593SDavid van Moolenbroek /* Print, and do not switch state. */
1757eda6f593SDavid van Moolenbroek input_print(ictx);
1758eda6f593SDavid van Moolenbroek return (-1);
1759eda6f593SDavid van Moolenbroek }
1760eda6f593SDavid van Moolenbroek log_debug("%s", __func__);
1761eda6f593SDavid van Moolenbroek
1762eda6f593SDavid van Moolenbroek utf8_open(&ictx->utf8data, ictx->ch);
1763eda6f593SDavid van Moolenbroek return (0);
1764eda6f593SDavid van Moolenbroek }
1765eda6f593SDavid van Moolenbroek
1766eda6f593SDavid van Moolenbroek /* Append to UTF-8 character. */
1767eda6f593SDavid van Moolenbroek int
input_utf8_add(struct input_ctx * ictx)1768eda6f593SDavid van Moolenbroek input_utf8_add(struct input_ctx *ictx)
1769eda6f593SDavid van Moolenbroek {
1770eda6f593SDavid van Moolenbroek log_debug("%s", __func__);
1771eda6f593SDavid van Moolenbroek
1772eda6f593SDavid van Moolenbroek utf8_append(&ictx->utf8data, ictx->ch);
1773eda6f593SDavid van Moolenbroek return (0);
1774eda6f593SDavid van Moolenbroek }
1775eda6f593SDavid van Moolenbroek
1776eda6f593SDavid van Moolenbroek /* Close UTF-8 string. */
1777eda6f593SDavid van Moolenbroek int
input_utf8_close(struct input_ctx * ictx)1778eda6f593SDavid van Moolenbroek input_utf8_close(struct input_ctx *ictx)
1779eda6f593SDavid van Moolenbroek {
1780eda6f593SDavid van Moolenbroek log_debug("%s", __func__);
1781eda6f593SDavid van Moolenbroek
1782eda6f593SDavid van Moolenbroek utf8_append(&ictx->utf8data, ictx->ch);
1783eda6f593SDavid van Moolenbroek
1784*0a6a1f1dSLionel Sambuc grid_cell_set(&ictx->cell, &ictx->utf8data);
1785*0a6a1f1dSLionel Sambuc screen_write_cell(&ictx->ctx, &ictx->cell);
1786eda6f593SDavid van Moolenbroek
1787eda6f593SDavid van Moolenbroek return (0);
1788eda6f593SDavid van Moolenbroek }
1789