Alexandre Julliard <julliard(a)winehq.org> wrote:
+INT CDECL ANDROID_ToUnicodeEx( UINT virt, UINT scan, const BYTE *state, + LPWSTR buf, int size, UINT flags, HKL hkl ) +{ + WCHAR buffer[2]; + BOOL shift = (state[VK_SHIFT] & 0x80) || (state[VK_CAPITAL] & 0x01);
Treating Shift and CapsLock states same way leads to not correct results for the not letter keys.
+ BOOL ctrl = state[VK_CONTROL] & 0x80; + BOOL numlock = state[VK_NUMLOCK] & 0x01; + + buffer[0] = buffer[1] = 0; + + if (scan & 0x8000) return 0; /* key up */ + + /* FIXME: hardcoded layout */ + + if (!ctrl) + { + switch (virt) + { + case VK_BACK: buffer[0] = '\b'; break; + case VK_OEM_1: buffer[0] = shift ? ':' : ';'; break; + case VK_OEM_2: buffer[0] = shift ? '?' : '/'; break; + case VK_OEM_3: buffer[0] = shift ? '~' : '`'; break; + case VK_OEM_4: buffer[0] = shift ? '{' : '['; break; + case VK_OEM_5: buffer[0] = shift ? '|' : '\\'; break; + case VK_OEM_6: buffer[0] = shift ? '}' : ']'; break; + case VK_OEM_7: buffer[0] = shift ? '"' : '\''; break; + case VK_OEM_COMMA: buffer[0] = shift ? '<' : ','; break; + case VK_OEM_MINUS: buffer[0] = shift ? '_' : '-'; break; + case VK_OEM_PERIOD: buffer[0] = shift ? '>' : '.'; break; + case VK_OEM_PLUS: buffer[0] = shift ? '+' : '='; break; + case VK_RETURN: buffer[0] = '\r'; break; + case VK_SPACE: buffer[0] = ' '; break; + case VK_TAB: buffer[0] = '\t'; break; + case VK_MULTIPLY: buffer[0] = '*'; break; + case VK_ADD: buffer[0] = '+'; break; + case VK_SUBTRACT: buffer[0] = '-'; break; + case VK_DIVIDE: buffer[0] = '/'; break; + default: + if (virt >= '0' && virt <= '9') + { + buffer[0] = shift ? ")!@#$%^&*("[virt - '0'] : virt;
While this compiles even with MSVC there are certainly more readable ways to do the same thing. -- Dmitry.