Author: greatlrd Date: Mon Jan 5 11:10:21 2009 New Revision: 38585
URL: http://svn.reactos.org/svn/reactos?rev=38585&view=rev Log: rename ddcs to gcsWinWatchLock
add global windows watch list call gpWinWatchList it will be use by DciBeginAccess and DciEndAccess.
Change behavior in WinWatchOpen so it store the new hww into gpWinWatchList.
Change behavior WinWatchClose so it remove the hww entry inside gpWinWatchList.
Modified: branches/reactx/reactos/dll/win32/dciman32/dciman_main.c
Modified: branches/reactx/reactos/dll/win32/dciman32/dciman_main.c URL: http://svn.reactos.org/svn/reactos/branches/reactx/reactos/dll/win32/dciman3... ============================================================================== --- branches/reactx/reactos/dll/win32/dciman32/dciman_main.c [iso-8859-1] (original) +++ branches/reactx/reactos/dll/win32/dciman32/dciman_main.c [iso-8859-1] Mon Jan 5 11:10:21 2009 @@ -9,12 +9,13 @@ #include <ddrawgdi.h> #include <pseh/pseh.h>
-CRITICAL_SECTION ddcs; +
/* Winwatch internal struct */ typedef struct _WINWATCH_INT { + LPVOID prev; HWND hWnd; BOOL WinWatchStatus; LPRGNDATA lpRgnData; @@ -41,6 +42,11 @@ } DCISURFACE_INT, *LPDCISURFACE_INT;
+/* Global value */ +LPWINWATCH_INT gpWinWatchList; +CRITICAL_SECTION gcsWinWatchLock; + +/* Function */ BOOL WINAPI DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID reserved ) @@ -48,11 +54,11 @@ switch(ul_reason_for_call) { case DLL_PROCESS_DETACH: - DeleteCriticalSection( &ddcs ); + DeleteCriticalSection( &gcsWinWatchLock ); break;
case DLL_PROCESS_ATTACH: - InitializeCriticalSection( &ddcs ); + InitializeCriticalSection( &gcsWinWatchLock ); break; } return TRUE; @@ -404,41 +410,115 @@ return retvalue; }
+/*++ +* @name DWORD WINAPI WinWatchOpen(HWND hwnd) +* @implemented +* + +* @return +* +* @remarks. +* None +*/ HWINWATCH WINAPI WinWatchOpen(HWND hwnd) { LPWINWATCH_INT pWinwatch_int;
- EnterCriticalSection(&ddcs); + EnterCriticalSection(&gcsWinWatchLock);
if ( (pWinwatch_int = (LPWINWATCH_INT) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINWATCH_INT) )) != NULL ) { pWinwatch_int->hWnd = hwnd; - } - LeaveCriticalSection(&ddcs); + pWinwatch_int->prev = (LPVOID) gpWinWatchList; + + gpWinWatchList = pWinwatch_int; + } + LeaveCriticalSection(&gcsWinWatchLock); return (HWINWATCH) pWinwatch_int; }
+/*++ +* @name DWORD WINAPI WinWatchClose(HWND hwnd) +* @implemented +* + +* @return +* +* @remarks. +* None +*/ void WINAPI WinWatchClose(HWINWATCH hWW) { - LPWINWATCH_INT pWinwatch_int = (LPWINWATCH_INT)hWW; - - EnterCriticalSection(&ddcs); - - if (pWinwatch_int != NULL) - { - if (pWinwatch_int->lpRgnData != NULL) - { - HeapFree(GetProcessHeap(), 0, pWinwatch_int->lpRgnData); - } - - HeapFree(GetProcessHeap(), 0, hWW); - } - - LeaveCriticalSection(&ddcs); -} - + LPWINWATCH_INT pWinwatch_int = (LPWINWATCH_INT)hWW; + LPWINWATCH_INT tmp_gpWinWatchList ; + LPWINWATCH_INT delete_gpWinWatchList; + + EnterCriticalSection(&gcsWinWatchLock); + + /* Start search see if our hWW exists in the gpWinWatchList */ + tmp_gpWinWatchList = gpWinWatchList; + delete_gpWinWatchList = gpWinWatchList; + + while (delete_gpWinWatchList != pWinwatch_int ) + { + if ( delete_gpWinWatchList == NULL ) + { + /* Noting to delete */ + break; + } + + /* Have we found our entry ? */ + if ( tmp_gpWinWatchList->prev == pWinwatch_int ) + { + /* Yes we found our entry */ + + /* Now we save it to delete_gpWinWatchList */ + delete_gpWinWatchList = tmp_gpWinWatchList->prev; + + /* Remove it from the gpWinWatchList list */ + if ( tmp_gpWinWatchList->prev != NULL ) + { + tmp_gpWinWatchList->prev = ((LPWINWATCH_INT)tmp_gpWinWatchList->prev)->prev ; + } + + } + else + { + /* No so we keep looking */ + tmp_gpWinWatchList = tmp_gpWinWatchList->prev ; + } + } + + /* now we can delete our entry */ + + if ( (delete_gpWinWatchList != NULL) && + (pWinwatch_int == delete_gpWinWatchList) ) + { + /* Check see if we got any region data and free it */ + if (pWinwatch_int->lpRgnData != NULL) + { + HeapFree(GetProcessHeap(), 0, delete_gpWinWatchList->lpRgnData); + } + + /* Free the delete_gpWinWatchList */ + HeapFree(GetProcessHeap(), 0, delete_gpWinWatchList); + } + + LeaveCriticalSection(&gcsWinWatchLock); +} + +/*++ +* @name WinWatchDidStatusChange(HWINWATCH hWW) +* @implemented +* + +* @return +* +* @remarks. +* None +*/ BOOL WINAPI WinWatchDidStatusChange(HWINWATCH hWW) { @@ -446,6 +526,16 @@ return pWinwatch_int->WinWatchStatus; }
+/*++ +* @name WinWatchGetClipList(HWINWATCH hWW) +* @implemented +* + +* @return +* +* @remarks. +* None +*/ UINT WINAPI WinWatchGetClipList(HWINWATCH hWW, LPRECT prc,