Module: wine Branch: master Commit: ef4b6b87496ba269cbf9ba71cbdc90b9a6c43f8e URL: http://source.winehq.org/git/wine.git/?a=commit;h=ef4b6b87496ba269cbf9ba71cb...
Author: Huw Davies huw@codeweavers.com Date: Mon Mar 23 11:47:19 2009 +0000
ole32: Store the ole clipboard window's HWND in the DataObject clipboard format.
---
dlls/ole32/clipboard.c | 48 +++++++++++++++++++++--------------------- dlls/ole32/tests/clipboard.c | 35 ++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 24 deletions(-)
diff --git a/dlls/ole32/clipboard.c b/dlls/ole32/clipboard.c index 8a7bdd2..4c6f35f 100644 --- a/dlls/ole32/clipboard.c +++ b/dlls/ole32/clipboard.c @@ -1271,6 +1271,26 @@ static HWND OLEClipbrd_CreateWindow(void) return hwnd; }
+static HRESULT set_dataobject_format(HWND hwnd) +{ + HGLOBAL h = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, sizeof(hwnd)); + HWND *data; + + if(!h) return E_OUTOFMEMORY; + + data = GlobalLock(h); + *data = hwnd; + GlobalUnlock(h); + + if(!SetClipboardData(dataobject_clipboard_format, h)) + { + GlobalFree(h); + return CLIPBRD_E_CANT_SET; + } + + return S_OK; +} + /*---------------------------------------------------------------------* * Win32 OLE clipboard API *---------------------------------------------------------------------*/ @@ -1296,10 +1316,6 @@ HRESULT WINAPI OleSetClipboard(IDataObject* pDataObj) FORMATETC rgelt; BOOL bClipboardOpen = FALSE; struct oletls *info = COM_CurrentInfo(); -/* - HGLOBAL hDataObject = 0; - OLEClipbrd **ppDataObject; -*/
TRACE("(%p)\n", pDataObj);
@@ -1391,27 +1407,9 @@ HRESULT WINAPI OleSetClipboard(IDataObject* pDataObj)
/* * Windows additionally creates a new "DataObject" clipboard format - * and stores in on the clipboard. We could possibly store a pointer - * to our internal IDataObject interface on the clipboard. I'm not - * sure what the use of this is though. - * Enable the code below for this functionality. + * and stores the clipboard window's HWND in it */ -/* - theOleClipboard->cfDataObj = RegisterClipboardFormatA("DataObject"); - hDataObject = GlobalAlloc( GMEM_DDESHARE|GMEM_MOVEABLE|GMEM_ZEROINIT, - sizeof(OLEClipbrd *)); - if (hDataObject==0) - HANDLE_ERROR( E_OUTOFMEMORY ); - - ppDataObject = GlobalLock(hDataObject); - *ppDataObject = theOleClipboard; - GlobalUnlock(hDataObject); - - if ( !SetClipboardData( theOleClipboard->cfDataObj, hDataObject ) ) - HANDLE_ERROR( CLIPBRD_E_CANT_SET ); -*/ - - hr = S_OK; + hr = set_dataobject_format(theOleClipboard->hWndClipboard);
CLEANUP:
@@ -1541,6 +1539,8 @@ HRESULT WINAPI OleFlushClipboard(void)
IEnumFORMATETC_Release(penumFormatetc);
+ hr = set_dataobject_format(NULL); + /* * Release the source data object we are holding on to */ diff --git a/dlls/ole32/tests/clipboard.c b/dlls/ole32/tests/clipboard.c index a4f8a62..f5ed06a 100644 --- a/dlls/ole32/tests/clipboard.c +++ b/dlls/ole32/tests/clipboard.c @@ -423,6 +423,36 @@ static void test_get_clipboard(void) IDataObject_Release(data_obj); }
+static void test_cf_dataobject(BOOL dataobject_active) +{ + UINT cf = 0; + UINT cf_dataobject = RegisterClipboardFormatA("DataObject"); + BOOL found_dataobject = FALSE; + + OpenClipboard(NULL); + do + { + cf = EnumClipboardFormats(cf); + if(cf == cf_dataobject) + { + HGLOBAL h = GetClipboardData(cf); + HWND *ptr = GlobalLock(h); + DWORD size = GlobalSize(h); + HWND clip_owner = GetClipboardOwner(); + + found_dataobject = TRUE; + ok(size >= sizeof(*ptr), "size %d\n", size); + if(dataobject_active) + ok(*ptr == clip_owner, "hwnd %p clip_owner %p\n", *ptr, clip_owner); + else /* ole clipboard flushed */ + ok(*ptr == NULL, "hwnd %p\n", *ptr); + GlobalUnlock(h); + } + } while(cf); + CloseClipboard(); + ok(found_dataobject, "didn't find cf_dataobject\n"); +} + static void test_set_clipboard(void) { HRESULT hr; @@ -453,6 +483,9 @@ static void test_set_clipboard(void)
hr = OleSetClipboard(data1); ok(hr == S_OK, "failed to set clipboard to data1, hr = 0x%08x\n", hr); + + test_cf_dataobject(TRUE); + hr = OleIsCurrentClipboard(data1); ok(hr == S_OK, "expected current clipboard to be data1, hr = 0x%08x\n", hr); hr = OleIsCurrentClipboard(data2); @@ -480,6 +513,8 @@ static void test_set_clipboard(void) hr = OleIsCurrentClipboard(NULL); ok(hr == S_FALSE, "expect S_FALSE, hr = 0x%08x\n", hr);
+ test_cf_dataobject(FALSE); + ok(OleSetClipboard(NULL) == S_OK, "failed to clear clipboard, hr = 0x%08x\n", hr);
ref = IDataObject_Release(data1);