Author: jimtabor Date: Fri Oct 5 10:47:42 2007 New Revision: 29394
URL: http://svn.reactos.org/svn/reactos?rev=29394&view=rev Log: Fixed an old typo bug from rev 3450 by dwelch. Add support for DCX_NORESETATTRS and fixed up IntWindowFromDC.
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/windc.c
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/windc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/windc.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/windc.c Fri Oct 5 10:47:42 2007 @@ -248,22 +248,25 @@
if (dce->DCXFlags & DCX_CACHE) { - /* make the DC clean so that SetDCState doesn't try to update the vis rgn */ - IntGdiSetHookFlags(dce->hDC, DCHF_VALIDATEVISRGN); - - PDC dc = DC_LockDc ( dce->hDC ); - IntGdiCopyFromSaveState(dc, defaultDCstate, dce->hDC ); // Was SetDCState. - - dce->DCXFlags &= ~DCX_DCEBUSY; - if (dce->DCXFlags & DCX_DCEDIRTY) - { + if (!(dce->DCXFlags & DCX_NORESETATTRS)) + { + /* make the DC clean so that SetDCState doesn't try to update the vis rgn */ + IntGdiSetHookFlags(dce->hDC, DCHF_VALIDATEVISRGN); + + PDC dc = DC_LockDc ( dce->hDC ); + IntGdiCopyFromSaveState(dc, defaultDCstate, dce->hDC ); // Was SetDCState. + + dce->DCXFlags &= ~DCX_DCEBUSY; + if (dce->DCXFlags & DCX_DCEDIRTY) + { /* don't keep around invalidated entries * because SetDCState() disables hVisRgn updates * by removing dirty bit. */ dce->hwndCurrent = 0; dce->DCXFlags &= DCX_CACHE; dce->DCXFlags |= DCX_DCEEMPTY; - } + } + } } return 1; } @@ -400,7 +403,7 @@ if (Flags & DCX_NOCLIPCHILDREN) { Flags |= DCX_CACHE; - Flags |= ~(DCX_PARENTCLIP | DCX_CLIPCHILDREN); + Flags &= ~(DCX_PARENTCLIP | DCX_CLIPCHILDREN); }
if (Flags & DCX_WINDOW) @@ -475,6 +478,12 @@ { UpdateVisRgn = FALSE; /* updated automatically, via DCHook() */ } + else + { + /* we should free dce->clip_rgn here, but Windows apparently doesn't */ + Dce->DCXFlags &= ~(DCX_EXCLUDERGN | DCX_INTERSECTRGN); + Dce->hClipRgn = NULL; + } #if 1 /* FIXME */ UpdateVisRgn = TRUE; #endif @@ -592,17 +601,18 @@ IntWindowFromDC(HDC hDc) { DCE *Dce; + HWND Ret = NULL; KeEnterCriticalRegion(); for (Dce = FirstDce; Dce != NULL; Dce = Dce->next) { if(Dce->hDC == hDc) { - KeLeaveCriticalRegion(); - return Dce->hwndCurrent; + Ret = Dce->hwndCurrent; + break; } } KeLeaveCriticalRegion(); - return 0; + return Ret; }