[PATCH v3 1/3] user32: Move ToUnicodeEx from wineandroid.drv to user32.
Rémi Bernon
rbernon at codeweavers.com
Thu Apr 29 02:53:52 CDT 2021
As a fallback implementation, using English keyboard layout.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
v3: Call driver first and return early if it implements the call.
dlls/user32/driver.c | 2 +-
dlls/user32/input.c | 80 ++++++++++++++++++-
dlls/wineandroid.drv/keyboard.c | 94 -----------------------
dlls/wineandroid.drv/wineandroid.drv.spec | 1 -
4 files changed, 77 insertions(+), 100 deletions(-)
diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c
index 7ac77141696..e5855e1c51b 100644
--- a/dlls/user32/driver.c
+++ b/dlls/user32/driver.c
@@ -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 )
diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index 805bfe3e9de..24942f72aa1 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -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;
}
/****************************************************************************
diff --git a/dlls/wineandroid.drv/keyboard.c b/dlls/wineandroid.drv/keyboard.c
index 0a6ede0ec5f..04565c3fad8 100644
--- a/dlls/wineandroid.drv/keyboard.c
+++ b/dlls/wineandroid.drv/keyboard.c
@@ -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
*/
diff --git a/dlls/wineandroid.drv/wineandroid.drv.spec b/dlls/wineandroid.drv/wineandroid.drv.spec
index 00de23de27e..6f27c1586b3 100644
--- a/dlls/wineandroid.drv/wineandroid.drv.spec
+++ b/dlls/wineandroid.drv/wineandroid.drv.spec
@@ -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
--
2.31.0
More information about the wine-devel
mailing list