Huw Davies : ole32: Add a function to return (and possibly create) the clipboard's window.

Alexandre Julliard julliard at winehq.org
Thu Apr 16 14:34:50 CDT 2009


Module: wine
Branch: master
Commit: 6526b570e15dd0d31157e5432315b648cb2980f4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6526b570e15dd0d31157e5432315b648cb2980f4

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Apr 16 12:09:04 2009 +0100

ole32: Add a function to return (and possibly create) the clipboard's window.

---

 dlls/ole32/clipboard.c |   59 ++++++++++++++++++++++++++----------------------
 1 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/dlls/ole32/clipboard.c b/dlls/ole32/clipboard.c
index 0b67476..0e2acf4 100644
--- a/dlls/ole32/clipboard.c
+++ b/dlls/ole32/clipboard.c
@@ -134,7 +134,7 @@ typedef struct ole_clipbrd
 
     LONG ref;
 
-    HWND hWndClipboard;              /* Hidden clipboard window */
+    HWND window;                     /* Hidden clipboard window */
     IDataObject *pIDataObjectSrc;    /* Source object passed to OleSetClipboard */
     ole_priv_data *cached_enum;      /* Cached result from the enumeration of src data object */
 } ole_clipbrd;
@@ -809,10 +809,10 @@ static ULONG WINAPI OLEClipbrd_IDataObject_AddRef(
 }
 
 /***********************************************************************
- * OLEClipbrd_DestroyWindow(HWND)
+ *                 destroy_clipbrd_window
  * Destroy the clipboard window and unregister its class
  */
-static void OLEClipbrd_DestroyWindow(HWND hwnd)
+static void destroy_clipbrd_window(HWND hwnd)
 {
     static const WCHAR ole32W[] = {'o','l','e','3','2',0};
     HINSTANCE hinst = GetModuleHandleW(ole32W);
@@ -827,8 +827,7 @@ static void OLEClipbrd_Destroy(ole_clipbrd* This)
 
     if (!This) return;
 
-    if ( This->hWndClipboard )
-        OLEClipbrd_DestroyWindow(This->hWndClipboard);
+    if ( This->window ) destroy_clipbrd_window(This->window);
 
     HeapFree(GetProcessHeap(), 0, This);
 }
@@ -903,7 +902,7 @@ static HRESULT WINAPI OLEClipbrd_IDataObject_GetData(
   /*
    * Otherwise, get the data from the windows clipboard using GetClipboardData
    */
-  if ( !OpenClipboard(theOleClipboard->hWndClipboard)) return CLIPBRD_E_CANT_OPEN;
+  if ( !OpenClipboard(theOleClipboard->window)) return CLIPBRD_E_CANT_OPEN;
 
   h = GetClipboardData(pformatetcIn->cfFormat);
   hr = dup_global_mem(h, GMEM_MOVEABLE, &hData);
@@ -1016,7 +1015,7 @@ static HRESULT WINAPI OLEClipbrd_IDataObject_EnumFormatEtc(
     *enum_fmt = NULL;
 
     if ( dwDirection != DATADIR_GET ) return E_NOTIMPL;
-    if ( !OpenClipboard(This->hWndClipboard) ) return CLIPBRD_E_CANT_OPEN;
+    if ( !OpenClipboard(This->window) ) return CLIPBRD_E_CANT_OPEN;
 
     handle = GetClipboardData( ole_priv_data_clipboard_format );
     if(handle)
@@ -1128,7 +1127,7 @@ static ole_clipbrd* OLEClipbrd_Construct(void)
     This->lpvtbl = &OLEClipbrd_IDataObject_VTable;
     This->ref = 1;
 
-    This->hWndClipboard = NULL;
+    This->window = NULL;
     This->pIDataObjectSrc = NULL;
     This->cached_enum = NULL;
 
@@ -1279,6 +1278,20 @@ static HRESULT set_clipboard_formats(ole_clipbrd *clipbrd, IDataObject *data)
     return S_OK;
 }
 
+static HWND create_clipbrd_window(void);
+
+/***********************************************************************
+ *                 get_clipbrd_window
+ */
+static inline HRESULT get_clipbrd_window(ole_clipbrd *clipbrd, HWND *wnd)
+{
+    if ( !clipbrd->window )
+        clipbrd->window = create_clipbrd_window();
+
+    *wnd = clipbrd->window;
+    return *wnd ? S_OK : E_FAIL;
+}
+
 /***********************************************************************
  *                   set_src_dataobject
  *
@@ -1362,10 +1375,9 @@ static LRESULT CALLBACK clipbrd_wndproc(HWND hwnd, UINT message, WPARAM wparam,
 
 
 /***********************************************************************
- * OLEClipbrd_CreateWindow()
- * Create the clipboard window
+ *                 create_clipbrd_window
  */
-static HWND OLEClipbrd_CreateWindow(void)
+static HWND create_clipbrd_window(void)
 {
     WNDCLASSEXW class;
     static const WCHAR ole32W[] = {'o','l','e','3','2',0};
@@ -1440,24 +1452,16 @@ HRESULT WINAPI OleSetClipboard(IDataObject* data)
 {
   HRESULT hr;
   ole_clipbrd *clipbrd;
+  HWND wnd;
 
   TRACE("(%p)\n", data);
 
   if(FAILED(hr = get_ole_clipbrd(&clipbrd))) return hr;
 
-  /*
-   * If the Ole clipboard window hasn't been created yet, create it now.
-   */
-  if ( !clipbrd->hWndClipboard )
-    clipbrd->hWndClipboard = OLEClipbrd_CreateWindow();
-  if ( !clipbrd->hWndClipboard ) return E_FAIL;
+  if(FAILED(hr = get_clipbrd_window(clipbrd, &wnd))) return hr;
 
-  if ( !OpenClipboard(clipbrd->hWndClipboard) ) return CLIPBRD_E_CANT_OPEN;
+  if ( !OpenClipboard(wnd) ) return CLIPBRD_E_CANT_OPEN;
 
-  /*
-   * Empty the current clipboard and make our window the clipboard owner
-   * NOTE: This will trigger a WM_DESTROYCLIPBOARD message
-   */
   if ( !EmptyClipboard() )
   {
     hr = CLIPBRD_E_CANT_EMPTY;
@@ -1467,7 +1471,7 @@ HRESULT WINAPI OleSetClipboard(IDataObject* data)
   hr = set_src_dataobject(clipbrd, data);
   if(FAILED(hr)) goto end;
 
-  hr = set_dataobject_format(clipbrd->hWndClipboard);
+  hr = set_dataobject_format(wnd);
 
 end:
 
@@ -1516,19 +1520,20 @@ HRESULT WINAPI OleFlushClipboard(void)
   FORMATETC rgelt;
   HRESULT hr;
   ole_clipbrd *clipbrd;
+  HWND wnd;
 
   TRACE("()\n");
 
   if(FAILED(hr = get_ole_clipbrd(&clipbrd))) return hr;
 
+  if(FAILED(hr = get_clipbrd_window(clipbrd, &wnd))) return hr;
+
   /*
    * Already flushed or no source DataObject? Nothing to do.
    */
-  if (!clipbrd->pIDataObjectSrc)
-    return S_OK;
+  if (!clipbrd->pIDataObjectSrc) return S_OK;
 
-  if (!OpenClipboard(clipbrd->hWndClipboard))
-    return CLIPBRD_E_CANT_OPEN;
+  if (!OpenClipboard(wnd)) return CLIPBRD_E_CANT_OPEN;
 
   /*
    * Render all HGLOBAL formats supported by the source into




More information about the wine-cvs mailing list