- /*
- * 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 (s->term->app_keypad_keys) {
- switch (event->message & keyCodeMask) {
- case KP_ENTER: p += sprintf((char *)p, "\x1BOM"); return p - output;
- case KP_CLEAR: p += sprintf((char *)p, "\x1BOP"); return p - output;
- case KP_EQUAL: p += sprintf((char *)p, "\x1BOQ"); return p - output;
- case KP_SLASH: p += sprintf((char *)p, "\x1BOR"); return p - output;
- case KP_STAR: p += sprintf((char *)p, "\x1BOS"); return p - output;
- case KP_PLUS: p += sprintf((char *)p, "\x1BOl"); return p - output;
- case KP_MINUS: p += sprintf((char *)p, "\x1BOm"); return p - output;
- case KP_DOT: p += sprintf((char *)p, "\x1BOn"); return p - output;
- case KP_0: p += sprintf((char *)p, "\x1BOp"); return p - output;
- case KP_1: p += sprintf((char *)p, "\x1BOq"); return p - output;
- case KP_2: p += sprintf((char *)p, "\x1BOr"); return p - output;
- case KP_3: p += sprintf((char *)p, "\x1BOs"); return p - output;
- case KP_4: p += sprintf((char *)p, "\x1BOt"); return p - output;
- case KP_5: p += sprintf((char *)p, "\x1BOu"); return p - output;
- case KP_6: p += sprintf((char *)p, "\x1BOv"); return p - output;
- case KP_7: p += sprintf((char *)p, "\x1BOw"); return p - output;
- case KP_8: p += sprintf((char *)p, "\x1BOx"); return p - output;
- case KP_9: p += sprintf((char *)p, "\x1BOy"); return p - output;
- }
- }
-
- switch (event->message & keyCodeMask) {
- case K_UP:
- p += sprintf((char *)p,
- s->term->app_cursor_keys ? "\x1BOA" : "\x1B[A");
- return p - output;
- case K_DOWN:
- p += sprintf((char *)p,
- s->term->app_cursor_keys ? "\x1BOB" : "\x1B[B");
- return p - output;
- case K_RIGHT:
- p += sprintf((char *)p,
- s->term->app_cursor_keys ? "\x1BOC" : "\x1B[C");
- return p - output;
- case K_LEFT:
- p += sprintf((char *)p,
- s->term->app_cursor_keys ? "\x1BOD" : "\x1B[D");
- return p - output;
- case KP_ENTER:
- *p++ = 0x0d;
- return p - output;
- case K_BS:
- *p++ = (s->cfg.bksp_is_delete ? 0x7f : 0x08);
- return p - output;
- default:
- *p++ = event->message & charCodeMask;
- return p - output;
- }