- /*
- * Control-2 should return ^@ (0x00), Control-6 should return
- * ^^ (0x1E), and Control-Minus should return ^_ (0x1F). Since
- * the DOS keyboard handling did it, and we have nothing better
- * to do with the key combo in question, we'll also map
- * Control-Backquote to ^\ (0x1C).
- */
-
- if (event->modifiers & controlKey) {
- switch (event->message & charCodeMask) {
- case ' ': case '2':
- *p++ = 0x00;
- return p - output;
- case '`':
- *p++ = 0x1c;
- return p - output;
- case '6':
- *p++ = 0x1e;
- return p - output;
- case '/':
- *p++ = 0x1f;
- return p - output;
- }
- }
-
- /*
- * First, all the keys that do tilde codes. (ESC '[' nn '~',
- * for integer decimal nn.)
- *
- * We also deal with the weird ones here. Linux VCs replace F1
- * to F5 by ESC [ [ A to ESC [ [ E. rxvt doesn't do _that_, but
- * does replace Home and End (1~ and 4~) by ESC [ H and ESC O w
- * respectively.
- */
- code = 0;
- switch (event->message & keyCodeMask) {
- case K_F1: code = (event->modifiers & shiftKey ? 23 : 11); break;
- case K_F2: code = (event->modifiers & shiftKey ? 24 : 12); break;
- case K_F3: code = (event->modifiers & shiftKey ? 25 : 13); break;
- case K_F4: code = (event->modifiers & shiftKey ? 26 : 14); break;
- case K_F5: code = (event->modifiers & shiftKey ? 28 : 15); break;
- case K_F6: code = (event->modifiers & shiftKey ? 29 : 17); break;
- case K_F7: code = (event->modifiers & shiftKey ? 31 : 18); break;
- case K_F8: code = (event->modifiers & shiftKey ? 32 : 19); break;
- case K_F9: code = (event->modifiers & shiftKey ? 33 : 20); break;
- case K_F10: code = (event->modifiers & shiftKey ? 34 : 21); break;
- case K_F11: code = 23; break;
- case K_F12: code = 24; break;
- case K_HOME: code = 1; break;
- case K_INSERT: code = 2; break;
- case K_DELETE: code = 3; break;
- case K_END: code = 4; break;
- case K_PRIOR: code = 5; break;
- case K_NEXT: code = 6; break;
- }
- if (s->cfg.funky_type == 1 && code >= 11 && code <= 15) {
- p += sprintf((char *)p, "\x1B[[%c", code + 'A' - 11);
- return p - output;
- }
- if (s->cfg.rxvt_homeend && (code == 1 || code == 4)) {
- p += sprintf((char *)p, code == 1 ? "\x1B[H" : "\x1BOw");
- return p - output;
- }
- if (code) {
- p += sprintf((char *)p, "\x1B[%d~", code);
- return p - output;
+ if (event->modifiers & shiftKey)
+ mods |= PKM_SHIFT;
+ if (event->modifiers & controlKey)
+ mods |= PKM_CONTROL;
+ if (event->what == autoKey)
+ flags |= PKF_REPEAT;
+
+ /* Mac key events consist of a virtual key code and a character code. */
+
+ switch ((event->message & keyCodeMask) >> 8) {
+ case 0x24: keysym = PK_RETURN; break;
+ case 0x30: keysym = PK_TAB; break;
+ case 0x33: keysym = PK_BACKSPACE; break;
+ case 0x35: keysym = PK_ESCAPE; break;
+
+ case 0x7A: keysym = PK_F1; break;
+ case 0x78: keysym = PK_F2; break;
+ case 0x63: keysym = PK_F3; break;
+ case 0x76: keysym = PK_F4; break;
+ case 0x60: keysym = PK_F5; break;
+ case 0x61: keysym = PK_F6; break;
+ case 0x62: keysym = PK_F7; break;
+ case 0x64: keysym = PK_F8; break;
+ case 0x65: keysym = PK_F9; break;
+ case 0x6D: keysym = PK_F10; break;
+ case 0x67: keysym = PK_F11; break;
+ case 0x6F: keysym = PK_F12; break;
+ case 0x69: keysym = PK_F13; break;
+ case 0x6B: keysym = PK_F14; break;
+ case 0x71: keysym = PK_F15; break;
+
+ case 0x72: keysym = PK_INSERT; break;
+ case 0x73: keysym = PK_HOME; break;
+ case 0x74: keysym = PK_PAGEUP; break;
+ case 0x75: keysym = PK_DELETE; break;
+ case 0x77: keysym = PK_END; break;
+ case 0x79: keysym = PK_PAGEDOWN; break;
+
+ case 0x47: keysym = PK_PF1; break;
+ case 0x51: keysym = PK_PF2; break;
+ case 0x4B: keysym = PK_PF3; break;
+ case 0x43: keysym = PK_PF4; break;
+ case 0x4E: keysym = PK_KPMINUS; break;
+ case 0x45: keysym = PK_KPCOMMA; break;
+ case 0x41: keysym = PK_KPDECIMAL; break;
+ case 0x4C: keysym = PK_KPENTER; break;
+ case 0x52: keysym = PK_KP0; break;
+ case 0x53: keysym = PK_KP1; break;
+ case 0x54: keysym = PK_KP2; break;
+ case 0x55: keysym = PK_KP3; break;
+ case 0x56: keysym = PK_KP4; break;
+ case 0x57: keysym = PK_KP5; break;
+ case 0x58: keysym = PK_KP6; break;
+ case 0x59: keysym = PK_KP7; break;
+ case 0x5B: keysym = PK_KP8; break;
+ case 0x5C: keysym = PK_KP9; break;
+
+ case 0x7B: keysym = PK_LEFT; break;
+ case 0x7C: keysym = PK_RIGHT; break;
+ case 0x7D: keysym = PK_DOWN; break;
+ case 0x7E: keysym = PK_UP; break;