Author: greatlrd Date: Mon Nov 24 01:21:33 2008 New Revision: 37607
URL: http://svn.reactos.org/svn/reactos?rev=37607&view=rev Log: Implement WinWatchGetClipList. Update WinWatchClose thx to WinWatchGetClipList ToDO Now only two api left to implement DCIEndAccess and DCIBeginAccess
Modified: branches/reactx/reactos/dll/win32/dciman32/dciman32.def branches/reactx/reactos/dll/win32/dciman32/dciman_main.c
Modified: branches/reactx/reactos/dll/win32/dciman32/dciman32.def URL: http://svn.reactos.org/svn/reactos/branches/reactx/reactos/dll/win32/dciman3... ============================================================================== --- branches/reactx/reactos/dll/win32/dciman32/dciman32.def [iso-8859-1] (original) +++ branches/reactx/reactos/dll/win32/dciman32/dciman32.def [iso-8859-1] Mon Nov 24 01:21:33 2008 @@ -17,6 +17,6 @@ GetWindowRegionData@12 WinWatchClose@4 WinWatchDidStatusChange@4 -; WinWatchGetClipList + WinWatchGetClipList@16 WinWatchNotify@12 WinWatchOpen@4
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 Nov 24 01:21:33 2008 @@ -16,7 +16,9 @@ typedef struct _WINWATCH_INT { HWND hWnd; - BOOL WinWtachStatus; + BOOL WinWatchStatus; + LPRGNDATA lpRgnData; + UINT RgnDataSize; } WINWATCH_INT, *LPWINWATCH_INT;
@@ -420,10 +422,17 @@ void WINAPI WinWatchClose(HWINWATCH hWW) { + LPWINWATCH_INT pWinwatch_int = (LPWINWATCH_INT)hWW; + EnterCriticalSection(&ddcs);
- if (hWW != NULL) - { + if (pWinwatch_int != NULL) + { + if (pWinwatch_int->lpRgnData != NULL) + { + HeapFree(GetProcessHeap(), 0, pWinwatch_int->lpRgnData); + } + HeapFree(GetProcessHeap(), 0, hWW); }
@@ -434,8 +443,83 @@ WinWatchDidStatusChange(HWINWATCH hWW) { LPWINWATCH_INT pWinwatch_int = (LPWINWATCH_INT)hWW; - return pWinwatch_int->WinWtachStatus; -} + return pWinwatch_int->WinWatchStatus; +} + +UINT WINAPI +WinWatchGetClipList(HWINWATCH hWW, + LPRECT prc, + UINT size, + LPRGNDATA prd) +{ + + LPWINWATCH_INT pWinwatch_int = (LPWINWATCH_INT) hWW; + DWORD BufferRequestSize; + DWORD NewBufferRequestSize; + + /* Check see if the WinWatch status have changes, it can only be change from DciBeginAccess and DciEndAcess */ + if (pWinwatch_int->WinWatchStatus != FALSE) + { + /* The status have change, Rest some internal value */ + pWinwatch_int->WinWatchStatus = FALSE; + pWinwatch_int->RgnDataSize = 0; + + /* Get the buffer size */ + BufferRequestSize = GetWindowRegionData(pWinwatch_int->hWnd, 0, NULL); + + /* We got a buffer size */ + if (BufferRequestSize != 0) + { + /* We need endless loop to get the buffer size, for we need waiting on gdi when it is ready, to give us that */ + while (1) + { + /* Check see if we got a buffer already for GetWindowRegionData */ + if (pWinwatch_int->lpRgnData != NULL) + { + /* Free our buffer for GetWindowRegionData */ + HeapFree(GetProcessHeap(), 0, pWinwatch_int->lpRgnData); + } + + /* Free our buffer for GetWindowRegionData */ + if ( (pWinwatch_int->lpRgnData = (LPRGNDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, BufferRequestSize )) == NULL ) + { + /* Fail to alloc our buffer for GetWindowRegionData */ + break; + } + + /* Get our data from GetWindowRegionData */ + NewBufferRequestSize = GetWindowRegionData(pWinwatch_int->hWnd, BufferRequestSize, pWinwatch_int->lpRgnData); + + /* Check see if the buffer size match */ + if (NewBufferRequestSize == BufferRequestSize) + { + /* The buffer size match */ + pWinwatch_int->RgnDataSize = BufferRequestSize; + break; + } + else if (BufferRequestSize == 0) + { + /* No buffer size was given */ + break; + } + BufferRequestSize = NewBufferRequestSize; + } + } + } + + /* Setup return data */ + if (size == pWinwatch_int->RgnDataSize) + { + if (pWinwatch_int->RgnDataSize != 0) + { + memcpy(prd,pWinwatch_int->lpRgnData,pWinwatch_int->RgnDataSize); + } + } + + /* return our value */ + return pWinwatch_int->RgnDataSize; +} +
/***********************************************************************************************************/