From d99f61dd9aa218ffb24f301a518fe659af9ee672 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 16 Nov 2021 12:33:09 +0100 Subject: [PATCH] win32u: Move NtUserGetKeyState implementation from user32. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/user32/defwnd.c | 4 ++-- dlls/user32/dialog.c | 4 ++-- dlls/user32/edit.c | 8 ++++---- dlls/user32/input.c | 22 ---------------------- dlls/user32/listbox.c | 2 +- dlls/user32/mdi.c | 4 ++-- dlls/user32/menu.c | 6 +++--- dlls/user32/user32.spec | 2 +- dlls/user32/win.c | 2 +- dlls/win32u/input.c | 24 ++++++++++++++++++++++++ dlls/win32u/syscall.c | 1 + dlls/win32u/win32u.spec | 2 +- dlls/wow64win/syscall.h | 1 + dlls/wow64win/user.c | 7 +++++++ 14 files changed, 50 insertions(+), 39 deletions(-) diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c index 5eb056ebd9e..916029c2579 100644 --- a/dlls/user32/defwnd.c +++ b/dlls/user32/defwnd.c @@ -507,11 +507,11 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa } else if( wParam == VK_F10 ) { - if (GetKeyState(VK_SHIFT) & 0x8000) + if (NtUserGetKeyState(VK_SHIFT) & 0x8000) SendMessageW( hwnd, WM_CONTEXTMENU, (WPARAM)hwnd, -1 ); iF10Key = 1; } - else if( wParam == VK_ESCAPE && (GetKeyState(VK_SHIFT) & 0x8000)) + else if (wParam == VK_ESCAPE && (NtUserGetKeyState(VK_SHIFT) & 0x8000)) SendMessageW( hwnd, WM_SYSCOMMAND, SC_KEYMENU, ' ' ); break; diff --git a/dlls/user32/dialog.c b/dlls/user32/dialog.c index c48f404eceb..7fac3e6b44c 100644 --- a/dlls/user32/dialog.c +++ b/dlls/user32/dialog.c @@ -1198,7 +1198,7 @@ BOOL WINAPI IsDialogMessageW( HWND hwndDlg, LPMSG msg ) * do so but I presume someone has) */ if (fIsDialog) - SendMessageW( hwndDlg, WM_NEXTDLGCTL, (GetKeyState(VK_SHIFT) & 0x8000), 0 ); + SendMessageW( hwndDlg, WM_NEXTDLGCTL, (NtUserGetKeyState(VK_SHIFT) & 0x8000), 0 ); else { /* It would appear that GetNextDlgTabItem can handle being @@ -1208,7 +1208,7 @@ BOOL WINAPI IsDialogMessageW( HWND hwndDlg, LPMSG msg ) HWND hwndFocus = GetFocus(); HWND hwndNext = GetNextDlgTabItem (hwndDlg, hwndFocus == hwndDlg ? NULL : hwndFocus, - GetKeyState (VK_SHIFT) & 0x8000); + NtUserGetKeyState (VK_SHIFT) & 0x8000); if (hwndNext) { dlgCode = SendMessageW (hwndNext, WM_GETDLGCODE, diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c index cf5e807de21..73885566d3b 100644 --- a/dlls/user32/edit.c +++ b/dlls/user32/edit.c @@ -3176,7 +3176,7 @@ static LRESULT EDIT_WM_Char(EDITSTATE *es, WCHAR c) { BOOL control; - control = GetKeyState(VK_CONTROL) & 0x8000; + control = NtUserGetKeyState(VK_CONTROL) & 0x8000; switch (c) { case '\r': @@ -3436,11 +3436,11 @@ static LRESULT EDIT_WM_KeyDown(EDITSTATE *es, INT key) BOOL shift; BOOL control; - if (GetKeyState(VK_MENU) & 0x8000) + if (NtUserGetKeyState(VK_MENU) & 0x8000) return 0; - shift = GetKeyState(VK_SHIFT) & 0x8000; - control = GetKeyState(VK_CONTROL) & 0x8000; + shift = NtUserGetKeyState(VK_SHIFT) & 0x8000; + control = NtUserGetKeyState(VK_CONTROL) & 0x8000; switch (key) { case VK_F4: diff --git a/dlls/user32/input.c b/dlls/user32/input.c index 1362664d0c9..7d0581dfc8f 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -593,28 +593,6 @@ BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO plii) } -/********************************************************************** - * GetKeyState (USER32.@) - * - * An application calls the GetKeyState function in response to a - * keyboard-input message. This function retrieves the state of the key - * at the time the input message was generated. - */ -SHORT WINAPI DECLSPEC_HOTPATCH GetKeyState(INT vkey) -{ - SHORT retval = 0; - - SERVER_START_REQ( get_key_state ) - { - req->key = vkey; - if (!wine_server_call( req )) retval = (signed char)(reply->state & 0x81); - } - SERVER_END_REQ; - TRACE("key (0x%x) -> %x\n", vkey, retval); - return retval; -} - - /********************************************************************** * GetKeyboardState (USER32.@) */ diff --git a/dlls/user32/listbox.c b/dlls/user32/listbox.c index 912adb716d0..c7e97170b27 100644 --- a/dlls/user32/listbox.c +++ b/dlls/user32/listbox.c @@ -2508,7 +2508,7 @@ static LRESULT LISTBOX_HandleKeyDown( LB_DESCR *descr, DWORD key ) if (caret >= 0) { if (((descr->style & LBS_EXTENDEDSEL) && - !(GetKeyState( VK_SHIFT ) & 0x8000)) || + !(NtUserGetKeyState( VK_SHIFT ) & 0x8000)) || !IS_MULTISELECT(descr)) descr->anchor_item = caret; LISTBOX_MoveCaret( descr, caret, TRUE ); diff --git a/dlls/user32/mdi.c b/dlls/user32/mdi.c index af39e5781ed..1047b969c17 100644 --- a/dlls/user32/mdi.c +++ b/dlls/user32/mdi.c @@ -1649,13 +1649,13 @@ BOOL WINAPI TranslateMDISysAccel( HWND hwndClient, LPMSG msg ) /* translate if the Ctrl key is down and Alt not. */ - if( (GetKeyState(VK_CONTROL) & 0x8000) && !(GetKeyState(VK_MENU) & 0x8000)) + if( (NtUserGetKeyState(VK_CONTROL) & 0x8000) && !(NtUserGetKeyState(VK_MENU) & 0x8000)) { switch( msg->wParam ) { case VK_F6: case VK_TAB: - wParam = ( GetKeyState(VK_SHIFT) & 0x8000 ) ? SC_NEXTWINDOW : SC_PREVWINDOW; + wParam = ( NtUserGetKeyState(VK_SHIFT) & 0x8000 ) ? SC_NEXTWINDOW : SC_PREVWINDOW; break; case VK_F4: case VK_RBUTTON: diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c index ec6ff1d0dd0..f0d4be8a684 100644 --- a/dlls/user32/menu.c +++ b/dlls/user32/menu.c @@ -5505,9 +5505,9 @@ static BOOL translate_accelerator( HWND hWnd, UINT message, WPARAM wParam, LPARA if (wParam != key) return FALSE; - if (GetKeyState(VK_CONTROL) & 0x8000) mask |= FCONTROL; - if (GetKeyState(VK_MENU) & 0x8000) mask |= FALT; - if (GetKeyState(VK_SHIFT) & 0x8000) mask |= FSHIFT; + if (NtUserGetKeyState(VK_CONTROL) & 0x8000) mask |= FCONTROL; + if (NtUserGetKeyState(VK_MENU) & 0x8000) mask |= FALT; + if (NtUserGetKeyState(VK_SHIFT) & 0x8000) mask |= FSHIFT; if (message == WM_CHAR || message == WM_SYSCHAR) { diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index 34ba824dc38..91dc9674a3b 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -316,7 +316,7 @@ @ stdcall GetKBCodePage() @ stdcall GetKeyNameTextA(long ptr long) @ stdcall GetKeyNameTextW(long ptr long) -@ stdcall GetKeyState(long) +@ stdcall -import GetKeyState(long) NtUserGetKeyState @ stdcall GetKeyboardLayout(long) @ stdcall GetKeyboardLayoutList(long ptr) @ stdcall GetKeyboardLayoutNameA(ptr) diff --git a/dlls/user32/win.c b/dlls/user32/win.c index bc0b06c3f94..9fd5a9aa5e6 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -3893,7 +3893,7 @@ BOOL WINAPI DragDetect( HWND hWnd, POINT pt ) TRACE( "%p,%s\n", hWnd, wine_dbgstr_point( &pt ) ); - if (!(GetKeyState( VK_LBUTTON ) & 0x8000)) + if (!(NtUserGetKeyState( VK_LBUTTON ) & 0x8000)) return FALSE; wDragWidth = GetSystemMetrics(SM_CXDRAG); diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 0a4ebdace1d..5383115a424 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -28,6 +28,9 @@ #include "win32u_private.h" #include "wine/server.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(win); /********************************************************************** @@ -47,3 +50,24 @@ BOOL WINAPI NtUserAttachThreadInput( DWORD from, DWORD to, BOOL attach ) SERVER_END_REQ; return ret; } + +/********************************************************************** + * NtUserGetKeyState (win32u.@) + * + * An application calls the GetKeyState function in response to a + * keyboard-input message. This function retrieves the state of the key + * at the time the input message was generated. + */ +SHORT WINAPI NtUserGetKeyState( INT vkey ) +{ + SHORT retval = 0; + + SERVER_START_REQ( get_key_state ) + { + req->key = vkey; + if (!wine_server_call( req )) retval = (signed char)(reply->state & 0x81); + } + SERVER_END_REQ; + TRACE("key (0x%x) -> %x\n", vkey, retval); + return retval; +} diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c index e557eade893..9216e95f25c 100644 --- a/dlls/win32u/syscall.c +++ b/dlls/win32u/syscall.c @@ -111,6 +111,7 @@ static void * const syscalls[] = NtUserGetClipboardOwner, NtUserGetClipboardSequenceNumber, NtUserGetClipboardViewer, + NtUserGetKeyState, NtUserGetLayeredWindowAttributes, NtUserGetObjectInformation, NtUserGetProcessWindowStation, diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 2a627763091..2003dc39bcd 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -945,7 +945,7 @@ @ stub NtUserGetInteractiveCtrlSupportedWaveforms @ stub NtUserGetInternalWindowPos @ stub NtUserGetKeyNameText -@ stub NtUserGetKeyState +@ stdcall -syscall NtUserGetKeyState(long) @ stub NtUserGetKeyboardLayout @ stub NtUserGetKeyboardLayoutList @ stub NtUserGetKeyboardLayoutName diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h index 4f7ff8e003c..7dc791e8eb5 100644 --- a/dlls/wow64win/syscall.h +++ b/dlls/wow64win/syscall.h @@ -98,6 +98,7 @@ SYSCALL_ENTRY( NtUserGetClipboardOwner ) \ SYSCALL_ENTRY( NtUserGetClipboardSequenceNumber ) \ SYSCALL_ENTRY( NtUserGetClipboardViewer ) \ + SYSCALL_ENTRY( NtUserGetKeyState ) \ SYSCALL_ENTRY( NtUserGetLayeredWindowAttributes ) \ SYSCALL_ENTRY( NtUserGetObjectInformation ) \ SYSCALL_ENTRY( NtUserGetProcessWindowStation ) \ diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index a783eb42229..dcf8850c3f2 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -237,3 +237,10 @@ NTSTATUS WINAPI wow64_NtUserAttachThreadInput( UINT *args ) return NtUserAttachThreadInput( from, to, attach ); } + +NTSTATUS WINAPI wow64_NtUserGetKeyState( UINT *args ) +{ + INT vkey = get_ulong( &args ); + + return NtUserGetKeyState( vkey ); +}