Fix a bug in SetWindowPos to prevent parent from erasing its child
painting area when parent window and child window don't have
WS_CLIPCHILDREN and WS_CLIPSIBLINGS.
diff --git a/windows/winpos.c b/windows/winpos.c
index 52476a1d..9794e8e 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -2821,6 +2821,11 @@
{
if( !(winpos.flags & SWP_NOREDRAW) )
{
+ if (wndPtr->parent == wndTemp)
+ {
+ /* Desktop does not receive wm_paint message so we use RDW_ERASENOW to erase the
+ the desktop window */
+
if( uFlags & SWP_EX_PAINTSELF )
{
PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, (visRgn == 1) ? 0 : visRgn, RDW_ERASE | RDW_FRAME |
@@ -2829,9 +2834,29 @@
}
else
{
- PAINT_RedrawWindow( wndPtr->parent->hwndSelf, NULL, (visRgn == 1) ? 0 : visRgn, RDW_ERASE |
- ((winpos.flags & SWP_DEFERERASE) ? 0 : RDW_ERASENOW) | RDW_INVALIDATE |
- RDW_ALLCHILDREN, RDW_EX_USEHRGN );
+ PAINT_RedrawWindow( wndPtr->parent->hwndSelf, NULL, (visRgn == 1) ? 0 : visRgn,
+ RDW_ERASE | RDW_ERASENOW | RDW_INVALIDATE | RDW_ALLCHILDREN, RDW_EX_USEHRGN );
+ }
+ }
+ else
+ {
+ if( uFlags & SWP_EX_PAINTSELF )
+ {
+ /* Use PAINT_RedrawWindow to explicitly force an invalidation of the window,
+ its parent and sibling and so on, and then update the parent window,
+ the non-top-level window. Rely on the system to repaint other affected
+ windows later on. */
+
+ PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, (visRgn == 1) ? 0 : visRgn, RDW_ERASE |
+ RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN, RDW_EX_XYWINDOW | RDW_EX_USEHRGN );
+ }
+ else
+ {
+ PAINT_RedrawWindow( wndPtr->parent->hwndSelf, NULL, (visRgn == 1) ? 0 : visRgn,
+ RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN, RDW_EX_USEHRGN );
+
+ UpdateWindow( wndPtr->parent->hwndSelf);
+ }
}
}
if( visRgn != 1 )