diff --git a/windows/winpos.c b/windows/winpos.c index 52476a1df68..9794e8ee8e2 100644 --- a/windows/winpos.c +++ b/windows/winpos.c @@ -2821,6 +2821,11 @@ Pos: /* ----------------------------------------------------------------------- { 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 @@ Pos: /* ----------------------------------------------------------------------- } 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 )