Author: jimtabor Date: Fri Dec 31 21:10:29 2010 New Revision: 50247
URL: http://svn.reactos.org/svn/reactos?rev=50247&view=rev Log: [User32] - Start creeping in more Left to Right support, readying up for the next wine User32 controls port and test sync. Code is based on wine, credit them for any breakages. 8^P Our positions are off by 103 x 122 in some test cases, anyone having an idea please chime in.
Modified: trunk/reactos/dll/win32/user32/windows/winpos.c
Modified: trunk/reactos/dll/win32/user32/windows/winpos.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/wi... ============================================================================== --- trunk/reactos/dll/win32/user32/windows/winpos.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/user32/windows/winpos.c [iso-8859-1] Fri Dec 31 21:10:29 2010 @@ -129,25 +129,66 @@ int WINAPI MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints) { - PWND FromWnd, ToWnd; + PWND FromWnd = NULL, ToWnd = NULL; + BOOL mirror_from, mirror_to; POINT Delta; UINT i;
- FromWnd = ValidateHwndOrDesk(hWndFrom); - if (!FromWnd) - return 0; - - ToWnd = ValidateHwndOrDesk(hWndTo); - if (!ToWnd) - return 0; - - Delta.x = FromWnd->rcClient.left - ToWnd->rcClient.left; - Delta.y = FromWnd->rcClient.top - ToWnd->rcClient.top; + if (hWndFrom) + { + FromWnd = ValidateHwnd(hWndFrom); + if (!FromWnd) + return 0; + } + if (hWndTo) + { + ToWnd = ValidateHwnd(hWndTo); + if (!ToWnd) + return 0; + } + + /* Note: Desktop Top and Left is always 0! */ + Delta.x = Delta.y = 0; + mirror_from = mirror_to = FALSE; + + if (FromWnd && FromWnd->fnid != FNID_DESKTOP) + { + if (FromWnd->ExStyle & WS_EX_LAYOUTRTL) + { + mirror_from = TRUE; + Delta.x = FromWnd->rcClient.right - FromWnd->rcClient.left; + } + else + Delta.x = FromWnd->rcClient.left; + Delta.y = FromWnd->rcClient.top; + } + + if (ToWnd && ToWnd->fnid != FNID_DESKTOP) + { + if (ToWnd->ExStyle & WS_EX_LAYOUTRTL) + { + mirror_to = TRUE; + Delta.x -= ToWnd->rcClient.right - ToWnd->rcClient.left; + } + else + Delta.x -= ToWnd->rcClient.left; + Delta.y -= ToWnd->rcClient.top; + } + + if (mirror_from) Delta.x = -Delta.x;
for (i = 0; i != cPoints; i++) { lpPoints[i].x += Delta.x; lpPoints[i].y += Delta.y; + if (mirror_from || mirror_to) lpPoints[i].x = -lpPoints[i].x; + } + + if ((mirror_from || mirror_to) && cPoints == 2) /* special case for rectangle */ + { + int tmp = lpPoints[0].x; + lpPoints[0].x = lpPoints[1].x; + lpPoints[1].x = tmp; }
return MAKELONG(LOWORD(Delta.x), LOWORD(Delta.y)); @@ -160,17 +201,20 @@ BOOL WINAPI ScreenToClient(HWND hWnd, LPPOINT lpPoint) { - PWND Wnd, DesktopWnd; - + PWND Wnd; + /* Note: Desktop Top and Left is always 0! */ Wnd = ValidateHwnd(hWnd); if (!Wnd) return FALSE;
- DesktopWnd = GetThreadDesktopWnd(); - - lpPoint->x += DesktopWnd->rcClient.left - Wnd->rcClient.left; - lpPoint->y += DesktopWnd->rcClient.top - Wnd->rcClient.top; - + if (Wnd->fnid != FNID_DESKTOP) + { + if (Wnd->ExStyle & WS_EX_LAYOUTRTL) + lpPoint->x = Wnd->rcClient.right - lpPoint->x; + else + lpPoint->x -= Wnd->rcClient.left; + lpPoint->y -= Wnd->rcClient.top; + } return TRUE; }
@@ -181,17 +225,20 @@ BOOL WINAPI ClientToScreen(HWND hWnd, LPPOINT lpPoint) { - PWND Wnd, DesktopWnd; - + PWND Wnd; + /* Note: Desktop Top and Left is always 0! */ Wnd = ValidateHwnd(hWnd); if (!Wnd) return FALSE;
- DesktopWnd = GetThreadDesktopWnd(); - - lpPoint->x += Wnd->rcClient.left - DesktopWnd->rcClient.left; - lpPoint->y += Wnd->rcClient.top - DesktopWnd->rcClient.top; - + if (Wnd->fnid != FNID_DESKTOP) + { + if (Wnd->ExStyle & WS_EX_LAYOUTRTL) + lpPoint->x = Wnd->rcClient.right - lpPoint->x; + else + lpPoint->x += Wnd->rcClient.left; + lpPoint->y += Wnd->rcClient.top; + } return TRUE; }