[PATCH 2/2] win32u: Move WM_CONTEXTMENU and WM_POPUPSYSTEMMENU implementation from user32.
Jacek Caban
wine at gitlab.winehq.org
Thu Jun 16 06:15:44 CDT 2022
From: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
dlls/user32/controls.h | 1 -
dlls/user32/defwnd.c | 26 ------
dlls/user32/nonclient.c | 182 ----------------------------------------
dlls/win32u/defwnd.c | 26 ++++++
4 files changed, 26 insertions(+), 209 deletions(-)
diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h
index 4fb21c9f0e3..3fadcc113c0 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -119,7 +119,6 @@ extern void MENU_EndMenu(HWND) DECLSPEC_HIDDEN;
extern HMENU MENU_GetSysMenu( HWND hWnd, HMENU hPopupMenu ) DECLSPEC_HIDDEN;
/* nonclient area */
-extern LRESULT NC_HandleNCHitTest( HWND hwnd, POINT pt ) DECLSPEC_HIDDEN;
extern LRESULT NC_HandleNCMouseMove( HWND hwnd, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN;
extern LRESULT NC_HandleNCMouseLeave( HWND hwnd ) DECLSPEC_HIDDEN;
extern LRESULT NC_HandleNCLButtonDblClk( HWND hwnd, WPARAM wParam, LPARAM lParam) DECLSPEC_HIDDEN;
diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c
index 4c8748f10cb..57e12d8e00b 100644
--- a/dlls/user32/defwnd.c
+++ b/dlls/user32/defwnd.c
@@ -209,32 +209,6 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
}
break;
- case WM_CONTEXTMENU:
- if (GetWindowLongW( hwnd, GWL_STYLE ) & WS_CHILD)
- SendMessageW( GetParent(hwnd), msg, (WPARAM)hwnd, lParam );
- else
- {
- LONG hitcode;
- POINT pt;
- pt.x = (short)LOWORD(lParam);
- pt.y = (short)HIWORD(lParam);
- hitcode = NC_HandleNCHitTest(hwnd, pt);
-
- /* Track system popup if click was in the caption area. */
- if (hitcode==HTCAPTION || hitcode==HTSYSMENU)
- TrackPopupMenu( NtUserGetSystemMenu(hwnd, FALSE),
- TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
- pt.x, pt.y, 0, hwnd, NULL );
- }
- break;
-
- case WM_POPUPSYSTEMMENU:
- /* This is an undocumented message used by the windows taskbar to
- display the system menu of windows that belong to other processes. */
- TrackPopupMenu( NtUserGetSystemMenu(hwnd, FALSE), TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
- (short)LOWORD(lParam), (short)HIWORD(lParam), 0, hwnd, NULL );
- return 0;
-
case WM_PRINT:
DEFWND_Print(hwnd, (HDC)wParam, lParam);
return 0;
diff --git a/dlls/user32/nonclient.c b/dlls/user32/nonclient.c
index 6c86c098e97..b803c99d43b 100644
--- a/dlls/user32/nonclient.c
+++ b/dlls/user32/nonclient.c
@@ -377,188 +377,6 @@ static void NC_GetInsideRect( HWND hwnd, enum coords_relative relative, RECT *re
}
}
-
-/***********************************************************************
- * NC_HandleNCHitTest
- *
- * Handle a WM_NCHITTEST message. Called from DefWindowProc().
- */
-LRESULT NC_HandleNCHitTest( HWND hwnd, POINT pt )
-{
- RECT rect, rcClient;
- DWORD style, ex_style;
-
- TRACE("hwnd=%p pt=%ld,%ld\n", hwnd, pt.x, pt.y );
-
- WIN_GetRectangles( hwnd, COORDS_SCREEN, &rect, &rcClient );
- if (!PtInRect( &rect, pt )) return HTNOWHERE;
-
- style = GetWindowLongW( hwnd, GWL_STYLE );
- ex_style = GetWindowLongW( hwnd, GWL_EXSTYLE );
-
- if (PtInRect( &rcClient, pt )) return HTCLIENT;
-
- /* Check borders */
- if (HAS_THICKFRAME( style, ex_style ))
- {
- InflateRect( &rect, -GetSystemMetrics(SM_CXFRAME), -GetSystemMetrics(SM_CYFRAME) );
- if (!PtInRect( &rect, pt ))
- {
- /* Check top sizing border */
- if (pt.y < rect.top)
- {
- if (pt.x < rect.left+GetSystemMetrics(SM_CXSIZE)) return HTTOPLEFT;
- if (pt.x >= rect.right-GetSystemMetrics(SM_CXSIZE)) return HTTOPRIGHT;
- return HTTOP;
- }
- /* Check bottom sizing border */
- if (pt.y >= rect.bottom)
- {
- if (pt.x < rect.left+GetSystemMetrics(SM_CXSIZE)) return HTBOTTOMLEFT;
- if (pt.x >= rect.right-GetSystemMetrics(SM_CXSIZE)) return HTBOTTOMRIGHT;
- return HTBOTTOM;
- }
- /* Check left sizing border */
- if (pt.x < rect.left)
- {
- if (pt.y < rect.top+GetSystemMetrics(SM_CYSIZE)) return HTTOPLEFT;
- if (pt.y >= rect.bottom-GetSystemMetrics(SM_CYSIZE)) return HTBOTTOMLEFT;
- return HTLEFT;
- }
- /* Check right sizing border */
- if (pt.x >= rect.right)
- {
- if (pt.y < rect.top+GetSystemMetrics(SM_CYSIZE)) return HTTOPRIGHT;
- if (pt.y >= rect.bottom-GetSystemMetrics(SM_CYSIZE)) return HTBOTTOMRIGHT;
- return HTRIGHT;
- }
- }
- }
- else /* No thick frame */
- {
- if (HAS_DLGFRAME( style, ex_style ))
- InflateRect(&rect, -GetSystemMetrics(SM_CXDLGFRAME), -GetSystemMetrics(SM_CYDLGFRAME));
- else if (HAS_THINFRAME( style ))
- InflateRect(&rect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER));
- if (!PtInRect( &rect, pt )) return HTBORDER;
- }
-
- /* Check caption */
-
- if ((style & WS_CAPTION) == WS_CAPTION)
- {
- if (ex_style & WS_EX_TOOLWINDOW)
- rect.top += GetSystemMetrics(SM_CYSMCAPTION) - 1;
- else
- rect.top += GetSystemMetrics(SM_CYCAPTION) - 1;
- if (!PtInRect( &rect, pt ))
- {
- BOOL min_or_max_box = (style & WS_SYSMENU) && (style & (WS_MINIMIZEBOX|WS_MAXIMIZEBOX));
- if (ex_style & WS_EX_LAYOUTRTL)
- {
- /* Check system menu */
- if ((style & WS_SYSMENU) && !(ex_style & WS_EX_TOOLWINDOW) && NC_IconForWindow(hwnd))
- {
- rect.right -= GetSystemMetrics(SM_CYCAPTION) - 1;
- if (pt.x > rect.right) return HTSYSMENU;
- }
-
- /* Check close button */
- if (style & WS_SYSMENU)
- {
- rect.left += GetSystemMetrics(SM_CYCAPTION);
- if (pt.x < rect.left) return HTCLOSE;
- }
-
- /* Check maximize box */
- /* In win95 there is automatically a Maximize button when there is a minimize one*/
- if (min_or_max_box && !(ex_style & WS_EX_TOOLWINDOW))
- {
- rect.left += GetSystemMetrics(SM_CXSIZE);
- if (pt.x < rect.left) return HTMAXBUTTON;
- }
-
- /* Check minimize box */
- if (min_or_max_box && !(ex_style & WS_EX_TOOLWINDOW))
- {
- rect.left += GetSystemMetrics(SM_CXSIZE);
- if (pt.x < rect.left) return HTMINBUTTON;
- }
- }
- else
- {
- /* Check system menu */
- if ((style & WS_SYSMENU) && !(ex_style & WS_EX_TOOLWINDOW) && NC_IconForWindow(hwnd))
- {
- rect.left += GetSystemMetrics(SM_CYCAPTION) - 1;
- if (pt.x < rect.left) return HTSYSMENU;
- }
-
- /* Check close button */
- if (style & WS_SYSMENU)
- {
- rect.right -= GetSystemMetrics(SM_CYCAPTION);
- if (pt.x > rect.right) return HTCLOSE;
- }
-
- /* Check maximize box */
- /* In win95 there is automatically a Maximize button when there is a minimize one*/
- if (min_or_max_box && !(ex_style & WS_EX_TOOLWINDOW))
- {
- rect.right -= GetSystemMetrics(SM_CXSIZE);
- if (pt.x > rect.right) return HTMAXBUTTON;
- }
-
- /* Check minimize box */
- if (min_or_max_box && !(ex_style & WS_EX_TOOLWINDOW))
- {
- rect.right -= GetSystemMetrics(SM_CXSIZE);
- if (pt.x > rect.right) return HTMINBUTTON;
- }
- }
- return HTCAPTION;
- }
- }
-
- /* Check menu bar */
-
- if (HAS_MENU( hwnd, style ) && (pt.y < rcClient.top) &&
- (pt.x >= rcClient.left) && (pt.x < rcClient.right))
- return HTMENU;
-
- /* Check vertical scroll bar */
-
- if (ex_style & WS_EX_LAYOUTRTL) ex_style ^= WS_EX_LEFTSCROLLBAR;
- if (style & WS_VSCROLL)
- {
- if((ex_style & WS_EX_LEFTSCROLLBAR) != 0)
- rcClient.left -= GetSystemMetrics(SM_CXVSCROLL);
- else
- rcClient.right += GetSystemMetrics(SM_CXVSCROLL);
- if (PtInRect( &rcClient, pt )) return HTVSCROLL;
- }
-
- /* Check horizontal scroll bar */
-
- if (style & WS_HSCROLL)
- {
- rcClient.bottom += GetSystemMetrics(SM_CYHSCROLL);
- if (PtInRect( &rcClient, pt ))
- {
- /* Check size box */
- if ((style & WS_VSCROLL) &&
- ((((ex_style & WS_EX_LEFTSCROLLBAR) != 0) && (pt.x <= rcClient.left + GetSystemMetrics(SM_CXVSCROLL))) ||
- (((ex_style & WS_EX_LEFTSCROLLBAR) == 0) && (pt.x >= rcClient.right - GetSystemMetrics(SM_CXVSCROLL)))))
- return HTSIZE;
- return HTHSCROLL;
- }
- }
-
- /* Has to return HTNOWHERE if nothing was found
- Could happen when a window has a customized non client area */
- return HTNOWHERE;
-}
-
LRESULT NC_HandleNCMouseMove(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
RECT rect;
diff --git a/dlls/win32u/defwnd.c b/dlls/win32u/defwnd.c
index 75a8045f9e2..b438b6d5275 100644
--- a/dlls/win32u/defwnd.c
+++ b/dlls/win32u/defwnd.c
@@ -2063,6 +2063,32 @@ LRESULT default_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam,
case WM_NCRBUTTONDOWN:
return handle_nc_rbutton_down( hwnd, wparam, lparam );
+ case WM_CONTEXTMENU:
+ if (get_window_long( hwnd, GWL_STYLE ) & WS_CHILD)
+ send_message( get_parent( hwnd ), msg, (WPARAM)hwnd, lparam );
+ else
+ {
+ LONG hitcode;
+ POINT pt;
+ pt.x = (short)LOWORD( lparam );
+ pt.y = (short)HIWORD( lparam );
+ hitcode = handle_nc_hit_test( hwnd, pt );
+
+ /* Track system popup if click was in the caption area. */
+ if (hitcode == HTCAPTION || hitcode == HTSYSMENU)
+ NtUserTrackPopupMenuEx( NtUserGetSystemMenu( hwnd, FALSE ),
+ TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
+ pt.x, pt.y, hwnd, NULL );
+ }
+ break;
+
+ case WM_POPUPSYSTEMMENU:
+ /* This is an undocumented message used by the windows taskbar to
+ * display the system menu of windows that belong to other processes. */
+ NtUserTrackPopupMenuEx( NtUserGetSystemMenu( hwnd, FALSE ), TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
+ (short)LOWORD(lparam), (short)HIWORD(lparam), hwnd, NULL );
+ return 0;
+
case WM_WINDOWPOSCHANGING:
return handle_window_pos_changing( hwnd, (WINDOWPOS *)lparam );
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/258
More information about the wine-devel
mailing list