Module: wine Branch: master Commit: 0df8855b205a9c29c66add86dc4f0da31e35a7ac URL: http://source.winehq.org/git/wine.git/?a=commit;h=0df8855b205a9c29c66add86dc...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Sep 24 14:13:03 2010 +0200
user32: Use screen coordinates for hittest checking to handle RTL windows correctly.
---
dlls/user32/nonclient.c | 100 ++++++++++++++++++++++++++++++++--------------- 1 files changed, 68 insertions(+), 32 deletions(-)
diff --git a/dlls/user32/nonclient.c b/dlls/user32/nonclient.c index cc52f38..64c1186 100644 --- a/dlls/user32/nonclient.c +++ b/dlls/user32/nonclient.c @@ -527,8 +527,7 @@ LRESULT NC_HandleNCHitTest( HWND hwnd, POINT pt )
TRACE("hwnd=%p pt=%d,%d\n", hwnd, pt.x, pt.y );
- ScreenToClient( hwnd, &pt ); - WIN_GetRectangles( hwnd, COORDS_CLIENT, &rect, &rcClient ); + WIN_GetRectangles( hwnd, COORDS_SCREEN, &rect, &rcClient ); if (!PtInRect( &rect, pt )) return HTNOWHERE;
style = GetWindowLongW( hwnd, GWL_STYLE ); @@ -594,36 +593,81 @@ LRESULT NC_HandleNCHitTest( HWND hwnd, POINT pt ) { BOOL min_or_max_box = (style & WS_MAXIMIZEBOX) || (style & WS_MINIMIZEBOX); - /* Check system menu */ - if ((style & WS_SYSMENU) && !(ex_style & WS_EX_TOOLWINDOW)) + if (ex_style & WS_EX_LAYOUTRTL) { - if (NC_IconForWindow(hwnd)) rect.left += GetSystemMetrics(SM_CYCAPTION) - 1; + /* 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; + } } - 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 */ - /* In win95 there is automatically a Maximize button when there is a Maximize one*/ - 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) @@ -649,14 +693,6 @@ LRESULT NC_HandleNCHitTest( HWND hwnd, POINT pt ) } }
- /* Check menu bar */ - - if (HAS_MENU( hwnd, style )) - { - if ((pt.y < 0) && (pt.x >= 0) && (pt.x < rcClient.right)) - return HTMENU; - } - /* Has to return HTNOWHERE if nothing was found Could happen when a window has a customized non client area */ return HTNOWHERE;