diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c index 78749a9..571b4b2 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -964,7 +964,7 @@ UINT WINPOS_MinMaximize( HWND hwnd, UINT cmd, LPRECT rect ) static BOOL show_window( HWND hwnd, INT cmd ) { WND *wndPtr; - HWND parent; + HWND parent = GetAncestor( hwnd, GA_PARENT ); LONG style = GetWindowLongW( hwnd, GWL_STYLE ); BOOL wasVisible = (style & WS_VISIBLE) != 0; BOOL showFlag = TRUE; @@ -983,6 +983,12 @@ static BOOL show_window( HWND hwnd, INT cmd ) break; case SW_SHOWMINNOACTIVE: + swp |= SWP_NOACTIVATE | SWP_NOZORDER | SWP_SHOWWINDOW; + if ( !IsWindowVisible( parent ) ) swp |= SWP_FRAMECHANGED; + swp |= WINPOS_MinMaximize( hwnd, cmd, &newPos ); + if ((style & WS_MINIMIZE) && wasVisible) return TRUE; + break; + case SW_MINIMIZE: case SW_FORCEMINIMIZE: /* FIXME: Does not work if thread is hung. */ swp |= SWP_NOACTIVATE | SWP_NOZORDER; @@ -1034,13 +1040,12 @@ static BOOL show_window( HWND hwnd, INT cmd ) return wasVisible; } - if ((showFlag != wasVisible || cmd == SW_SHOWNA) && cmd != SW_SHOWMAXIMIZED && !(swp & SWP_STATECHANGED)) + if ((showFlag != wasVisible || cmd == SW_SHOWNA) && cmd != SW_SHOWMAXIMIZED && !(swp & SWP_STATECHANGED) && cmd != SW_SHOWMINNOACTIVE) { SendMessageW( hwnd, WM_SHOWWINDOW, showFlag, 0 ); if (!IsWindow( hwnd )) return wasVisible; } - parent = GetAncestor( hwnd, GA_PARENT ); if (parent && !IsWindowVisible( parent ) && !(swp & SWP_STATECHANGED)) { /* if parent is not visible simply toggle WS_VISIBLE and return */ diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index fde23fb..5e3c9b6 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -9489,7 +9489,7 @@ static void test_ShowWindow(void) /* 19 */ { SW_MINIMIZE, TRUE, WS_VISIBLE|WS_MINIMIZE, WmMinimize_1, FALSE }, /* 20 */ { SW_MINIMIZE, TRUE, WS_VISIBLE|WS_MINIMIZE, WmMinMax_3, FALSE }, /* 21 */ { SW_HIDE, TRUE, WS_MINIMIZE, WmHide_2, FALSE }, -/* 22 */ { SW_SHOWMINNOACTIVE, FALSE, WS_VISIBLE|WS_MINIMIZE, WmShowMinNoActivate, TRUE }, +/* 22 */ { SW_SHOWMINNOACTIVE, FALSE, WS_VISIBLE|WS_MINIMIZE, WmShowMinNoActivate, FALSE }, /* 23 */ { SW_SHOWMINNOACTIVE, TRUE, WS_VISIBLE|WS_MINIMIZE, WmMinMax_4, FALSE }, /* 24 */ { SW_HIDE, TRUE, WS_MINIMIZE, WmHide_2, FALSE }, /* 25 */ { SW_HIDE, FALSE, WS_MINIMIZE, WmEmptySeq, FALSE },