From a32f044154db8f81509cbabbe885fcac85ec0130 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 17 Nov 2021 12:47:04 +0100 Subject: [PATCH] win32u: Move NtUserActivateKeyboardLayout implementation from user32. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/user32/defwnd.c | 2 +- dlls/user32/driver.c | 7 +------ dlls/user32/input.c | 32 +------------------------------- dlls/user32/user32.spec | 2 +- dlls/win32u/driver.c | 6 ++++++ dlls/win32u/gdiobj.c | 1 + dlls/win32u/input.c | 30 ++++++++++++++++++++++++++++++ dlls/win32u/win32u.spec | 2 +- dlls/win32u/win32u_private.h | 1 + dlls/win32u/wrappers.c | 5 +++++ 10 files changed, 48 insertions(+), 40 deletions(-) diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c index 916029c2579..8cd9047f02b 100644 --- a/dlls/user32/defwnd.c +++ b/dlls/user32/defwnd.c @@ -734,7 +734,7 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa } case WM_INPUTLANGCHANGEREQUEST: - ActivateKeyboardLayout( (HKL)lParam, 0 ); + NtUserActivateKeyboardLayout( (HKL)lParam, 0 ); break; case WM_INPUTLANGCHANGE: diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c index b92d74443f3..fb0ed54bc80 100644 --- a/dlls/user32/driver.c +++ b/dlls/user32/driver.c @@ -233,11 +233,6 @@ static void CDECL nulldrv_ThreadDetach( void ) * Each entry point simply loads the real driver and chains to it. */ -static BOOL CDECL loaderdrv_ActivateKeyboardLayout( HKL layout, UINT flags ) -{ - return load_driver()->pActivateKeyboardLayout( layout, flags ); -} - static void CDECL loaderdrv_Beep(void) { load_driver()->pBeep(); @@ -345,7 +340,7 @@ static struct user_driver_funcs lazy_load_driver = { { NULL }, /* keyboard functions */ - loaderdrv_ActivateKeyboardLayout, + NULL, loaderdrv_Beep, NULL, loaderdrv_GetKeyboardLayoutList, diff --git a/dlls/user32/input.c b/dlls/user32/input.c index 3f41f09d4e2..369c024a1d4 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -872,36 +872,6 @@ INT WINAPI ToAsciiEx( UINT virtKey, UINT scanCode, const BYTE *lpKeyState, return ret; } -/********************************************************************** - * ActivateKeyboardLayout (USER32.@) - */ -HKL WINAPI ActivateKeyboardLayout( HKL layout, UINT flags ) -{ - struct user_thread_info *info = get_user_thread_info(); - HKL old_layout; - - TRACE_(keyboard)( "layout %p, flags %x\n", layout, flags ); - - if (flags) FIXME_(keyboard)( "flags %x not supported\n", flags ); - - if (layout == (HKL)HKL_NEXT || layout == (HKL)HKL_PREV) - { - SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); - FIXME_(keyboard)( "HKL_NEXT and HKL_PREV not supported\n" ); - return 0; - } - - if (!USER_Driver->pActivateKeyboardLayout( layout, flags )) - return 0; - - old_layout = info->kbd_layout; - info->kbd_layout = layout; - if (old_layout != layout) info->kbd_layout_id = 0; - - if (!old_layout) return get_locale_kbd_layout(); - return old_layout; -} - /********************************************************************** * BlockInput (USER32.@) */ @@ -1056,7 +1026,7 @@ HKL WINAPI LoadKeyboardLayoutW( const WCHAR *name, UINT flags ) RegCloseKey( hkey ); } - if ((flags & KLF_ACTIVATE) && ActivateKeyboardLayout( layout, 0 )) return layout; + if ((flags & KLF_ACTIVATE) && NtUserActivateKeyboardLayout( layout, 0 )) return layout; /* FIXME: semi-stub: returning default layout */ return get_locale_kbd_layout(); diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index 71830f41574..7d88bd14c99 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -1,4 +1,4 @@ -@ stdcall ActivateKeyboardLayout(long long) +@ stdcall ActivateKeyboardLayout(long long) NtUserActivateKeyboardLayout @ stdcall AddClipboardFormatListener(long) NtUserAddClipboardFormatListener @ stdcall AdjustWindowRect(ptr long long) @ stdcall AdjustWindowRectEx(ptr long long long) diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index f7f3f3cf5f7..6e7a5c715c8 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -1003,6 +1003,11 @@ static const struct user_driver_funcs *load_driver(void) return user_driver; } +static BOOL CDECL loaderdrv_ActivateKeyboardLayout( HKL layout, UINT flags ) +{ + return load_driver()->pActivateKeyboardLayout( layout, flags ); +} + static INT CDECL loaderdrv_GetKeyNameText( LONG lparam, LPWSTR buffer, INT size ) { return load_driver()->pGetKeyNameText( lparam, buffer, size ); @@ -1031,6 +1036,7 @@ static void CDECL loaderdrv_UpdateClipboard(void) static const struct user_driver_funcs lazy_load_driver = { + .pActivateKeyboardLayout = loaderdrv_ActivateKeyboardLayout, .pGetKeyNameText = loaderdrv_GetKeyNameText, .pMapVirtualKeyEx = loaderdrv_MapVirtualKeyEx, .pToUnicodeEx = loaderdrv_ToUnicodeEx, diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index 82d94435bf1..29750c6bbf7 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -1167,6 +1167,7 @@ static struct unix_funcs unix_funcs = NtGdiUnrealizeObject, NtGdiUpdateColors, NtGdiWidenPath, + NtUserActivateKeyboardLayout, NtUserCountClipboardFormats, NtUserGetKeyNameText, NtUserGetPriorityClipboardFormat, diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 0f41dbb46ad..9af1a81492d 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -570,3 +570,33 @@ INT WINAPI NtUserToUnicodeEx( UINT virt, UINT scan, const BYTE *state, TRACE_(keyboard)( "ret %d, str %s.\n", len, debugstr_w(str) ); return len; } + +/********************************************************************** + * NtUserActivateKeyboardLayout (win32u.@) + */ +HKL WINAPI NtUserActivateKeyboardLayout( HKL layout, UINT flags ) +{ + struct user_thread_info *info = get_user_thread_info(); + HKL old_layout; + + TRACE_(keyboard)( "layout %p, flags %x\n", layout, flags ); + + if (flags) FIXME_(keyboard)( "flags %x not supported\n", flags ); + + if (layout == (HKL)HKL_NEXT || layout == (HKL)HKL_PREV) + { + SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); + FIXME_(keyboard)( "HKL_NEXT and HKL_PREV not supported\n" ); + return 0; + } + + if (!user_driver->pActivateKeyboardLayout( layout, flags )) + return 0; + + old_layout = info->kbd_layout; + info->kbd_layout = layout; + if (old_layout != layout) info->kbd_layout_id = 0; + + if (!old_layout) return get_locale_kbd_layout(); + return old_layout; +} diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 9439aa21a29..df5f4fb843f 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -749,7 +749,7 @@ @ stub NtUpdateInputSinkTransforms @ stub NtUserAcquireIAMKey @ stub NtUserAcquireInteractiveControlBackgroundAccess -@ stub NtUserActivateKeyboardLayout +@ stdcall NtUserActivateKeyboardLayout(long long) @ stdcall -syscall NtUserAddClipboardFormatListener(long) @ stub NtUserAddVisualIdentifier @ stub NtUserAlterWindowStyle diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 4219ffa5bbc..c2b35fc53b1 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -194,6 +194,7 @@ struct unix_funcs BOOL (WINAPI *pNtGdiUnrealizeObject)( HGDIOBJ obj ); BOOL (WINAPI *pNtGdiUpdateColors)( HDC hdc ); BOOL (WINAPI *pNtGdiWidenPath)( HDC hdc ); + HKL (WINAPI *pNtUserActivateKeyboardLayout)( HKL layout, UINT flags ); INT (WINAPI *pNtUserCountClipboardFormats)(void); INT (WINAPI *pNtUserGetKeyNameText)( LONG lparam, WCHAR *buffer, INT size ); INT (WINAPI *pNtUserGetPriorityClipboardFormat)( UINT *list, INT count ); diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c index 04019de036b..b8bd5ec225e 100644 --- a/dlls/win32u/wrappers.c +++ b/dlls/win32u/wrappers.c @@ -596,6 +596,11 @@ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER return unix_funcs->pNtGdiDdDDISetVidPnSourceOwner( desc ); } +HKL WINAPI NtUserActivateKeyboardLayout( HKL layout, UINT flags ) +{ + return unix_funcs->pNtUserActivateKeyboardLayout( layout, flags ); +} + INT WINAPI NtUserCountClipboardFormats(void) { return unix_funcs->pNtUserCountClipboardFormats();