win32ss/user/ntuser/painting.c | 3 +- win32ss/user/ntuser/scrollbar.c | 3 -- win32ss/user/ntuser/vis.c | 13 ++++- win32ss/user/ntuser/winpos.c | 110 ++++------------------------------------ 4 files changed, 23 insertions(+), 106 deletions(-) diff --git a/win32ss/user/ntuser/painting.c b/win32ss/user/ntuser/painting.c index e0e4893a4b0..eb64a074c72 100644 --- a/win32ss/user/ntuser/painting.c +++ b/win32ss/user/ntuser/painting.c @@ -299,8 +299,7 @@ IntGetNCUpdateRgn(PWND Window, BOOL Validate) { GreDeleteObject(hRgnWindow); GreDeleteObject(hRgnNonClient); - Window->state &= ~WNDS_UPDATEDIRTY; - return NULL; + return HRGN_WINDOW; } /* diff --git a/win32ss/user/ntuser/scrollbar.c b/win32ss/user/ntuser/scrollbar.c index 9d5e4005dcb..9ce066a6514 100644 --- a/win32ss/user/ntuser/scrollbar.c +++ b/win32ss/user/ntuser/scrollbar.c @@ -856,9 +856,6 @@ co_IntCreateScrollBars(PWND Window) Window->pSBInfo->Vert.posMax = 100; Window->pSBInfo->Horz.posMax = 100; - co_WinPosGetNonClientSize(Window, - &Window->rcWindow, - &Window->rcClient); for(s = SB_HORZ; s <= SB_VERT; s++) { diff --git a/win32ss/user/ntuser/vis.c b/win32ss/user/ntuser/vis.c index 670cc7537b9..61cbdd206e1 100644 --- a/win32ss/user/ntuser/vis.c +++ b/win32ss/user/ntuser/vis.c @@ -165,9 +165,18 @@ co_VIS_WindowLayoutChanged( Wnd->rcWindow.top - Parent->rcClient.top); UserRefObjectCo(Parent, &Ref); - co_UserRedrawWindow(Parent, NULL, TempRgn, - RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | + if (Wnd->style & WS_VISIBLE) + { + co_UserRedrawWindow(Parent, NULL, TempRgn, + RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW | RDW_ALLCHILDREN); + } + else + { + co_UserRedrawWindow(Parent, NULL, TempRgn, + RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW | + RDW_ALLCHILDREN); + } UserDerefObjectCo(Parent); REGION_Delete(TempRgn); diff --git a/win32ss/user/ntuser/winpos.c b/win32ss/user/ntuser/winpos.c index eba590fad13..8d8d198f772 100644 --- a/win32ss/user/ntuser/winpos.c +++ b/win32ss/user/ntuser/winpos.c @@ -1653,68 +1653,6 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWND Wnd) return TRUE; } -// -// This is a NC HACK fix for forcing painting of non client areas. -// Further troubleshooting in painting.c is required to remove this hack. -// See CORE-7166 & CORE-15934 -// -VOID -ForceNCPaintErase(PWND Wnd, HRGN hRgn, PREGION pRgn) -{ - HDC hDC; - PREGION RgnUpdate; - UINT RgnType; - BOOL Create = FALSE; - - if (Wnd->hrgnUpdate == NULL) - { - Wnd->hrgnUpdate = NtGdiCreateRectRgn(0, 0, 0, 0); - IntGdiSetRegionOwner(Wnd->hrgnUpdate, GDI_OBJ_HMGR_PUBLIC); - Create = TRUE; - } - - if (Wnd->hrgnUpdate != HRGN_WINDOW) - { - RgnUpdate = REGION_LockRgn(Wnd->hrgnUpdate); - if (RgnUpdate) - { - RgnType = IntGdiCombineRgn(RgnUpdate, RgnUpdate, pRgn, RGN_OR); - REGION_UnlockRgn(RgnUpdate); - if (RgnType == NULLREGION) - { - IntGdiSetRegionOwner(Wnd->hrgnUpdate, GDI_OBJ_HMGR_POWNED); - GreDeleteObject(Wnd->hrgnUpdate); - Wnd->hrgnUpdate = NULL; - Create = FALSE; - } - } - } - - IntSendNCPaint( Wnd, hRgn ); // Region can be deleted by the application. - - if (Wnd->hrgnUpdate) - { - hDC = UserGetDCEx( Wnd, - Wnd->hrgnUpdate, - DCX_CACHE|DCX_USESTYLE|DCX_INTERSECTRGN|DCX_KEEPCLIPRGN); - - Wnd->state &= ~(WNDS_SENDERASEBACKGROUND|WNDS_ERASEBACKGROUND); - // Kill the loop, so Clear before we send. - if (!co_IntSendMessage(UserHMGetHandle(Wnd), WM_ERASEBKGND, (WPARAM)hDC, 0)) - { - Wnd->state |= (WNDS_SENDERASEBACKGROUND|WNDS_ERASEBACKGROUND); - } - UserReleaseDC(Wnd, hDC, FALSE); - } - - if (Create) - { - IntGdiSetRegionOwner(Wnd->hrgnUpdate, GDI_OBJ_HMGR_POWNED); - GreDeleteObject(Wnd->hrgnUpdate); - Wnd->hrgnUpdate = NULL; - } -} - /* x and y are always screen relative */ BOOLEAN FASTCALL co_WinPosSetWindowPos( @@ -2105,42 +2043,16 @@ co_WinPosSetWindowPos( } IntInvalidateWindows(Window, DirtyRgn, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); } - else if ( RgnType != ERROR && RgnType == NULLREGION ) // Must be the same. See CORE-7166 & CORE-15934, NC HACK fix. + else if ( RgnType != ERROR && RgnType == NULLREGION ) // Must be the same. See CORE-7166 & CORE-15934, { if ( !PosChanged && !(WinPos.flags & SWP_DEFERERASE) && (WinPos.flags & SWP_FRAMECHANGED) ) { - PWND pwnd = Window; - PWND Parent = Window->spwndParent; - - if ( pwnd->style & WS_CHILD ) // Fix ProgMan menu bar drawing. - { - TRACE("SWP_FRAMECHANGED win child %p Parent %p\n",pwnd,Parent); - pwnd = Parent ? Parent : pwnd; - } - - if ( !(pwnd->style & WS_CHILD) ) + if ((Window->style & (WS_BORDER | WS_THICKFRAME | WS_DLGFRAME) || + (Window->ExStyle & (WS_EX_CLIENTEDGE | WS_EX_DLGMODALFRAME | WS_EX_STATICEDGE)))) { - /* - * Check if we have these specific windows style bits set/reset. - * FIXME: There may be other combinations of styles that need this handling as well. - * This fixes the ReactOS Calculator buttons disappearing in CORE-16827. - */ - if ((Window->style & WS_CLIPSIBLINGS) && !(Window->style & (WS_POPUP | WS_CLIPCHILDREN | WS_SIZEBOX))) - { - IntSendNCPaint(pwnd, HRGN_WINDOW); // Paint the whole frame. - } - else // Use region handling - { - HRGN DcRgn = NtGdiCreateRectRgn(0, 0, 0, 0); - PREGION DcRgnObj = REGION_LockRgn(DcRgn); - TRACE("SWP_FRAMECHANGED win %p hRgn %p\n",pwnd, DcRgn); - IntGdiCombineRgn(DcRgnObj, VisBefore, NULL, RGN_COPY); - REGION_UnlockRgn(DcRgnObj); - ForceNCPaintErase(pwnd, DcRgn, DcRgnObj); - GreDeleteObject(DcRgn); - } + co_UserRedrawWindow(Window, NULL, VisAfter, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); } } } @@ -2229,9 +2141,9 @@ co_WinPosSetWindowPos( if(!(flags & SWP_DEFERERASE)) { /* erase parent when hiding or resizing child */ - if ((flags & SWP_HIDEWINDOW) || - (!(flags & SWP_SHOWWINDOW) && - (WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOGEOMETRYCHANGE)) + if ((WinPos.flags & SWP_HIDEWINDOW) || + (!(WinPos.flags & SWP_SHOWWINDOW) && + (WinPos.flags & SWP_AGG_STATUSFLAGS) != (SWP_AGG_NOCLIENTCHANGE | SWP_NOMOVE | SWP_NOSIZE))) { PWND Parent = Window->spwndParent; if (!Parent || UserIsDesktopWindow(Parent)) Parent = Window; @@ -2239,8 +2151,8 @@ co_WinPosSetWindowPos( } /* Give newly shown windows a chance to redraw */ - if(((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE) - && !(flags & SWP_AGG_NOCLIENTCHANGE) && (flags & SWP_SHOWWINDOW)) + if (WinPos.flags & (SWP_SHOWWINDOW | SWP_FRAMECHANGED) || + ((WinPos.flags & SWP_AGG_NOPOSCHANGE) & ~SWP_NOZORDER) != (SWP_AGG_NOPOSCHANGE & ~SWP_NOZORDER)) { UserSyncAndPaintWindows( Window, RDW_ERASENOW); } @@ -2250,8 +2162,8 @@ co_WinPosSetWindowPos( TRACE("\tstatus hwnd %p flags = %04x\n",Window?Window->head.h:NULL,WinPos.flags & SWP_AGG_STATUSFLAGS); - if (((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE) - && !((flags & SWP_AGG_NOCLIENTCHANGE) && (flags & SWP_SHOWWINDOW))) + if (WinPos.flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW | SWP_FRAMECHANGED) || + ((WinPos.flags & SWP_AGG_NOPOSCHANGE) & ~SWP_NOZORDER) != (SWP_AGG_NOPOSCHANGE & ~SWP_NOZORDER)) { /* WM_WINDOWPOSCHANGED is sent even if SWP_NOSENDCHANGING is set and always contains final window position.