Alexandre Julliard : user32: Avoid direct accesses to the window structure in NC_HandleNCHitTest.
Alexandre Julliard
julliard at winehq.org
Wed Sep 8 13:32:10 CDT 2010
Module: wine
Branch: master
Commit: 4858c54a8e5b59cc8a3a7d41c5a4243aca597ea8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4858c54a8e5b59cc8a3a7d41c5a4243aca597ea8
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Sep 8 13:19:04 2010 +0200
user32: Avoid direct accesses to the window structure in NC_HandleNCHitTest.
---
dlls/user32/nonclient.c | 95 +++++++++++++++++-----------------------------
1 files changed, 35 insertions(+), 60 deletions(-)
diff --git a/dlls/user32/nonclient.c b/dlls/user32/nonclient.c
index 15ed22e..051041c 100644
--- a/dlls/user32/nonclient.c
+++ b/dlls/user32/nonclient.c
@@ -60,7 +60,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(nonclient);
((exStyle) & WS_EX_DLGMODALFRAME) || \
!((style) & (WS_CHILD | WS_POPUP)))
-#define HAS_MENU(w) ((((w)->dwStyle & (WS_CHILD | WS_POPUP)) != WS_CHILD) && ((w)->wIDmenu != 0))
+#define HAS_MENU(hwnd,style) ((((style) & (WS_CHILD | WS_POPUP)) != WS_CHILD) && GetMenu(hwnd))
/******************************************************************************
@@ -512,33 +512,29 @@ static void NC_GetInsideRect( HWND hwnd, enum coords_relative relative, RECT *re
/***********************************************************************
- * NC_DoNCHitTest
- *
- * Handle a WM_NCHITTEST message. Called from NC_HandleNCHitTest().
+ * NC_HandleNCHitTest
*
- * FIXME: Just a modified copy of the Win 3.1 version.
+ * Handle a WM_NCHITTEST message. Called from DefWindowProc().
*/
-
-static LRESULT NC_DoNCHitTest (WND *wndPtr, POINT pt )
+LRESULT NC_HandleNCHitTest( HWND hwnd, POINT pt )
{
RECT rect, rcClient;
- POINT ptClient;
+ DWORD style, ex_style;
- TRACE("hwnd=%p pt=%d,%d\n", wndPtr->obj.handle, pt.x, pt.y );
+ TRACE("hwnd=%p pt=%d,%d\n", hwnd, pt.x, pt.y );
- GetWindowRect(wndPtr->obj.handle, &rect );
+ ScreenToClient( hwnd, &pt );
+ WIN_GetRectangles( hwnd, COORDS_CLIENT, &rect, &rcClient );
if (!PtInRect( &rect, pt )) return HTNOWHERE;
- if (wndPtr->dwStyle & WS_MINIMIZE) return HTCAPTION;
+ style = GetWindowLongW( hwnd, GWL_STYLE );
+ ex_style = GetWindowLongW( hwnd, GWL_EXSTYLE );
+ if (style & WS_MINIMIZE) return HTCAPTION;
- /* Check client area */
- ptClient = pt;
- ScreenToClient( wndPtr->obj.handle, &ptClient );
- GetClientRect( wndPtr->obj.handle, &rcClient );
- if (PtInRect( &rcClient, ptClient )) return HTCLIENT;
+ if (PtInRect( &rcClient, pt )) return HTCLIENT;
/* Check borders */
- if (HAS_THICKFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
+ if (HAS_THICKFRAME( style, ex_style ))
{
InflateRect( &rect, -GetSystemMetrics(SM_CXFRAME), -GetSystemMetrics(SM_CYFRAME) );
if (!PtInRect( &rect, pt ))
@@ -575,47 +571,46 @@ static LRESULT NC_DoNCHitTest (WND *wndPtr, POINT pt )
}
else /* No thick frame */
{
- if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
+ if (HAS_DLGFRAME( style, ex_style ))
InflateRect(&rect, -GetSystemMetrics(SM_CXDLGFRAME), -GetSystemMetrics(SM_CYDLGFRAME));
- else if (HAS_THINFRAME( wndPtr->dwStyle ))
+ else if (HAS_THINFRAME( style ))
InflateRect(&rect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER));
if (!PtInRect( &rect, pt )) return HTBORDER;
}
/* Check caption */
- if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION)
+ if ((style & WS_CAPTION) == WS_CAPTION)
{
- if (wndPtr->dwExStyle & WS_EX_TOOLWINDOW)
+ 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 = (wndPtr->dwStyle & WS_MAXIMIZEBOX) ||
- (wndPtr->dwStyle & WS_MINIMIZEBOX);
+ BOOL min_or_max_box = (style & WS_MAXIMIZEBOX) ||
+ (style & WS_MINIMIZEBOX);
/* Check system menu */
- if ((wndPtr->dwStyle & WS_SYSMENU) && !(wndPtr->dwExStyle & WS_EX_TOOLWINDOW))
+ if ((style & WS_SYSMENU) && !(ex_style & WS_EX_TOOLWINDOW))
{
- if (NC_IconForWindow(wndPtr->obj.handle))
- rect.left += GetSystemMetrics(SM_CYCAPTION) - 1;
+ if (NC_IconForWindow(hwnd)) rect.left += GetSystemMetrics(SM_CYCAPTION) - 1;
}
if (pt.x < rect.left) return HTSYSMENU;
/* Check close button */
- if (wndPtr->dwStyle & WS_SYSMENU)
+ 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 && !(wndPtr->dwExStyle & WS_EX_TOOLWINDOW))
+ 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 */
/* In win95 there is automatically a Maximize button when there is a Maximize one*/
- if (min_or_max_box && !(wndPtr->dwExStyle & WS_EX_TOOLWINDOW))
+ if (min_or_max_box && !(ex_style & WS_EX_TOOLWINDOW))
rect.right -= GetSystemMetrics(SM_CXSIZE);
if (pt.x > rect.right) return HTMINBUTTON;
@@ -625,26 +620,26 @@ static LRESULT NC_DoNCHitTest (WND *wndPtr, POINT pt )
/* Check vertical scroll bar */
- if (wndPtr->dwStyle & WS_VSCROLL)
+ if (style & WS_VSCROLL)
{
- if((wndPtr->dwExStyle & WS_EX_LEFTSCROLLBAR) != 0)
+ if((ex_style & WS_EX_LEFTSCROLLBAR) != 0)
rcClient.left -= GetSystemMetrics(SM_CXVSCROLL);
else
rcClient.right += GetSystemMetrics(SM_CXVSCROLL);
- if (PtInRect( &rcClient, ptClient )) return HTVSCROLL;
+ if (PtInRect( &rcClient, pt )) return HTVSCROLL;
}
/* Check horizontal scroll bar */
- if (wndPtr->dwStyle & WS_HSCROLL)
+ if (style & WS_HSCROLL)
{
rcClient.bottom += GetSystemMetrics(SM_CYHSCROLL);
- if (PtInRect( &rcClient, ptClient ))
+ if (PtInRect( &rcClient, pt ))
{
/* Check size box */
- if ((wndPtr->dwStyle & WS_VSCROLL) &&
- ((((wndPtr->dwExStyle & WS_EX_LEFTSCROLLBAR) != 0) && (ptClient.x <= rcClient.left + GetSystemMetrics(SM_CXVSCROLL))) ||
- (((wndPtr->dwExStyle & WS_EX_LEFTSCROLLBAR) == 0) && (ptClient.x >= rcClient.right - GetSystemMetrics(SM_CXVSCROLL)))))
+ 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;
}
@@ -652,9 +647,9 @@ static LRESULT NC_DoNCHitTest (WND *wndPtr, POINT pt )
/* Check menu bar */
- if (HAS_MENU(wndPtr))
+ if (HAS_MENU( hwnd, style ))
{
- if ((ptClient.y < 0) && (ptClient.x >= 0) && (ptClient.x < rcClient.right))
+ if ((pt.y < 0) && (pt.x >= 0) && (pt.x < rcClient.right))
return HTMENU;
}
@@ -664,24 +659,6 @@ static LRESULT NC_DoNCHitTest (WND *wndPtr, POINT pt )
}
-/***********************************************************************
- * NC_HandleNCHitTest
- *
- * Handle a WM_NCHITTEST message. Called from DefWindowProc().
- */
-LRESULT NC_HandleNCHitTest (HWND hwnd , POINT pt)
-{
- LRESULT retvalue;
- WND *wndPtr = WIN_GetPtr( hwnd );
-
- if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return HTERROR;
-
- retvalue = NC_DoNCHitTest (wndPtr, pt);
- WIN_ReleasePtr( wndPtr );
- return retvalue;
-}
-
-
/******************************************************************************
*
* NC_DrawSysButton
@@ -986,10 +963,8 @@ static void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint )
WORD flags;
HRGN hrgn;
RECT rectClient;
- int has_menu;
if (!(wndPtr = WIN_GetPtr( hwnd )) || wndPtr == WND_OTHER_PROCESS) return;
- has_menu = HAS_MENU(wndPtr);
dwStyle = wndPtr->dwStyle;
dwExStyle = wndPtr->dwExStyle;
flags = wndPtr->flags;
@@ -1053,7 +1028,7 @@ static void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint )
NC_DrawCaption(hdc, &r, hwnd, dwStyle, dwExStyle, active);
}
- if (has_menu)
+ if (HAS_MENU( hwnd, dwStyle ))
{
RECT r = rect;
r.bottom = rect.top + GetSystemMetrics(SM_CYMENU);
More information about the wine-cvs
mailing list