Index: winpos.c =================================================================== --- winpos.c (revision 38670) +++ winpos.c (working copy) @@ -1311,13 +1311,14 @@ return Result; } +#define SWP_STATECHANGED 0x8000 BOOLEAN FASTCALL co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) { BOOLEAN WasVisible; UINT Swp = 0; - RECT NewPos; - BOOLEAN ShowFlag; + RECT NewPos = {0, 0, 0, 0}; + BOOLEAN ShowFlag = TRUE; // HRGN VisibleRgn; PWINDOW Wnd; @@ -1328,102 +1329,81 @@ WasVisible = (Wnd->Style & WS_VISIBLE) != 0; + switch (Cmd) { case SW_HIDE: { - if (!WasVisible) - { - return(FALSE); - } + if (!WasVisible) return FALSE; + ShowFlag = FALSE; Swp |= SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE; - if (Window->hSelf != UserGetActiveWindow()) - Swp |= SWP_NOACTIVATE | SWP_NOZORDER; + if (Wnd->Style & WS_CHILD) Swp |= SWP_NOACTIVATE | SWP_NOZORDER; break; } case SW_SHOWMINNOACTIVE: + case SW_MINIMIZE: + case SW_FORCEMINIMIZE: Swp |= SWP_NOACTIVATE | SWP_NOZORDER; /* Fall through. */ case SW_SHOWMINIMIZED: - Swp |= SWP_SHOWWINDOW; - /* Fall through. */ - case SW_MINIMIZE: - { - Swp |= SWP_NOACTIVATE; - if (!(Wnd->Style & WS_MINIMIZE)) - { - Swp |= co_WinPosMinMaximize(Window, SW_MINIMIZE, &NewPos) | - SWP_FRAMECHANGED; - } - else - { - Swp |= SWP_NOSIZE | SWP_NOMOVE; - if (! WasVisible) - { - Swp |= SWP_FRAMECHANGED; - } - } - break; - } + { + Swp |= SWP_SHOWWINDOW | SWP_FRAMECHANGED; + Swp |= co_WinPosMinMaximize(Window, Cmd, &NewPos); + if ((Wnd->Style & WS_MINIMIZE) && WasVisible) return TRUE; + break; + } case SW_SHOWMAXIMIZED: { - Swp |= SWP_SHOWWINDOW; - if (!(Wnd->Style & WS_MAXIMIZE)) - { - Swp |= co_WinPosMinMaximize(Window, SW_MAXIMIZE, &NewPos) | - SWP_FRAMECHANGED; - } - else - { - Swp |= SWP_NOSIZE | SWP_NOMOVE; - if (! WasVisible) - { - Swp |= SWP_FRAMECHANGED; - } - } + if (!WasVisible) Swp |= SWP_SHOWWINDOW; + Swp |= SWP_FRAMECHANGED; + Swp |= co_WinPosMinMaximize(Window, SW_MAXIMIZE, &NewPos); + if (!(Wnd->Style & WS_MAXIMIZE) && WasVisible) return TRUE; break; } case SW_SHOWNA: - Swp |= SWP_NOACTIVATE | SWP_NOZORDER; + { + Swp |= SWP_NOACTIVATE | SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE; + if (Wnd->Style & WS_CHILD) Swp |= SWP_NOZORDER; + break; + } /* Fall through. */ case SW_SHOW: if (WasVisible) return(TRUE); // Nothing to do! Swp |= SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE; - /* Don't activate the topmost window. */ + if (Wnd->Style & WS_CHILD) Swp |= SWP_NOACTIVATE | SWP_NOZORDER; break; case SW_SHOWNOACTIVATE: - //Swp |= SWP_NOZORDER; Swp |= SWP_NOACTIVATE | SWP_NOZORDER; /* Fall through. */ + case SW_RESTORE: case SW_SHOWNORMAL: case SW_SHOWDEFAULT: - case SW_RESTORE: - Swp |= SWP_SHOWWINDOW; + if (!WasVisible) Swp |= SWP_SHOWWINDOW; if (Wnd->Style & (WS_MINIMIZE | WS_MAXIMIZE)) { - Swp |= co_WinPosMinMaximize(Window, SW_RESTORE, &NewPos) | - SWP_FRAMECHANGED; + Swp |= SWP_FRAMECHANGED; + Swp |= co_WinPosMinMaximize(Window, Cmd, &NewPos); } else { + if (WasVisible) return TRUE; Swp |= SWP_NOSIZE | SWP_NOMOVE; - if (! WasVisible) - { - Swp |= SWP_FRAMECHANGED; - } } + if (Wnd->Style & WS_CHILD && !(Swp & SWP_STATECHANGED)) + Swp |= SWP_NOACTIVATE | SWP_NOZORDER; break; + default: + return WasVisible; } - ShowFlag = (Cmd != SW_HIDE); - - if (ShowFlag != WasVisible) + if ((ShowFlag != WasVisible || Cmd == SW_SHOWNA) && Cmd != SW_SHOWMAXIMIZED && !(Swp & SWP_STATECHANGED)) { co_IntSendMessage(Window->hSelf, WM_SHOWWINDOW, ShowFlag, 0); + if (!IntIsWindow(Window->hSelf)) return WasVisible; } /* We can't activate a child window */