{
for (phWnd = List; *phWnd; ++phWnd)
{
- Window = IntGetWindowObject(*phWnd);
+ Window = UserGetWindowObject(*phWnd);
if (Window && (Window->Style & WS_VISIBLE))
{
+ USER_REFERENCE_ENTRY Ref;
+ UserRefObjectCo(Window, &Ref);
co_IntPaintWindows(Window, Flags);
- ObmDereferenceObject(Window);
+ UserDerefObjectCo(Window);
}
}
ExFreePool(List);
if (!(Flags & RDW_NOCHILDREN) && !(Window->Style & WS_MINIMIZE) &&
((Flags & RDW_ALLCHILDREN) || !(Window->Style & WS_CLIPCHILDREN)))
{
- HWND *List, *phWnd;
PWINDOW_OBJECT Child;
- if ((List = IntWinListChildren(Window)))
+ for (Child = Window->FirstChild; Child; Child = Child->NextSibling)
{
- for (phWnd = List; *phWnd; ++phWnd)
+ if (Child->Style & WS_VISIBLE)
{
- if(!(Child = UserGetWindowObject(*phWnd)))
- {
- continue;
- }
-
- if (Child->Style & WS_VISIBLE)
- {
- /*
- * Recursive call to update children UpdateRegion
- */
- HRGN hRgnTemp = NtGdiCreateRectRgn(0, 0, 0, 0);
- NtGdiCombineRgn(hRgnTemp, hRgn, 0, RGN_COPY);
- IntInvalidateWindows(Child, hRgnTemp, Flags);
- NtGdiDeleteObject(hRgnTemp);
- }
-
+ /*
+ * Recursive call to update children UpdateRegion
+ */
+ HRGN hRgnTemp = NtGdiCreateRectRgn(0, 0, 0, 0);
+ NtGdiCombineRgn(hRgnTemp, hRgn, 0, RGN_COPY);
+ IntInvalidateWindows(Child, hRgnTemp, Flags);
+ NtGdiDeleteObject(hRgnTemp);
}
- ExFreePool(List);
+
}
}
ASSERT_REFS_CO(Window);
- Desktop = PsGetCurrentThread()->Tcb.Win32Thread->Desktop;
+ Desktop = ((PW32THREAD)PsGetCurrentThread()->Tcb.Win32Thread)->Desktop;
CaretInfo = ((PUSER_MESSAGE_QUEUE)Desktop->ActiveMessageQueue)->CaretInfo;
hWndCaret = CaretInfo->hWnd;
PROSRGNDATA Rgn;
NTSTATUS Status;
DECLARE_RETURN(HDC);
+ USER_REFERENCE_ENTRY Ref;
DPRINT("Enter NtUserBeginPaint\n");
UserEnterExclusive();
RETURN( NULL);
}
- UserRefObjectCo(Window);
+ UserRefObjectCo(Window, &Ref);
co_UserHideCaret(Window);
Ps.hdc = UserGetDCEx(Window, Window->UpdateRegion, DCX_INTERSECTRGN | DCX_USESTYLE);
if (!Ps.hdc)
{
- RETURN( NULL);
+ RETURN(NULL);
}
if (Window->UpdateRegion != NULL)
{
UnsafeIntGetRgnBox(Rgn, &Ps.rcPaint);
RGNDATA_UnlockRgn(Rgn);
+ IntGdiIntersectRect(&Ps.rcPaint, &Ps.rcPaint, &Window->ClientRect);
IntGdiOffsetRect(&Ps.rcPaint,
-Window->ClientRect.left,
-Window->ClientRect.top);
if (! NT_SUCCESS(Status))
{
SetLastNtError(Status);
- RETURN( NULL);
+ RETURN(NULL);
}
- RETURN( Ps.hdc);
+ RETURN(Ps.hdc);
CLEANUP:
if (Window) UserDerefObjectCo(Window);
{
PWINDOW_OBJECT Window;
DECLARE_RETURN(BOOL);
+ USER_REFERENCE_ENTRY Ref;
DPRINT("Enter NtUserEndPaint\n");
UserEnterExclusive();
UserReleaseDC(Window, lPs->hdc, TRUE);
- UserRefObjectCo(Window);
+ UserRefObjectCo(Window, &Ref);
co_UserShowCaret(Window);
UserDerefObjectCo(Window);
END_CLEANUP;
}
-/*
- * NtUserInvalidateRect
- *
- * Status
- * @implemented
- */
-
-DWORD STDCALL
-NtUserInvalidateRect(HWND hWnd, CONST RECT *Rect, BOOL Erase)
-{
- return NtUserRedrawWindow(hWnd, Rect, 0, RDW_INVALIDATE | (Erase ? RDW_ERASE : 0));
-}
-
-/*
- * NtUserInvalidateRgn
- *
- * Status
- * @implemented
- */
-
-DWORD STDCALL
-NtUserInvalidateRgn(HWND hWnd, HRGN Rgn, BOOL Erase)
-{
- return NtUserRedrawWindow(hWnd, NULL, Rgn, RDW_INVALIDATE | (Erase ? RDW_ERASE : 0));
-}
-
-
-
-BOOL FASTCALL
-co_UserValidateRgn(PWINDOW_OBJECT Window, HRGN hRgn)
-{
- return co_UserRedrawWindow(Window, NULL, hRgn, RDW_VALIDATE | RDW_NOCHILDREN);
-}
-
-/*
- * NtUserValidateRgn
- *
- * Status
- * @implemented
- */
-
-BOOL STDCALL
-NtUserValidateRgn(HWND hWnd, HRGN hRgn)
-{
- return NtUserRedrawWindow(hWnd, NULL, hRgn, RDW_VALIDATE | RDW_NOCHILDREN);
-}
-
-/*
- * NtUserUpdateWindow
- *
- * Status
- * @implemented
- */
-
-BOOL STDCALL
-NtUserUpdateWindow(HWND hWnd)
-{
- return NtUserRedrawWindow(hWnd, NULL, 0, RDW_UPDATENOW | RDW_ALLCHILDREN);
-}
-
-
-
-
INT FASTCALL
co_UserGetUpdateRgn(PWINDOW_OBJECT Window, HRGN hRgn, BOOL bErase)
{
int RegionType;
+ RECT Rect;
ASSERT_REFS_CO(Window);
}
else
{
- RegionType = NtGdiCombineRgn(hRgn, Window->UpdateRegion, hRgn, RGN_COPY);
+ Rect = Window->ClientRect;
+ IntIntersectWithParents(Window, &Rect);
+ NtGdiSetRectRgn(hRgn, Rect.left, Rect.top, Rect.right, Rect.bottom);
+ RegionType = NtGdiCombineRgn(hRgn, hRgn, Window->UpdateRegion, RGN_AND);
NtGdiOffsetRgn(hRgn, -Window->ClientRect.left, -Window->ClientRect.top);
}
return RegionType;
}
+
/*
* NtUserGetUpdateRgn
*
DECLARE_RETURN(INT);
PWINDOW_OBJECT Window;
INT ret;
+ USER_REFERENCE_ENTRY Ref;
DPRINT("Enter NtUserGetUpdateRgn\n");
UserEnterExclusive();
RETURN(ERROR);
}
- UserRefObjectCo(Window);
+ UserRefObjectCo(Window, &Ref);
ret = co_UserGetUpdateRgn(Window, hRgn, bErase);
UserDerefObjectCo(Window);
RECT Rect;
INT RegionType;
PROSRGNDATA RgnData;
- BOOL AlwaysPaint;
NTSTATUS Status;
DECLARE_RETURN(BOOL);
if (!(Window = UserGetWindowObject(hWnd)))
{
- RETURN( ERROR);
+ RETURN(FALSE);
}
if (Window->UpdateRegion == NULL)
}
else
{
- RgnData = RGNDATA_LockRgn(Window->UpdateRegion);
- ASSERT(RgnData != NULL);
- RegionType = UnsafeIntGetRgnBox(RgnData, &Rect);
- ASSERT(RegionType != ERROR);
- RGNDATA_UnlockRgn(RgnData);
+ /* Get the update region bounding box. */
+ if (Window->UpdateRegion == (HRGN)1)
+ {
+ Rect = Window->ClientRect;
+ }
+ else
+ {
+ RgnData = RGNDATA_LockRgn(Window->UpdateRegion);
+ ASSERT(RgnData != NULL);
+ RegionType = UnsafeIntGetRgnBox(RgnData, &Rect);
+ RGNDATA_UnlockRgn(RgnData);
+
+ if (RegionType != ERROR && RegionType != NULLREGION)
+ IntGdiIntersectRect(&Rect, &Rect, &Window->ClientRect);
+ }
+
+ if (IntIntersectWithParents(Window, &Rect))
+ {
+ IntGdiOffsetRect(&Rect,
+ -Window->ClientRect.left,
+ -Window->ClientRect.top);
+ } else
+ {
+ Rect.left = Rect.top = Rect.right = Rect.bottom = 0;
+ }
}
- AlwaysPaint = (Window->Flags & WINDOWOBJECT_NEED_NCPAINT) ||
- (Window->Flags & WINDOWOBJECT_NEED_INTERNALPAINT);
- if (bErase && Rect.left < Rect.right && Rect.top < Rect.bottom)
+ if (bErase && !IntGdiIsEmptyRect(&Rect))
{
- UserRefObjectCo(Window);
+ USER_REFERENCE_ENTRY Ref;
+ UserRefObjectCo(Window, &Ref);
co_UserRedrawWindow(Window, NULL, NULL, RDW_ERASENOW | RDW_NOCHILDREN);
UserDerefObjectCo(Window);
}
if (!NT_SUCCESS(Status))
{
SetLastWin32Error(ERROR_INVALID_PARAMETER);
- RETURN( FALSE);
+ RETURN(FALSE);
}
}
- RETURN( (Rect.left < Rect.right && Rect.top < Rect.bottom) || AlwaysPaint);
+ RETURN(!IntGdiIsEmptyRect(&Rect));
CLEANUP:
DPRINT("Leave NtUserGetUpdateRect, ret=%i\n",_ret_);
NTSTATUS Status;
PWINDOW_OBJECT Wnd;
DECLARE_RETURN(BOOL);
+ USER_REFERENCE_ENTRY Ref;
DPRINT("Enter NtUserRedrawWindow\n");
UserEnterExclusive();
}
}
- UserRefObjectCo(Wnd);
+ UserRefObjectCo(Wnd, &Ref);
Status = co_UserRedrawWindow(Wnd, NULL == lprcUpdate ? NULL : &SafeUpdateRect,
hrgnUpdate, flags);
BOOL bOwnRgn = TRUE;
NTSTATUS Status;
DECLARE_RETURN(DWORD);
+ USER_REFERENCE_ENTRY Ref, CaretRef;
DPRINT("Enter NtUserScrollWindowEx\n");
UserEnterExclusive();
Window = NULL; /* prevent deref at cleanup */
RETURN( ERROR);
}
- UserRefObjectCo(Window);
+ UserRefObjectCo(Window, &Ref);
IntGetClientRect(Window, &rc);
RECT r, dummy;
POINT ClientOrigin;
PWINDOW_OBJECT Wnd;
+ USER_REFERENCE_ENTRY WndRef;
IntGetClientOrigin(Window, &ClientOrigin);
for (i = 0; List[i]; i++)
if (! UnsafeRect || IntGdiIntersectRect(&dummy, &r, &rc))
{
- UserRefObjectCo(Wnd);
+ UserRefObjectCo(Wnd, &WndRef);
co_WinPosSetWindowPos(Wnd, 0, r.left + dx, r.top + dy, 0, 0,
SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE |
SWP_NOREDRAW);
if ((CaretWnd = UserGetWindowObject(hwndCaret)))
{
- UserRefObjectCo(CaretWnd);
+ UserRefObjectCo(CaretWnd, &CaretRef);
co_IntSetCaretPos(caretrc.left + dx, caretrc.top + dy);
co_UserShowCaret(CaretWnd);
UserDerefObjectCo(CaretWnd);
}
- RETURN( Result);
+ RETURN(Result);
CLEANUP:
if (Window)