user32: Return correct showCmd from GetWindowPlacement() for other process window.

Fixes black screen in SWTOR after window minimize / maximize or
switching window in full screen mode.

Signed-off-by: Paul Gofman <gofmanp@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Paul Gofman 2019-08-26 13:57:00 +03:00 committed by Alexandre Julliard
parent 9dbe886e3f
commit 480bae108c
2 changed files with 136 additions and 9 deletions

View File

@ -11733,6 +11733,114 @@ static void test_arrange_iconic_windows(void)
ok(ret, "failed to restore minimized metrics, error %u\n", GetLastError());
}
static void other_process_proc(HWND hwnd)
{
HANDLE window_ready_event, test_done_event;
WINDOWPLACEMENT wp;
DWORD ret;
window_ready_event = OpenEventA(EVENT_ALL_ACCESS, FALSE, "test_opw_window");
ok(!!window_ready_event, "OpenEvent failed.\n");
test_done_event = OpenEventA(EVENT_ALL_ACCESS, FALSE, "test_opw_test");
ok(!!test_done_event, "OpenEvent failed.\n");
/* SW_SHOW */
ret = WaitForSingleObject(window_ready_event, 5000);
ok(ret == WAIT_OBJECT_0, "Unexpected ret %x.\n", ret);
ret = GetWindowPlacement(hwnd, &wp);
ok(ret, "Unexpected ret %#x.\n", ret);
ok(wp.showCmd == SW_SHOWNORMAL, "Unexpected showCmd %#x.\n", wp.showCmd);
ok(!wp.flags, "Unexpected flags %#x.\n", wp.flags);
SetEvent(test_done_event);
/* SW_SHOWMAXIMIZED */
ret = WaitForSingleObject(window_ready_event, 5000);
ok(ret == WAIT_OBJECT_0, "Unexpected ret %x.\n", ret);
ret = GetWindowPlacement(hwnd, &wp);
ok(ret, "Unexpected ret %#x.\n", ret);
ok(wp.showCmd == SW_SHOWMAXIMIZED, "Unexpected showCmd %#x.\n", wp.showCmd);
todo_wine ok(wp.flags == WPF_RESTORETOMAXIMIZED, "Unexpected flags %#x.\n", wp.flags);
SetEvent(test_done_event);
/* SW_SHOWMINIMIZED */
ret = WaitForSingleObject(window_ready_event, 5000);
ok(ret == WAIT_OBJECT_0, "Unexpected ret %x.\n", ret);
ret = GetWindowPlacement(hwnd, &wp);
ok(ret, "Unexpected ret %#x.\n", ret);
ok(wp.showCmd == SW_SHOWMINIMIZED, "Unexpected showCmd %#x.\n", wp.showCmd);
todo_wine ok(wp.flags == WPF_RESTORETOMAXIMIZED, "Unexpected flags %#x.\n", wp.flags);
SetEvent(test_done_event);
/* SW_RESTORE */
ret = WaitForSingleObject(window_ready_event, 5000);
ok(ret == WAIT_OBJECT_0, "Unexpected ret %x.\n", ret);
ret = GetWindowPlacement(hwnd, &wp);
ok(ret, "Unexpected ret %#x.\n", ret);
ok(wp.showCmd == SW_SHOWMAXIMIZED, "Unexpected showCmd %#x.\n", wp.showCmd);
todo_wine ok(wp.flags == WPF_RESTORETOMAXIMIZED, "Unexpected flags %#x.\n", wp.flags);
SetEvent(test_done_event);
CloseHandle(window_ready_event);
CloseHandle(test_done_event);
}
static void test_other_process_window(const char *argv0)
{
HANDLE window_ready_event, test_done_event;
PROCESS_INFORMATION info;
STARTUPINFOA startup;
char cmd[MAX_PATH];
HWND hwnd;
BOOL ret;
hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP,
100, 100, 100, 100, 0, 0, NULL, NULL);
ok(!!hwnd, "CreateWindowEx failed.\n");
window_ready_event = CreateEventA(NULL, FALSE, FALSE, "test_opw_window");
ok(!!window_ready_event, "CreateEvent failed.\n");
test_done_event = CreateEventA(NULL, FALSE, FALSE, "test_opw_test");
ok(!!test_done_event, "CreateEvent failed.\n");
sprintf(cmd, "%s win test_other_process_window %p", argv0, hwnd);
memset(&startup, 0, sizeof(startup));
startup.cb = sizeof(startup);
ok(CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL,
&startup, &info), "CreateProcess failed.\n");
ret = ShowWindow(hwnd, SW_SHOW);
ok(!ret, "Unexpected ret %#x.\n", ret);
SetEvent(window_ready_event);
ret = WaitForSingleObject(test_done_event, 5000);
ok(ret == WAIT_OBJECT_0, "Unexpected ret %x.\n", ret);
ret = ShowWindow(hwnd, SW_SHOWMAXIMIZED);
ok(ret, "Unexpected ret %#x.\n", ret);
SetEvent(window_ready_event);
ret = WaitForSingleObject(test_done_event, 5000);
ok(ret == WAIT_OBJECT_0, "Unexpected ret %x.\n", ret);
ret = ShowWindow(hwnd, SW_SHOWMINIMIZED);
ok(ret, "Unexpected ret %#x.\n", ret);
SetEvent(window_ready_event);
ret = WaitForSingleObject(test_done_event, 5000);
ok(ret == WAIT_OBJECT_0, "Unexpected ret %x.\n", ret);
ret = ShowWindow(hwnd, SW_RESTORE);
ok(ret, "Unexpected ret %#x.\n", ret);
SetEvent(window_ready_event);
ret = WaitForSingleObject(test_done_event, 5000);
ok(ret == WAIT_OBJECT_0, "Unexpected ret %x.\n", ret);
winetest_wait_child_process(info.hProcess);
CloseHandle(window_ready_event);
CloseHandle(test_done_event);
CloseHandle(info.hProcess);
CloseHandle(info.hThread);
DestroyWindow(hwnd);
}
START_TEST(win)
{
char **argv;
@ -11762,14 +11870,22 @@ START_TEST(win)
pAdjustWindowRectExForDpi = (void *)GetProcAddress( user32, "AdjustWindowRectExForDpi" );
pSystemParametersInfoForDpi = (void *)GetProcAddress( user32, "SystemParametersInfoForDpi" );
if (argc==4 && !strcmp(argv[2], "create_children"))
if (argc == 4)
{
HWND hwnd;
sscanf(argv[3], "%p", &hwnd);
if (!strcmp(argv[2], "create_children"))
{
window_from_point_proc(hwnd);
return;
}
else if (!strcmp(argv[2], "test_other_process_window"))
{
other_process_proc(hwnd);
return;
}
}
if (argc == 3 && !strcmp(argv[2], "winproc_limit"))
{
@ -11894,6 +12010,7 @@ START_TEST(win)
test_IsWindowEnabled();
test_window_placement();
test_arrange_iconic_windows();
test_other_process_window(argv[0]);
/* add the tests above this line */
if (hhook) UnhookWindowsHookEx(hhook);

View File

@ -1280,17 +1280,27 @@ BOOL WINAPI GetWindowPlacement( HWND hwnd, WINDOWPLACEMENT *wndpl )
}
if (pWnd == WND_OTHER_PROCESS)
{
if (!IsWindow( hwnd )) return FALSE;
FIXME( "not supported on other process window %p\n", hwnd );
/* provide some dummy information */
RECT normal_position;
DWORD style;
if (!GetWindowRect(hwnd, &normal_position))
return FALSE;
FIXME("not fully supported on other process window %p.\n", hwnd);
wndpl->length = sizeof(*wndpl);
wndpl->showCmd = SW_SHOWNORMAL;
style = GetWindowLongW(hwnd, GWL_STYLE);
if (style & WS_MINIMIZE)
wndpl->showCmd = SW_SHOWMINIMIZED;
else
wndpl->showCmd = (style & WS_MAXIMIZE) ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL;
/* provide some dummy information */
wndpl->flags = 0;
wndpl->ptMinPosition.x = -1;
wndpl->ptMinPosition.y = -1;
wndpl->ptMaxPosition.x = -1;
wndpl->ptMaxPosition.y = -1;
GetWindowRect( hwnd, &wndpl->rcNormalPosition );
wndpl->rcNormalPosition = normal_position;
return TRUE;
}