diff --git a/reactos/win32ss/gdi/eng/eng.h b/reactos/win32ss/gdi/eng/eng.h index fba140b9921..fac3f97cca7 100644 --- a/reactos/win32ss/gdi/eng/eng.h +++ b/reactos/win32ss/gdi/eng/eng.h @@ -18,8 +18,8 @@ IntEngMaskBlt(SURFOBJ *psoDest, VOID FASTCALL IntEngWindowChanged( - PWND Window, - FLONG flChanged); + _In_ PWND Window, + _In_ FLONG flChanged); VOID FASTCALL IntGdiAcquireSemaphore ( HSEMAPHORE hsem ); VOID FASTCALL IntGdiReleaseSemaphore ( HSEMAPHORE hsem ); diff --git a/reactos/win32ss/gdi/eng/engwindow.c b/reactos/win32ss/gdi/eng/engwindow.c index cbb7f7c6099..423f61f79e2 100644 --- a/reactos/win32ss/gdi/eng/engwindow.c +++ b/reactos/win32ss/gdi/eng/engwindow.c @@ -6,9 +6,6 @@ * PROGRAMER: Gregor Anich */ -/* TODO: Check how the WNDOBJ implementation should behave with a driver on windows. - */ - #include #define NDEBUG @@ -22,32 +19,32 @@ INT gcountPWO = 0; VOID FASTCALL IntEngWndCallChangeProc( - IN WNDOBJ *pwo, - IN FLONG flChanged) + IN WNDOBJ *pwo, + IN FLONG flChanged) { - WNDGDI *WndObjInt = ObjToGDI(pwo, WND); + WNDGDI *WndObjInt = ObjToGDI(pwo, WND); - if (WndObjInt->ChangeProc == NULL) + if (WndObjInt->ChangeProc == NULL) { - return; + return; } - /* check flags of the WNDOBJ */ - flChanged &= WndObjInt->Flags; - if (flChanged == 0) + /* check flags of the WNDOBJ */ + flChanged &= WndObjInt->Flags; + if (flChanged == 0) { - return; + return; } - /* Call the WNDOBJCHANGEPROC */ - if (flChanged == WOC_CHANGED) + /* Call the WNDOBJCHANGEPROC */ + if (flChanged == WOC_CHANGED) { - pwo = NULL; + pwo = NULL; } - DPRINT("Calling WNDOBJCHANGEPROC (0x%p), Changed = 0x%x\n", - WndObjInt->ChangeProc, flChanged); - WndObjInt->ChangeProc(pwo, flChanged); + DPRINT("Calling WNDOBJCHANGEPROC (0x%p), Changed = 0x%x\n", + WndObjInt->ChangeProc, flChanged); + WndObjInt->ChangeProc(pwo, flChanged); } /* @@ -56,74 +53,74 @@ IntEngWndCallChangeProc( BOOLEAN FASTCALL IntEngWndUpdateClipObj( - WNDGDI *WndObjInt, - PWND Window) + WNDGDI *WndObjInt, + PWND Window) { - HRGN hVisRgn; - PROSRGNDATA visRgn; - CLIPOBJ *ClipObj = NULL; - CLIPOBJ *OldClipObj; + HRGN hVisRgn; + PROSRGNDATA visRgn; + CLIPOBJ *ClipObj = NULL; + CLIPOBJ *OldClipObj; - DPRINT("IntEngWndUpdateClipObj\n"); + DPRINT("IntEngWndUpdateClipObj\n"); - hVisRgn = VIS_ComputeVisibleRegion(Window, TRUE, TRUE, TRUE); - if (hVisRgn != NULL) - { - NtGdiOffsetRgn(hVisRgn, Window->rcClient.left, Window->rcClient.top); - visRgn = RGNOBJAPI_Lock(hVisRgn, NULL); - if (visRgn != NULL) + hVisRgn = VIS_ComputeVisibleRegion(Window, TRUE, TRUE, TRUE); + if (hVisRgn != NULL) { - if (visRgn->rdh.nCount > 0) - { - ClipObj = IntEngCreateClipRegion(visRgn->rdh.nCount, visRgn->Buffer, - &visRgn->rdh.rcBound); - DPRINT("Created visible region with %lu rects\n", visRgn->rdh.nCount); - DPRINT(" BoundingRect: %d, %d %d, %d\n", - visRgn->rdh.rcBound.left, visRgn->rdh.rcBound.top, - visRgn->rdh.rcBound.right, visRgn->rdh.rcBound.bottom); + NtGdiOffsetRgn(hVisRgn, Window->rcClient.left, Window->rcClient.top); + visRgn = RGNOBJAPI_Lock(hVisRgn, NULL); + if (visRgn != NULL) { - ULONG i; - for (i = 0; i < visRgn->rdh.nCount; i++) - { - DPRINT(" Rect #%lu: %ld,%ld %ld,%ld\n", i+1, - visRgn->Buffer[i].left, visRgn->Buffer[i].top, - visRgn->Buffer[i].right, visRgn->Buffer[i].bottom); - } + if (visRgn->rdh.nCount > 0) + { + ClipObj = IntEngCreateClipRegion(visRgn->rdh.nCount, visRgn->Buffer, + &visRgn->rdh.rcBound); + DPRINT("Created visible region with %lu rects\n", visRgn->rdh.nCount); + DPRINT(" BoundingRect: %d, %d %d, %d\n", + visRgn->rdh.rcBound.left, visRgn->rdh.rcBound.top, + visRgn->rdh.rcBound.right, visRgn->rdh.rcBound.bottom); + { + ULONG i; + for (i = 0; i < visRgn->rdh.nCount; i++) + { + DPRINT(" Rect #%lu: %ld,%ld %ld,%ld\n", i+1, + visRgn->Buffer[i].left, visRgn->Buffer[i].top, + visRgn->Buffer[i].right, visRgn->Buffer[i].bottom); + } + } + } + RGNOBJAPI_Unlock(visRgn); } - } - RGNOBJAPI_Unlock(visRgn); + else + { + DPRINT1("Warning: Couldn't lock visible region of window DC\n"); + } + GreDeleteObject(hVisRgn); } else { - DPRINT1("Warning: Couldn't lock visible region of window DC\n"); + DPRINT1("Warning: VIS_ComputeVisibleRegion failed!\n"); } - GreDeleteObject(hVisRgn); - } - else - { - DPRINT1("Warning: VIS_ComputeVisibleRegion failed!\n"); - } - if (ClipObj == NULL) - { - /* Fall back to client rect */ - ClipObj = IntEngCreateClipRegion(1, &Window->rcClient, - &Window->rcClient); - } + if (ClipObj == NULL) + { + /* Fall back to client rect */ + ClipObj = IntEngCreateClipRegion(1, &Window->rcClient, + &Window->rcClient); + } - if (ClipObj == NULL) - { - DPRINT1("Warning: IntEngCreateClipRegion() failed!\n"); - return FALSE; - } + if (ClipObj == NULL) + { + DPRINT1("Warning: IntEngCreateClipRegion() failed!\n"); + return FALSE; + } - RtlCopyMemory(&WndObjInt->WndObj.coClient, ClipObj, sizeof (CLIPOBJ)); - RtlCopyMemory(&WndObjInt->WndObj.rclClient, &Window->rcClient, sizeof (RECT)); - OldClipObj = InterlockedExchangePointer((PVOID*)&WndObjInt->ClientClipObj, ClipObj); - if (OldClipObj != NULL) - IntEngDeleteClipRegion(OldClipObj); + RtlCopyMemory(&WndObjInt->WndObj.coClient, ClipObj, sizeof (CLIPOBJ)); + RtlCopyMemory(&WndObjInt->WndObj.rclClient, &Window->rcClient, sizeof (RECT)); + OldClipObj = InterlockedExchangePointer((PVOID*)&WndObjInt->ClientClipObj, ClipObj); + if (OldClipObj != NULL) + IntEngDeleteClipRegion(OldClipObj); - return TRUE; + return TRUE; } /* @@ -132,49 +129,49 @@ IntEngWndUpdateClipObj( VOID FASTCALL IntEngWindowChanged( - PWND Window, - FLONG flChanged) + _In_ PWND Window, + _In_ FLONG flChanged) { - PPROPERTY pprop; - WNDGDI *Current; - HWND hWnd; + PPROPERTY pprop; + WNDGDI *Current; + HWND hWnd; - ASSERT_IRQL_LESS_OR_EQUAL(PASSIVE_LEVEL); + ASSERT_IRQL_LESS_OR_EQUAL(PASSIVE_LEVEL); - hWnd = Window->head.h; - pprop = IntGetProp(Window, AtomWndObj); - if (!pprop) - { - return; - } - Current = (WNDGDI *)pprop->Data; - if ( gcountPWO && - Current && - Current->Hwnd == hWnd && - Current->WndObj.pvConsumer != NULL ) - { - /* Update the WNDOBJ */ - switch (flChanged) - { + hWnd = Window->head.h; + pprop = IntGetProp(Window, AtomWndObj); + if (!pprop) + { + return; + } + Current = (WNDGDI *)pprop->Data; + if ( gcountPWO && + Current && + Current->Hwnd == hWnd && + Current->WndObj.pvConsumer != NULL ) + { + /* Update the WNDOBJ */ + switch (flChanged) + { case WOC_RGN_CLIENT: - /* Update the clipobj and client rect of the WNDOBJ */ - IntEngWndUpdateClipObj(Current, Window); - break; + /* Update the clipobj and client rect of the WNDOBJ */ + IntEngWndUpdateClipObj(Current, Window); + break; case WOC_DELETE: - /* FIXME: Should the WNDOBJs be deleted by win32k or by the driver? */ - break; - } + /* FIXME: Should the WNDOBJs be deleted by win32k or by the driver? */ + break; + } - /* Call the change proc */ - IntEngWndCallChangeProc(&Current->WndObj, flChanged); + /* Call the change proc */ + IntEngWndCallChangeProc(&Current->WndObj, flChanged); - /* HACK: Send WOC_CHANGED after WOC_RGN_CLIENT */ - if (flChanged == WOC_RGN_CLIENT) - { - IntEngWndCallChangeProc(&Current->WndObj, WOC_CHANGED); - } - } + /* HACK: Send WOC_CHANGED after WOC_RGN_CLIENT */ + if (flChanged == WOC_RGN_CLIENT) + { + IntEngWndCallChangeProc(&Current->WndObj, WOC_CHANGED); + } + } } /* @@ -183,75 +180,75 @@ IntEngWindowChanged( WNDOBJ* APIENTRY EngCreateWnd( - SURFOBJ *pso, - HWND hWnd, - WNDOBJCHANGEPROC pfn, - FLONG fl, - int iPixelFormat) + SURFOBJ *pso, + HWND hWnd, + WNDOBJCHANGEPROC pfn, + FLONG fl, + int iPixelFormat) { - WNDGDI *WndObjInt = NULL; - WNDOBJ *WndObjUser = NULL; - PWND Window; - BOOL calledFromUser; - DECLARE_RETURN(WNDOBJ*); + WNDGDI *WndObjInt = NULL; + WNDOBJ *WndObjUser = NULL; + PWND Window; + BOOL calledFromUser; + DECLARE_RETURN(WNDOBJ*); - DPRINT("EngCreateWnd: pso = 0x%p, hwnd = 0x%p, pfn = 0x%p, fl = 0x%lx, pixfmt = %d\n", - pso, hWnd, pfn, fl, iPixelFormat); + DPRINT1("EngCreateWnd: pso = 0x%p, hwnd = 0x%p, pfn = 0x%p, fl = 0x%lx, pixfmt = %d\n", + pso, hWnd, pfn, fl, iPixelFormat); - calledFromUser = UserIsEntered(); - if (!calledFromUser){ - UserEnterShared(); - } - - /* Get window object */ - Window = UserGetWindowObject(hWnd); - if (Window == NULL) - { - RETURN( NULL); + calledFromUser = UserIsEntered(); + if (!calledFromUser) { + UserEnterShared(); } - /* Create WNDOBJ */ - WndObjInt = EngAllocMem(0, sizeof (WNDGDI), GDITAG_WNDOBJ); - if (WndObjInt == NULL) + /* Get window object */ + Window = UserGetWindowObject(hWnd); + if (Window == NULL) { - DPRINT1("Failed to allocate memory for a WND structure!\n"); - RETURN( NULL); + RETURN( NULL); } - /* Fill the clipobj */ - WndObjInt->ClientClipObj = NULL; - if (!IntEngWndUpdateClipObj(WndObjInt, Window)) + /* Create WNDOBJ */ + WndObjInt = EngAllocMem(0, sizeof (WNDGDI), GDITAG_WNDOBJ); + if (WndObjInt == NULL) { - EngFreeMem(WndObjInt); - RETURN( NULL); + DPRINT1("Failed to allocate memory for a WND structure!\n"); + RETURN( NULL); } - /* Fill user object */ - WndObjUser = GDIToObj(WndObjInt, WND); - WndObjUser->psoOwner = pso; - WndObjUser->pvConsumer = NULL; + /* Fill the clipobj */ + WndObjInt->ClientClipObj = NULL; + if (!IntEngWndUpdateClipObj(WndObjInt, Window)) + { + EngFreeMem(WndObjInt); + RETURN( NULL); + } - /* Fill internal object */ - WndObjInt->Hwnd = hWnd; - WndObjInt->ChangeProc = pfn; - WndObjInt->Flags = fl; - WndObjInt->PixelFormat = iPixelFormat; + /* Fill user object */ + WndObjUser = GDIToObj(WndObjInt, WND); + WndObjUser->psoOwner = pso; + WndObjUser->pvConsumer = NULL; - /* associate object with window */ - IntSetProp(Window, AtomWndObj, WndObjInt); - ++gcountPWO; + /* Fill internal object */ + WndObjInt->Hwnd = hWnd; + WndObjInt->ChangeProc = pfn; + WndObjInt->Flags = fl; + WndObjInt->PixelFormat = iPixelFormat; - DPRINT("EngCreateWnd: SUCCESS!\n"); + /* associate object with window */ + IntSetProp(Window, AtomWndObj, WndObjInt); + ++gcountPWO; - RETURN( WndObjUser); + DPRINT("EngCreateWnd: SUCCESS!\n"); + + RETURN( WndObjUser); CLEANUP: - if (!calledFromUser){ - UserLeave(); - } + if (!calledFromUser) { + UserLeave(); + } - END_CLEANUP; + END_CLEANUP; } @@ -261,39 +258,39 @@ CLEANUP: VOID APIENTRY EngDeleteWnd( - IN WNDOBJ *pwo) + IN WNDOBJ *pwo) { - WNDGDI *WndObjInt = ObjToGDI(pwo, WND); - PWND Window; - BOOL calledFromUser; + WNDGDI *WndObjInt = ObjToGDI(pwo, WND); + PWND Window; + BOOL calledFromUser; - DPRINT("EngDeleteWnd: pwo = 0x%p\n", pwo); + DPRINT("EngDeleteWnd: pwo = 0x%p\n", pwo); - calledFromUser = UserIsEntered(); - if (!calledFromUser){ - UserEnterExclusive(); - } + calledFromUser = UserIsEntered(); + if (!calledFromUser) { + UserEnterExclusive(); + } - /* Get window object */ - Window = UserGetWindowObject(WndObjInt->Hwnd); - if (Window == NULL) - { - DPRINT1("Warning: Couldnt get window object for WndObjInt->Hwnd!!!\n"); - } - else - { - /* Remove object from window */ - IntRemoveProp(Window, AtomWndObj); - --gcountPWO; - } + /* Get window object */ + Window = UserGetWindowObject(WndObjInt->Hwnd); + if (Window == NULL) + { + DPRINT1("Warning: Couldnt get window object for WndObjInt->Hwnd!!!\n"); + } + else + { + /* Remove object from window */ + IntRemoveProp(Window, AtomWndObj); + --gcountPWO; + } - if (!calledFromUser){ - UserLeave(); - } + if (!calledFromUser) { + UserLeave(); + } - /* Free resources */ - IntEngDeleteClipRegion(WndObjInt->ClientClipObj); - EngFreeMem(WndObjInt); + /* Free resources */ + IntEngDeleteClipRegion(WndObjInt->ClientClipObj); + EngFreeMem(WndObjInt); } @@ -303,18 +300,18 @@ EngDeleteWnd( BOOL APIENTRY WNDOBJ_bEnum( - IN WNDOBJ *pwo, - IN ULONG cj, - OUT ULONG *pul) + IN WNDOBJ *pwo, + IN ULONG cj, + OUT ULONG *pul) { - WNDGDI *WndObjInt = ObjToGDI(pwo, WND); - BOOL Ret; + WNDGDI *WndObjInt = ObjToGDI(pwo, WND); + BOOL Ret; - DPRINT("WNDOBJ_bEnum: pwo = 0x%p, cj = %lu, pul = 0x%p\n", pwo, cj, pul); - Ret = CLIPOBJ_bEnum(WndObjInt->ClientClipObj, cj, pul); + DPRINT("WNDOBJ_bEnum: pwo = 0x%p, cj = %lu, pul = 0x%p\n", pwo, cj, pul); + Ret = CLIPOBJ_bEnum(WndObjInt->ClientClipObj, cj, pul); - DPRINT("WNDOBJ_bEnum: Returning %s\n", Ret ? "True" : "False"); - return Ret; + DPRINT("WNDOBJ_bEnum: Returning %s\n", Ret ? "True" : "False"); + return Ret; } @@ -324,22 +321,22 @@ WNDOBJ_bEnum( ULONG APIENTRY WNDOBJ_cEnumStart( - IN WNDOBJ *pwo, - IN ULONG iType, - IN ULONG iDirection, - IN ULONG cLimit) + IN WNDOBJ *pwo, + IN ULONG iType, + IN ULONG iDirection, + IN ULONG cLimit) { - WNDGDI *WndObjInt = ObjToGDI(pwo, WND); - ULONG Ret; + WNDGDI *WndObjInt = ObjToGDI(pwo, WND); + ULONG Ret; - DPRINT("WNDOBJ_cEnumStart: pwo = 0x%p, iType = %lu, iDirection = %lu, cLimit = %lu\n", - pwo, iType, iDirection, cLimit); + DPRINT("WNDOBJ_cEnumStart: pwo = 0x%p, iType = %lu, iDirection = %lu, cLimit = %lu\n", + pwo, iType, iDirection, cLimit); - /* FIXME: Should we enumerate all rectangles or not? */ - Ret = CLIPOBJ_cEnumStart(WndObjInt->ClientClipObj, FALSE, iType, iDirection, cLimit); + /* FIXME: Should we enumerate all rectangles or not? */ + Ret = CLIPOBJ_cEnumStart(WndObjInt->ClientClipObj, FALSE, iType, iDirection, cLimit); - DPRINT("WNDOBJ_cEnumStart: Returning 0x%lx\n", Ret); - return Ret; + DPRINT("WNDOBJ_cEnumStart: Returning 0x%lx\n", Ret); + return Ret; } @@ -349,29 +346,29 @@ WNDOBJ_cEnumStart( VOID APIENTRY WNDOBJ_vSetConsumer( - IN WNDOBJ *pwo, - IN PVOID pvConsumer) + IN WNDOBJ *pwo, + IN PVOID pvConsumer) { - BOOL Hack; + BOOL Hack; - DPRINT("WNDOBJ_vSetConsumer: pwo = 0x%p, pvConsumer = 0x%p\n", pwo, pvConsumer); + DPRINT("WNDOBJ_vSetConsumer: pwo = 0x%p, pvConsumer = 0x%p\n", pwo, pvConsumer); - Hack = (pwo->pvConsumer == NULL); - pwo->pvConsumer = pvConsumer; + Hack = (pwo->pvConsumer == NULL); + pwo->pvConsumer = pvConsumer; - /* HACKHACKHACK - * - * MSDN says that the WNDOBJCHANGEPROC will be called with the most recent state - * when a WNDOBJ is created - we do it here because most drivers will need pvConsumer - * in the callback to identify the WNDOBJ I think. - * - * - blight - */ - if (Hack) + /* HACKHACKHACK + * + * MSDN says that the WNDOBJCHANGEPROC will be called with the most recent state + * when a WNDOBJ is created - we do it here because most drivers will need pvConsumer + * in the callback to identify the WNDOBJ I think. + * + * - blight + */ + if (Hack) { - IntEngWndCallChangeProc(pwo, WOC_RGN_CLIENT); - IntEngWndCallChangeProc(pwo, WOC_CHANGED); - IntEngWndCallChangeProc(pwo, WOC_DRAWN); + IntEngWndCallChangeProc(pwo, WOC_RGN_CLIENT); + IntEngWndCallChangeProc(pwo, WOC_CHANGED); + IntEngWndCallChangeProc(pwo, WOC_DRAWN); } }