[PATCH 1/7] win32u: Move default key messages implementation from user32.
Jacek Caban
wine at gitlab.winehq.org
Mon Jun 20 08:21:39 CDT 2022
From: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
dlls/user32/defwnd.c | 90 +-------------------------------------------
dlls/win32u/defwnd.c | 80 +++++++++++++++++++++++++++++++++++++++
2 files changed, 81 insertions(+), 89 deletions(-)
diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c
index 45f1842714f..2cfc0b14ff5 100644
--- a/dlls/user32/defwnd.c
+++ b/dlls/user32/defwnd.c
@@ -36,15 +36,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(win);
- /* bits in the dwKeyData */
-#define KEYDATA_ALT 0x2000
-#define KEYDATA_PREVSTATE 0x4000
-
#define DRAG_FILE 0x454C4946
-static short iF10Key = 0;
-static short iMenuSysKey = 0;
-
/***********************************************************************
* DEFWND_HandleWindowPosChanged
*
@@ -169,12 +162,6 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
DEFWND_HandleWindowPosChanged( hwnd, (const WINDOWPOS *)lParam );
break;
- case WM_LBUTTONDOWN:
- case WM_RBUTTONDOWN:
- case WM_MBUTTONDOWN:
- iF10Key = iMenuSysKey = 0;
- break;
-
case WM_RBUTTONUP:
{
POINT pt;
@@ -222,69 +209,6 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
case WM_SYSCOMMAND:
return NC_HandleSysCommand( hwnd, wParam, lParam );
- case WM_KEYDOWN:
- if(wParam == VK_F10) iF10Key = VK_F10;
- break;
-
- case WM_SYSKEYDOWN:
- if( HIWORD(lParam) & KEYDATA_ALT )
- {
- /* if( HIWORD(lParam) & ~KEYDATA_PREVSTATE ) */
- if ( (wParam == VK_MENU || wParam == VK_LMENU
- || wParam == VK_RMENU) && !iMenuSysKey )
- iMenuSysKey = 1;
- else
- iMenuSysKey = 0;
-
- iF10Key = 0;
-
- if( wParam == VK_F4 ) /* try to close the window */
- {
- HWND top = NtUserGetAncestor( hwnd, GA_ROOT );
- if (!(GetClassLongW( top, GCL_STYLE ) & CS_NOCLOSE))
- PostMessageW( top, WM_SYSCOMMAND, SC_CLOSE, 0 );
- }
- }
- else if( wParam == VK_F10 )
- {
- if (NtUserGetKeyState(VK_SHIFT) & 0x8000)
- SendMessageW( hwnd, WM_CONTEXTMENU, (WPARAM)hwnd, -1 );
- iF10Key = 1;
- }
- else if (wParam == VK_ESCAPE && (NtUserGetKeyState(VK_SHIFT) & 0x8000))
- SendMessageW( hwnd, WM_SYSCOMMAND, SC_KEYMENU, ' ' );
- break;
-
- case WM_KEYUP:
- case WM_SYSKEYUP:
- /* Press and release F10 or ALT */
- if (((wParam == VK_MENU || wParam == VK_LMENU || wParam == VK_RMENU)
- && iMenuSysKey) || ((wParam == VK_F10) && iF10Key))
- SendMessageW( NtUserGetAncestor( hwnd, GA_ROOT ), WM_SYSCOMMAND, SC_KEYMENU, 0L );
- iMenuSysKey = iF10Key = 0;
- break;
-
- case WM_SYSCHAR:
- {
- iMenuSysKey = 0;
- if (wParam == '\r' && IsIconic(hwnd))
- {
- PostMessageW( hwnd, WM_SYSCOMMAND, SC_RESTORE, 0L );
- break;
- }
- if ((HIWORD(lParam) & KEYDATA_ALT) && wParam)
- {
- if (wParam == '\t' || wParam == '\x1b') break;
- if (wParam == ' ' && (GetWindowLongW( hwnd, GWL_STYLE ) & WS_CHILD))
- SendMessageW( GetParent(hwnd), msg, wParam, lParam );
- else
- SendMessageW( hwnd, WM_SYSCOMMAND, SC_KEYMENU, wParam );
- }
- else /* check for Ctrl-Esc */
- if (wParam != '\x1b') MessageBeep(0);
- break;
- }
-
case WM_SHOWWINDOW:
{
LONG style = GetWindowLongW( hwnd, GWL_STYLE );
@@ -310,11 +234,6 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
break;
}
- case WM_CANCELMODE:
- iMenuSysKey = 0;
- NtUserMessageCall( hwnd, msg, wParam, lParam, 0, NtUserDefWindowProc, FALSE );
- break;
-
case WM_VKEYTOITEM:
case WM_CHARTOITEM:
return -1;
@@ -485,6 +404,7 @@ LRESULT WINAPI DefWindowProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam
break;
case WM_SETTEXT:
+ case WM_SYSCHAR:
result = NtUserMessageCall( hwnd, msg, wParam, lParam, 0, NtUserDefWindowProc, TRUE );
break;
@@ -556,14 +476,6 @@ LRESULT WINAPI DefWindowProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam
}
break;
- case WM_SYSCHAR:
- {
- CHAR ch = LOWORD(wParam);
- WCHAR wch;
- MultiByteToWideChar(CP_ACP, 0, &ch, 1, &wch, 1);
- wParam = MAKEWPARAM( wch, HIWORD(wParam) );
- }
- /* fall through */
default:
result = DEFWND_DefWinProc( hwnd, msg, wParam, lParam );
break;
diff --git a/dlls/win32u/defwnd.c b/dlls/win32u/defwnd.c
index b67f4de2dd9..71429884b2f 100644
--- a/dlls/win32u/defwnd.c
+++ b/dlls/win32u/defwnd.c
@@ -31,6 +31,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(win);
+/* bits in the dwKeyData */
+#define KEYDATA_ALT 0x2000
+#define KEYDATA_PREVSTATE 0x4000
+
+static short f10_key = 0;
+static short menu_sys_key = 0;
+
static BOOL has_dialog_frame( UINT style, UINT ex_style )
{
return (ex_style & WS_EX_DLGMODALFRAME) || ((style & WS_DLGFRAME) && !(style & WS_THICKFRAME));
@@ -2404,6 +2411,7 @@ LRESULT default_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam,
break;
case WM_CANCELMODE:
+ menu_sys_key = 0;
end_menu( hwnd );
if (get_capture() == hwnd) release_capture();
break;
@@ -2443,6 +2451,78 @@ LRESULT default_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam,
result = handle_sys_command( hwnd, wparam, lparam );
break;
+ case WM_LBUTTONDOWN:
+ case WM_RBUTTONDOWN:
+ case WM_MBUTTONDOWN:
+ f10_key = menu_sys_key = 0;
+ break;
+
+ case WM_KEYDOWN:
+ if (wparam == VK_F10) f10_key = VK_F10;
+ break;
+
+ case WM_SYSKEYDOWN:
+ if (HIWORD( lparam ) & KEYDATA_ALT)
+ {
+ if ((wparam == VK_MENU || wparam == VK_LMENU || wparam == VK_RMENU) && !menu_sys_key)
+ menu_sys_key = 1;
+ else
+ menu_sys_key = 0;
+
+ f10_key = 0;
+
+ if (wparam == VK_F4) /* try to close the window */
+ {
+ HWND top = NtUserGetAncestor( hwnd, GA_ROOT );
+ if (!(get_class_long( top, GCL_STYLE, FALSE ) & CS_NOCLOSE))
+ NtUserPostMessage( top, WM_SYSCOMMAND, SC_CLOSE, 0 );
+ }
+ }
+ else if (wparam == VK_F10)
+ {
+ if (NtUserGetKeyState(VK_SHIFT) & 0x8000)
+ send_message( hwnd, WM_CONTEXTMENU, (WPARAM)hwnd, -1 );
+ f10_key = 1;
+ }
+ else if (wparam == VK_ESCAPE && (NtUserGetKeyState( VK_SHIFT ) & 0x8000))
+ send_message( hwnd, WM_SYSCOMMAND, SC_KEYMENU, ' ' );
+ break;
+
+ case WM_KEYUP:
+ case WM_SYSKEYUP:
+ /* Press and release F10 or ALT */
+ if (((wparam == VK_MENU || wparam == VK_LMENU || wparam == VK_RMENU) && menu_sys_key) ||
+ (wparam == VK_F10 && f10_key))
+ send_message( NtUserGetAncestor( hwnd, GA_ROOT ), WM_SYSCOMMAND, SC_KEYMENU, 0 );
+ menu_sys_key = f10_key = 0;
+ break;
+
+ case WM_SYSCHAR:
+ menu_sys_key = 0;
+ if (wparam == '\r' && is_iconic( hwnd ))
+ {
+ NtUserPostMessage( hwnd, WM_SYSCOMMAND, SC_RESTORE, 0 );
+ break;
+ }
+ if ((HIWORD( lparam ) & KEYDATA_ALT) && wparam)
+ {
+ WCHAR wch;
+ if (ansi)
+ {
+ char ch = wparam;
+ win32u_mbtowc( &ansi_cp, &wch, 1, &ch, 1 );
+ }
+ else wch = wparam;
+ if (wch == '\t' || wch == '\x1b') break;
+ if (wch == ' ' && (get_window_long( hwnd, GWL_STYLE ) & WS_CHILD))
+ send_message( get_parent( hwnd ), msg, wch, lparam );
+ else
+ send_message( hwnd, WM_SYSCOMMAND, SC_KEYMENU, wch );
+ }
+ else if (wparam != '\x1b') /* Ctrl-Esc */
+ message_beep(0);
+ break;
+
case WM_KEYF1:
{
HELPINFO hi;
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/285
More information about the wine-devel
mailing list