UTF8 input support for Windows.

ToDo:
* add support for dead keys
* other input methods (for hieroglyphs)
This commit is contained in:
Alexander Kuznetsov
2011-10-21 17:40:35 +00:00
parent 00735ed9e4
commit c9035e20d0

View File

@@ -712,21 +712,21 @@ GHOST_EventKey* GHOST_SystemWin32::processKeyEvent(GHOST_IWindow *window, RAWINP
GHOST_SystemWin32 * system = (GHOST_SystemWin32 *)getSystem(); GHOST_SystemWin32 * system = (GHOST_SystemWin32 *)getSystem();
GHOST_TKey key = system->hardKey(window, raw, &keyDown, &vk); GHOST_TKey key = system->hardKey(window, raw, &keyDown, &vk);
GHOST_EventKey* event; GHOST_EventKey* event;
if (key != GHOST_kKeyUnknown) { if (key != GHOST_kKeyUnknown) {
char ascii = '\0'; char utf8_char[6] = {0} ;
unsigned short utf16[2]={0}; wchar_t utf16[2]={0};
BYTE state[256]; BYTE state[256];
GetKeyboardState((PBYTE)state); GetKeyboardState((PBYTE)state);
if(ToAsciiEx(vk, 0, state, utf16, 0, system->m_keylayout)) if(ToUnicodeEx(vk, 0, state, utf16, 2, 0, system->m_keylayout))
WideCharToMultiByte(CP_ACP, 0x00000400, WideCharToMultiByte(CP_UTF8, 0,
(wchar_t*)utf16, 1, (wchar_t*)utf16, 1,
(LPSTR) &ascii, 1, (LPSTR) utf8_char, 5,
NULL,NULL); NULL,NULL); else *utf8_char = 0;
/* TODO, last arg is utf8, need to pass utf8 arg */ event = new GHOST_EventKey(system->getMilliSeconds(), keyDown ? GHOST_kEventKeyDown: GHOST_kEventKeyUp, window, key, (*utf8_char & 0x80)?'?':*utf8_char, utf8_char);
event = new GHOST_EventKey(system->getMilliSeconds(), keyDown ? GHOST_kEventKeyDown: GHOST_kEventKeyUp, window, key, ascii, NULL);
#ifdef GHOST_DEBUG #ifdef GHOST_DEBUG
std::cout << ascii << std::endl; std::cout << ascii << std::endl;