- Move the window showing/hiding notifications from co_WinPosShowWindow to co_WinPosSetWindowPos and fix up the top-level checks. - Call the redraw routine on parent window if possible in co_WinPosSetWindowPos. Should fix bug #735. Modified: trunk/reactos/subsys/win32k/ntuser/winpos.c _____
Modified: trunk/reactos/subsys/win32k/ntuser/winpos.c --- trunk/reactos/subsys/win32k/ntuser/winpos.c 2005-09-19 05:42:01 UTC (rev 17927) +++ trunk/reactos/subsys/win32k/ntuser/winpos.c 2005-09-19 07:35:31 UTC (rev 17928) @@ -1064,10 +1064,20 @@
/* Clear the update region */ co_UserRedrawWindow(Window, NULL, 0, RDW_VALIDATE | RDW_NOFRAME | RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_ALLCHILDREN); + if ((Window->Style & WS_VISIBLE) && + Window->Parent == UserGetDesktopWindow()) + { + co_IntShellHookNotify(HSHELL_WINDOWDESTROYED, (LPARAM)Window->hSelf); + } Window->Style &= ~WS_VISIBLE; } else if (WinPos.flags & SWP_SHOWWINDOW) { + if (!(Window->Style & WS_VISIBLE) && + Window->Parent == UserGetDesktopWindow()) + { + co_IntShellHookNotify(HSHELL_WINDOWCREATED, (LPARAM)Window->hSelf); + } Window->Style |= WS_VISIBLE; }
@@ -1199,11 +1209,22 @@ } if (RgnType != ERROR && RgnType != NULLREGION) { - NtGdiOffsetRgn(DirtyRgn, - Window->WindowRect.left - Window->ClientRect.left, - Window->WindowRect.top - Window->ClientRect.top); - co_UserRedrawWindow(Window, NULL, DirtyRgn, - RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); + if (Window->Parent) + { + NtGdiOffsetRgn(DirtyRgn, + Window->WindowRect.left - Window->Parent->ClientRect.left, + Window->WindowRect.top - Window->Parent->ClientRect.top); + co_UserRedrawWindow(Window->Parent, NULL, DirtyRgn, + RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); + } + else + { + NtGdiOffsetRgn(DirtyRgn, + Window->WindowRect.left - Window->ClientRect.left, + Window->WindowRect.top - Window->ClientRect.top); + co_UserRedrawWindow(Window, NULL, DirtyRgn, + RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); + } } NtGdiDeleteObject(DirtyRgn); } @@ -1363,14 +1384,6 @@ if (ShowFlag != WasVisible) { co_IntSendMessage(Window->hSelf, WM_SHOWWINDOW, ShowFlag, 0); - /* - * FIXME: Need to check the window wasn't destroyed during the - * window procedure. - */ - if (!(Window->Parent)) - { - co_IntShellHookNotify(HSHELL_WINDOWCREATED, (LPARAM)Window->hSelf); - } }
/* We can't activate a child window */ @@ -1409,11 +1422,6 @@ //faxme: as long as we have ref on Window, we also, indirectly, have ref on parent... co_UserSetFocus(Window->Parent); } - - if (!(Window->Parent)) - { - co_IntShellHookNotify(HSHELL_WINDOWDESTROYED, (LPARAM)Window->hSelf); - } }
/* FIXME: Check for window destruction. */