- Patch by Fabian Maurer : Send WM_NCPAINT and WM_ERASEBKGND when window is shown. Only send position-change messages when needed.
- Adapted patch and fixes CORE-3998.

svn path=/trunk/; revision=75735
This commit is contained in:
James Tabor 2017-09-02 04:45:16 +00:00
parent 968673daab
commit 6af37fd54e

View file

@ -22,6 +22,8 @@ DBG_DEFAULT_CHANNEL(UserWinpos);
(SWP_NOSIZE | SWP_NOMOVE | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE | SWP_NOZORDER)
#define SWP_AGG_STATUSFLAGS \
(SWP_AGG_NOPOSCHANGE | SWP_FRAMECHANGED | SWP_HIDEWINDOW | SWP_SHOWWINDOW)
#define SWP_AGG_NOCLIENTCHANGE \
(SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE)
#define EMPTYPOINT(pt) ((pt).x == -1 && (pt).y == -1)
#define PLACE_MIN 0x0001
@ -1263,7 +1265,8 @@ co_WinPosDoWinPosChanging(PWND Window,
/* Send WM_WINDOWPOSCHANGING message */
if (!(WinPos->flags & SWP_NOSENDCHANGING))
if (!(WinPos->flags & SWP_NOSENDCHANGING)
&& !((WinPos->flags & SWP_AGG_NOCLIENTCHANGE) && (WinPos->flags & SWP_SHOWWINDOW)))
{
TRACE("Sending WM_WINDOWPOSCHANGING to hwnd %p flags %04x.\n", Window->head.h,WinPos->flags);
co_IntSendMessage(Window->head.h, WM_WINDOWPOSCHANGING, 0, (LPARAM) WinPos);
@ -2105,11 +2108,32 @@ co_WinPosSetWindowPos(
WinPos.flags |= SWP_NOZORDER|SWP_NOREDRAW;
}
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))
{
PWND Parent = Window->spwndParent;
if (!Parent || UserIsDesktopWindow(Parent)) Parent = Window;
UserSyncAndPaintWindows( Parent, RDW_ERASENOW);
}
/* Give newly shown windows a chance to redraw */
if(((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE)
&& !(flags & SWP_AGG_NOCLIENTCHANGE) && (flags & SWP_SHOWWINDOW))
{
UserSyncAndPaintWindows( Window, RDW_ERASENOW);
}
}
/* And last, send the WM_WINDOWPOSCHANGED message */
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)
if (((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE)
&& !((flags & SWP_AGG_NOCLIENTCHANGE) && (flags & SWP_SHOWWINDOW)))
{
/* WM_WINDOWPOSCHANGED is sent even if SWP_NOSENDCHANGING is set
and always contains final window position.