wineandroid: Implement ToUnicodeEx.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2017-06-08 16:44:43 +02:00
parent 8dc11a3ab3
commit 6f4149d842
2 changed files with 96 additions and 0 deletions

View File

@ -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 );
}

View File

@ -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