mirror of
https://github.com/reactos/reactos.git
synced 2025-07-27 19:41:40 +00:00
[Win32k]
- Add back removed window dce support routine. Fixed list handling and implemented thread cleanup for dces. svn path=/trunk/; revision=45305
This commit is contained in:
parent
5b14ade9f8
commit
21032e02d1
3 changed files with 192 additions and 123 deletions
|
@ -1116,18 +1116,6 @@ NtUserGetLayeredWindowAttributes(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ValidateRect gets redirected to NtUserValidateRect:
|
|
||||||
http://blog.csdn.net/ntdll/archive/2005/10/19/509299.aspx */
|
|
||||||
BOOL
|
|
||||||
APIENTRY
|
|
||||||
NtUserValidateRect(
|
|
||||||
HWND hWnd,
|
|
||||||
const RECT *lpRect)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
APIENTRY
|
APIENTRY
|
||||||
NtUserValidateTimerCallback(
|
NtUserValidateTimerCallback(
|
||||||
|
|
|
@ -81,7 +81,8 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN hValidateRgn, BOOL Recurse)
|
||||||
if (Recurse)
|
if (Recurse)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
IntInvalidateWindows(ParentWindow, hValidateRgn,
|
IntInvalidateWindows( ParentWindow,
|
||||||
|
hValidateRgn,
|
||||||
RDW_VALIDATE | RDW_NOCHILDREN);
|
RDW_VALIDATE | RDW_NOCHILDREN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,7 +251,9 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse)
|
||||||
Window->state &= ~WINDOWOBJECT_NEED_NCPAINT;
|
Window->state &= ~WINDOWOBJECT_NEED_NCPAINT;
|
||||||
MsqDecPaintCountQueue(Window->pti->MessageQueue);
|
MsqDecPaintCountQueue(Window->pti->MessageQueue);
|
||||||
co_IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)TempRegion, 0);
|
co_IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)TempRegion, 0);
|
||||||
if ((HANDLE) 1 != TempRegion && NULL != TempRegion)
|
|
||||||
|
if ( (HANDLE) 1 != TempRegion &&
|
||||||
|
NULL != TempRegion)
|
||||||
{
|
{
|
||||||
/* NOTE: The region can already be deleted! */
|
/* NOTE: The region can already be deleted! */
|
||||||
GDIOBJ_FreeObjByHandle(TempRegion, GDI_OBJECT_TYPE_REGION | GDI_OBJECT_TYPE_SILENT);
|
GDIOBJ_FreeObjByHandle(TempRegion, GDI_OBJECT_TYPE_REGION | GDI_OBJECT_TYPE_SILENT);
|
||||||
|
@ -261,9 +264,10 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse)
|
||||||
{
|
{
|
||||||
if (Window->hrgnUpdate)
|
if (Window->hrgnUpdate)
|
||||||
{
|
{
|
||||||
hDC = UserGetDCEx(Window, Window->hrgnUpdate,
|
hDC = UserGetDCEx( Window,
|
||||||
DCX_CACHE | DCX_USESTYLE |
|
Window->hrgnUpdate,
|
||||||
DCX_INTERSECTRGN | DCX_KEEPCLIPRGN);
|
DCX_CACHE|DCX_USESTYLE|DCX_INTERSECTRGN|DCX_KEEPCLIPRGN);
|
||||||
|
|
||||||
if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0))
|
if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0))
|
||||||
{
|
{
|
||||||
Window->state &= ~WINDOWOBJECT_NEED_ERASEBKGND;
|
Window->state &= ~WINDOWOBJECT_NEED_ERASEBKGND;
|
||||||
|
@ -285,7 +289,8 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse)
|
||||||
/*
|
/*
|
||||||
* Paint child windows.
|
* Paint child windows.
|
||||||
*/
|
*/
|
||||||
if (!(Flags & RDW_NOCHILDREN) && !(Wnd->style & WS_MINIMIZE) &&
|
if (!(Flags & RDW_NOCHILDREN) &&
|
||||||
|
!(Wnd->style & WS_MINIMIZE) &&
|
||||||
((Flags & RDW_ALLCHILDREN) || !(Wnd->style & WS_CLIPCHILDREN)) )
|
((Flags & RDW_ALLCHILDREN) || !(Wnd->style & WS_CLIPCHILDREN)) )
|
||||||
{
|
{
|
||||||
HWND *List, *phWnd;
|
HWND *List, *phWnd;
|
||||||
|
@ -325,7 +330,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
|
||||||
BOOL HasPaintMessage, HasNCPaintMessage;
|
BOOL HasPaintMessage, HasNCPaintMessage;
|
||||||
|
|
||||||
Wnd = Window->Wnd;
|
Wnd = Window->Wnd;
|
||||||
|
DPRINT1("IntInvalidateWindows start\n");
|
||||||
/*
|
/*
|
||||||
* If the nonclient is not to be redrawn, clip the region to the client
|
* If the nonclient is not to be redrawn, clip the region to the client
|
||||||
* rect
|
* rect
|
||||||
|
@ -477,7 +482,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
|
||||||
else
|
else
|
||||||
MsqIncPaintCountQueue(Window->pti->MessageQueue);
|
MsqIncPaintCountQueue(Window->pti->MessageQueue);
|
||||||
}
|
}
|
||||||
|
DPRINT1("IntInvalidateWindows exit\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -515,21 +520,23 @@ IntIsWindowDrawable(PWINDOW_OBJECT Window)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
BOOL FASTCALL
|
BOOL FASTCALL
|
||||||
co_UserRedrawWindow(PWINDOW_OBJECT Window, const RECTL* UpdateRect, HRGN UpdateRgn,
|
co_UserRedrawWindow(
|
||||||
|
PWINDOW_OBJECT Window,
|
||||||
|
const RECTL* UpdateRect,
|
||||||
|
HRGN UpdateRgn,
|
||||||
ULONG Flags)
|
ULONG Flags)
|
||||||
{
|
{
|
||||||
HRGN hRgn = NULL;
|
HRGN hRgn = NULL;
|
||||||
|
DPRINT1("co_UserRedrawWindow start\n");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Step 1.
|
* Step 1.
|
||||||
* Validation of passed parameters.
|
* Validation of passed parameters.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!IntIsWindowDrawable(Window) ||
|
if (!IntIsWindowDrawable(Window))
|
||||||
(Flags & (RDW_VALIDATE | RDW_INVALIDATE)) ==
|
|
||||||
(RDW_VALIDATE | RDW_INVALIDATE))
|
|
||||||
{
|
{
|
||||||
return FALSE;
|
return TRUE; // Just do nothing!!!
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -538,7 +545,7 @@ co_UserRedrawWindow(PWINDOW_OBJECT Window, const RECTL* UpdateRect, HRGN UpdateR
|
||||||
* a region hRgn specified in screen coordinates.
|
* a region hRgn specified in screen coordinates.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (Flags & (RDW_INVALIDATE | RDW_VALIDATE))
|
if (Flags & (RDW_INVALIDATE | RDW_VALIDATE)) // Both are OKAY!
|
||||||
{
|
{
|
||||||
if (UpdateRgn != NULL)
|
if (UpdateRgn != NULL)
|
||||||
{
|
{
|
||||||
|
@ -602,6 +609,7 @@ co_UserRedrawWindow(PWINDOW_OBJECT Window, const RECTL* UpdateRect, HRGN UpdateR
|
||||||
{
|
{
|
||||||
REGION_FreeRgnByHandle(hRgn);
|
REGION_FreeRgnByHandle(hRgn);
|
||||||
}
|
}
|
||||||
|
DPRINT1("co_UserRedrawWindow exit\n");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -660,8 +668,13 @@ IntFindWindowToRepaint(PWINDOW_OBJECT Window, PTHREADINFO Thread)
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL FASTCALL
|
BOOL FASTCALL
|
||||||
IntGetPaintMessage(PWINDOW_OBJECT Window, UINT MsgFilterMin, UINT MsgFilterMax,
|
IntGetPaintMessage(
|
||||||
PTHREADINFO Thread, MSG *Message, BOOL Remove)
|
PWINDOW_OBJECT Window,
|
||||||
|
UINT MsgFilterMin,
|
||||||
|
UINT MsgFilterMax,
|
||||||
|
PTHREADINFO Thread,
|
||||||
|
MSG *Message,
|
||||||
|
BOOL Remove)
|
||||||
{
|
{
|
||||||
PUSER_MESSAGE_QUEUE MessageQueue = (PUSER_MESSAGE_QUEUE)Thread->MessageQueue;
|
PUSER_MESSAGE_QUEUE MessageQueue = (PUSER_MESSAGE_QUEUE)Thread->MessageQueue;
|
||||||
|
|
||||||
|
@ -787,7 +800,9 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs)
|
||||||
|
|
||||||
RtlZeroMemory(&Ps, sizeof(PAINTSTRUCT));
|
RtlZeroMemory(&Ps, sizeof(PAINTSTRUCT));
|
||||||
|
|
||||||
Ps.hdc = UserGetDCEx(Window, Window->hrgnUpdate, DCX_INTERSECTRGN | DCX_USESTYLE);
|
Ps.hdc = UserGetDCEx( Window,
|
||||||
|
Window->hrgnUpdate,
|
||||||
|
DCX_INTERSECTRGN | DCX_USESTYLE);
|
||||||
if (!Ps.hdc)
|
if (!Ps.hdc)
|
||||||
{
|
{
|
||||||
RETURN(NULL);
|
RETURN(NULL);
|
||||||
|
@ -1060,16 +1075,20 @@ CLEANUP:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
BOOL APIENTRY
|
BOOL APIENTRY
|
||||||
NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate,
|
NtUserRedrawWindow(
|
||||||
|
HWND hWnd,
|
||||||
|
CONST RECT *lprcUpdate,
|
||||||
|
HRGN hrgnUpdate,
|
||||||
UINT flags)
|
UINT flags)
|
||||||
{
|
{
|
||||||
RECTL SafeUpdateRect;
|
RECTL SafeUpdateRect;
|
||||||
NTSTATUS Status;
|
|
||||||
PWINDOW_OBJECT Wnd;
|
PWINDOW_OBJECT Wnd;
|
||||||
DECLARE_RETURN(BOOL);
|
BOOL Ret;
|
||||||
USER_REFERENCE_ENTRY Ref;
|
USER_REFERENCE_ENTRY Ref;
|
||||||
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
DECLARE_RETURN(BOOL);
|
||||||
|
|
||||||
DPRINT("Enter NtUserRedrawWindow\n");
|
DPRINT1("Enter NtUserRedrawWindow\n");
|
||||||
UserEnterExclusive();
|
UserEnterExclusive();
|
||||||
|
|
||||||
if (!(Wnd = UserGetWindowObject(hWnd ? hWnd : IntGetDesktopWindow())))
|
if (!(Wnd = UserGetWindowObject(hWnd ? hWnd : IntGetDesktopWindow())))
|
||||||
|
@ -1077,44 +1096,61 @@ NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate,
|
||||||
RETURN( FALSE);
|
RETURN( FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lprcUpdate != NULL)
|
if (lprcUpdate)
|
||||||
{
|
{
|
||||||
Status = MmCopyFromCaller(&SafeUpdateRect, lprcUpdate,
|
_SEH2_TRY
|
||||||
sizeof(RECTL));
|
{
|
||||||
|
ProbeForRead(lprcUpdate, sizeof(RECTL), 1);
|
||||||
|
RtlCopyMemory(&SafeUpdateRect, lprcUpdate, sizeof(RECTL));
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = _SEH2_GetExceptionCode();
|
||||||
|
}
|
||||||
|
_SEH2_END
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
SetLastWin32Error(RtlNtStatusToDosError(Status));
|
||||||
RETURN( FALSE);
|
RETURN( FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( flags & ~(RDW_ERASE|RDW_FRAME|RDW_INTERNALPAINT|RDW_INVALIDATE|
|
||||||
|
RDW_NOERASE|RDW_NOFRAME|RDW_NOINTERNALPAINT|RDW_VALIDATE|
|
||||||
|
RDW_ERASENOW|RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_NOCHILDREN) )
|
||||||
|
{
|
||||||
|
/* RedrawWindow fails only in case that flags are invalid */
|
||||||
|
SetLastWin32Error(ERROR_INVALID_FLAGS);
|
||||||
|
RETURN( FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
UserRefObjectCo(Wnd, &Ref);
|
UserRefObjectCo(Wnd, &Ref);
|
||||||
|
|
||||||
Status = co_UserRedrawWindow(Wnd, NULL == lprcUpdate ? NULL : &SafeUpdateRect,
|
Ret = co_UserRedrawWindow( Wnd,
|
||||||
hrgnUpdate, flags);
|
lprcUpdate ? &SafeUpdateRect : NULL,
|
||||||
|
hrgnUpdate,
|
||||||
|
flags);
|
||||||
|
|
||||||
UserDerefObjectCo(Wnd);
|
UserDerefObjectCo(Wnd);
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
RETURN( Ret);
|
||||||
{
|
|
||||||
/* IntRedrawWindow fails only in case that flags are invalid */
|
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
||||||
RETURN( FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
RETURN( TRUE);
|
|
||||||
|
|
||||||
CLEANUP:
|
CLEANUP:
|
||||||
DPRINT("Leave NtUserRedrawWindow, ret=%i\n",_ret_);
|
DPRINT1("Leave NtUserRedrawWindow, ret=%i\n",_ret_);
|
||||||
UserLeave();
|
UserLeave();
|
||||||
END_CLEANUP;
|
END_CLEANUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
INT FASTCALL
|
INT FASTCALL
|
||||||
UserScrollDC(HDC hDC, INT dx, INT dy, const RECTL *prcScroll,
|
UserScrollDC(
|
||||||
const RECTL *prcClip, HRGN hrgnUpdate, RECTL *prcUpdate)
|
HDC hDC,
|
||||||
|
INT dx,
|
||||||
|
INT dy,
|
||||||
|
const RECTL *prcScroll,
|
||||||
|
const RECTL *prcClip,
|
||||||
|
HRGN hrgnUpdate,
|
||||||
|
RECTL *prcUpdate)
|
||||||
{
|
{
|
||||||
PDC pDC;
|
PDC pDC;
|
||||||
RECTL rcScroll, rcClip, rcSrc, rcDst;
|
RECTL rcScroll, rcClip, rcSrc, rcDst;
|
||||||
|
@ -1141,9 +1177,17 @@ UserScrollDC(HDC hDC, INT dx, INT dy, const RECTL *prcScroll,
|
||||||
RECTL_vOffsetRect(&rcDst, dx, dy);
|
RECTL_vOffsetRect(&rcDst, dx, dy);
|
||||||
RECTL_bIntersectRect(&rcDst, &rcDst, &rcClip);
|
RECTL_bIntersectRect(&rcDst, &rcDst, &rcClip);
|
||||||
|
|
||||||
if (!NtGdiBitBlt(hDC, rcDst.left, rcDst.top,
|
if (!NtGdiBitBlt( hDC,
|
||||||
rcDst.right - rcDst.left, rcDst.bottom - rcDst.top,
|
rcDst.left,
|
||||||
hDC, rcDst.left - dx, rcDst.top - dy, SRCCOPY, 0, 0))
|
rcDst.top,
|
||||||
|
rcDst.right - rcDst.left,
|
||||||
|
rcDst.bottom - rcDst.top,
|
||||||
|
hDC,
|
||||||
|
rcDst.left - dx,
|
||||||
|
rcDst.top - dy,
|
||||||
|
SRCCOPY,
|
||||||
|
0,
|
||||||
|
0))
|
||||||
{
|
{
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
@ -1159,7 +1203,7 @@ UserScrollDC(HDC hDC, INT dx, INT dy, const RECTL *prcScroll,
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
hrgnVisible = pDC->rosdc.hVisRgn; // pDC->w.hGCClipRgn?
|
hrgnVisible = pDC->rosdc.hVisRgn; // pDC->prgnRao?
|
||||||
DC_UnlockDc(pDC);
|
DC_UnlockDc(pDC);
|
||||||
|
|
||||||
/* Begin with the shifted and then clipped scroll rect */
|
/* Begin with the shifted and then clipped scroll rect */
|
||||||
|
@ -1539,7 +1583,8 @@ UserDrawSysMenuButton(
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
UserDrawCaptionText(HDC hDc,
|
UserDrawCaptionText(
|
||||||
|
HDC hDc,
|
||||||
const PUNICODE_STRING Text,
|
const PUNICODE_STRING Text,
|
||||||
const RECTL *lpRc,
|
const RECTL *lpRc,
|
||||||
UINT uFlags)
|
UINT uFlags)
|
||||||
|
@ -1984,4 +2029,19 @@ NtUserInvalidateRgn(
|
||||||
return NtUserRedrawWindow(hWnd, NULL, hRgn, RDW_INVALIDATE | (bErase? RDW_ERASE : 0));
|
return NtUserRedrawWindow(hWnd, NULL, hRgn, RDW_INVALIDATE | (bErase? RDW_ERASE : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ValidateRect gets redirected to NtUserValidateRect:
|
||||||
|
http://blog.csdn.net/ntdll/archive/2005/10/19/509299.aspx */
|
||||||
|
BOOL
|
||||||
|
APIENTRY
|
||||||
|
NtUserValidateRect(
|
||||||
|
HWND hWnd,
|
||||||
|
const RECT *lpRect)
|
||||||
|
{
|
||||||
|
if (hWnd)
|
||||||
|
{
|
||||||
|
return NtUserRedrawWindow(hWnd, lpRect, NULL, RDW_VALIDATE );
|
||||||
|
}
|
||||||
|
return NtUserRedrawWindow(hWnd, lpRect, NULL, RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW|RDW_ALLCHILDREN);
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -952,7 +952,8 @@ co_WinPosSetWindowPos(
|
||||||
VisBefore = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE);
|
VisBefore = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE);
|
||||||
VisRgn = NULL;
|
VisRgn = NULL;
|
||||||
|
|
||||||
if (VisBefore != NULL && (VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisBefore, NULL)) &&
|
if ( VisBefore != NULL &&
|
||||||
|
(VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisBefore, NULL)) &&
|
||||||
REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION )
|
REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION )
|
||||||
{
|
{
|
||||||
RGNOBJAPI_Unlock(VisRgn);
|
RGNOBJAPI_Unlock(VisRgn);
|
||||||
|
@ -989,7 +990,8 @@ co_WinPosSetWindowPos(
|
||||||
{
|
{
|
||||||
InsertAfterWindow = NULL;
|
InsertAfterWindow = NULL;
|
||||||
Sibling = ParentWindow->spwndChild;
|
Sibling = ParentWindow->spwndChild;
|
||||||
while (NULL != Sibling && 0 != (Sibling->Wnd->ExStyle & WS_EX_TOPMOST))
|
while ( NULL != Sibling &&
|
||||||
|
0 != (Sibling->Wnd->ExStyle & WS_EX_TOPMOST) )
|
||||||
{
|
{
|
||||||
InsertAfterWindow = Sibling;
|
InsertAfterWindow = Sibling;
|
||||||
Sibling = Sibling->spwndNext;
|
Sibling = Sibling->spwndNext;
|
||||||
|
@ -1027,12 +1029,13 @@ co_WinPosSetWindowPos(
|
||||||
}
|
}
|
||||||
if (InsertAfterWindow != NULL)
|
if (InsertAfterWindow != NULL)
|
||||||
UserDereferenceObject(InsertAfterWindow);
|
UserDereferenceObject(InsertAfterWindow);
|
||||||
if ((HWND_TOPMOST == WinPos.hwndInsertAfter)
|
|
||||||
|| (0 != (Window->Wnd->ExStyle & WS_EX_TOPMOST)
|
if ( (HWND_TOPMOST == WinPos.hwndInsertAfter) ||
|
||||||
&& NULL != Window->spwndPrev
|
(0 != (Window->Wnd->ExStyle & WS_EX_TOPMOST) &&
|
||||||
&& 0 != (Window->spwndPrev->Wnd->ExStyle & WS_EX_TOPMOST))
|
NULL != Window->spwndPrev &&
|
||||||
|| (NULL != Window->spwndNext
|
0 != (Window->spwndPrev->Wnd->ExStyle & WS_EX_TOPMOST)) ||
|
||||||
&& 0 != (Window->spwndNext->Wnd->ExStyle & WS_EX_TOPMOST)))
|
(NULL != Window->spwndNext &&
|
||||||
|
0 != (Window->spwndNext->Wnd->ExStyle & WS_EX_TOPMOST)) )
|
||||||
{
|
{
|
||||||
Window->Wnd->ExStyle |= WS_EX_TOPMOST;
|
Window->Wnd->ExStyle |= WS_EX_TOPMOST;
|
||||||
}
|
}
|
||||||
|
@ -1077,8 +1080,11 @@ co_WinPosSetWindowPos(
|
||||||
if (!(WinPos.flags & SWP_SHOWWINDOW) && (WinPos.flags & SWP_HIDEWINDOW))
|
if (!(WinPos.flags & SWP_SHOWWINDOW) && (WinPos.flags & SWP_HIDEWINDOW))
|
||||||
{
|
{
|
||||||
/* Clear the update region */
|
/* Clear the update region */
|
||||||
co_UserRedrawWindow(Window, NULL, 0, RDW_VALIDATE | RDW_NOFRAME |
|
co_UserRedrawWindow( Window,
|
||||||
RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_ALLCHILDREN);
|
NULL,
|
||||||
|
0,
|
||||||
|
RDW_VALIDATE | RDW_NOFRAME | RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_ALLCHILDREN);
|
||||||
|
|
||||||
if ((Window->Wnd->style & WS_VISIBLE) &&
|
if ((Window->Wnd->style & WS_VISIBLE) &&
|
||||||
Window->spwndParent == UserGetDesktopWindow())
|
Window->spwndParent == UserGetDesktopWindow())
|
||||||
{
|
{
|
||||||
|
@ -1111,7 +1117,8 @@ co_WinPosSetWindowPos(
|
||||||
VisAfter = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE);
|
VisAfter = VIS_ComputeVisibleRegion(Window, FALSE, FALSE, TRUE);
|
||||||
VisRgn = NULL;
|
VisRgn = NULL;
|
||||||
|
|
||||||
if (VisAfter != NULL && (VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisAfter, NULL)) &&
|
if ( VisAfter != NULL &&
|
||||||
|
(VisRgn = (PROSRGNDATA)RGNOBJAPI_Lock(VisAfter, NULL)) &&
|
||||||
REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION )
|
REGION_GetRgnBox(VisRgn, &TempRect) == NULLREGION )
|
||||||
{
|
{
|
||||||
RGNOBJAPI_Unlock(VisRgn);
|
RGNOBJAPI_Unlock(VisRgn);
|
||||||
|
@ -1131,7 +1138,9 @@ co_WinPosSetWindowPos(
|
||||||
* class need to be completely repainted on (horizontal/vertical) size
|
* class need to be completely repainted on (horizontal/vertical) size
|
||||||
* change.
|
* change.
|
||||||
*/
|
*/
|
||||||
if (VisBefore != NULL && VisAfter != NULL && !(WinPos.flags & SWP_NOCOPYBITS) &&
|
if ( VisBefore != NULL &&
|
||||||
|
VisAfter != NULL &&
|
||||||
|
!(WinPos.flags & SWP_NOCOPYBITS) &&
|
||||||
((WinPos.flags & SWP_NOSIZE) || !(WvrFlags & WVR_REDRAW)) &&
|
((WinPos.flags & SWP_NOSIZE) || !(WvrFlags & WVR_REDRAW)) &&
|
||||||
!(Window->Wnd->ExStyle & WS_EX_TRANSPARENT) )
|
!(Window->Wnd->ExStyle & WS_EX_TRANSPARENT) )
|
||||||
{
|
{
|
||||||
|
@ -1146,7 +1155,8 @@ co_WinPosSetWindowPos(
|
||||||
* we don't have to crop (can't take anything away from an empty
|
* we don't have to crop (can't take anything away from an empty
|
||||||
* region...)
|
* region...)
|
||||||
*/
|
*/
|
||||||
if (!(WinPos.flags & SWP_NOSIZE) && RgnType != ERROR &&
|
if (!(WinPos.flags & SWP_NOSIZE) &&
|
||||||
|
RgnType != ERROR &&
|
||||||
RgnType != NULLREGION )
|
RgnType != NULLREGION )
|
||||||
{
|
{
|
||||||
PROSRGNDATA pCopyRgn;
|
PROSRGNDATA pCopyRgn;
|
||||||
|
@ -1199,14 +1209,20 @@ co_WinPosSetWindowPos(
|
||||||
* to create a copy of CopyRgn and pass that. We need CopyRgn later
|
* to create a copy of CopyRgn and pass that. We need CopyRgn later
|
||||||
*/
|
*/
|
||||||
NtGdiOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top);
|
NtGdiOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top);
|
||||||
Dc = UserGetDCEx(Window, CopyRgn, DCX_WINDOW | DCX_CACHE |
|
Dc = UserGetDCEx( Window,
|
||||||
DCX_INTERSECTRGN | DCX_CLIPSIBLINGS |
|
CopyRgn,
|
||||||
DCX_KEEPCLIPRGN);
|
DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_CLIPSIBLINGS|DCX_KEEPCLIPRGN);
|
||||||
NtGdiBitBlt( Dc,
|
NtGdiBitBlt( Dc,
|
||||||
CopyRect.left, CopyRect.top, CopyRect.right - CopyRect.left,
|
CopyRect.left, CopyRect.top,
|
||||||
CopyRect.bottom - CopyRect.top, Dc,
|
CopyRect.right - CopyRect.left,
|
||||||
|
CopyRect.bottom - CopyRect.top,
|
||||||
|
Dc,
|
||||||
CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
|
CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
|
||||||
CopyRect.top + (OldWindowRect.top - NewWindowRect.top), SRCCOPY, 0, 0);
|
CopyRect.top + (OldWindowRect.top - NewWindowRect.top),
|
||||||
|
SRCCOPY,
|
||||||
|
0,
|
||||||
|
0);
|
||||||
|
|
||||||
UserReleaseDC(Window, Dc, FALSE);
|
UserReleaseDC(Window, Dc, FALSE);
|
||||||
IntValidateParent(Window, CopyRgn, FALSE);
|
IntValidateParent(Window, CopyRgn, FALSE);
|
||||||
NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
|
NtGdiOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
|
||||||
|
@ -1237,7 +1253,8 @@ co_WinPosSetWindowPos(
|
||||||
{
|
{
|
||||||
/* old code
|
/* old code
|
||||||
NtGdiOffsetRgn(DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
|
NtGdiOffsetRgn(DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
|
||||||
IntInvalidateWindows(Window, DirtyRgn,
|
IntInvalidateWindows( Window,
|
||||||
|
DirtyRgn,
|
||||||
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||||
}
|
}
|
||||||
GreDeleteObject(DirtyRgn);
|
GreDeleteObject(DirtyRgn);
|
||||||
|
@ -1252,13 +1269,15 @@ co_WinPosSetWindowPos(
|
||||||
(Parent) &&
|
(Parent) &&
|
||||||
!(Parent->Wnd->style & WS_CLIPCHILDREN))
|
!(Parent->Wnd->style & WS_CLIPCHILDREN))
|
||||||
{
|
{
|
||||||
IntInvalidateWindows(Parent, DirtyRgn,
|
IntInvalidateWindows( Parent,
|
||||||
|
DirtyRgn,
|
||||||
RDW_ERASE | RDW_INVALIDATE);
|
RDW_ERASE | RDW_INVALIDATE);
|
||||||
co_IntPaintWindows(Parent, RDW_ERASENOW, FALSE);
|
co_IntPaintWindows(Parent, RDW_ERASENOW, FALSE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
IntInvalidateWindows(Window, DirtyRgn,
|
IntInvalidateWindows( Window,
|
||||||
|
DirtyRgn,
|
||||||
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1275,8 +1294,10 @@ co_WinPosSetWindowPos(
|
||||||
{
|
{
|
||||||
ExposedRgn = IntSysCreateRectRgn(0, 0, 0, 0);
|
ExposedRgn = IntSysCreateRectRgn(0, 0, 0, 0);
|
||||||
NtGdiCombineRgn(ExposedRgn, VisBefore, NULL, RGN_COPY);
|
NtGdiCombineRgn(ExposedRgn, VisBefore, NULL, RGN_COPY);
|
||||||
NtGdiOffsetRgn(ExposedRgn, OldWindowRect.left - NewWindowRect.left,
|
NtGdiOffsetRgn( ExposedRgn,
|
||||||
|
OldWindowRect.left - NewWindowRect.left,
|
||||||
OldWindowRect.top - NewWindowRect.top);
|
OldWindowRect.top - NewWindowRect.top);
|
||||||
|
|
||||||
if (VisAfter != NULL)
|
if (VisAfter != NULL)
|
||||||
RgnType = NtGdiCombineRgn(ExposedRgn, ExposedRgn, VisAfter, RGN_DIFF);
|
RgnType = NtGdiCombineRgn(ExposedRgn, ExposedRgn, VisAfter, RGN_DIFF);
|
||||||
else
|
else
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue