ole32: Move the code to set the clipboard formats to a separate function.
This commit is contained in:
parent
5f6ae94ad0
commit
3383db6107
|
@ -1271,6 +1271,46 @@ static HWND OLEClipbrd_CreateWindow(void)
|
||||||
return hwnd;
|
return hwnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
* set_clipboard_formats
|
||||||
|
*
|
||||||
|
* Enumerate all HGLOBAL formats supported by the source and make
|
||||||
|
* those formats available using delayed rendering using SetClipboardData.
|
||||||
|
*
|
||||||
|
* TODO: We need to additionally handle TYMED_IStorage and
|
||||||
|
* TYMED_IStream data by copying into global memory.
|
||||||
|
*/
|
||||||
|
static HRESULT set_clipboard_formats(IDataObject *data)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
FORMATETC fmt;
|
||||||
|
IEnumFORMATETC *enum_fmt;
|
||||||
|
|
||||||
|
hr = IDataObject_EnumFormatEtc(data, DATADIR_GET, &enum_fmt);
|
||||||
|
if(FAILED(hr)) return hr;
|
||||||
|
|
||||||
|
while(IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL) == S_OK)
|
||||||
|
{
|
||||||
|
if (fmt.tymed == TYMED_HGLOBAL)
|
||||||
|
{
|
||||||
|
char fmt_name[80];
|
||||||
|
TRACE("(cfFormat=%d:%s)\n", fmt.cfFormat,
|
||||||
|
GetClipboardFormatNameA(fmt.cfFormat, fmt_name, sizeof(fmt_name)-1) ? fmt_name : "");
|
||||||
|
|
||||||
|
SetClipboardData(fmt.cfFormat, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumFORMATETC_Release(enum_fmt);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
* set_dataobject_format
|
||||||
|
*
|
||||||
|
* Windows creates a 'DataObject' clipboard format that contains the
|
||||||
|
* clipboard window's HWND or NULL if the Ole clipboard has been flushed.
|
||||||
|
*/
|
||||||
static HRESULT set_dataobject_format(HWND hwnd)
|
static HRESULT set_dataobject_format(HWND hwnd)
|
||||||
{
|
{
|
||||||
HGLOBAL h = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, sizeof(hwnd));
|
HGLOBAL h = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, sizeof(hwnd));
|
||||||
|
@ -1312,8 +1352,6 @@ static HRESULT set_dataobject_format(HWND hwnd)
|
||||||
HRESULT WINAPI OleSetClipboard(IDataObject* pDataObj)
|
HRESULT WINAPI OleSetClipboard(IDataObject* pDataObj)
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
IEnumFORMATETC* penumFormatetc = NULL;
|
|
||||||
FORMATETC rgelt;
|
|
||||||
BOOL bClipboardOpen = FALSE;
|
BOOL bClipboardOpen = FALSE;
|
||||||
struct oletls *info = COM_CurrentInfo();
|
struct oletls *info = COM_CurrentInfo();
|
||||||
|
|
||||||
|
@ -1361,54 +1399,15 @@ HRESULT WINAPI OleSetClipboard(IDataObject* pDataObj)
|
||||||
theOleClipboard->pIDataObjectSrc = NULL;
|
theOleClipboard->pIDataObjectSrc = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* A NULL value indicates that the clipboard should be emptied. */
|
||||||
* AddRef the data object passed in and save its pointer.
|
|
||||||
* A NULL value indicates that the clipboard should be emptied.
|
|
||||||
*/
|
|
||||||
theOleClipboard->pIDataObjectSrc = pDataObj;
|
theOleClipboard->pIDataObjectSrc = pDataObj;
|
||||||
if ( pDataObj )
|
if ( pDataObj )
|
||||||
{
|
{
|
||||||
IDataObject_AddRef(theOleClipboard->pIDataObjectSrc);
|
IDataObject_AddRef(theOleClipboard->pIDataObjectSrc);
|
||||||
|
hr = set_clipboard_formats(pDataObj);
|
||||||
|
if(FAILED(hr)) goto CLEANUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Enumerate all HGLOBAL formats supported by the source and make
|
|
||||||
* those formats available using delayed rendering using SetClipboardData.
|
|
||||||
* Only global memory based data items may be made available to non-OLE
|
|
||||||
* applications via the standard Windows clipboard API. Data based on other
|
|
||||||
* mediums(non TYMED_HGLOBAL) can only be accessed via the Ole Clipboard API.
|
|
||||||
*
|
|
||||||
* TODO: Do we need to additionally handle TYMED_IStorage media by copying
|
|
||||||
* the storage into global memory?
|
|
||||||
*/
|
|
||||||
if ( pDataObj )
|
|
||||||
{
|
|
||||||
if ( FAILED(hr = IDataObject_EnumFormatEtc( pDataObj,
|
|
||||||
DATADIR_GET,
|
|
||||||
&penumFormatetc )))
|
|
||||||
{
|
|
||||||
HANDLE_ERROR( hr );
|
|
||||||
}
|
|
||||||
|
|
||||||
while ( S_OK == IEnumFORMATETC_Next(penumFormatetc, 1, &rgelt, NULL) )
|
|
||||||
{
|
|
||||||
if ( rgelt.tymed == TYMED_HGLOBAL )
|
|
||||||
{
|
|
||||||
CHAR szFmtName[80];
|
|
||||||
TRACE("(cfFormat=%d:%s)\n", rgelt.cfFormat,
|
|
||||||
GetClipboardFormatNameA(rgelt.cfFormat, szFmtName, sizeof(szFmtName)-1)
|
|
||||||
? szFmtName : "");
|
|
||||||
|
|
||||||
SetClipboardData( rgelt.cfFormat, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
IEnumFORMATETC_Release(penumFormatetc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Windows additionally creates a new "DataObject" clipboard format
|
|
||||||
* and stores the clipboard window's HWND in it
|
|
||||||
*/
|
|
||||||
hr = set_dataobject_format(theOleClipboard->hWndClipboard);
|
hr = set_dataobject_format(theOleClipboard->hWndClipboard);
|
||||||
|
|
||||||
CLEANUP:
|
CLEANUP:
|
||||||
|
|
Loading…
Reference in New Issue