Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
This is a collaborative effort between Alex Volkov and John Popplewell. Thanks guys! (Fixes bug #39) --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401256
This commit is contained in:
parent
d32b3a376f
commit
e63977fbad
6 changed files with 76 additions and 11 deletions
|
@ -109,4 +109,9 @@ extern void DX5_SoundFocus(HWND window);
|
||||||
GDL_CreateWindow as well */
|
GDL_CreateWindow as well */
|
||||||
LONG CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
LONG CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
|
/* JFP: Implementation of ToUnicode() that works on 9x/ME/2K/XP */
|
||||||
|
typedef int (WINAPI *ToUnicodeFN)(UINT, UINT, PBYTE, LPWSTR, int, UINT);
|
||||||
|
|
||||||
|
extern ToUnicodeFN SDL_ToUnicode;
|
||||||
|
|
||||||
#endif /* SDL_lowvideo_h */
|
#endif /* SDL_lowvideo_h */
|
||||||
|
|
|
@ -79,6 +79,15 @@ void (*WIN_PaletteChanged)(_THIS, HWND window);
|
||||||
void (*WIN_WinPAINT)(_THIS, HDC hdc);
|
void (*WIN_WinPAINT)(_THIS, HDC hdc);
|
||||||
extern void DIB_SwapGamma(_THIS);
|
extern void DIB_SwapGamma(_THIS);
|
||||||
|
|
||||||
|
/* Variables and support functions for SDL_ToUnicode() */
|
||||||
|
static int codepage;
|
||||||
|
static int Is9xME();
|
||||||
|
static int GetCodePage();
|
||||||
|
static int WINAPI ToUnicode9xME(UINT vkey, UINT scancode, BYTE *keystate, Uint16 *wchars, int wsize, UINT flags);
|
||||||
|
|
||||||
|
ToUnicodeFN SDL_ToUnicode = ToUnicode9xME;
|
||||||
|
|
||||||
|
|
||||||
#if defined(_WIN32_WCE)
|
#if defined(_WIN32_WCE)
|
||||||
|
|
||||||
// dynamically load aygshell dll because we want SDL to work on HPC and be300
|
// dynamically load aygshell dll because we want SDL to work on HPC and be300
|
||||||
|
@ -622,6 +631,11 @@ LONG CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
}
|
}
|
||||||
return(0);
|
return(0);
|
||||||
|
|
||||||
|
case WM_INPUTLANGCHANGE: {
|
||||||
|
codepage = GetCodePage();
|
||||||
|
}
|
||||||
|
return(TRUE);
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
/* Special handling by the video driver */
|
/* Special handling by the video driver */
|
||||||
if (HandleMessage) {
|
if (HandleMessage) {
|
||||||
|
@ -728,6 +742,10 @@ int SDL_RegisterApp(char *name, Uint32 style, void *hInst)
|
||||||
/* Check for SDL_WINDOWID hack */
|
/* Check for SDL_WINDOWID hack */
|
||||||
SDL_windowid = getenv("SDL_WINDOWID");
|
SDL_windowid = getenv("SDL_WINDOWID");
|
||||||
|
|
||||||
|
/* Initialise variables for SDL_ToUnicode() */
|
||||||
|
codepage = GetCodePage();
|
||||||
|
SDL_ToUnicode = Is9xME() ? ToUnicode9xME : ToUnicode;
|
||||||
|
|
||||||
app_registered = 1;
|
app_registered = 1;
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
@ -751,3 +769,39 @@ void SDL_UnregisterApp()
|
||||||
app_registered = 0;
|
app_registered = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* JFP: Implementation of ToUnicode() that works on 9x/ME/2K/XP */
|
||||||
|
|
||||||
|
static int Is9xME()
|
||||||
|
{
|
||||||
|
OSVERSIONINFO info;
|
||||||
|
|
||||||
|
memset(&info, 0, sizeof(info));
|
||||||
|
info.dwOSVersionInfoSize = sizeof(info);
|
||||||
|
if (!GetVersionEx(&info)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GetCodePage()
|
||||||
|
{
|
||||||
|
char buff[8];
|
||||||
|
int lcid = MAKELCID(LOWORD(GetKeyboardLayout(0)), SORT_DEFAULT);
|
||||||
|
int cp = GetACP();
|
||||||
|
|
||||||
|
if (GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE, buff, sizeof(buff))) {
|
||||||
|
cp = atoi(buff);
|
||||||
|
}
|
||||||
|
return cp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int WINAPI ToUnicode9xME(UINT vkey, UINT scancode, PBYTE keystate, LPWSTR wchars, int wsize, UINT flags)
|
||||||
|
{
|
||||||
|
BYTE chars[2];
|
||||||
|
|
||||||
|
if (ToAsciiEx(vkey, scancode, keystate, (WORD*)chars, 0, GetKeyboardLayout(0)) == 1) {
|
||||||
|
return MultiByteToWideChar(codepage, 0, chars, 1, wchars, wsize);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -281,6 +281,7 @@ void DIB_InitOSKeymap(_THIS)
|
||||||
VK_keymap[VK_EQUALS] = SDLK_EQUALS;
|
VK_keymap[VK_EQUALS] = SDLK_EQUALS;
|
||||||
VK_keymap[VK_LBRACKET] = SDLK_LEFTBRACKET;
|
VK_keymap[VK_LBRACKET] = SDLK_LEFTBRACKET;
|
||||||
VK_keymap[VK_BACKSLASH] = SDLK_BACKSLASH;
|
VK_keymap[VK_BACKSLASH] = SDLK_BACKSLASH;
|
||||||
|
VK_keymap[VK_OEM_102] = SDLK_LESS;
|
||||||
VK_keymap[VK_RBRACKET] = SDLK_RIGHTBRACKET;
|
VK_keymap[VK_RBRACKET] = SDLK_RIGHTBRACKET;
|
||||||
VK_keymap[VK_GRAVE] = SDLK_BACKQUOTE;
|
VK_keymap[VK_GRAVE] = SDLK_BACKQUOTE;
|
||||||
VK_keymap[VK_BACKTICK] = SDLK_BACKQUOTE;
|
VK_keymap[VK_BACKTICK] = SDLK_BACKQUOTE;
|
||||||
|
@ -385,17 +386,18 @@ static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, in
|
||||||
keysym->sym = VK_keymap[vkey];
|
keysym->sym = VK_keymap[vkey];
|
||||||
keysym->mod = KMOD_NONE;
|
keysym->mod = KMOD_NONE;
|
||||||
keysym->unicode = 0;
|
keysym->unicode = 0;
|
||||||
if ( pressed && SDL_TranslateUNICODE ) { /* Someday use ToUnicode() */
|
if ( pressed && SDL_TranslateUNICODE ) {
|
||||||
#ifdef NO_GETKEYBOARDSTATE
|
#ifdef NO_GETKEYBOARDSTATE
|
||||||
/* Uh oh, better hope the vkey is close enough.. */
|
/* Uh oh, better hope the vkey is close enough.. */
|
||||||
keysym->unicode = vkey;
|
keysym->unicode = vkey;
|
||||||
#else
|
#else
|
||||||
BYTE keystate[256];
|
BYTE keystate[256];
|
||||||
BYTE chars[2];
|
Uint16 wchars[2];
|
||||||
|
|
||||||
GetKeyboardState(keystate);
|
GetKeyboardState(keystate);
|
||||||
if ( ToAscii(vkey,scancode,keystate,(WORD *)chars,0) == 1 ) {
|
if (SDL_ToUnicode(vkey, scancode, keystate, wchars, sizeof(wchars)/sizeof(wchars[0]), 0) == 1)
|
||||||
keysym->unicode = chars[0];
|
{
|
||||||
|
keysym->unicode = wchars[0];
|
||||||
}
|
}
|
||||||
#endif /* NO_GETKEYBOARDSTATE */
|
#endif /* NO_GETKEYBOARDSTATE */
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,3 +77,4 @@ static char rcsid =
|
||||||
#define VK_RBRACKET 0xDD
|
#define VK_RBRACKET 0xDD
|
||||||
#define VK_APOSTROPHE 0xDE
|
#define VK_APOSTROPHE 0xDE
|
||||||
#define VK_BACKTICK 0xDF
|
#define VK_BACKTICK 0xDF
|
||||||
|
#define VK_OEM_102 0xE2
|
||||||
|
|
|
@ -824,11 +824,11 @@ static SDL_keysym *TranslateKey(UINT scancode, SDL_keysym *keysym, int pressed)
|
||||||
keysym->sym = DIK_keymap[scancode];
|
keysym->sym = DIK_keymap[scancode];
|
||||||
keysym->mod = KMOD_NONE;
|
keysym->mod = KMOD_NONE;
|
||||||
keysym->unicode = 0;
|
keysym->unicode = 0;
|
||||||
if ( pressed && SDL_TranslateUNICODE ) { /* Someday use ToUnicode() */
|
if ( pressed && SDL_TranslateUNICODE ) {
|
||||||
UINT vkey;
|
UINT vkey;
|
||||||
#ifndef NO_GETKEYBOARDSTATE
|
#ifndef NO_GETKEYBOARDSTATE
|
||||||
BYTE keystate[256];
|
BYTE keystate[256];
|
||||||
BYTE chars[2];
|
Uint16 wchars[2];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
vkey = MapVirtualKey(scancode, 1);
|
vkey = MapVirtualKey(scancode, 1);
|
||||||
|
@ -837,10 +837,11 @@ static SDL_keysym *TranslateKey(UINT scancode, SDL_keysym *keysym, int pressed)
|
||||||
keysym->unicode = vkey;
|
keysym->unicode = vkey;
|
||||||
#else
|
#else
|
||||||
GetKeyboardState(keystate);
|
GetKeyboardState(keystate);
|
||||||
if ( ToAscii(vkey,scancode,keystate,(WORD *)chars,0) == 1 ) {
|
if (SDL_ToUnicode(vkey, scancode, keystate, wchars, sizeof(wchars)/sizeof(wchars[0]), 0) == 1)
|
||||||
keysym->unicode = chars[0];
|
{
|
||||||
|
keysym->unicode = wchars[0];
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* NO_GETKEYBOARDSTATE */
|
||||||
}
|
}
|
||||||
return(keysym);
|
return(keysym);
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,8 @@ static void PrintKey(SDL_keysym *sym, int pressed)
|
||||||
/* This is a Latin-1 program, so only show 8-bits */
|
/* This is a Latin-1 program, so only show 8-bits */
|
||||||
if ( !(sym->unicode & 0xFF00) )
|
if ( !(sym->unicode & 0xFF00) )
|
||||||
printf(" (%c)", sym->unicode);
|
printf(" (%c)", sym->unicode);
|
||||||
|
else
|
||||||
|
printf(" (0x%X)", sym->unicode);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue