/* Update the WNDOBJ */
Clip->WndObj.rclClient = Window->rcClient;
+ Clip->WndObj.coClient.iUniq++;
return TRUE;
}
{
XCLIPOBJ *Clip;
- /*
- * This function is broken because AtomWndObj conflicts with
- * properties set from user mode using SetPropW
- */
- return;
-
ASSERT_IRQL_LESS_OR_EQUAL(PASSIVE_LEVEL);
Clip = UserGetProp(Window, AtomWndObj);
}
ASSERT(Clip->Hwnd == Window->head.h);
- if (Clip->WndObj.pvConsumer != NULL)
+ // if (Clip->WndObj.pvConsumer != NULL)
{
/* Update the WNDOBJ */
switch (flChanged)
TRACE("EngCreateWnd: pso = 0x%p, hwnd = 0x%p, pfn = 0x%p, fl = 0x%lx, pixfmt = %d\n",
pso, hWnd, pfn, fl, iPixelFormat);
+ if (fl & (WO_RGN_WINDOW | WO_RGN_DESKTOP_COORD | WO_RGN_UPDATE_ALL))
+ {
+ FIXME("Unsupported flags: 0x%lx\n", fl & ~(WO_RGN_CLIENT_DELTA | WO_RGN_CLIENT | WO_RGN_SURFACE_DELTA | WO_RGN_SURFACE));
+ }
+
calledFromUser = UserIsEntered();
if (!calledFromUser) {
UserEnterShared();
/* Fill internal object */
Clip->Hwnd = hWnd;
Clip->ChangeProc = pfn;
- Clip->Flags = fl;
+ /* Keep track of relevant flags */
+ Clip->Flags = fl & (WO_RGN_CLIENT_DELTA | WO_RGN_CLIENT | WO_RGN_SURFACE_DELTA | WO_RGN_SURFACE | WO_DRAW_NOTIFY);
+ if (fl & WO_SPRITE_NOTIFY)
+ Clip->Flags |= WOC_SPRITE_OVERLAP | WOC_SPRITE_NO_OVERLAP;
+ /* Those should always be sent */
+ Clip->Flags |= WOC_CHANGED | WOC_DELETE;
Clip->PixelFormat = iPixelFormat;
/* associate object with window */
{
/* Remove object from window */
IntRemoveProp(Window, AtomWndObj);
- --gcountPWO;
}
+ --gcountPWO;
if (!calledFromUser) {
UserLeave();
gpsi->atomFrostedWindowProp = IntAddGlobalAtom(L"SysFrostedWindow", TRUE);
- AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
+ /*
+ * FIXME: AddPropW uses the global kernel atom table, thus leading to conflicts if we use
+ * the win32k atom table for this ones. What is the right thing to do ?
+ */
+ // AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
+ NtAddAtom(L"SysWNDO", 14, &AtomWndObj);
AtomLayer = IntAddGlobalAtom(L"SysLayer", TRUE);
AtomFlashWndState = IntAddGlobalAtom(L"FlashWState", TRUE);
Dce->DCXFlags &= ~DCX_DCEDIRTY;
GdiSelectVisRgn(Dce->hDC, RgnVisible);
-
- if (VerifyWnd(Window)) // Window maybe dead by this time before finishing the DCE release.
- {
- IntEngWindowChanged(Window, WOC_RGN_CLIENT);
- }
+ /* Tell GDI driver */
+ if (Window)
+ IntEngWindowChanged(Window, WOC_RGN_CLIENT);
if (RgnVisible != NULL)
{
DceUpdateVisRgn(pDCE, CurrentWindow, pDCE->DCXFlags);
IntGdiSetHookFlags(pDCE->hDC, DCHF_VALIDATEVISRGN);
-
- if (Window->head.h != pDCE->hwndCurrent)
- {
-// IntEngWindowChanged(CurrentWindow, WOC_RGN_CLIENT);
-// UserDerefObject(CurrentWindow);
- }
}
pLE = pDCE->List.Flink;
pDCE = CONTAINING_RECORD(pLE, DCE, List);