Alexandre Julliard : user32: Properly set last error in MapWindowPoints.
Alexandre Julliard
julliard at winehq.org
Wed Nov 14 13:17:16 CST 2012
Module: wine
Branch: master
Commit: 5dea6543170fd12928cf2196b55fec9c2fe82c75
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5dea6543170fd12928cf2196b55fec9c2fe82c75
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Nov 14 16:26:13 2012 +0100
user32: Properly set last error in MapWindowPoints.
---
dlls/user32/winpos.c | 36 ++++++++++++++++++++++++------------
1 files changed, 24 insertions(+), 12 deletions(-)
diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c
index eda5b78..c620df9 100644
--- a/dlls/user32/winpos.c
+++ b/dlls/user32/winpos.c
@@ -422,11 +422,11 @@ HWND WINAPI ChildWindowFromPointEx( HWND hwndParent, POINT pt, UINT uFlags)
* Calculate the offset between the origin of the two windows. Used
* to implement MapWindowPoints.
*/
-static POINT WINPOS_GetWinOffset( HWND hwndFrom, HWND hwndTo, BOOL *mirrored )
+static BOOL WINPOS_GetWinOffset( HWND hwndFrom, HWND hwndTo, BOOL *mirrored, POINT *ret_offset )
{
WND * wndPtr;
POINT offset;
- BOOL mirror_from, mirror_to;
+ BOOL mirror_from, mirror_to, ret;
HWND hwnd;
offset.x = offset.y = 0;
@@ -435,7 +435,11 @@ static POINT WINPOS_GetWinOffset( HWND hwndFrom, HWND hwndTo, BOOL *mirrored )
/* Translate source window origin to screen coords */
if (hwndFrom)
{
- if (!(wndPtr = WIN_GetPtr( hwndFrom ))) return offset;
+ if (!(wndPtr = WIN_GetPtr( hwndFrom )))
+ {
+ SetLastError( ERROR_INVALID_WINDOW_HANDLE );
+ return FALSE;
+ }
if (wndPtr == WND_OTHER_PROCESS) goto other_process;
if (wndPtr != WND_DESKTOP)
{
@@ -466,7 +470,11 @@ static POINT WINPOS_GetWinOffset( HWND hwndFrom, HWND hwndTo, BOOL *mirrored )
/* Translate origin to destination window coords */
if (hwndTo)
{
- if (!(wndPtr = WIN_GetPtr( hwndTo ))) return offset;
+ if (!(wndPtr = WIN_GetPtr( hwndTo )))
+ {
+ SetLastError( ERROR_INVALID_WINDOW_HANDLE );
+ return FALSE;
+ }
if (wndPtr == WND_OTHER_PROCESS) goto other_process;
if (wndPtr != WND_DESKTOP)
{
@@ -496,35 +504,37 @@ static POINT WINPOS_GetWinOffset( HWND hwndFrom, HWND hwndTo, BOOL *mirrored )
*mirrored = mirror_from ^ mirror_to;
if (mirror_from) offset.x = -offset.x;
- return offset;
+ *ret_offset = offset;
+ return TRUE;
other_process: /* one of the parents may belong to another process, do it the hard way */
- offset.x = offset.y = 0;
SERVER_START_REQ( get_windows_offset )
{
req->from = wine_server_user_handle( hwndFrom );
req->to = wine_server_user_handle( hwndTo );
- if (!wine_server_call( req ))
+ if ((ret = !wine_server_call_err( req )))
{
- offset.x = reply->x;
- offset.y = reply->y;
+ ret_offset->x = reply->x;
+ ret_offset->y = reply->y;
*mirrored = reply->mirror;
}
}
SERVER_END_REQ;
- return offset;
+ return ret;
}
/* map coordinates of a window region */
void map_window_region( HWND from, HWND to, HRGN hrgn )
{
BOOL mirrored;
- POINT offset = WINPOS_GetWinOffset( from, to, &mirrored );
+ POINT offset;
UINT i, size;
RGNDATA *data;
HRGN new_rgn;
RECT *rect;
+ if (!WINPOS_GetWinOffset( from, to, &mirrored, &offset )) return;
+
if (!mirrored)
{
OffsetRgn( hrgn, offset.x, offset.y );
@@ -557,9 +567,11 @@ void map_window_region( HWND from, HWND to, HRGN hrgn )
INT WINAPI MapWindowPoints( HWND hwndFrom, HWND hwndTo, LPPOINT lppt, UINT count )
{
BOOL mirrored;
- POINT offset = WINPOS_GetWinOffset( hwndFrom, hwndTo, &mirrored );
+ POINT offset;
UINT i;
+ if (!WINPOS_GetWinOffset( hwndFrom, hwndTo, &mirrored, &offset )) return 0;
+
for (i = 0; i < count; i++)
{
lppt[i].x += offset.x;
More information about the wine-cvs
mailing list