[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