user32: Hardcode the GetWindowLong values for the desktop window to avoid a server round-trip.

Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Huw Davies 2017-02-02 12:00:01 +00:00 committed by Alexandre Julliard
parent 1bb9db43e1
commit e883d0ec60
2 changed files with 98 additions and 2 deletions

View File

@ -7143,6 +7143,25 @@ static void test_hwnd_message(void)
HWND parent = 0, hwnd, found; HWND parent = 0, hwnd, found;
RECT rect; RECT rect;
static const struct
{
int offset;
ULONG_PTR expect;
DWORD error;
}
tests[] =
{
{ GWLP_USERDATA, 0, 0 },
{ GWL_STYLE, WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0 },
{ GWL_EXSTYLE, 0, 0 },
{ GWLP_ID, 0, 0 },
/* GWLP_HWNDPARENT - returns random values */
/* GWLP_HINSTANCE - not useful and not consistent between Windows versions */
{ GWLP_WNDPROC, 0, ERROR_ACCESS_DENIED },
{ DWLP_MSGRESULT, 0, ERROR_INVALID_INDEX }
};
DWORD_PTR result;
int i;
/* HWND_MESSAGE is not supported below w2k, but win9x return != 0 /* HWND_MESSAGE is not supported below w2k, but win9x return != 0
on CreateWindowExA and crash later in the test. on CreateWindowExA and crash later in the test.
@ -7166,7 +7185,7 @@ static void test_hwnd_message(void)
ok(parent != desktop, "GetAncestor(GA_PARENT) should not return desktop for message windows\n"); ok(parent != desktop, "GetAncestor(GA_PARENT) should not return desktop for message windows\n");
root = pGetAncestor(hwnd, GA_ROOT); root = pGetAncestor(hwnd, GA_ROOT);
ok(root == hwnd, "GetAncestor(GA_ROOT) should return hwnd for message windows\n"); ok(root == hwnd, "GetAncestor(GA_ROOT) should return hwnd for message windows\n");
ok( !pGetAncestor(parent, GA_PARENT) || broken(pGetAncestor(parent, GA_PARENT) != 0), /* win2k */ ok( !pGetAncestor(parent, GA_PARENT),
"parent shouldn't have parent %p\n", pGetAncestor(parent, GA_PARENT) ); "parent shouldn't have parent %p\n", pGetAncestor(parent, GA_PARENT) );
trace("parent %p root %p desktop %p\n", parent, root, desktop); trace("parent %p root %p desktop %p\n", parent, root, desktop);
if (!GetClassNameA( parent, buffer, sizeof(buffer) )) buffer[0] = 0; if (!GetClassNameA( parent, buffer, sizeof(buffer) )) buffer[0] = 0;
@ -7202,6 +7221,21 @@ static void test_hwnd_message(void)
ok( !IsWindowVisible( hwnd ), "HWND_MESSAGE window is visible\n" ); ok( !IsWindowVisible( hwnd ), "HWND_MESSAGE window is visible\n" );
if (parent) ok( !IsWindowVisible( parent ), "HWND_MESSAGE parent is visible\n" ); if (parent) ok( !IsWindowVisible( parent ), "HWND_MESSAGE parent is visible\n" );
/* GetWindowLong */
for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
{
SetLastError( 0xdeadbeef );
result = GetWindowLongPtrW( parent, tests[i].offset );
ok( result == tests[i].expect, "offset %d, got %08lx expect %08lx\n",
tests[i].offset, result, tests[i].expect );
if (tests[i].error)
ok( GetLastError() == tests[i].error, "offset %d: error %d expect %d\n",
tests[i].offset, GetLastError(), tests[i].error );
else
ok( GetLastError() == 0xdeadbeef, "offset %d: error %d expect unchanged\n",
tests[i].offset, GetLastError() );
}
DestroyWindow(hwnd); DestroyWindow(hwnd);
} }
@ -9567,6 +9601,45 @@ static void test_LockWindowUpdate(HWND parent)
DestroyWindow(child); DestroyWindow(child);
} }
static void test_desktop( void )
{
HWND desktop = GetDesktopWindow();
/* GetWindowLong Desktop window tests */
static const struct
{
int offset;
ULONG_PTR expect;
DWORD error;
}
tests[] =
{
{ GWLP_USERDATA, 0, 0 },
{ GWL_STYLE, WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0 },
{ GWL_EXSTYLE, 0, 0 },
{ GWLP_ID, 0, 0 },
{ GWLP_HWNDPARENT, 0, 0 },
/* GWLP_HINSTANCE - not useful and not consistent between Windows versions */
{ GWLP_WNDPROC, 0, ERROR_ACCESS_DENIED },
{ DWLP_MSGRESULT, 0, ERROR_INVALID_INDEX }
};
DWORD_PTR result;
int i;
for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
{
SetLastError( 0xdeadbeef );
result = GetWindowLongPtrW( desktop, tests[i].offset );
ok( result == tests[i].expect, "offset %d, got %08lx expect %08lx\n",
tests[i].offset, result, tests[i].expect );
if (tests[i].error)
ok( GetLastError() == tests[i].error, "offset %d: error %d expect %d\n",
tests[i].offset, GetLastError(), tests[i].error );
else
ok( GetLastError() == 0xdeadbeef, "offset %d: error %d expect unchanged\n",
tests[i].offset, GetLastError() );
}
}
START_TEST(win) START_TEST(win)
{ {
char **argv; char **argv;
@ -9714,6 +9787,7 @@ START_TEST(win)
test_winproc_handles(argv[0]); test_winproc_handles(argv[0]);
test_deferwindowpos(); test_deferwindowpos();
test_LockWindowUpdate(hwndMain); test_LockWindowUpdate(hwndMain);
test_desktop();
/* add the tests above this line */ /* add the tests above this line */
if (hhook) UnhookWindowsHookEx(hhook); if (hhook) UnhookWindowsHookEx(hhook);

View File

@ -2242,7 +2242,29 @@ static LONG_PTR WIN_GetWindowLong( HWND hwnd, INT offset, UINT size, BOOL unicod
return 0; return 0;
} }
if (wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) if (wndPtr == WND_DESKTOP)
{
switch (offset)
{
case GWL_STYLE:
retvalue = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; /* message parent is not visible */
if (WIN_GetFullHandle( hwnd ) == GetDesktopWindow())
retvalue |= WS_VISIBLE;
return retvalue;
case GWL_EXSTYLE:
case GWLP_USERDATA:
case GWLP_ID:
case GWLP_HINSTANCE:
return 0;
case GWLP_WNDPROC:
SetLastError( ERROR_ACCESS_DENIED );
return 0;
}
SetLastError( ERROR_INVALID_INDEX );
return 0;
}
if (wndPtr == WND_OTHER_PROCESS)
{ {
if (offset == GWLP_WNDPROC) if (offset == GWLP_WNDPROC)
{ {