add MESSAGE-OF-DOOM to EXTRA_DIST make Alt+Return generate ESC newline
[vte.git] / src / keymap.c
1 /*
2  * Copyright (C) 2002,2003 Red Hat, Inc.
3  *
4  * This is free software; you can redistribute it and/or modify it under
5  * the terms of the GNU Library General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this program; if not, write to the Free Software
16  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18
19 #ident "$Id$"
20 #include "../config.h"
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <glib.h>
25 #include <gdk/gdk.h>
26 #include <gdk/gdkkeysyms.h>
27 #include "caps.h"
28 #include "debug.h"
29 #include "keymap.h"
30 #include "termcap.h"
31 #ifdef HAVE_NCURSES
32 #include <ncurses.h>
33 #ifdef HAVE_TERM_H
34 #include <term.h>
35 #endif
36 #define HAVE_CURSES
37 #else
38 #ifdef HAVE_CURSES
39 #include <curses.h>
40 #ifdef HAVE_TERM_H
41 #include <term.h>
42 #endif
43 #else
44 #ifdef HAVE_TERMCAP
45 #include <termcap.h>
46 #endif
47 #endif
48 #endif
49
50 #ifdef VTE_DEBUG
51 static const char *
52 _vte_keysym_name(guint keyval)
53 {
54         switch (keyval) {
55 #include "keysyms.c"
56                 default:
57                         break;
58         }
59         return "(unknown)";
60 }
61 #endif
62
63 enum _vte_cursor_mode {
64         cursor_default =        1 << 0,
65         cursor_app =            1 << 1,
66 };
67
68 enum _vte_keypad_mode {
69         keypad_default =        1 << 0,
70         keypad_app =            1 << 1
71 };
72
73 enum _vte_fkey_mode {
74         fkey_default =  1 << 0,
75         fkey_sun =      1 << 1,
76         fkey_hp =       1 << 2,
77         fkey_legacy =   1 << 3,
78         fkey_vt220 =    1 << 4,
79 };
80
81 #define cursor_all      (cursor_default | cursor_app)
82 #define keypad_all      (keypad_default | keypad_app)
83 #define fkey_all        (fkey_default | fkey_sun | fkey_hp | fkey_legacy | fkey_vt220)
84 #define fkey_notvt220   (fkey_default | fkey_sun | fkey_hp | fkey_legacy)
85 #define fkey_notsun     (fkey_default | fkey_hp | fkey_legacy | fkey_vt220)
86 #define fkey_nothp      (fkey_default | fkey_sun | fkey_legacy | fkey_vt220)
87 #define fkey_notsunvt   (fkey_default | fkey_hp | fkey_legacy)
88 #define fkey_notsunhp   (fkey_default | fkey_legacy | fkey_vt220)
89 #define fkey_nothpvt    (fkey_default | fkey_sun | fkey_legacy)
90
91 struct _vte_keymap_entry {
92         enum _vte_cursor_mode cursor_mode;
93         enum _vte_keypad_mode keypad_mode;
94         enum _vte_fkey_mode fkey_mode;
95         GdkModifierType mod_mask;
96         const char *normal;
97         gssize normal_length;
98         const char *special;
99 };
100
101 /* Normal keys unaffected by modes. */
102 static struct _vte_keymap_entry _vte_keymap_GDK_space[] = {
103         /* Control+space = NUL */
104         {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\0", 1, NULL},
105         /* Regular space. */
106         {cursor_all, keypad_all, fkey_all, 0, " ", 1, NULL},
107         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
108 };
109
110 static struct _vte_keymap_entry _vte_keymap_GDK_Tab[] = {
111         /* Shift+Tab = Back-Tab */
112         {cursor_all, keypad_all, fkey_all,
113          GDK_SHIFT_MASK, NULL, 0, "kB"},
114         {cursor_all, keypad_all, fkey_all,
115          GDK_SHIFT_MASK, _VTE_CAP_CSI "Z", -1, NULL},
116         /* Alt+Tab = Esc+Tab */
117         {cursor_all, keypad_all, fkey_all,
118          VTE_META_MASK, _VTE_CAP_ESC "\t", -1, NULL},
119         /* Regular tab. */
120         {cursor_all, keypad_all, fkey_all,
121          0, NULL, 0, "ta"},
122         {cursor_all, keypad_all, fkey_all, 0, "\t", 1, NULL},
123         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
124 };
125
126 static struct _vte_keymap_entry _vte_keymap_GDK_Return[] = {
127         {cursor_all, keypad_all, fkey_all,
128          VTE_META_MASK, _VTE_CAP_ESC "\n", 2, NULL},
129         {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\n", 1, NULL},
130         {cursor_all, keypad_all, fkey_all, 0, "\r", 1, NULL},
131         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
132 };
133
134 static struct _vte_keymap_entry _vte_keymap_GDK_Escape[] = {
135         {cursor_all, keypad_all, fkey_all,
136          VTE_META_MASK, _VTE_CAP_ESC _VTE_CAP_ESC, 2, NULL},
137         {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_ESC, 1, NULL},
138         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
139 };
140
141 static struct _vte_keymap_entry _vte_keymap_GDK_Insert[] = {
142         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kI"},
143         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "Q", -1, NULL},
144         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "2z", -1, NULL},
145         {cursor_all, keypad_all, fkey_notsunhp, 0, _VTE_CAP_CSI "2~", -1, NULL},
146         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
147 };
148
149 static struct _vte_keymap_entry _vte_keymap_GDK_ISO_Left_Tab[] = {
150         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kB"},
151         {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_CSI "Z", -1, NULL},
152         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
153 };
154
155 /* Various numeric keys enter control characters. */
156 static struct _vte_keymap_entry _vte_keymap_GDK_2[] = {
157         {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\0", 1, NULL},
158         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
159 };
160 static struct _vte_keymap_entry _vte_keymap_GDK_3[] = {
161         {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\033", 1, NULL},
162         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
163 };
164 static struct _vte_keymap_entry _vte_keymap_GDK_4[] = {
165         {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\034", 1, NULL},
166         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
167 };
168 static struct _vte_keymap_entry _vte_keymap_GDK_5[] = {
169         {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\035", 1, NULL},
170         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
171 };
172 static struct _vte_keymap_entry _vte_keymap_GDK_6[] = {
173         {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\036", 1, NULL},
174         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
175 };
176 static struct _vte_keymap_entry _vte_keymap_GDK_7[] = {
177         {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\037", 1, NULL},
178         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
179 };
180 static struct _vte_keymap_entry _vte_keymap_GDK_8[] = {
181         {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\177", 1, NULL},
182         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
183 };
184
185 /* Home and End are strange cases because their sequences vary wildly from
186  * system to system, or mine's just broken.  But anyway. */
187 static struct _vte_keymap_entry _vte_keymap_GDK_Home[] = {
188         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kh"},
189         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "1~", -1, NULL},
190         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "h", -1, NULL},
191         {cursor_all, keypad_all, fkey_nothpvt, 0, NULL, 0, "kh"},
192         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
193 };
194
195 static struct _vte_keymap_entry _vte_keymap_GDK_End[] = {
196         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "@7"},
197         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "4~", -1, NULL},
198         {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "@7"},
199         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
200 };
201
202 static struct _vte_keymap_entry _vte_keymap_GDK_Page_Up[] = {
203         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kP"},
204         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "T", -1, NULL},
205         {cursor_all, keypad_all, fkey_notsunhp, 0, _VTE_CAP_CSI "5~", -1, NULL},
206         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "5z", -1, NULL},
207         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
208 };
209
210 static struct _vte_keymap_entry _vte_keymap_GDK_Page_Down[] = {
211         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kN"},
212         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "S", -1, NULL},
213         {cursor_all, keypad_all, fkey_notsunhp, 0, _VTE_CAP_CSI "6~", -1, NULL},
214         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "6z", -1, NULL},
215         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
216 };
217
218 /* Keys affected by the cursor key mode. */
219 static struct _vte_keymap_entry _vte_keymap_GDK_Up[] = {
220         {cursor_default, keypad_all, fkey_all, 0, NULL, 0, "ku"},
221         {cursor_default, keypad_all, fkey_nothp, 0, _VTE_CAP_CSI "A", -1, NULL},
222         {cursor_default, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "A", -1, NULL},
223         {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "A", -1, NULL},
224         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
225 };
226
227 static struct _vte_keymap_entry _vte_keymap_GDK_Down[] = {
228         {cursor_default, keypad_all, fkey_all, 0, NULL, 0, "kd"},
229         {cursor_default, keypad_all, fkey_nothp, 0, _VTE_CAP_CSI "B", -1, NULL},
230         {cursor_default, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "B", -1, NULL},
231         {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "B", -1, NULL},
232         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
233 };
234
235 static struct _vte_keymap_entry _vte_keymap_GDK_Right[] = {
236         {cursor_default, keypad_all, fkey_all, 0, NULL, 0, "kr"},
237         {cursor_default, keypad_all, fkey_nothp, 0, _VTE_CAP_CSI "C", -1, NULL},
238         {cursor_default, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "C", -1, NULL},
239         {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "C", -1, NULL},
240         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
241 };
242
243 static struct _vte_keymap_entry _vte_keymap_GDK_Left[] = {
244         {cursor_default, keypad_all, fkey_all, 0, NULL, 0, "kl"},
245         {cursor_default, keypad_all, fkey_nothp, 0, _VTE_CAP_CSI "D", -1, NULL},
246         {cursor_default, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "D", -1, NULL},
247         {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "D", -1, NULL},
248         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
249 };
250
251 /* Keys (potentially) affected by the keypad key mode. */
252 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Space[] = {
253         {cursor_all, keypad_default, fkey_all, 0, " ", 1, NULL},
254         {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 " ", -1, NULL},
255         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
256 };
257
258 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Tab[] = {
259         {cursor_all, keypad_default, fkey_all, 0, "\t", 1, NULL},
260         {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 "I", -1, NULL},
261         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
262 };
263
264 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Enter[] = {
265         {cursor_all, keypad_default, fkey_all, 0, NULL, 0, "@8"},
266         {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 "M", -1, NULL},
267         {cursor_all, keypad_all, fkey_all, GDK_CONTROL_MASK, "\n", 1, NULL},
268         {cursor_all, keypad_all, fkey_all, 0, "\r", 1, NULL},
269         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
270 };
271
272 static struct _vte_keymap_entry _vte_keymap_GDK_KP_F1[] = {
273         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k1"},
274         {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "P", -1, NULL},
275         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
276 };
277
278 static struct _vte_keymap_entry _vte_keymap_GDK_KP_F2[] = {
279         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k2"},
280         {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "Q", -1, NULL},
281         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
282 };
283
284 static struct _vte_keymap_entry _vte_keymap_GDK_KP_F3[] = {
285         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k3"},
286         {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "R", -1, NULL},
287         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
288 };
289
290 static struct _vte_keymap_entry _vte_keymap_GDK_KP_F4[] = {
291         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "k4"},
292         {cursor_all, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "S", -1, NULL},
293         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
294 };
295
296 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Multiply[] = {
297         {cursor_all, keypad_default, fkey_all, 0, "*", 1, NULL},
298         {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 "j", -1, NULL},
299         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
300 };
301
302 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Add[] = {
303         {cursor_all, keypad_default, fkey_notvt220, 0, "+", 1, NULL},
304         {cursor_all, keypad_default, fkey_vt220, 0, ",", 1, NULL},
305         {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_SS3 "k", -1, NULL},
306         {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "l", -1, NULL},
307         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
308 };
309
310 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Separator[] = {
311         {cursor_all, keypad_default, fkey_all, 0, ",", 1, NULL},
312         {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 "l", -1, NULL},
313         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
314 };
315
316 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Subtract[] = {
317         {cursor_all, keypad_default, fkey_all, 0, "-", 1, NULL},
318         {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 "m", -1, NULL},
319         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
320 };
321
322 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Decimal_Delete[] = {
323         {cursor_all, keypad_default, fkey_default, 0, ".", 1, NULL},
324         {cursor_all, keypad_app, fkey_notsun, 0, _VTE_CAP_SS3 "3~", -1, NULL},
325         {cursor_all, keypad_app, fkey_sun, 0, _VTE_CAP_SS3 "3~", -1, NULL},
326         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
327 };
328
329 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Divide[] = {
330         {cursor_all, keypad_default, fkey_all, 0, "/", 1, NULL},
331         {cursor_all, keypad_app, fkey_all, 0, _VTE_CAP_SS3 "o", -1, NULL},
332         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
333 };
334
335 /* GDK already separates keypad "0" from keypad "Insert", so the only time
336  * we'll see this key is when NumLock is on, and that means that we're in
337  * "default" mode. */
338 static struct _vte_keymap_entry _vte_keymap_GDK_KP_0[] = {
339         {cursor_all, keypad_all, fkey_all, 0, "0", 1, NULL},
340         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
341 };
342
343 static struct _vte_keymap_entry _vte_keymap_GDK_KP_1[] = {
344         {cursor_all, keypad_all, fkey_all, 0, "1", 1, NULL},
345         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
346 };
347
348 static struct _vte_keymap_entry _vte_keymap_GDK_KP_2[] = {
349         {cursor_all, keypad_all, fkey_all, 0, "2", 1, NULL},
350         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
351 };
352
353 static struct _vte_keymap_entry _vte_keymap_GDK_KP_3[] = {
354         {cursor_all, keypad_all, fkey_all, 0, "3", 1, NULL},
355         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
356 };
357
358 static struct _vte_keymap_entry _vte_keymap_GDK_KP_4[] = {
359         {cursor_all, keypad_all, fkey_all, 0, "4", 1, NULL},
360         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
361 };
362
363 static struct _vte_keymap_entry _vte_keymap_GDK_KP_5[] = {
364         {cursor_all, keypad_all, fkey_all, 0, "5", 1, NULL},
365         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
366 };
367
368 static struct _vte_keymap_entry _vte_keymap_GDK_KP_6[] = {
369         {cursor_all, keypad_all, fkey_all, 0, "6", 1, NULL},
370         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
371 };
372
373 static struct _vte_keymap_entry _vte_keymap_GDK_KP_7[] = {
374         {cursor_all, keypad_all, fkey_all, 0, "7", 1, NULL},
375         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
376 };
377
378 static struct _vte_keymap_entry _vte_keymap_GDK_KP_8[] = {
379         {cursor_all, keypad_all, fkey_all, 0, "8", 1, NULL},
380         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
381 };
382
383 static struct _vte_keymap_entry _vte_keymap_GDK_KP_9[] = {
384         {cursor_all, keypad_all, fkey_all, 0, "9", 1, NULL},
385         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
386 };
387
388 /* These are the same keys as above, but without numlock.  If there's a
389  * capability associated with the key, then we send that, unless we're in
390  * application mode. */
391 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Insert[] = {
392         {cursor_all, keypad_default, fkey_notsunvt,
393          0, _VTE_CAP_CSI "2~", -1, NULL},
394         {cursor_all, keypad_default, fkey_sun, 0, _VTE_CAP_CSI "2z", -1, NULL},
395         {cursor_all, keypad_default, fkey_vt220, 0, "0", 1, NULL},
396         {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "2~", -1, NULL},
397         {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "p", -1, NULL},
398         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
399 };
400
401 static struct _vte_keymap_entry _vte_keymap_GDK_KP_End[] = {
402         {cursor_all, keypad_default, fkey_all, 0, NULL, 0, "K4"},
403         {cursor_all, keypad_default, fkey_notvt220,
404          0, _VTE_CAP_CSI "4~", -1, NULL},
405         {cursor_all, keypad_default, fkey_vt220, 0, "1", 1, NULL},
406         {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "4~", -1, NULL},
407         {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "q", -1, NULL},
408         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
409 };
410
411 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Down[] = {
412         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kd"},
413         {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "B", -1, NULL},
414         {cursor_default, keypad_all, fkey_notvt220,
415          0, _VTE_CAP_CSI "B", -1, NULL},
416         {cursor_default, keypad_default, fkey_vt220, 0, "2", 1, NULL},
417         {cursor_default, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "r", -1, NULL},
418         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
419 };
420
421 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Page_Down[] = {
422         {cursor_all, keypad_default, fkey_all, 0, NULL, 0, "K5"},
423         {cursor_all, keypad_default, fkey_notsunvt,
424          0, _VTE_CAP_CSI "6~", -1, NULL},
425         {cursor_all, keypad_default, fkey_sun, 0, _VTE_CAP_CSI "6z", -1, NULL},
426         {cursor_all, keypad_default, fkey_vt220, 0, "3", 1, NULL},
427         {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "5~", -1, NULL},
428         {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "s", -1, NULL},
429         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
430 };
431
432 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Left[] = {
433         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kl"},
434         {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "D", -1, NULL},
435         {cursor_default, keypad_all, fkey_notvt220,
436          0, _VTE_CAP_CSI "D", -1, NULL},
437         {cursor_default, keypad_default, fkey_vt220, 0, "4", 1, NULL},
438         {cursor_default, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "t", -1, NULL},
439         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
440 };
441
442 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Begin[] = {
443         {cursor_all, keypad_default, fkey_all, 0, NULL, 0, "K2"},
444         {cursor_all, keypad_default, fkey_notvt220,
445          0, _VTE_CAP_CSI "E", -1, NULL},
446         {cursor_all, keypad_default, fkey_vt220, 0, "5", 1, NULL},
447         {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "E", -1, NULL},
448         {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "u", -1, NULL},
449         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
450 };
451
452 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Right[] = {
453         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "kr"},
454         {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "C", -1, NULL},
455         {cursor_default, keypad_all, fkey_notvt220,
456          0, _VTE_CAP_CSI "C", -1, NULL},
457         {cursor_default, keypad_default, fkey_vt220, 0, "6", 1, NULL},
458         {cursor_default, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "v", -1, NULL},
459         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
460 };
461
462 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Home[] = {
463         {cursor_all, keypad_default, fkey_all, 0, NULL, 0, "K1"},
464         {cursor_all, keypad_default, fkey_notvt220,
465          0, _VTE_CAP_CSI "1~", -1, NULL},
466         {cursor_all, keypad_default, fkey_vt220, 0, "7", 1, NULL},
467         {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "1~", -1, NULL},
468         {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "w", -1, NULL},
469         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
470 };
471
472 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Up[] = {
473         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "ku"},
474         {cursor_app, keypad_all, fkey_all, 0, _VTE_CAP_SS3 "A", -1, NULL},
475         {cursor_default, keypad_all, fkey_notvt220,
476          0, _VTE_CAP_CSI "A", -1, NULL},
477         {cursor_default, keypad_default, fkey_vt220, 0, "8", 1, NULL},
478         {cursor_default, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "x", -1, NULL},
479         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
480 };
481
482 static struct _vte_keymap_entry _vte_keymap_GDK_KP_Page_Up[] = {
483         {cursor_all, keypad_default, fkey_all, 0, NULL, 0, "K3"},
484         {cursor_all, keypad_default, fkey_notvt220,
485          0, _VTE_CAP_CSI "5~", -1, NULL},
486         {cursor_all, keypad_default, fkey_vt220, 0, "9", 1, NULL},
487         {cursor_all, keypad_app, fkey_notvt220, 0, _VTE_CAP_CSI "5~", -1, NULL},
488         {cursor_all, keypad_app, fkey_vt220, 0, _VTE_CAP_SS3 "y", -1, NULL},
489         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
490 };
491
492
493 /* Keys affected by the function key mode. */
494 static struct _vte_keymap_entry _vte_keymap_GDK_F1[] = {
495         {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k1"},
496         {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F3"},
497         {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k1"},
498         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_SS3 "P", -1, NULL},
499         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "224z", -1, NULL},
500         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "p", -1, NULL},
501         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "11~", -1, NULL},
502         {cursor_all, keypad_all, fkey_vt220,
503          GDK_CONTROL_MASK, _VTE_CAP_CSI "23~", -1, NULL},
504         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_SS3 "P", -1, NULL},
505         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
506 };
507
508 static struct _vte_keymap_entry _vte_keymap_GDK_F2[] = {
509         {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k2"},
510         {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F4"},
511         {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k2"},
512         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_SS3 "Q", -1, NULL},
513         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "225z", -1, NULL},
514         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "q", -1, NULL},
515         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "12~", -1, NULL},
516         {cursor_all, keypad_all, fkey_vt220,
517          GDK_CONTROL_MASK, _VTE_CAP_CSI "24~", -1, NULL},
518         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_SS3 "Q", -1, NULL},
519         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
520 };
521
522 static struct _vte_keymap_entry _vte_keymap_GDK_F3[] = {
523         {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k3"},
524         {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F5"},
525         {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k3"},
526         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_SS3 "R", -1, NULL},
527         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "226z", -1, NULL},
528         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "r", -1, NULL},
529         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "13~", -1, NULL},
530         {cursor_all, keypad_all, fkey_vt220,
531          GDK_CONTROL_MASK, _VTE_CAP_CSI "25~", -1, NULL},
532         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_SS3 "R", -1, NULL},
533         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
534 };
535
536 static struct _vte_keymap_entry _vte_keymap_GDK_F4[] = {
537         {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k4"},
538         {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F6"},
539         {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k4"},
540         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_SS3 "S", -1, NULL},
541         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "227z", -1, NULL},
542         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "s", -1, NULL},
543         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "14~", -1, NULL},
544         {cursor_all, keypad_all, fkey_vt220,
545          GDK_CONTROL_MASK, _VTE_CAP_CSI "26~", -1, NULL},
546         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_SS3 "S", -1, NULL},
547         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
548 };
549
550 static struct _vte_keymap_entry _vte_keymap_GDK_F5[] = {
551         {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k5"},
552         {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F7"},
553         {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k5"},
554         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_CSI "15~", -1, NULL},
555         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "228z", -1, NULL},
556         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "t", -1, NULL},
557         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "15~", -1, NULL},
558         {cursor_all, keypad_all, fkey_vt220,
559          GDK_CONTROL_MASK, _VTE_CAP_CSI "28~", -1, NULL},
560         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "15~", -1, NULL},
561         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
562 };
563
564 static struct _vte_keymap_entry _vte_keymap_GDK_F6[] = {
565         {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k6"},
566         {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F8"},
567         {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k6"},
568         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_CSI "17~", -1, NULL},
569         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "229z", -1, NULL},
570         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "u", -1, NULL},
571         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "17~", -1, NULL},
572         {cursor_all, keypad_all, fkey_vt220,
573          GDK_CONTROL_MASK, _VTE_CAP_CSI "29~", -1, NULL},
574         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "17~", -1, NULL},
575         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
576 };
577
578 static struct _vte_keymap_entry _vte_keymap_GDK_F7[] = {
579         {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k7"},
580         {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "F9"},
581         {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k7"},
582         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_CSI "18~", -1, NULL},
583         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "230z", -1, NULL},
584         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "v", -1, NULL},
585         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "18~", -1, NULL},
586         {cursor_all, keypad_all, fkey_vt220,
587          GDK_CONTROL_MASK, _VTE_CAP_CSI "31~", -1, NULL},
588         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "18~", -1, NULL},
589         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
590 };
591
592 static struct _vte_keymap_entry _vte_keymap_GDK_F8[] = {
593         {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k8"},
594         {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "FA"},
595         {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k8"},
596         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_CSI "19~", -1, NULL},
597         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "231z", -1, NULL},
598         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_ESC "w", -1, NULL},
599         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "19~", -1, NULL},
600         {cursor_all, keypad_all, fkey_vt220,
601          GDK_CONTROL_MASK, _VTE_CAP_CSI "32~", -1, NULL},
602         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "19~", -1, NULL},
603         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
604 };
605
606 static struct _vte_keymap_entry _vte_keymap_GDK_F9[] = {
607         {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k9"},
608         {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "FB"},
609         {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k9"},
610         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_CSI "20~", -1, NULL},
611         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "232z", -1, NULL},
612         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_CSI "20~", -1, NULL},
613         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "20~", -1, NULL},
614         {cursor_all, keypad_all, fkey_vt220,
615          GDK_CONTROL_MASK, _VTE_CAP_CSI "33~", -1, NULL},
616         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "20~", -1, NULL},
617         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
618 };
619
620 static struct _vte_keymap_entry _vte_keymap_GDK_F10[] = {
621         {cursor_all, keypad_all, fkey_notvt220, 0, NULL, 0, "k;"},
622         {cursor_all, keypad_all, fkey_vt220, GDK_CONTROL_MASK, NULL, 0, "FC"},
623         {cursor_all, keypad_all, fkey_vt220, 0, NULL, 0, "k;"},
624         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_CSI "21~", -1, NULL},
625         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "233z", -1, NULL},
626         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_CSI "21~", -1, NULL},
627         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "21~", -1, NULL},
628         {cursor_all, keypad_all, fkey_vt220,
629          GDK_CONTROL_MASK, _VTE_CAP_CSI "34~", -1, NULL},
630         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "21~", -1, NULL},
631         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
632 };
633
634 static struct _vte_keymap_entry _vte_keymap_GDK_F11[] = {
635         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F1"},
636         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_CSI "23~", -1, NULL},
637         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "192z", -1, NULL},
638         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_CSI "23~", -1, NULL},
639         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "23~", -1, NULL},
640         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "23~", -1, NULL},
641         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
642 };
643
644 static struct _vte_keymap_entry _vte_keymap_GDK_F12[] = {
645         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F2"},
646         {cursor_all, keypad_all, fkey_default, 0, _VTE_CAP_CSI "24~", -1, NULL},
647         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "193z", -1, NULL},
648         {cursor_all, keypad_all, fkey_hp, 0, _VTE_CAP_CSI "24~", -1, NULL},
649         {cursor_all, keypad_all, fkey_legacy, 0, _VTE_CAP_CSI "24~", -1, NULL},
650         {cursor_all, keypad_all, fkey_vt220, 0, _VTE_CAP_CSI "24~", -1, NULL},
651         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
652 };
653
654 static struct _vte_keymap_entry _vte_keymap_GDK_F13[] = {
655         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F3"},
656         {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "25~", -1, NULL},
657         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "194z", -1, NULL},
658         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
659 };
660
661 static struct _vte_keymap_entry _vte_keymap_GDK_F14[] = {
662         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F4"},
663         {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "26~", -1, NULL},
664         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "195z", -1, NULL},
665         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
666 };
667
668 static struct _vte_keymap_entry _vte_keymap_GDK_F15[] = {
669         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F5"},
670         {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "28~", -1, NULL},
671         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "196z", -1, NULL},
672         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
673 };
674
675 static struct _vte_keymap_entry _vte_keymap_GDK_F16[] = {
676         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F6"},
677         {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "29~", -1, NULL},
678         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "197z", -1, NULL},
679         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
680 };
681
682 static struct _vte_keymap_entry _vte_keymap_GDK_F17[] = {
683         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F7"},
684         {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "31~", -1, NULL},
685         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "198z", -1, NULL},
686         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
687 };
688
689 static struct _vte_keymap_entry _vte_keymap_GDK_F18[] = {
690         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F8"},
691         {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "32~", -1, NULL},
692         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "199z", -1, NULL},
693         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
694 };
695
696 static struct _vte_keymap_entry _vte_keymap_GDK_F19[] = {
697         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "F9"},
698         {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "33~", -1, NULL},
699         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "200z", -1, NULL},
700         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
701 };
702
703 static struct _vte_keymap_entry _vte_keymap_GDK_F20[] = {
704         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FA"},
705         {cursor_all, keypad_all, fkey_notsun, 0, _VTE_CAP_CSI "34~", -1, NULL},
706         {cursor_all, keypad_all, fkey_sun, 0, _VTE_CAP_CSI "201z", -1, NULL},
707         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
708 };
709
710 static struct _vte_keymap_entry _vte_keymap_GDK_F21[] = {
711         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FB"},
712         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
713 };
714
715 static struct _vte_keymap_entry _vte_keymap_GDK_F22[] = {
716         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FC"},
717         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
718 };
719
720 static struct _vte_keymap_entry _vte_keymap_GDK_F23[] = {
721         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FD"},
722         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
723 };
724
725 static struct _vte_keymap_entry _vte_keymap_GDK_F24[] = {
726         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FE"},
727         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
728 };
729
730 static struct _vte_keymap_entry _vte_keymap_GDK_F25[] = {
731         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FF"},
732         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
733 };
734
735 static struct _vte_keymap_entry _vte_keymap_GDK_F26[] = {
736         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FG"},
737         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
738 };
739
740 static struct _vte_keymap_entry _vte_keymap_GDK_F27[] = {
741         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FH"},
742         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
743 };
744
745 static struct _vte_keymap_entry _vte_keymap_GDK_F28[] = {
746         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FI"},
747         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
748 };
749
750 static struct _vte_keymap_entry _vte_keymap_GDK_F29[] = {
751         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FJ"},
752         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
753 };
754
755 static struct _vte_keymap_entry _vte_keymap_GDK_F30[] = {
756         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FK"},
757         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
758 };
759
760 static struct _vte_keymap_entry _vte_keymap_GDK_F31[] = {
761         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FL"},
762         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
763 };
764
765 static struct _vte_keymap_entry _vte_keymap_GDK_F32[] = {
766         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FM"},
767         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
768 };
769
770 static struct _vte_keymap_entry _vte_keymap_GDK_F33[] = {
771         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FN"},
772         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
773 };
774
775 static struct _vte_keymap_entry _vte_keymap_GDK_F34[] = {
776         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FO"},
777         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
778 };
779
780 static struct _vte_keymap_entry _vte_keymap_GDK_F35[] = {
781         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, "FP"},
782         {cursor_all, keypad_all, fkey_all, 0, NULL, 0, NULL},
783 };
784
785 static struct _vte_keymap_group {
786         guint keyval;
787         struct _vte_keymap_entry *entries;
788 } _vte_keymap[] = {
789         {GDK_space,             _vte_keymap_GDK_space},
790         {GDK_Return,            _vte_keymap_GDK_Return},
791         {GDK_Escape,            _vte_keymap_GDK_Escape},
792         {GDK_Tab,               _vte_keymap_GDK_Tab},
793         {GDK_ISO_Left_Tab,      _vte_keymap_GDK_ISO_Left_Tab},
794         {GDK_Home,              _vte_keymap_GDK_Home},
795         {GDK_End,               _vte_keymap_GDK_End},
796         {GDK_Insert,            _vte_keymap_GDK_Insert},
797         /* GDK_Delete is all handled in code, due to funkiness. */
798         {GDK_Page_Up,           _vte_keymap_GDK_Page_Up},
799         {GDK_Page_Down,         _vte_keymap_GDK_Page_Down},
800
801         {GDK_2,                 _vte_keymap_GDK_2},
802         {GDK_3,                 _vte_keymap_GDK_3},
803         {GDK_4,                 _vte_keymap_GDK_4},
804         {GDK_5,                 _vte_keymap_GDK_5},
805         {GDK_6,                 _vte_keymap_GDK_6},
806         {GDK_7,                 _vte_keymap_GDK_7},
807         {GDK_8,                 _vte_keymap_GDK_8},
808
809         {GDK_Up,                _vte_keymap_GDK_Up},
810         {GDK_Down,              _vte_keymap_GDK_Down},
811         {GDK_Right,             _vte_keymap_GDK_Right},
812         {GDK_Left,              _vte_keymap_GDK_Left},
813
814         {GDK_KP_Space,          _vte_keymap_GDK_KP_Space},
815         {GDK_KP_Tab,            _vte_keymap_GDK_KP_Tab},
816         {GDK_KP_Enter,          _vte_keymap_GDK_KP_Enter},
817         {GDK_KP_F1,             _vte_keymap_GDK_KP_F1},
818         {GDK_KP_F2,             _vte_keymap_GDK_KP_F2},
819         {GDK_KP_F3,             _vte_keymap_GDK_KP_F3},
820         {GDK_KP_F4,             _vte_keymap_GDK_KP_F4},
821         {GDK_KP_Multiply,       _vte_keymap_GDK_KP_Multiply},
822         {GDK_KP_Add,            _vte_keymap_GDK_KP_Add},
823         {GDK_KP_Separator,      _vte_keymap_GDK_KP_Separator},
824         {GDK_KP_Subtract,       _vte_keymap_GDK_KP_Subtract},
825         {GDK_KP_Decimal,        _vte_keymap_GDK_KP_Decimal_Delete},
826         {GDK_KP_Delete,         _vte_keymap_GDK_KP_Decimal_Delete},
827         {GDK_KP_Divide,         _vte_keymap_GDK_KP_Divide},
828         {GDK_KP_0,              _vte_keymap_GDK_KP_0},
829         {GDK_KP_Insert,         _vte_keymap_GDK_KP_Insert},
830         {GDK_KP_1,              _vte_keymap_GDK_KP_1},
831         {GDK_KP_End,            _vte_keymap_GDK_KP_End},
832         {GDK_KP_2,              _vte_keymap_GDK_KP_2},
833         {GDK_KP_Down,           _vte_keymap_GDK_KP_Down},
834         {GDK_KP_3,              _vte_keymap_GDK_KP_3},
835         {GDK_KP_Page_Down,      _vte_keymap_GDK_KP_Page_Down},
836         {GDK_KP_4,              _vte_keymap_GDK_KP_4},
837         {GDK_KP_Left,           _vte_keymap_GDK_KP_Left},
838         {GDK_KP_5,              _vte_keymap_GDK_KP_5},
839         {GDK_KP_Begin,          _vte_keymap_GDK_KP_Begin},
840         {GDK_KP_6,              _vte_keymap_GDK_KP_6},
841         {GDK_KP_Right,          _vte_keymap_GDK_KP_Right},
842         {GDK_KP_7,              _vte_keymap_GDK_KP_7},
843         {GDK_KP_Home,           _vte_keymap_GDK_KP_Home},
844         {GDK_KP_8,              _vte_keymap_GDK_KP_8},
845         {GDK_KP_Up,             _vte_keymap_GDK_KP_Up},
846         {GDK_KP_9,              _vte_keymap_GDK_KP_9},
847         {GDK_KP_Page_Up,        _vte_keymap_GDK_KP_Page_Up},
848
849         {GDK_F1,                _vte_keymap_GDK_F1},
850         {GDK_F2,                _vte_keymap_GDK_F2},
851         {GDK_F3,                _vte_keymap_GDK_F3},
852         {GDK_F4,                _vte_keymap_GDK_F4},
853         {GDK_F5,                _vte_keymap_GDK_F5},
854         {GDK_F6,                _vte_keymap_GDK_F6},
855         {GDK_F7,                _vte_keymap_GDK_F7},
856         {GDK_F8,                _vte_keymap_GDK_F8},
857         {GDK_F9,                _vte_keymap_GDK_F9},
858         {GDK_F10,               _vte_keymap_GDK_F10},
859         {GDK_F11,               _vte_keymap_GDK_F11},
860         {GDK_F12,               _vte_keymap_GDK_F12},
861         {GDK_F13,               _vte_keymap_GDK_F13},
862         {GDK_F14,               _vte_keymap_GDK_F14},
863         {GDK_F15,               _vte_keymap_GDK_F15},
864         {GDK_F16,               _vte_keymap_GDK_F16},
865         {GDK_F17,               _vte_keymap_GDK_F17},
866         {GDK_F18,               _vte_keymap_GDK_F18},
867         {GDK_F19,               _vte_keymap_GDK_F19},
868         {GDK_F20,               _vte_keymap_GDK_F20},
869         {GDK_F21,               _vte_keymap_GDK_F21},
870         {GDK_F22,               _vte_keymap_GDK_F22},
871         {GDK_F23,               _vte_keymap_GDK_F23},
872         {GDK_F24,               _vte_keymap_GDK_F24},
873         {GDK_F25,               _vte_keymap_GDK_F25},
874         {GDK_F26,               _vte_keymap_GDK_F26},
875         {GDK_F27,               _vte_keymap_GDK_F27},
876         {GDK_F28,               _vte_keymap_GDK_F28},
877         {GDK_F29,               _vte_keymap_GDK_F29},
878         {GDK_F30,               _vte_keymap_GDK_F30},
879         {GDK_F31,               _vte_keymap_GDK_F31},
880         {GDK_F32,               _vte_keymap_GDK_F32},
881         {GDK_F33,               _vte_keymap_GDK_F33},
882         {GDK_F34,               _vte_keymap_GDK_F34},
883         {GDK_F35,               _vte_keymap_GDK_F35},
884 };
885
886 /* Map the specified keyval/modifier setup, dependent on the mode, to either
887  * a literal string or a capability name. */
888 void
889 _vte_keymap_map(guint keyval,
890                 GdkModifierType modifiers,
891                 gboolean sun_mode,
892                 gboolean hp_mode,
893                 gboolean legacy_mode,
894                 gboolean vt220_mode,
895                 gboolean app_cursor_keys,
896                 gboolean app_keypad_keys,
897                 struct _vte_termcap *termcap,
898                 const char *terminal,
899                 char **normal,
900                 size_t *normal_length,
901                 const char **special)
902 {
903         int i;
904         struct _vte_keymap_entry *entries;
905         enum _vte_cursor_mode cursor_mode;
906         enum _vte_keypad_mode keypad_mode;
907         enum _vte_fkey_mode fkey_mode;
908         char *cap, *tmp;
909         const char *termcap_special = NULL;
910 #if defined(HAVE_CURSES) || defined(HAVE_TERMCAP)
911         char ncurses_buffer[4096];
912         char ncurses_area[512];
913 #endif
914
915         g_return_if_fail(normal != NULL);
916         g_return_if_fail(normal_length != NULL);
917         g_return_if_fail(special != NULL);
918
919 #ifdef VTE_DEBUG
920         if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
921                 fprintf(stderr, "Mapping ");
922                 if (modifiers & GDK_CONTROL_MASK) {
923                         fprintf(stderr, "Control+");
924                 }
925                 if (modifiers & VTE_META_MASK) {
926                         fprintf(stderr, "Meta+");
927                 }
928                 if (modifiers & GDK_SHIFT_MASK) {
929                         fprintf(stderr, "Shift+");
930                 }
931                 fprintf(stderr, "%s" , _vte_keysym_name(keyval));
932                 if (sun_mode || hp_mode || legacy_mode || vt220_mode) {
933                         i = 0;
934                         fprintf(stderr, "(");
935                         if (sun_mode) {
936                                 if (i > 0) {
937                                         fprintf(stderr, ",");
938                                 }
939                                 i++;
940                                 fprintf(stderr, "Sun");
941                         }
942                         if (hp_mode) {
943                                 if (i > 0) {
944                                         fprintf(stderr, ",");
945                                 }
946                                 i++;
947                                 fprintf(stderr, "HP");
948                         }
949                         if (legacy_mode) {
950                                 if (i > 0) {
951                                         fprintf(stderr, ",");
952                                 }
953                                 i++;
954                                 fprintf(stderr, "Legacy");
955                         }
956                         if (vt220_mode) {
957                                 if (i > 0) {
958                                         fprintf(stderr, ",");
959                                 }
960                                 i++;
961                                 fprintf(stderr, "VT220");
962                         }
963                         fprintf(stderr, ")");
964                 }
965         }
966 #endif
967
968         /* Start from scratch. */
969         *normal = NULL;
970         *special = NULL;
971         *normal_length = 0;
972
973         /* Search for the list for this key. */
974         entries = NULL;
975         for (i = 0; i < G_N_ELEMENTS(_vte_keymap); i++) {
976 #ifdef VTE_DEBUG
977                 int j;
978                 GdkModifierType mods;
979                 /* Check for NULL strings with non-zero length, and
980                  * vice-versa. */
981                 entries = _vte_keymap[i].entries;
982                 for (j = 0; entries[j].normal || entries[j].special; j++) {
983                         if (entries[j].normal != NULL) {
984                                 g_assert(entries[j].normal_length != 0);
985                                 g_assert(entries[j].special == NULL);
986                         } else {
987                                 g_assert(entries[j].normal_length == 0);
988                                 g_assert(entries[j].special != NULL);
989                         }
990                 }
991                 /* Check for coverage. This check is not exhaustive. */
992                 fkey_mode = 0;
993                 mods = GDK_SHIFT_MASK | GDK_CONTROL_MASK | VTE_META_MASK;
994                 for (j = 0; entries[j].normal || entries[j].special; j++) {
995                         if (entries[j].fkey_mode != fkey_all) {
996                                 fkey_mode |= entries[j].fkey_mode;
997                         }
998                         mods &= entries[j].mod_mask;
999                 }
1000                 switch (_vte_keymap[i].keyval) {
1001                 case GDK_2:
1002                 case GDK_3:
1003                 case GDK_4:
1004                 case GDK_5:
1005                 case GDK_6:
1006                 case GDK_7:
1007                 case GDK_8:
1008                         /* Known non-full-coverage cases. */
1009                         break;
1010                 default:
1011                         /* Everything else we double-check. */
1012                         g_assert((fkey_mode == 0) || (fkey_mode == fkey_all));
1013                         g_assert(mods == 0);
1014                         break;
1015                 }
1016                 entries = NULL;
1017 #endif
1018                 if (_vte_keymap[i].keyval == keyval) {
1019                         /* Found it! */
1020                         entries = _vte_keymap[i].entries;
1021                         break;
1022                 }
1023         }
1024         if (entries == NULL) {
1025 #ifdef VTE_DEBUG
1026                 if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
1027                         fprintf(stderr, " (ignoring, no map for key).\n");
1028                 }
1029 #endif
1030                 return;
1031         }
1032
1033         /* Build mode masks. */
1034         cursor_mode = app_cursor_keys ? cursor_app : cursor_default;
1035         keypad_mode = app_keypad_keys ? keypad_app : keypad_default;
1036         if (sun_mode) {
1037                 fkey_mode = fkey_sun;
1038         } else
1039         if (hp_mode) {
1040                 fkey_mode = fkey_hp;
1041         } else
1042         if (legacy_mode) {
1043                 fkey_mode = fkey_legacy;
1044         } else
1045         if (vt220_mode) {
1046                 fkey_mode = fkey_vt220;
1047         } else {
1048                 fkey_mode = fkey_default;
1049         }
1050         modifiers &= (GDK_SHIFT_MASK | GDK_CONTROL_MASK | VTE_META_MASK);
1051
1052         /* Search for the conditions. */
1053         for (i = 0; entries[i].normal || entries[i].special; i++)
1054         if ((entries[i].cursor_mode & cursor_mode) &&
1055             (entries[i].keypad_mode & keypad_mode) &&
1056             (entries[i].fkey_mode & fkey_mode))
1057         if ((modifiers & entries[i].mod_mask) == entries[i].mod_mask) {
1058                 if (entries[i].normal) {
1059                         if (entries[i].normal_length != -1) {
1060                                 *normal_length = entries[i].normal_length;
1061                                 *normal = g_memdup(entries[i].normal,
1062                                                    entries[i].normal_length);
1063                         } else {
1064                                 *normal_length = strlen(entries[i].normal);
1065                                 *normal = g_strdup(entries[i].normal);
1066                         }
1067                         _vte_keymap_key_add_key_modifiers(keyval,
1068                                                           modifiers,
1069                                                           sun_mode,
1070                                                           hp_mode,
1071                                                           legacy_mode,
1072                                                           vt220_mode,
1073                                                           normal,
1074                                                           normal_length);
1075 #ifdef VTE_DEBUG
1076                         if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
1077                                 int j;
1078                                 fprintf(stderr, " to '");
1079                                 for (j = 0; j < *normal_length; j++) {
1080                                         if (((*normal)[j] < 32) ||
1081                                             ((*normal)[j] >= 127)) {
1082                                                 fprintf(stderr, "<0x%02x>",
1083                                                         (*normal)[j]);
1084                                         } else {
1085                                                 fprintf(stderr, "%c",
1086                                                         (*normal)[j]);
1087                                         }
1088                                 }
1089                                 fprintf(stderr, "'.\n");
1090                         }
1091 #endif
1092                         return;
1093                 }
1094                 if (entries[i].special) {
1095                         termcap_special = entries[i].special;
1096                         cap = _vte_termcap_find_string(termcap,
1097                                                        terminal,
1098                                                        entries[i].special);
1099                         if (cap != NULL) {
1100                                 *special = NULL;
1101                                 if (strlen(cap) > 0) {
1102                                         /* Save the special string. */
1103                                         *special = entries[i].special;
1104 #ifdef VTE_DEBUG
1105                                         if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
1106                                                 fprintf(stderr, " to \"%s\"",
1107                                                         *special);
1108                                         }
1109 #endif
1110                                 }
1111                                 g_free(cap);
1112                                 if (*special != NULL) {
1113                                         /* Return the special string. */
1114 #ifdef VTE_DEBUG
1115                                         if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
1116                                                 fprintf(stderr,
1117                                                         ", returning.\n");
1118                                         }
1119 #endif
1120                                         return;
1121                                 }
1122                         }
1123                 }
1124         }
1125 #if defined(HAVE_CURSES) || defined(HAVE_TERMCAP)
1126         if (termcap_special != NULL) {
1127                 tmp = g_strdup(terminal);
1128                 cap = NULL;
1129                 if (tgetent(ncurses_buffer, tmp) == 1) {
1130                         cap = ncurses_area;
1131                         tmp = g_strdup(termcap_special);
1132                         cap = tgetstr(tmp, &cap);
1133                 }
1134                 if ((cap == NULL) && (strcmp(terminal, "xterm") == 0)) {
1135                         /* try, try again */
1136                         if (tgetent(ncurses_buffer, "xterm-xfree86") == 1) {
1137                                 cap = ncurses_area;
1138                                 tmp = g_strdup(termcap_special);
1139                                 cap = tgetstr(tmp, &cap);
1140                         }
1141                 }
1142                 g_free(tmp);
1143                 if ((cap != NULL) && (*cap != '\0')) {
1144                         *normal_length = strlen(cap);
1145                         *normal = g_strdup(cap);
1146 #ifdef VTE_DEBUG
1147                         if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
1148                                 int j;
1149 #ifdef HAVE_CURSES
1150                                 fprintf(stderr, " via ncurses to '");
1151 #else
1152 #ifdef HAVE_TERMCAP
1153                                 fprintf(stderr, " via termcap to '");
1154 #endif
1155 #endif
1156                                 for (j = 0; j < *normal_length; j++) {
1157                                         if (((*normal)[j] < 32) ||
1158                                             ((*normal)[j] >= 127)) {
1159                                                 fprintf(stderr, "<0x%02x>",
1160                                                         (*normal)[j]);
1161                                         } else {
1162                                                 fprintf(stderr, "%c",
1163                                                         (*normal)[j]);
1164                                         }
1165                                 }
1166                                 fprintf(stderr, "', returning.\n");
1167                         }
1168 #endif
1169                         return;
1170                 }
1171         }
1172 #endif
1173
1174 #ifdef VTE_DEBUG
1175         if (_vte_debug_on(VTE_DEBUG_KEYBOARD)) {
1176                 fprintf(stderr, " (ignoring, no match for modifier state).\n");
1177         }
1178 #endif
1179 }
1180
1181 gboolean
1182 _vte_keymap_key_is_modifier(guint keyval)
1183 {
1184         gboolean modifier = FALSE;
1185         /* Determine if this is just a modifier key. */
1186         switch (keyval) {
1187         case GDK_Alt_L:
1188         case GDK_Alt_R:
1189         case GDK_Caps_Lock:
1190         case GDK_Control_L:
1191         case GDK_Control_R:
1192         case GDK_Eisu_Shift:
1193         case GDK_Hyper_L:
1194         case GDK_Hyper_R:
1195         case GDK_ISO_First_Group_Lock:
1196         case GDK_ISO_Group_Lock:
1197         case GDK_ISO_Group_Shift:
1198         case GDK_ISO_Last_Group_Lock:
1199         case GDK_ISO_Level3_Lock:
1200         case GDK_ISO_Level3_Shift:
1201         case GDK_ISO_Lock:
1202         case GDK_ISO_Next_Group_Lock:
1203         case GDK_ISO_Prev_Group_Lock:
1204         case GDK_Kana_Lock:
1205         case GDK_Kana_Shift:
1206         case GDK_Meta_L:
1207         case GDK_Meta_R:
1208         case GDK_Num_Lock:
1209         case GDK_Scroll_Lock:
1210         case GDK_Shift_L:
1211         case GDK_Shift_Lock:
1212         case GDK_Shift_R:
1213         case GDK_Super_L:
1214         case GDK_Super_R:
1215                 modifier = TRUE;
1216                 break;
1217         default:
1218                 modifier = FALSE;
1219                 break;
1220         }
1221         return modifier;
1222 }
1223
1224 static gboolean
1225 _vte_keymap_key_gets_modifiers(guint keyval)
1226 {
1227         gboolean fkey = FALSE;
1228         /* Determine if this is just a modifier key. */
1229         switch (keyval) {
1230         case GDK_Up:
1231         case GDK_Down:
1232         case GDK_Left:
1233         case GDK_Right:
1234         case GDK_Insert:
1235         case GDK_Delete:
1236         case GDK_Page_Up:
1237         case GDK_Page_Down:
1238         case GDK_KP_Up:
1239         case GDK_KP_Down:
1240         case GDK_KP_Left:
1241         case GDK_KP_Right:
1242         case GDK_KP_Insert:
1243         case GDK_KP_Delete:
1244         case GDK_KP_Page_Up:
1245         case GDK_KP_Page_Down:
1246         case GDK_F1:
1247         case GDK_F2:
1248         case GDK_F3:
1249         case GDK_F4:
1250         case GDK_F5:
1251         case GDK_F6:
1252         case GDK_F7:
1253         case GDK_F8:
1254         case GDK_F9:
1255         case GDK_F10:
1256         case GDK_F11:
1257         case GDK_F12:
1258         case GDK_F13:
1259         case GDK_F14:
1260         case GDK_F15:
1261         case GDK_F16:
1262         case GDK_F17:
1263         case GDK_F18:
1264         case GDK_F19:
1265         case GDK_F20:
1266         case GDK_F21:
1267         case GDK_F22:
1268         case GDK_F23:
1269         case GDK_F24:
1270         case GDK_F25:
1271         case GDK_F26:
1272         case GDK_F27:
1273         case GDK_F28:
1274         case GDK_F29:
1275         case GDK_F30:
1276         case GDK_F31:
1277         case GDK_F32:
1278         case GDK_F33:
1279         case GDK_F34:
1280         case GDK_F35:
1281                 fkey = TRUE;
1282                 break;
1283         default:
1284                 fkey = FALSE;
1285                 break;
1286         }
1287         return fkey;
1288 }
1289
1290 void
1291 _vte_keymap_key_add_key_modifiers(guint keyval,
1292                                   GdkModifierType modifiers,
1293                                   gboolean sun_mode,
1294                                   gboolean hp_mode,
1295                                   gboolean legacy_mode,
1296                                   gboolean vt220_mode,
1297                                   char **normal,
1298                                   gssize *normal_length)
1299 {
1300         int modifier, offset;
1301         char *nnormal;
1302         GdkModifierType significant_modifiers;
1303
1304         significant_modifiers = GDK_SHIFT_MASK |
1305                                 GDK_CONTROL_MASK |
1306                                 VTE_META_MASK;
1307
1308         if (!_vte_keymap_key_gets_modifiers(keyval)) {
1309                 return;
1310         }
1311         if (sun_mode || hp_mode || vt220_mode) {
1312                 /* no modifiers for you! */
1313                 return;
1314         }
1315
1316         switch (modifiers & significant_modifiers) {
1317         case 0:
1318                 modifier = 0;
1319                 break;
1320         case GDK_SHIFT_MASK:
1321                 modifier = 2;
1322                 break;
1323         case VTE_META_MASK:
1324                 modifier = 3;
1325                 break;
1326         case GDK_SHIFT_MASK | VTE_META_MASK:
1327                 modifier = 4;
1328                 break;
1329         case GDK_CONTROL_MASK:
1330                 modifier = 5;
1331                 break;
1332         case GDK_SHIFT_MASK | GDK_CONTROL_MASK:
1333                 modifier = 6;
1334                 break;
1335         case VTE_META_MASK | GDK_CONTROL_MASK:
1336                 modifier = 7;
1337                 break;
1338         case GDK_SHIFT_MASK | VTE_META_MASK | GDK_CONTROL_MASK:
1339                 modifier = 8;
1340                 break;
1341         default:
1342                 modifier = 8;
1343                 break;
1344         }
1345
1346         if (modifier == 0) {
1347                 return;
1348         }
1349
1350         nnormal = g_malloc0(*normal_length + 4);
1351         memcpy(nnormal, *normal, *normal_length);
1352         if (strlen(nnormal) > 1) {
1353                 /* Get the offset of the last character. */
1354                 offset = strlen(nnormal) - 1;
1355                 if (g_ascii_isdigit(nnormal[offset - 1])) {
1356                         /* Stuff a semicolon and the modifier in right before
1357                          * that last character. */
1358                         nnormal[offset + 2] = nnormal[offset];
1359                         nnormal[offset + 1] = modifier + '0';
1360                         nnormal[offset + 0] = ';';
1361                         *normal_length += 2;
1362                 } else {
1363 #if 0
1364                         /* Stuff a "1", a semicolon and the modifier in right
1365                          * before that last character, matching Xterm. */
1366                         nnormal[offset + 3] = nnormal[offset];
1367                         nnormal[offset + 2] = modifier + '0';
1368                         nnormal[offset + 1] = ';';
1369                         nnormal[offset + 0] = '1';
1370                         *normal_length += 3;
1371 #else
1372                         /* Stuff the modifier in right before that last
1373                          * character, matching what people expect. */
1374                         nnormal[offset + 1] = nnormal[offset];
1375                         nnormal[offset + 0] = modifier + '0';
1376                         *normal_length += 1;
1377 #endif
1378                 }
1379                 g_free(*normal);
1380                 *normal = nnormal;
1381         } else {
1382                 g_free(nnormal);
1383         }
1384 }