From 5a9512434952ee8ada01945d6f53753d6a6fac37 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 15 Jul 2007 03:30:03 +0000 Subject: [PATCH] - fix IntValidateParent - validate Parent windows on moving pixels (both was fine earlier, but has been messed up recently) - move sending of WM_SIZE and WM_MOVE from co_WinPosShowWindow to co_WinPosSetWindowPos co_WinPosSetWindowPos: - instantly erase when drawing windows or exposing region - Invalidate child windows on BeginPaint This should fix most window redrawing bugs and also (hopefully) speed up the gui (less redrawing). svn path=/trunk/; revision=27672 --- .../subsystems/win32/win32k/ntuser/painting.c | 21 +++-- reactos/subsystems/win32/win32k/ntuser/vis.c | 2 +- .../subsystems/win32/win32k/ntuser/winpos.c | 76 +++++++++---------- 3 files changed, 52 insertions(+), 47 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index 1082cc67d1b..1ff4516a936 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -82,13 +82,10 @@ IntIntersectWithParents(PWINDOW_OBJECT Child, PRECT WindowRect) } BOOL FASTCALL -IntValidateParent(PWINDOW_OBJECT Child, BOOL Recurse) +IntValidateParent(PWINDOW_OBJECT Child, HRGN hValidateRgn, BOOL Recurse) { PWINDOW_OBJECT ParentWindow = Child->Parent; - while (ParentWindow && ParentWindow->Style & WS_CHILD) - ParentWindow = ParentWindow->Parent; - while (ParentWindow) { if (ParentWindow->Style & WS_CLIPCHILDREN) @@ -99,7 +96,7 @@ IntValidateParent(PWINDOW_OBJECT Child, BOOL Recurse) if (Recurse) return FALSE; - IntInvalidateWindows(ParentWindow, Child->UpdateRegion, + IntInvalidateWindows(ParentWindow, hValidateRgn, RDW_VALIDATE | RDW_NOCHILDREN); } @@ -243,7 +240,7 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse) { if (Window->UpdateRegion) { - if (!IntValidateParent(Window, Recurse)) + if (!IntValidateParent(Window, Window->UpdateRegion, Recurse)) return; } @@ -813,6 +810,7 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs) IntGetClientRect(Window, &Ps.rcPaint); } GDIOBJ_SetOwnership(GdiHandleTable, Window->UpdateRegion, PsGetCurrentProcess()); + /* The region is part of the dc now and belongs to the process! */ Window->UpdateRegion = NULL; } else @@ -834,6 +832,17 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs) { Ps.fErase = FALSE; } + if (Window->UpdateRegion) + { + if (!(Window->Style & WS_CLIPCHILDREN)) + { + PWINDOW_OBJECT Child; + for (Child = Window->FirstChild; Child; Child = Child->NextSibling) + { + IntInvalidateWindows(Child, Window->UpdateRegion, RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); + } + } + } Status = MmCopyToCaller(UnsafePs, &Ps, sizeof(PAINTSTRUCT)); if (! NT_SUCCESS(Status)) diff --git a/reactos/subsystems/win32/win32k/ntuser/vis.c b/reactos/subsystems/win32/win32k/ntuser/vis.c index 99aae6b2f5f..51af3987ef7 100644 --- a/reactos/subsystems/win32/win32k/ntuser/vis.c +++ b/reactos/subsystems/win32/win32k/ntuser/vis.c @@ -167,7 +167,7 @@ co_VIS_WindowLayoutChanged( UserRefObjectCo(Parent, &Ref); co_UserRedrawWindow(Parent, NULL, Temp, - RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | + RDW_FRAME | RDW_ERASE | RDW_ERASENOW | RDW_INVALIDATE | RDW_ALLCHILDREN); UserDerefObjectCo(Parent); } diff --git a/reactos/subsystems/win32/win32k/ntuser/winpos.c b/reactos/subsystems/win32/win32k/ntuser/winpos.c index 1da51e50269..0c7bbb074e8 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winpos.c +++ b/reactos/subsystems/win32/win32k/ntuser/winpos.c @@ -969,7 +969,7 @@ co_WinPosSetWindowPos( } WvrFlags = co_WinPosDoNCCALCSize(Window, &WinPos, &NewWindowRect, &NewClientRect); - + //DPRINT1("co_WinPosDoNCCALCSize"); /* Relink windows. (also take into account shell window in hwndShellWindow) */ @@ -1197,6 +1197,7 @@ co_WinPosSetWindowPos( CopyRect.left + (OldWindowRect.left - NewWindowRect.left), CopyRect.top + (OldWindowRect.top - NewWindowRect.top), SRCCOPY, 0, 0); UserReleaseDC(Window, Dc, FALSE); + IntValidateParent(Window, CopyRgn, FALSE); NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top); } else if(VisRgn) @@ -1223,14 +1224,6 @@ co_WinPosSetWindowPos( } if (RgnType != ERROR && RgnType != NULLREGION) { - /* old code - NtGdiOffsetRgn(DirtyRgn, Window->WindowRect.left, Window->WindowRect.top); - IntInvalidateWindows(Window, DirtyRgn, - RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); - } - NtGdiDeleteObject(DirtyRgn); - */ - PWINDOW_OBJECT Parent = Window->Parent; NtGdiOffsetRgn(DirtyRgn, @@ -1241,13 +1234,16 @@ co_WinPosSetWindowPos( !(Parent->Style & WS_CLIPCHILDREN)) { IntInvalidateWindows(Parent, DirtyRgn, - RDW_ERASE | RDW_INVALIDATE); - co_IntPaintWindows(Parent, RDW_ERASENOW, FALSE); + RDW_ERASE | RDW_INVALIDATE | RDW_NOCHILDREN); + co_IntPaintWindows(Parent, RDW_ERASENOW | RDW_NOCHILDREN, FALSE); + IntInvalidateWindows(Window, DirtyRgn, + RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); } else { - IntInvalidateWindows(Window, DirtyRgn, - RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); + IntInvalidateWindows(Window, DirtyRgn, + RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); + co_IntPaintWindows(Window, RDW_ERASENOW, FALSE); } } NtGdiDeleteObject(DirtyRgn); @@ -1299,6 +1295,33 @@ co_WinPosSetWindowPos( if ((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE) co_IntPostOrSendMessage(WinPos.hwnd, WM_WINDOWPOSCHANGED, 0, (LPARAM) &WinPos); + if ((Window->Flags & WINDOWOBJECT_NEED_SIZE) && + !(Window->Status & WINDOWSTATUS_DESTROYING)) + { + WPARAM wParam = SIZE_RESTORED; + + Window->Flags &= ~WINDOWOBJECT_NEED_SIZE; + if (Window->Style & WS_MAXIMIZE) + { + wParam = SIZE_MAXIMIZED; + } + else if (Window->Style & WS_MINIMIZE) + { + wParam = SIZE_MINIMIZED; + } + + co_IntSendMessage(Window->hSelf, WM_SIZE, wParam, + MAKELONG(Window->ClientRect.right - + Window->ClientRect.left, + Window->ClientRect.bottom - + Window->ClientRect.top)); + co_IntSendMessage(Window->hSelf, WM_MOVE, 0, + MAKELONG(Window->ClientRect.left, + Window->ClientRect.top)); + IntEngWindowChanged(Window, WOC_RGN_CLIENT); + + } + return TRUE; } @@ -1467,33 +1490,6 @@ co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) /* FIXME: Check for window destruction. */ - if ((Window->Flags & WINDOWOBJECT_NEED_SIZE) && - !(Window->Status & WINDOWSTATUS_DESTROYING)) - { - WPARAM wParam = SIZE_RESTORED; - - Window->Flags &= ~WINDOWOBJECT_NEED_SIZE; - if (Window->Style & WS_MAXIMIZE) - { - wParam = SIZE_MAXIMIZED; - } - else if (Window->Style & WS_MINIMIZE) - { - wParam = SIZE_MINIMIZED; - } - - co_IntSendMessage(Window->hSelf, WM_SIZE, wParam, - MAKELONG(Window->ClientRect.right - - Window->ClientRect.left, - Window->ClientRect.bottom - - Window->ClientRect.top)); - co_IntSendMessage(Window->hSelf, WM_MOVE, 0, - MAKELONG(Window->ClientRect.left, - Window->ClientRect.top)); - IntEngWindowChanged(Window, WOC_RGN_CLIENT); - - } - /* Activate the window if activation is not requested and the window is not minimized */ /* if (!(Swp & (SWP_NOACTIVATE | SWP_HIDEWINDOW)) && !(Window->Style & WS_MINIMIZE))