user32: Move ToUnicodeEx from wineandroid.drv to user32.
As a fallback implementation, using English keyboard layout. Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
b7c3135444
commit
95d8f40fdf
|
@ -286,7 +286,7 @@ static BOOL CDECL nulldrv_RegisterHotKey( HWND hwnd, UINT modifiers, UINT vk )
|
|||
static INT CDECL nulldrv_ToUnicodeEx( UINT virt, UINT scan, const BYTE *state, LPWSTR str,
|
||||
int size, UINT flags, HKL layout )
|
||||
{
|
||||
return 0;
|
||||
return -2; /* use default implementation */
|
||||
}
|
||||
|
||||
static BOOL CDECL nulldrv_UnloadKeyboardLayout( HKL layout )
|
||||
|
|
|
@ -877,11 +877,83 @@ INT WINAPI ToUnicode(UINT virtKey, UINT scanCode, const BYTE *lpKeyState,
|
|||
/****************************************************************************
|
||||
* ToUnicodeEx (USER32.@)
|
||||
*/
|
||||
INT WINAPI ToUnicodeEx(UINT virtKey, UINT scanCode, const BYTE *lpKeyState,
|
||||
LPWSTR lpwStr, int size, UINT flags, HKL hkl)
|
||||
INT WINAPI ToUnicodeEx( UINT virt, UINT scan, const BYTE *state,
|
||||
WCHAR *str, int size, UINT flags, HKL layout )
|
||||
{
|
||||
if (!lpKeyState) return 0;
|
||||
return USER_Driver->pToUnicodeEx(virtKey, scanCode, lpKeyState, lpwStr, size, flags, hkl);
|
||||
BOOL shift, ctrl, numlock;
|
||||
WCHAR buffer[2];
|
||||
INT len;
|
||||
|
||||
TRACE_(keyboard)( "virt %u, scan %u, state %p, str %p, size %d, flags %x, layout %p.\n",
|
||||
virt, scan, state, str, size, flags, layout );
|
||||
|
||||
if (!state) return 0;
|
||||
if ((len = USER_Driver->pToUnicodeEx( virt, scan, state, str, size, flags, layout )) >= -1) return len;
|
||||
|
||||
shift = state[VK_SHIFT] & 0x80;
|
||||
ctrl = state[VK_CONTROL] & 0x80;
|
||||
numlock = state[VK_NUMLOCK] & 0x01;
|
||||
|
||||
/* FIXME: English keyboard layout specific */
|
||||
|
||||
if (scan & 0x8000) buffer[0] = 0; /* key up */
|
||||
else 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;
|
||||
else if (virt >= 'A' && virt <= 'Z')
|
||||
buffer[0] = shift || (state[VK_CAPITAL] & 0x01) ? virt : virt + 'a' - 'A';
|
||||
else if (virt >= VK_NUMPAD0 && virt <= VK_NUMPAD9 && numlock && !shift)
|
||||
buffer[0] = '0' + virt - VK_NUMPAD0;
|
||||
else if (virt == VK_DECIMAL && numlock && !shift)
|
||||
buffer[0] = '.';
|
||||
else
|
||||
buffer[0] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else /* Control codes */
|
||||
{
|
||||
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;
|
||||
default:
|
||||
if (virt >= 'A' && virt <= 'Z') buffer[0] = virt - 'A' + 1;
|
||||
else buffer[0] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
buffer[1] = 0;
|
||||
len = wcslen( buffer );
|
||||
lstrcpynW( str, buffer, size );
|
||||
|
||||
TRACE_(keyboard)( "ret %d, str %s.\n", len, debugstr_w(str) );
|
||||
return len;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
|
|
@ -750,100 +750,6 @@ jboolean keyboard_event( JNIEnv *env, jobject obj, jint win, jint action, jint k
|
|||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* 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;
|
||||
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 || (state[VK_CAPITAL] & 0x01) ? 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 );
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* ANDROID_GetKeyNameText
|
||||
*/
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
@ cdecl GetKeyNameText(long ptr long) ANDROID_GetKeyNameText
|
||||
@ cdecl GetKeyboardLayout(long) ANDROID_GetKeyboardLayout
|
||||
@ cdecl MapVirtualKeyEx(long long long) ANDROID_MapVirtualKeyEx
|
||||
@ cdecl ToUnicodeEx(long long ptr ptr long long long) ANDROID_ToUnicodeEx
|
||||
@ cdecl VkKeyScanEx(long long) ANDROID_VkKeyScanEx
|
||||
@ cdecl SetCursor(long) ANDROID_SetCursor
|
||||
@ cdecl ChangeDisplaySettingsEx(ptr ptr long long long) ANDROID_ChangeDisplaySettingsEx
|
||||
|
|
Loading…
Reference in New Issue