diff --git a/reactos/win32ss/gdi/eng/engobjects.h b/reactos/win32ss/gdi/eng/engobjects.h index a65772d4d60..e907ae380ca 100644 --- a/reactos/win32ss/gdi/eng/engobjects.h +++ b/reactos/win32ss/gdi/eng/engobjects.h @@ -85,6 +85,7 @@ typedef struct _CLIPGDI { ULONG RectCount; RECTL* Rects; } CLIPGDI, *PCLIPGDI; +C_ASSERT(FIELD_OFFSET(CLIPGDI, ClipObj) == FIELD_OFFSET(CLIPGDI, WndObj.coClient)); // HACK, until we use the original structure #define XCLIPOBJ CLIPGDI diff --git a/reactos/win32ss/gdi/eng/engwindow.c b/reactos/win32ss/gdi/eng/engwindow.c index 34003ceff5a..486ac4a5622 100644 --- a/reactos/win32ss/gdi/eng/engwindow.c +++ b/reactos/win32ss/gdi/eng/engwindow.c @@ -18,11 +18,9 @@ INT gcountPWO = 0; VOID FASTCALL IntEngWndCallChangeProc( - IN WNDOBJ *pwo, - IN FLONG flChanged) + _In_ XCLIPOBJ *Clip, + _In_ FLONG flChanged) { - XCLIPOBJ* Clip = CONTAINING_RECORD(pwo, XCLIPOBJ, WndObj); - if (Clip->ChangeProc == NULL) { return; @@ -35,15 +33,14 @@ IntEngWndCallChangeProc( return; } - /* Call the WNDOBJCHANGEPROC */ - if (flChanged == WOC_CHANGED) - { - pwo = NULL; - } - TRACE("Calling WNDOBJCHANGEPROC (0x%p), Changed = 0x%x\n", Clip->ChangeProc, flChanged); - Clip->ChangeProc(pwo, flChanged); + + /* Call the WNDOBJCHANGEPROC */ + if (flChanged == WOC_CHANGED) + Clip->ChangeProc(NULL, flChanged); + else + Clip->ChangeProc(&Clip->WndObj, flChanged); } /* @@ -112,30 +109,25 @@ IntEngWindowChanged( _In_ PWND Window, _In_ FLONG flChanged) { - PPROPERTY pprop; - XCLIPOBJ *Current; - HWND hWnd; + XCLIPOBJ *Clip; ASSERT_IRQL_LESS_OR_EQUAL(PASSIVE_LEVEL); - hWnd = Window->head.h; - pprop = IntGetProp(Window, AtomWndObj); - if (!pprop) + Clip = UserGetProp(Window, AtomWndObj); + if (!Clip) { return; } - Current = (XCLIPOBJ *)pprop->Data; - if ( gcountPWO && - Current && - Current->Hwnd == hWnd && - Current->WndObj.pvConsumer != NULL ) + + ASSERT(Clip->Hwnd == Window->head.h); + if (Clip->WndObj.pvConsumer != NULL) { /* Update the WNDOBJ */ switch (flChanged) { case WOC_RGN_CLIENT: /* Update the clipobj and client rect of the WNDOBJ */ - IntEngWndUpdateClipObj(Current, Window); + IntEngWndUpdateClipObj(Clip, Window); break; case WOC_DELETE: @@ -144,12 +136,12 @@ IntEngWindowChanged( } /* Call the change proc */ - IntEngWndCallChangeProc(&Current->WndObj, flChanged); + IntEngWndCallChangeProc(Clip, flChanged); /* HACK: Send WOC_CHANGED after WOC_RGN_CLIENT */ if (flChanged == WOC_RGN_CLIENT) { - IntEngWndCallChangeProc(&Current->WndObj, WOC_CHANGED); + IntEngWndCallChangeProc(Clip, WOC_CHANGED); } } } @@ -218,7 +210,7 @@ EngCreateWnd( IntSetProp(Window, AtomWndObj, Clip); ++gcountPWO; - TRACE("EngCreateWnd: SUCCESS!\n"); + TRACE("EngCreateWnd: SUCCESS: %p!\n", WndObjUser); RETURN( WndObjUser); @@ -315,6 +307,7 @@ WNDOBJ_vSetConsumer( IN WNDOBJ *pwo, IN PVOID pvConsumer) { + XCLIPOBJ* Clip = CONTAINING_RECORD(pwo, XCLIPOBJ, WndObj); BOOL Hack; TRACE("WNDOBJ_vSetConsumer: pwo = 0x%p, pvConsumer = 0x%p\n", pwo, pvConsumer); @@ -333,9 +326,9 @@ WNDOBJ_vSetConsumer( if (Hack) { FIXME("Is this hack really needed?\n"); - IntEngWndCallChangeProc(pwo, WOC_RGN_CLIENT); - IntEngWndCallChangeProc(pwo, WOC_CHANGED); - IntEngWndCallChangeProc(pwo, WOC_DRAWN); + IntEngWndCallChangeProc(Clip, WOC_RGN_CLIENT); + IntEngWndCallChangeProc(Clip, WOC_CHANGED); + IntEngWndCallChangeProc(Clip, WOC_DRAWN); } }