… | |
… | |
25 | * - extensive modifications |
25 | * - extensive modifications |
26 | * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org> |
26 | * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org> |
27 | * Copyright (c) 2001 Marius Gedminas |
27 | * Copyright (c) 2001 Marius Gedminas |
28 | * - Ctrl/Mod4+Tab works like Meta+Tab (options) |
28 | * - Ctrl/Mod4+Tab works like Meta+Tab (options) |
29 | * Copyright (c) 2003 Rob McMullen <robm@flipturn.org> |
29 | * Copyright (c) 2003 Rob McMullen <robm@flipturn.org> |
|
|
30 | * Copyright (c) 2003-2004 Marc Lehmann <pcg@goof.com> |
30 | * |
31 | * |
31 | * This program is free software; you can redistribute it and/or modify |
32 | * This program is free software; you can redistribute it and/or modify |
32 | * it under the terms of the GNU General Public License as published by |
33 | * it under the terms of the GNU General Public License as published by |
33 | * the Free Software Foundation; either version 2 of the License, or |
34 | * the Free Software Foundation; either version 2 of the License, or |
34 | * (at your option) any later version. |
35 | * (at your option) any later version. |
… | |
… | |
55 | |
56 | |
56 | /*{{{ Convert the keypress event into a string */ |
57 | /*{{{ Convert the keypress event into a string */ |
57 | void |
58 | void |
58 | rxvt_term::lookup_key (XKeyEvent &ev) |
59 | rxvt_term::lookup_key (XKeyEvent &ev) |
59 | { |
60 | { |
60 | int ctrl, meta, shft, len; |
61 | int ctrl, meta, shft, len; |
61 | unsigned int newlen; |
62 | unsigned int newlen; |
62 | KeySym keysym; |
63 | KeySym keysym; |
63 | #ifdef DEBUG_CMD |
64 | #ifdef DEBUG_CMD |
64 | static int debug_key = 1; /* accessible by a debugger only */ |
65 | static int debug_key = 1; /* accessible by a debugger only */ |
65 | #endif |
66 | #endif |
66 | int valid_keysym; |
67 | int valid_keysym; |
67 | unsigned char kbuf[KBUFSZ]; |
68 | unsigned char kbuf[KBUFSZ]; |
68 | |
69 | |
69 | /* |
70 | /* |
70 | * use Num_Lock to toggle Keypad on/off. If Num_Lock is off, allow an |
71 | * use Num_Lock to toggle Keypad on/off. If Num_Lock is off, allow an |
71 | * escape sequence to toggle the Keypad. |
72 | * escape sequence to toggle the Keypad. |
… | |
… | |
88 | if (Input_Context) |
89 | if (Input_Context) |
89 | { |
90 | { |
90 | Status status_return; |
91 | Status status_return; |
91 | |
92 | |
92 | #ifdef X_HAVE_UTF8_STRING |
93 | #ifdef X_HAVE_UTF8_STRING |
93 | if (enc_utf8 && 0) |
94 | if (enc_utf8 && 0) // currently disabled, doesn't seem to work, nor is useful |
94 | len = Xutf8LookupString (Input_Context, &ev, (char *)kbuf, |
95 | len = Xutf8LookupString (Input_Context, &ev, (char *)kbuf, |
95 | KBUFSZ, &keysym, &status_return); |
96 | KBUFSZ, &keysym, &status_return); |
96 | else |
97 | else |
97 | #endif |
98 | #endif |
98 | |
|
|
99 | { |
99 | { |
100 | wchar_t wkbuf[KBUFSZ + 1]; |
100 | wchar_t wkbuf[KBUFSZ + 1]; |
101 | |
101 | |
102 | // the XOpenIM manpage lies about hardcoding the locale |
102 | // the XOpenIM manpage lies about hardcoding the locale |
103 | // at the point of XOpenIM, so temporarily switch locales |
103 | // at the point of XOpenIM, so temporarily switch locales |
… | |
… | |
108 | KBUFSZ, &keysym, &status_return); |
108 | KBUFSZ, &keysym, &status_return); |
109 | if (rs[Rs_imLocale]) |
109 | if (rs[Rs_imLocale]) |
110 | SET_LOCALE (locale); |
110 | SET_LOCALE (locale); |
111 | |
111 | |
112 | if (status_return == XLookupChars |
112 | if (status_return == XLookupChars |
113 | || status_return == XLookupBoth) |
113 | || status_return == XLookupBoth) |
114 | { |
114 | { |
115 | wkbuf[len] = 0; |
115 | wkbuf[len] = 0; |
116 | len = wcstombs ((char *)kbuf, wkbuf, KBUFSZ); |
116 | len = wcstombs ((char *)kbuf, wkbuf, KBUFSZ); |
117 | if (len < 0) |
117 | if (len < 0) |
118 | len = 0; |
118 | len = 0; |
… | |
… | |
120 | else |
120 | else |
121 | len = 0; |
121 | len = 0; |
122 | } |
122 | } |
123 | |
123 | |
124 | valid_keysym = status_return == XLookupKeySym |
124 | valid_keysym = status_return == XLookupKeySym |
125 | || status_return == XLookupBoth; |
125 | || status_return == XLookupBoth; |
126 | } |
126 | } |
127 | else |
127 | else |
128 | #endif |
128 | #endif |
129 | |
|
|
130 | { |
129 | { |
131 | len = XLookupString (&ev, (char *)kbuf, KBUFSZ, &keysym, &compose); |
130 | len = XLookupString (&ev, (char *)kbuf, KBUFSZ, &keysym, &compose); |
132 | valid_keysym = !len; |
131 | valid_keysym = keysym != NoSymbol; |
133 | } |
132 | } |
134 | |
133 | |
135 | if (valid_keysym) |
134 | if (valid_keysym) |
136 | { |
135 | { |
137 | /* for some backwards compatibility */ |
136 | /* for some backwards compatibility */ |
… | |
… | |
162 | { |
161 | { |
163 | #else |
162 | #else |
164 | if (IS_SCROLL_MOD) |
163 | if (IS_SCROLL_MOD) |
165 | { |
164 | { |
166 | #endif |
165 | #endif |
167 | int lnsppg; |
166 | int lnsppg; |
168 | |
167 | |
169 | #ifdef PAGING_CONTEXT_LINES |
168 | #ifdef PAGING_CONTEXT_LINES |
170 | lnsppg = TermWin.nrow - PAGING_CONTEXT_LINES; |
169 | lnsppg = TermWin.nrow - PAGING_CONTEXT_LINES; |
171 | #else |
170 | #else |
172 | lnsppg = TermWin.nrow * 4 / 5; |
171 | lnsppg = TermWin.nrow * 4 / 5; |
… | |
… | |
210 | scr_move_to (1, 0); |
209 | scr_move_to (1, 0); |
211 | return; |
210 | return; |
212 | } |
211 | } |
213 | } |
212 | } |
214 | #endif |
213 | #endif |
215 | |
|
|
216 | } |
214 | } |
217 | |
215 | |
218 | if (shft) |
216 | if (shft) |
219 | { |
217 | { |
220 | /* Shift + F1 - F10 generates F11 - F20 */ |
218 | /* Shift + F1 - F10 generates F11 - F20 */ |
… | |
… | |
286 | tt_write (kbuf0, l); |
284 | tt_write (kbuf0, l); |
287 | return; |
285 | return; |
288 | } |
286 | } |
289 | else |
287 | else |
290 | #endif |
288 | #endif |
291 | |
|
|
292 | { |
289 | { |
293 | newlen = 1; |
290 | newlen = 1; |
294 | switch (keysym) |
291 | switch (keysym) |
295 | { |
292 | { |
296 | #ifndef NO_BACKSPACE_KEY |
293 | #ifndef NO_BACKSPACE_KEY |
… | |
… | |
349 | #endif |
346 | #endif |
350 | newlen = 0; |
347 | newlen = 0; |
351 | } |
348 | } |
352 | break; |
349 | break; |
353 | |
350 | |
354 | |
|
|
355 | #ifdef XK_KP_Left |
351 | #ifdef XK_KP_Left |
356 | case XK_KP_Up: /* \033Ox or standard */ |
352 | case XK_KP_Up: /* \033Ox or standard */ |
357 | case XK_KP_Down: /* \033Or or standard */ |
353 | case XK_KP_Down: /* \033Or or standard */ |
358 | case XK_KP_Right: /* \033Ov or standard */ |
354 | case XK_KP_Right: /* \033Ov or standard */ |
359 | case XK_KP_Left: /* \033Ot or standard */ |
355 | case XK_KP_Left: /* \033Ot or standard */ |
360 | if ((PrivateModes & PrivMode_aplKP) ? !shft : shft) |
356 | if ((PrivateModes & PrivMode_aplKP) ? !shft : shft) |
361 | { |
357 | { |
362 | STRCPY (kbuf, "\033OZ"); |
358 | STRCPY (kbuf, "\033OZ"); |
363 | kbuf[2] = ("txvr"[keysym - XK_KP_Left]); |
359 | kbuf[2] = "txvr"[keysym - XK_KP_Left]; |
364 | break; |
360 | break; |
365 | } |
361 | } |
366 | else |
362 | else |
367 | /* translate to std. cursor key */ |
363 | /* translate to std. cursor key */ |
368 | keysym = XK_Left + (keysym - XK_KP_Left); |
364 | keysym = XK_Left + (keysym - XK_KP_Left); |
… | |
… | |
371 | case XK_Up: /* "\033[A" */ |
367 | case XK_Up: /* "\033[A" */ |
372 | case XK_Down: /* "\033[B" */ |
368 | case XK_Down: /* "\033[B" */ |
373 | case XK_Right: /* "\033[C" */ |
369 | case XK_Right: /* "\033[C" */ |
374 | case XK_Left: /* "\033[D" */ |
370 | case XK_Left: /* "\033[D" */ |
375 | STRCPY (kbuf, "\033[Z"); |
371 | STRCPY (kbuf, "\033[Z"); |
376 | kbuf[2] = ("DACB"[keysym - XK_Left]); |
372 | kbuf[2] = "DACB"[keysym - XK_Left]; |
377 | /* do Shift first */ |
373 | /* do Shift first */ |
378 | if (shft) |
374 | if (shft) |
379 | kbuf[2] = ("dacb"[keysym - XK_Left]); |
375 | kbuf[2] = "dacb"[keysym - XK_Left]; |
380 | else if (ctrl) |
376 | else if (ctrl) |
381 | { |
377 | { |
382 | kbuf[1] = 'O'; |
378 | kbuf[1] = 'O'; |
383 | kbuf[2] = ("dacb"[keysym - XK_Left]); |
379 | kbuf[2] = "dacb"[keysym - XK_Left]; |
384 | } |
380 | } |
385 | else if (PrivateModes & PrivMode_aplCUR) |
381 | else if (PrivateModes & PrivMode_aplCUR) |
386 | kbuf[1] = 'O'; |
382 | kbuf[1] = 'O'; |
387 | #ifdef MULTICHAR_SET |
383 | #ifdef MULTICHAR_SET |
388 | //TODO: ?? |
384 | //TODO: ?? |
… | |
… | |
482 | STRCPY (kbuf, "\033OP"); |
478 | STRCPY (kbuf, "\033OP"); |
483 | kbuf[2] += (keysym - XK_KP_F1); |
479 | kbuf[2] += (keysym - XK_KP_F1); |
484 | break; |
480 | break; |
485 | |
481 | |
486 | case XK_KP_Multiply: /* "\033Oj" : "*" */ |
482 | case XK_KP_Multiply: /* "\033Oj" : "*" */ |
487 | case XK_KP_Add: /* "\033Ok" : "+" */ |
483 | case XK_KP_Add: /* "\033Ok" : "+" */ |
488 | case XK_KP_Separator: /* "\033Ol" : "," */ |
484 | case XK_KP_Separator: /* "\033Ol" : "," */ |
489 | case XK_KP_Subtract: /* "\033Om" : "-" */ |
485 | case XK_KP_Subtract: /* "\033Om" : "-" */ |
490 | case XK_KP_Decimal: /* "\033On" : "." */ |
486 | case XK_KP_Decimal: /* "\033On" : "." */ |
491 | case XK_KP_Divide: /* "\033Oo" : "/" */ |
487 | case XK_KP_Divide: /* "\033Oo" : "/" */ |
492 | case XK_KP_0: /* "\033Op" : "0" */ |
488 | case XK_KP_0: /* "\033Op" : "0" */ |
… | |
… | |
947 | { |
943 | { |
948 | if (*cmdbuf_ptr < 0x80) // assume < 0x80 to be ascii ALWAYS (all shift-states etc.) uh-oh |
944 | if (*cmdbuf_ptr < 0x80) // assume < 0x80 to be ascii ALWAYS (all shift-states etc.) uh-oh |
949 | return *cmdbuf_ptr++; |
945 | return *cmdbuf_ptr++; |
950 | |
946 | |
951 | wchar_t wc; |
947 | wchar_t wc; |
952 | size_t len = mbrtowc (&wc, (char *)cmdbuf_ptr, cmdbuf_endp - cmdbuf_ptr, &mbstate.mbs); |
948 | size_t len = mbrtowc (&wc, (char *)cmdbuf_ptr, cmdbuf_endp - cmdbuf_ptr, mbstate); |
953 | |
949 | |
954 | if (len == (size_t)-2) |
950 | if (len == (size_t)-2) |
955 | return NOCHAR; |
951 | return NOCHAR; |
956 | |
952 | |
957 | if (len == (size_t)-1) |
953 | if (len == (size_t)-1) |
… | |
… | |
2369 | /* case 1: do_tek_mode (); break; */ |
2365 | /* case 1: do_tek_mode (); break; */ |
2370 | case '#': |
2366 | case '#': |
2371 | if (cmd_getc () == '8') |
2367 | if (cmd_getc () == '8') |
2372 | scr_E (); |
2368 | scr_E (); |
2373 | break; |
2369 | break; |
2374 | case ' (': |
2370 | case '(': |
2375 | scr_charset_set (0, (unsigned int)cmd_getc ()); |
2371 | scr_charset_set (0, (unsigned int)cmd_getc ()); |
2376 | break; |
2372 | break; |
2377 | case ')': |
2373 | case ')': |
2378 | scr_charset_set (1, (unsigned int)cmd_getc ()); |
2374 | scr_charset_set (1, (unsigned int)cmd_getc ()); |
2379 | break; |
2375 | break; |