mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 05:26:58 +00:00
[0.4.9][WIN32K:NTUSER] Properly fix IntSendChildNCPaint() & IntLinkWindow()
Hack has been introduced in IntSendChildNCPaint() in r73532 ==6d7fcc4
to attempt to pseudo-fix CORE-12071 and CORE-12085 while breaking other stuff, amongst which CORE-14763 is one of the latest manifestations, and re-enable the correct original code. This fixes painting hangs under diverse situations, while CORE-12071 and CORE-12085 remain fixed. When it was hanging like CORE-14763, we could not even ACPI shutdown anymore. by porting back: 0.4.10-dev-324-g25004bb5b4
0.4.10-dev-323-gee0511b49d
0.4.10-dev-322-g4d057cf626
This commit is contained in:
parent
1c107f80cf
commit
743f12cdc8
|
@ -366,38 +366,16 @@ IntSendNCPaint(PWND pWnd, HRGN hRgn)
|
|||
VOID FASTCALL
|
||||
IntSendChildNCPaint(PWND pWnd)
|
||||
{
|
||||
PWND Child;
|
||||
HWND *List, *phWnd;
|
||||
|
||||
List = IntWinListChildren(UserGetDesktopWindow());
|
||||
if ( List )
|
||||
for (pWnd = pWnd->spwndChild; pWnd; pWnd = pWnd->spwndNext)
|
||||
{
|
||||
for (phWnd = List; *phWnd; ++phWnd)
|
||||
{
|
||||
Child = ValidateHwndNoErr(*phWnd);
|
||||
if ( Child && Child->hrgnUpdate == NULL && Child->state & WNDS_SENDNCPAINT)
|
||||
{
|
||||
USER_REFERENCE_ENTRY Ref;
|
||||
UserRefObjectCo(Child, &Ref);
|
||||
IntSendNCPaint(Child, HRGN_WINDOW);
|
||||
UserDerefObjectCo(Child);
|
||||
}
|
||||
}
|
||||
ExFreePoolWithTag(List, USERTAG_WINDOWLIST);
|
||||
}
|
||||
/* FIXME : Use snap shot mode until window death is fixed while surfing menus! Fix CORE-12085 and CORE-12071.
|
||||
pWnd = pWnd->spwndChild;
|
||||
while(pWnd)
|
||||
{
|
||||
if (pWnd->hrgnUpdate == NULL && pWnd->state & WNDS_SENDNCPAINT)
|
||||
if ((pWnd->hrgnUpdate == NULL) && (pWnd->state & WNDS_SENDNCPAINT))
|
||||
{
|
||||
USER_REFERENCE_ENTRY Ref;
|
||||
UserRefObjectCo(pWnd, &Ref);
|
||||
IntSendNCPaint(pWnd, HRGN_WINDOW);
|
||||
UserDerefObjectCo(pWnd);
|
||||
}
|
||||
pWnd = pWnd->spwndNext;
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -894,28 +894,37 @@ IntIsChildWindow(PWND Parent, PWND BaseWindow)
|
|||
}
|
||||
////
|
||||
|
||||
/*
|
||||
Link the window into siblings list
|
||||
children and parent are kept in place.
|
||||
*/
|
||||
/* Link the window into siblings list. Children and parent are kept in place. */
|
||||
VOID FASTCALL
|
||||
IntLinkWindow(
|
||||
PWND Wnd,
|
||||
PWND WndInsertAfter /* set to NULL if top sibling */
|
||||
PWND WndInsertAfter /* Set to NULL if top sibling */
|
||||
)
|
||||
{
|
||||
if ((Wnd->spwndPrev = WndInsertAfter))
|
||||
if (Wnd == WndInsertAfter)
|
||||
{
|
||||
/* link after WndInsertAfter */
|
||||
if ((Wnd->spwndNext = WndInsertAfter->spwndNext))
|
||||
ERR("IntLinkWindow -- Trying to link window 0x%p to itself!!\n", Wnd);
|
||||
return;
|
||||
}
|
||||
|
||||
Wnd->spwndPrev = WndInsertAfter;
|
||||
if (Wnd->spwndPrev)
|
||||
{
|
||||
/* Link after WndInsertAfter */
|
||||
ASSERT(Wnd != WndInsertAfter->spwndNext);
|
||||
Wnd->spwndNext = WndInsertAfter->spwndNext;
|
||||
if (Wnd->spwndNext)
|
||||
Wnd->spwndNext->spwndPrev = Wnd;
|
||||
|
||||
ASSERT(Wnd != Wnd->spwndPrev);
|
||||
Wnd->spwndPrev->spwndNext = Wnd;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* link at top */
|
||||
if ((Wnd->spwndNext = Wnd->spwndParent->spwndChild))
|
||||
/* Link at the top */
|
||||
ASSERT(Wnd != Wnd->spwndParent->spwndChild);
|
||||
Wnd->spwndNext = Wnd->spwndParent->spwndChild;
|
||||
if (Wnd->spwndNext)
|
||||
Wnd->spwndNext->spwndPrev = Wnd;
|
||||
|
||||
Wnd->spwndParent->spwndChild = Wnd;
|
||||
|
@ -929,8 +938,8 @@ VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev)
|
|||
{
|
||||
if (hWndPrev == HWND_NOTOPMOST)
|
||||
{
|
||||
if (!(Wnd->ExStyle & WS_EX_TOPMOST) &&
|
||||
(Wnd->ExStyle2 & WS_EX2_LINKED)) return; /* nothing to do */
|
||||
if (!(Wnd->ExStyle & WS_EX_TOPMOST) && (Wnd->ExStyle2 & WS_EX2_LINKED))
|
||||
return; /* nothing to do */
|
||||
Wnd->ExStyle &= ~WS_EX_TOPMOST;
|
||||
hWndPrev = HWND_TOP; /* fallback to the HWND_TOP case */
|
||||
}
|
||||
|
@ -943,8 +952,10 @@ VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev)
|
|||
PWND WndInsertAfter;
|
||||
|
||||
WndInsertAfter = Wnd->spwndParent->spwndChild;
|
||||
while( WndInsertAfter && WndInsertAfter->spwndNext)
|
||||
while (WndInsertAfter && WndInsertAfter->spwndNext)
|
||||
{
|
||||
WndInsertAfter = WndInsertAfter->spwndNext;
|
||||
}
|
||||
|
||||
IntLinkWindow(Wnd, WndInsertAfter);
|
||||
Wnd->ExStyle &= ~WS_EX_TOPMOST;
|
||||
|
@ -953,7 +964,6 @@ VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev)
|
|||
{
|
||||
/* Link in the top of the list */
|
||||
IntLinkWindow(Wnd, NULL);
|
||||
|
||||
Wnd->ExStyle |= WS_EX_TOPMOST;
|
||||
}
|
||||
else if (hWndPrev == HWND_TOP)
|
||||
|
@ -967,7 +977,9 @@ VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev)
|
|||
{
|
||||
while (WndInsertBefore != NULL && WndInsertBefore->spwndNext != NULL)
|
||||
{
|
||||
if (!(WndInsertBefore->ExStyle & WS_EX_TOPMOST)) break;
|
||||
if (!(WndInsertBefore->ExStyle & WS_EX_TOPMOST))
|
||||
break;
|
||||
|
||||
if (WndInsertBefore == Wnd->spwndOwner) /* keep it above owner */
|
||||
{
|
||||
Wnd->ExStyle |= WS_EX_TOPMOST;
|
||||
|
@ -986,13 +998,15 @@ VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev)
|
|||
|
||||
WndInsertAfter = UserGetWindowObject(hWndPrev);
|
||||
/* Are we called with an erroneous handle */
|
||||
if(WndInsertAfter == NULL)
|
||||
if (WndInsertAfter == NULL)
|
||||
{
|
||||
/* Link in a default position */
|
||||
IntLinkHwnd(Wnd, HWND_TOP);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Wnd == WndInsertAfter)
|
||||
ERR("IntLinkHwnd -- Trying to link window 0x%p to itself!!\n", Wnd);
|
||||
IntLinkWindow(Wnd, WndInsertAfter);
|
||||
|
||||
/* Fix the WS_EX_TOPMOST flag */
|
||||
|
@ -1002,8 +1016,8 @@ VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev)
|
|||
}
|
||||
else
|
||||
{
|
||||
if(WndInsertAfter->spwndNext &&
|
||||
WndInsertAfter->spwndNext->ExStyle & WS_EX_TOPMOST)
|
||||
if (WndInsertAfter->spwndNext &&
|
||||
(WndInsertAfter->spwndNext->ExStyle & WS_EX_TOPMOST))
|
||||
{
|
||||
Wnd->ExStyle |= WS_EX_TOPMOST;
|
||||
}
|
||||
|
@ -1287,10 +1301,13 @@ co_UserSetParent(HWND hWndChild, HWND hWndNewParent)
|
|||
return( hWndOldParent);
|
||||
}
|
||||
|
||||
/* Unlink the window from siblings. children and parent are kept in place. */
|
||||
/* Unlink the window from siblings. Children and parent are kept in place. */
|
||||
VOID FASTCALL
|
||||
IntUnlinkWindow(PWND Wnd)
|
||||
{
|
||||
ASSERT(Wnd != Wnd->spwndNext);
|
||||
ASSERT(Wnd != Wnd->spwndPrev);
|
||||
|
||||
if (Wnd->spwndNext)
|
||||
Wnd->spwndNext->spwndPrev = Wnd->spwndPrev;
|
||||
|
||||
|
|
|
@ -30,8 +30,6 @@ DBG_DEFAULT_CHANNEL(UserWinpos);
|
|||
#define PLACE_MAX 0x0002
|
||||
#define PLACE_RECT 0x0004
|
||||
|
||||
VOID FASTCALL IntLinkWindow(PWND Wnd,PWND WndInsertAfter);
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
#if DBG
|
||||
|
|
Loading…
Reference in a new issue