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