- /*
- * 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;
+ /* Map from key script to Unicode. */
+ txt[0] = event->message & charCodeMask;
+ key_script = GetScriptManagerVariable(smKeyScript);
+
+ if (mac_gestalts.encvvers != 0) {
+ static TextToUnicodeInfo key_to_uni = NULL;
+ static ScriptCode key_to_uni_script;
+ TextEncoding enc;
+ ByteCount iread, olen;
+ OSErr err;
+
+ if (key_to_uni != NULL && key_to_uni_script != key_script)
+ DisposeTextToUnicodeInfo(&key_to_uni);
+ if (key_to_uni == NULL || key_to_uni_script != key_script) {
+ if (UpgradeScriptInfoToTextEncoding(key_script,
+ kTextLanguageDontCare,
+ kTextRegionDontCare, NULL,
+ &enc) == noErr &&
+ CreateTextToUnicodeInfoByEncoding(enc, &key_to_uni) == noErr)
+ key_to_uni_script = key_script;
+ else
+ key_to_uni = NULL;
+ }
+ if (key_to_uni != NULL) {
+ err = ConvertFromTextToUnicode(key_to_uni, 1, txt,
+ (kUnicodeKeepInfoMask |
+ kUnicodeStringUnterminatedMask),
+ 0, NULL, NULL, NULL,
+ sizeof(utxt), &iread, &olen, utxt);
+ if (err == noErr)
+ len = olen / sizeof(*utxt);
+ }
+ } else {
+ int charset;
+ char *tptr = txt;
+ int tlen = 1;
+
+ charset = charset_from_macenc(key_script,
+ GetScriptManagerVariable(smRegionCode),
+ mac_gestalts.sysvers, NULL);
+ if (charset != CS_NONE) {
+ len = charset_to_unicode(&tptr, &tlen, utxt, sizeof(utxt), charset,
+ NULL, NULL, 0);