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:
parent
1bb9db43e1
commit
e883d0ec60
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue