From: Paul Gofman pgofman@codeweavers.com
--- dlls/user32/tests/win.c | 4 ++-- dlls/win32u/window.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index a788d57328a..85d2c4952ee 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -13707,14 +13707,14 @@ static void test_startupinfo_showwindow_proc( int test_id ) && (!test->show_affected || sa.wShowWindow != SW_HIDE); bval = !!IsWindowVisible( hwnd );
- todo_wine_if((test->show_affected && sa.wShowWindow == SW_HIDE) || test->cmd_show == SW_FORCEMINIMIZE) + todo_wine_if(test->cmd_show == SW_FORCEMINIMIZE) ok( bval == expected, "got %d, expected %d.\n", bval, expected );
/* After default args were used once SW_SHOWDEFAULT doesn't use startupinfo. */ ShowWindow( hwnd, SW_SHOWDEFAULT ); bval = !!IsWindowVisible( hwnd ); expected = test->counted_as_first || sa.wShowWindow != SW_HIDE; - todo_wine_if(!test->counted_as_first && sa.wShowWindow == SW_HIDE) ok( bval == expected, "got %d, expected %d.\n", bval, expected ); + ok( bval == expected, "got %d, expected %d.\n", bval, expected ); DestroyWindow( hwnd ); pump_messages();
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index a82462e44e4..5cb7b9f4d2d 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -4515,6 +4515,7 @@ void update_window_state( HWND hwnd ) */ static BOOL show_window( HWND hwnd, INT cmd ) { + static volatile LONG first_window = 1; WND *win; HWND parent; DWORD style = get_window_long( hwnd, GWL_STYLE ), new_style; @@ -4527,6 +4528,19 @@ static BOOL show_window( HWND hwnd, INT cmd )
context = set_thread_dpi_awareness_context( get_window_dpi_awareness_context( hwnd ));
+ if ((!(style & (WS_POPUP | WS_CHILD)) + || ((style & (WS_POPUP | WS_CHILD | WS_CAPTION)) == (WS_POPUP | WS_CAPTION))) + && InterlockedExchange( &first_window, 0 )) + { + RTL_USER_PROCESS_PARAMETERS *params = NtCurrentTeb()->Peb->ProcessParameters; + + if (params->dwFlags & STARTF_USESHOWWINDOW && (cmd == SW_SHOW || cmd == SW_SHOWNORMAL || cmd == SW_SHOWDEFAULT)) + { + cmd = params->wShowWindow; + TRACE( "hwnd=%p, using cmd %d from startup info.\n", hwnd, cmd ); + } + } + switch(cmd) { case SW_HIDE: