Author: jimtabor Date: Mon May 26 04:36:58 2014 New Revision: 63457
URL: http://svn.reactos.org/svn/reactos?rev=63457&view=rev Log: [Win32k] - Make minimizing windows in MDI application usable, more fixing is needed. ReactOS suffers from wine poisoning. Need more Vodka! See wine Bug 1719.
Modified: trunk/reactos/win32ss/user/ntuser/winpos.c
Modified: trunk/reactos/win32ss/user/ntuser/winpos.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/winpos.... ============================================================================== --- trunk/reactos/win32ss/user/ntuser/winpos.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/winpos.c [iso-8859-1] Mon May 26 04:36:58 2014 @@ -362,134 +362,6 @@ if (WndTo) UserDerefObjectCo(WndTo); }
-UINT -FASTCALL -co_WinPosArrangeIconicWindows(PWND parent) -{ - RECTL rectParent; - INT i, x, y, xspacing, yspacing, sx, sy; - HWND *List = IntWinListChildren(parent); - - ASSERT_REFS_CO(parent); - - /* Check if we found any children */ - if(List == NULL) - { - return 0; - } - - IntGetClientRect( parent, &rectParent ); - // FIXME: Support gspv.mm.iArrange. - x = rectParent.left; - y = rectParent.bottom; - - xspacing = (UserGetSystemMetrics(SM_CXMINSPACING)/2)+UserGetSystemMetrics(SM_CXBORDER); - yspacing = (UserGetSystemMetrics(SM_CYMINSPACING)/2)+UserGetSystemMetrics(SM_CYBORDER); - - //ERR("X:%d Y:%d XS:%d YS:%d\n",x,y,xspacing,yspacing); - - for(i = 0; List[i]; i++) - { - PWND Child; - - if (!(Child = ValidateHwndNoErr(List[i]))) - continue; - - if((Child->style & WS_MINIMIZE) != 0 ) - { - USER_REFERENCE_ENTRY Ref; - UserRefObjectCo(Child, &Ref); - - sx = x + UserGetSystemMetrics(SM_CXBORDER); - sy = y - yspacing - UserGetSystemMetrics(SM_CYBORDER); - - co_WinPosSetWindowPos( Child, 0, sx, sy, 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE ); - - Child->InternalPos.IconPos.x = sx; - Child->InternalPos.IconPos.y = sy; - Child->InternalPos.flags |= WPF_MININIT; - Child->InternalPos.flags &= ~WPF_SETMINPOSITION; - - UserDerefObjectCo(Child); - - if (x <= (rectParent.right - UserGetSystemMetrics(SM_CXMINSPACING))) - x += xspacing; - else - { - x = rectParent.left; - y -= yspacing; - } - //ERR("X:%d Y:%d\n",x,y); - } - } - ExFreePoolWithTag(List, USERTAG_WINDOWLIST); - return yspacing; -} - -static VOID FASTCALL -WinPosFindIconPos(PWND Window, POINT *Pos) -{ - RECT rectParent; - PWND pwndChild, pwndParent; - int x, y, xspacing, yspacing; - - pwndParent = Window->spwndParent; - if (pwndParent == UserGetDesktopWindow()) - { - //ERR("Parent is Desktop, Min off screen!\n"); - /* ReactOS doesn't support iconic minimize to desktop */ - Pos->x = Pos->y = -32000; - Window->InternalPos.flags |= WPF_MININIT; - Window->InternalPos.IconPos.x = Pos->x; - Window->InternalPos.IconPos.y = Pos->y; - return; - } - - IntGetClientRect( pwndParent, &rectParent ); - // FIXME: Support gspv.mm.iArrange. - x = rectParent.left; - y = rectParent.bottom; - - xspacing = (UserGetSystemMetrics(SM_CXMINSPACING)/2)+UserGetSystemMetrics(SM_CXBORDER); - yspacing = (UserGetSystemMetrics(SM_CYMINSPACING)/2)+UserGetSystemMetrics(SM_CYBORDER); - - //ERR("X:%d Y:%d XS:%d YS:%d\n",Pos->x,Pos->y,xspacing,yspacing); - - // Set to default position when minimized. - Pos->x = x + UserGetSystemMetrics(SM_CXBORDER); - Pos->y = y - yspacing - UserGetSystemMetrics(SM_CYBORDER); - - for (pwndChild = pwndParent->spwndChild; pwndChild; pwndChild = pwndChild->spwndNext) - { - if (pwndChild == Window) continue; - - if (pwndChild->style & WS_VISIBLE) - { - //ERR("Loop!\n"); - continue; - } - //ERR("Pos Child X %d Y %d!\n", pwndChild->InternalPos.IconPos.x, pwndChild->InternalPos.IconPos.y); - if ( pwndChild->InternalPos.IconPos.x == Pos->x && - pwndChild->InternalPos.IconPos.y == Pos->y ) - { - if (x <= rectParent.right - UserGetSystemMetrics(SM_CXMINSPACING)) - x += xspacing; - else - { - x = rectParent.left; - y -= yspacing; - } - Pos->x = x + UserGetSystemMetrics(SM_CXBORDER); - Pos->y = y - yspacing - UserGetSystemMetrics(SM_CYBORDER); - } - } - Window->InternalPos.IconPos.x = Pos->x; - Window->InternalPos.IconPos.y = Pos->y; - Window->InternalPos.flags |= WPF_MININIT; - //ERR("Position is set! X:%d Y:%d\n",Pos->x,Pos->y); - return; -}
VOID FASTCALL WinPosInitInternalPos(PWND Wnd, RECTL *RestoreRect) @@ -738,6 +610,118 @@ Wnd->InternalPos.flags |= WPF_RESTORETOMAXIMIZED; } return TRUE; +} + +UINT +FASTCALL +co_WinPosArrangeIconicWindows(PWND parent) +{ + RECTL rectParent; + PWND Child; + INT x, y, xspacing, yspacing, sx, sy; + + ASSERT_REFS_CO(parent); + + IntGetClientRect( parent, &rectParent ); + // FIXME: Support gspv.mm.iArrange. + x = rectParent.left; + y = rectParent.bottom; + + xspacing = (UserGetSystemMetrics(SM_CXMINSPACING)/2)+UserGetSystemMetrics(SM_CXBORDER); + yspacing = (UserGetSystemMetrics(SM_CYMINSPACING)/2)+UserGetSystemMetrics(SM_CYBORDER); + + Child = parent->spwndChild; + while(Child) + { + if((Child->style & WS_MINIMIZE) != 0 ) + { + USER_REFERENCE_ENTRY Ref; + UserRefObjectCo(Child, &Ref); + + sx = x + UserGetSystemMetrics(SM_CXBORDER); + sy = y - yspacing - UserGetSystemMetrics(SM_CYBORDER); + + Child->InternalPos.IconPos.x = sx; + Child->InternalPos.IconPos.y = sy; + Child->InternalPos.flags |= WPF_MININIT; + + co_WinPosSetWindowPos( Child, 0, sx, sy, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_ASYNCWINDOWPOS); + + UserDerefObjectCo(Child); + + if (x <= rectParent.right - xspacing) + x += xspacing; + else + { + x = rectParent.left; + y -= yspacing; + } + } + Child = Child->spwndNext; + } + return yspacing; +} + +static VOID FASTCALL +WinPosFindIconPos(PWND Window, POINT *Pos) +{ + RECT rectParent; + PWND pwndChild, pwndParent; + int x, y, xspacing, yspacing; + + pwndParent = Window->spwndParent; + if (pwndParent == UserGetDesktopWindow()) + { + //ERR("Parent is Desktop, Min off screen!\n"); + /* ReactOS doesn't support iconic minimize to desktop */ + Pos->x = Pos->y = -32000; + Window->InternalPos.flags |= WPF_MININIT; + Window->InternalPos.IconPos.x = Pos->x; + Window->InternalPos.IconPos.y = Pos->y; + return; + } + + IntGetClientRect( pwndParent, &rectParent ); + // FIXME: Support gspv.mm.iArrange. + x = rectParent.left; + y = rectParent.bottom; + + xspacing = (UserGetSystemMetrics(SM_CXMINSPACING)/2)+UserGetSystemMetrics(SM_CXBORDER); + yspacing = (UserGetSystemMetrics(SM_CYMINSPACING)/2)+UserGetSystemMetrics(SM_CYBORDER); + + // Set to default position when minimized. + Pos->x = x + UserGetSystemMetrics(SM_CXBORDER); + Pos->y = y - yspacing - UserGetSystemMetrics(SM_CYBORDER); + + for (pwndChild = pwndParent->spwndChild; pwndChild; pwndChild = pwndChild->spwndNext) + { + if (pwndChild == Window) continue; + + if ((pwndChild->style & (WS_VISIBLE|WS_MINIMIZE)) != (WS_VISIBLE|WS_MINIMIZE) ) + { + continue; + } + + if ( pwndChild->InternalPos.IconPos.x != Pos->x && pwndChild->InternalPos.IconPos.y != Pos->y ) + { + break; + } + if (x <= rectParent.right - xspacing) + x += xspacing; + else + { + x = rectParent.left; + y -= yspacing; + } + Pos->x = x + UserGetSystemMetrics(SM_CXBORDER); + Pos->y = y - yspacing - UserGetSystemMetrics(SM_CYBORDER); + } + + Window->InternalPos.IconPos.x = Pos->x; + Window->InternalPos.IconPos.y = Pos->y; + Window->InternalPos.flags |= WPF_MININIT; + TRACE("Position is set! X:%d Y:%d\n",Pos->x,Pos->y); + return; }
UINT FASTCALL @@ -793,8 +777,7 @@
old_style = IntSetStyle( Wnd, WS_MINIMIZE, WS_MAXIMIZE );
- co_UserRedrawWindow(Wnd, NULL, 0, RDW_VALIDATE | RDW_NOERASE | - RDW_NOINTERNALPAINT); + co_UserRedrawWindow(Wnd, NULL, 0, RDW_VALIDATE | RDW_NOERASE | RDW_NOINTERNALPAINT);
if (!(Wnd->InternalPos.flags & WPF_SETMINPOSITION)) Wnd->InternalPos.flags &= ~WPF_MININIT; @@ -808,10 +791,8 @@ UserGetSystemMetrics(SM_CYMINIMIZED)); */ RECTL_vSetRect(NewPos, wpl.ptMinPosition.x, wpl.ptMinPosition.y, -// wpl.ptMinPosition.x + UserGetSystemMetrics(SM_CXMINIMIZED), -// wpl.ptMinPosition.y + UserGetSystemMetrics(SM_CYMINIMIZED)); - UserGetSystemMetrics(SM_CXMINIMIZED), - UserGetSystemMetrics(SM_CYMINIMIZED)); + wpl.ptMinPosition.x + UserGetSystemMetrics(SM_CXMINIMIZED), + wpl.ptMinPosition.y + UserGetSystemMetrics(SM_CYMINIMIZED)); SwpFlags |= SWP_NOCOPYBITS; break; } @@ -849,6 +830,7 @@ old_style = IntSetStyle( Wnd, 0, WS_MINIMIZE | WS_MAXIMIZE ); if (old_style & WS_MINIMIZE) { + if (Wnd->InternalPos.flags & WPF_RESTORETOMAXIMIZED) { co_WinPosGetMinMaxInfo(Wnd, &Size, &wpl.ptMaxPosition, NULL, NULL); @@ -1302,8 +1284,8 @@ { if (Window->style & WS_MINIMIZE) { - WindowRect->right = WindowRect->left + UserGetSystemMetrics(SM_CXICON); - WindowRect->bottom = WindowRect->top + UserGetSystemMetrics(SM_CYICON); + WindowRect->right = WindowRect->left + (UserGetSystemMetrics(SM_CXMINSPACING)/2)+UserGetSystemMetrics(SM_CXBORDER); + WindowRect->bottom = WindowRect->top + (UserGetSystemMetrics(SM_CYMINSPACING)/2)+UserGetSystemMetrics(SM_CYBORDER); } else { @@ -2181,10 +2163,10 @@ LONG style; PWND Parent; PTHREADINFO pti; - // HRGN VisibleRgn; - //ERR("co_WinPosShowWindow START\n"); + //HRGN VisibleRgn; BOOL ShowOwned = FALSE; ASSERT_REFS_CO(Wnd); + //ERR("co_WinPosShowWindow START\n");
pti = PsGetCurrentThreadWin32Thread(); WasVisible = (Wnd->style & WS_VISIBLE) != 0;