diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c index e71cabd7f29638ec1a002079e01a29297c43630c..0cd36775f92515c2dd437e59121dd7ba2be49338 100644 --- a/src/conio/sdl_con.c +++ b/src/conio/sdl_con.c @@ -107,7 +107,7 @@ const struct sdl_keyvals sdl_keyval[] = {SDLK_TAB, 0x09, 0x0f00, 0x9400, 0xa500}, {SDLK_RETURN, 0x0d, 0x0d, 0x0a, 0xa600}, {SDLK_ESCAPE, 0x1b, 0x1b, 0x1b, 0x0100}, - {SDLK_SPACE, 0x20, 0x20, 0x0300, 0x20,}, + {SDLK_SPACE, 0x20, 0x20, 0x0300, 0x20}, {SDLK_0, '0', ')', 0, 0x8100}, {SDLK_1, '1', '!', 0, 0x7800}, {SDLK_2, '2', '@', 0x0300, 0x7900}, @@ -1302,37 +1302,310 @@ int sdl_full_screen_redraw(int force) return(0); } +unsigned int cp437_convert(unsigned int unicode) +{ + switch(unicode) { + case 0x00c7: + return(0x80); + case 0x00fc: + return(0x81); + case 0x00e9: + return(0x82); + case 0x00e2: + return(0x83); + case 0x00e4: + return(0x84); + case 0x00e0: + return(0x85); + case 0x00e5: + return(0x86); + case 0x00e7: + return(0x87); + case 0x00ea: + return(0x88); + case 0x00eb: + return(0x89); + case 0x00e8: + return(0x8a); + case 0x00ef: + return(0x8b); + case 0x00ee: + return(0x8c); + case 0x00ec: + return(0x8d); + case 0x00c4: + return(0x8e); + case 0x00c5: + return(0x8f); + case 0x00c9: + return(0x90); + case 0x00e6: + return(0x91); + case 0x00c6: + return(0x92); + case 0x00f4: + return(0x93); + case 0x00f6: + return(0x94); + case 0x00f2: + return(0x95); + case 0x00fb: + return(0x96); + case 0x00f9: + return(0x97); + case 0x00ff: + return(0x98); + case 0x00d6: + return(0x99); + case 0x00dc: + return(0x9a); + case 0x00a2: + return(0x9b); + case 0x00a3: + return(0x9c); + case 0x00a5: + return(0x9d); + case 0x20a7: + return(0x9e); + case 0x0192: + return(0x9f); + case 0x00e1: + return(0xa0); + case 0x00ed: + return(0xa1); + case 0x00f3: + return(0xa2); + case 0x00fa: + return(0xa3); + case 0x00f1: + return(0xa4); + case 0x00d1: + return(0xa5); + case 0x00aa: + return(0xa6); + case 0x00ba: + return(0xa7); + case 0x00bf: + return(0xa8); + case 0x2310: + return(0xa9); + case 0x00ac: + return(0xaa); + case 0x00bd: + return(0xab); + case 0x00bc: + return(0xac); + case 0x00a1: + return(0xad); + case 0x00ab: + return(0xae); + case 0x00bb: + return(0xaf); + case 0x2591: + return(0xb0); + case 0x2592: + return(0xb1); + case 0x2593: + return(0xb2); + case 0x2502: + return(0xb3); + case 0x2524: + return(0xb4); + case 0x2561: + return(0xb5); + case 0x2562: + return(0xb6); + case 0x2556: + return(0xb7); + case 0x2555: + return(0xb8); + case 0x2563: + return(0xb9); + case 0x2551: + return(0xba); + case 0x2557: + return(0xbb); + case 0x255d: + return(0xbc); + case 0x255c: + return(0xbd); + case 0x255b: + return(0xbe); + case 0x2510: + return(0xbf); + case 0x2514: + return(0xc0); + case 0x2534: + return(0xc1); + case 0x252c: + return(0xc2); + case 0x251c: + return(0xc3); + case 0x2500: + return(0xc4); + case 0x253c: + return(0xc5); + case 0x255e: + return(0xc6); + case 0x255f: + return(0xc7); + case 0x255a: + return(0xc8); + case 0x2554: + return(0xc9); + case 0x2569: + return(0xca); + case 0x2566: + return(0xcb); + case 0x2560: + return(0xcc); + case 0x2550: + return(0xcd); + case 0x256c: + return(0xce); + case 0x2567: + return(0xcf); + case 0x2568: + return(0xd0); + case 0x2564: + return(0xd1); + case 0x2565: + return(0xd2); + case 0x2559: + return(0xd3); + case 0x2558: + return(0xd4); + case 0x2552: + return(0xd5); + case 0x2553: + return(0xd6); + case 0x256b: + return(0xd7); + case 0x256a: + return(0xd8); + case 0x2518: + return(0xd9); + case 0x250c: + return(0xda); + case 0x2588: + return(0xdb); + case 0x2584: + return(0xdc); + case 0x258c: + return(0xdd); + case 0x2590: + return(0xde); + case 0x2580: + return(0xdf); + case 0x03b1: + return(0xe0); + case 0x00df: + return(0xe1); + case 0x0393: + return(0xe2); + case 0x03c0: + return(0xe3); + case 0x03a3: + return(0xe4); + case 0x03c3: + return(0xe5); + case 0x00b5: + return(0xe6); + case 0x03c4: + return(0xe7); + case 0x03a6: + return(0xe8); + case 0x0398: + return(0xe9); + case 0x03a9: + return(0xea); + case 0x03b4: + return(0xeb); + case 0x221e: + return(0xec); + case 0x03c6: + return(0xed); + case 0x03b5: + return(0xee); + case 0x2229: + return(0xef); + case 0x2261: + return(0xf0); + case 0x00b1: + return(0xf1); + case 0x2265: + return(0xf2); + case 0x2264: + return(0xf3); + case 0x2320: + return(0xf4); + case 0x2321: + return(0xf5); + case 0x00f7: + return(0xf6); + case 0x2248: + return(0xf7); + case 0x00b0: + return(0xf8); + case 0x2219: + return(0xf9); + case 0x00b7: + return(0xfa); + case 0x221a: + return(0xfb); + case 0x207f: + return(0xfc); + case 0x00b2: + return(0xfd); + case 0x25a0: + return(0xfe); + case 0x00a0: + return(0xff); + } + return(0x01ffff); +} + /* Called from event thread only */ unsigned int sdl_get_char_code(unsigned int keysym, unsigned int mod, unsigned int unicode) { - int i; - #ifdef __DARWIN__ if(unicode==0x7f) { unicode=0x08; - keysym=SDLK_DELETE; + keysym=SDLK_BACKSPACE; } #endif - if((mod & KMOD_META|KMOD_ALT) && (mod & KMOD_CTRL) && unicode && (unicode < 256)) - return(unicode); - for(i=0;sdl_keyval[i].keysym;i++) { - if(sdl_keyval[i].keysym==keysym) { - if(mod & (KMOD_META|KMOD_ALT)) - return(sdl_keyval[i].alt); - if(mod & KMOD_CTRL) - return(sdl_keyval[i].ctrl); - if(mod & KMOD_SHIFT) - return(sdl_keyval[i].shift); - return(sdl_keyval[i].key); + if(!unicode || (mod & (KMOD_META|KMOD_ALT))) { + int expect; + int i; + + for(i=0;sdl_keyval[i].keysym;i++) { + if(sdl_keyval[i].keysym==keysym) { + if(mod & KMOD_CTRL) + expect=sdl_keyval[i].ctrl; + else if(mod & KMOD_SHIFT) + expect=sdl_keyval[i].shift; + else + expect=sdl_keyval[i].key; + + /* "Extended" syms are always right */ + if(!unicode) + return(expect); + /* + * If we don't know that this key can + * return the unicode translation, then + * we're not right and this is prolly + * an AltGr sequence. + */ + if(mod & (KMOD_META|KMOD_ALT)) { + if(unicode==expect) + return(sdl_keyval[i].alt); + } + } } } -#ifdef _WIN32 - if((mod & (KMOD_META|KMOD_ALT)) && (unicode=='\t')) - return(0x01ffff); -#endif - if(unicode && unicode < 256) + if(unicode <= 0x7f) return(unicode); - return(0x01ffff); + return(cp437_convert(unicode)); } /* Mouse event/keyboard thread */ @@ -1356,43 +1629,7 @@ int sdl_video_event_thread(void *data) case SDL_ACTIVEEVENT: /* Focus change */ break; case SDL_KEYDOWN: /* Keypress */ - if(ev.key.keysym.unicode > 0 && ev.key.keysym.unicode <= 0x7f) { /* ASCII Key (Whoopee!) */ - /* ALT-TAB stuff doesn't work correctly inder Win32, - * seems ot pass a whole slew of TABs though here. - * Kludge-fix 'em by ignoring all ALT-TAB keystrokes - * that appear to be a tab */ - if(ev.key.keysym.unicode=='\t' && ev.key.keysym.mod & KMOD_ALT) - break; - /* Need magical handling here... - * if ALT is pressed, run 'er through - * sdl_get_char_code() ANYWAYS unless - * both right ALT and left controll are - * pressed in which case it may be an - * AltGr combo */ - if((ev.key.keysym.mod & (KMOD_RALT))==(KMOD_RALT)) { - sdl_add_key(ev.key.keysym.unicode); - } - else if(ev.key.keysym.mod & (KMOD_META|KMOD_ALT)) { - sdl_add_key(sdl_get_char_code(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode)); - } - else { -#ifdef __DARWIN__ /* OS X sends Backspace as Delete! */ - if(ev.key.keysym.unicode==0x7f) - ev.key.keysym.unicode=0x08; -#endif - sdl_add_key(ev.key.keysym.unicode&0x7f); - } - } - else - if((ev.key.keysym.mod & KMOD_NUM) && ev.key.keysym.sym >= SDLK_KP0 && ev.key.keysym.sym <= SDLK_KP9) { - sdl_add_key(ev.key.keysym.sym - SDLK_KP0 + '0'); - } - else if((ev.key.keysym.mod & KMOD_NUM) && ev.key.keysym.sym == SDLK_KP_PERIOD) { - sdl_add_key('.'); - } - else { - sdl_add_key(sdl_get_char_code(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode)); - } + sdl_add_key(sdl_get_char_code(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode)); break; case SDL_KEYUP: /* Ignored (handled in KEYDOWN event) */ break;