Module: wine Branch: master Commit: 6f4149d8423b975717fd587dfa421e4b65c4b70f URL: http://source.winehq.org/git/wine.git/?a=commit;h=6f4149d8423b975717fd587dfa...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jun 8 16:44:43 2017 +0200
wineandroid: Implement ToUnicodeEx.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wineandroid.drv/keyboard.c | 95 +++++++++++++++++++++++++++++++ dlls/wineandroid.drv/wineandroid.drv.spec | 1 + 2 files changed, 96 insertions(+)
diff --git a/dlls/wineandroid.drv/keyboard.c b/dlls/wineandroid.drv/keyboard.c index d9a8326..b3ac76f 100644 --- a/dlls/wineandroid.drv/keyboard.c +++ b/dlls/wineandroid.drv/keyboard.c @@ -32,6 +32,7 @@ #include "config.h"
#include "android.h" +#include "wine/unicode.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(keyboard); @@ -554,3 +555,97 @@ jboolean keyboard_event( JNIEnv *env, jobject obj, jint win, jint action, jint k send_event( &data ); return JNI_TRUE; } + + +/*********************************************************************** + * ANDROID_ToUnicodeEx + */ +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); + 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; + break; + } + if (virt >= 'A' && virt <= 'Z') + { + buffer[0] = shift ? virt : virt + 'a' - 'A'; + break; + } + if (virt >= VK_NUMPAD0 && virt <= VK_NUMPAD9 && numlock && !shift) + { + buffer[0] = '0' + virt - VK_NUMPAD0; + break; + } + if (virt == VK_DECIMAL && numlock && !shift) + { + buffer[0] = '.'; + break; + } + break; + } + } + else /* Control codes */ + { + if (virt >= 'A' && virt <= 'Z') + buffer[0] = virt - 'A' + 1; + else + { + switch (virt) + { + case VK_OEM_4: + buffer[0] = 0x1b; + break; + case VK_OEM_5: + buffer[0] = 0x1c; + break; + case VK_OEM_6: + buffer[0] = 0x1d; + break; + case VK_SUBTRACT: + buffer[0] = 0x1e; + break; + } + } + } + + lstrcpynW( buf, buffer, size ); + TRACE( "returning %d / %s\n", strlenW( buffer ), debugstr_wn(buf, strlenW( buffer ))); + return strlenW( buffer ); +} diff --git a/dlls/wineandroid.drv/wineandroid.drv.spec b/dlls/wineandroid.drv/wineandroid.drv.spec index f893299..1a74624 100644 --- a/dlls/wineandroid.drv/wineandroid.drv.spec +++ b/dlls/wineandroid.drv/wineandroid.drv.spec @@ -4,6 +4,7 @@
# USER driver
+@ cdecl ToUnicodeEx(long long ptr ptr long long long) ANDROID_ToUnicodeEx @ cdecl EnumDisplayMonitors(long ptr ptr long) ANDROID_EnumDisplayMonitors @ cdecl GetMonitorInfo(long ptr) ANDROID_GetMonitorInfo @ cdecl CreateWindow(long) ANDROID_CreateWindow