[PATCH 04/11] winemac: Use unixlib interface for dragdrop.c calls.

Jacek Caban wine at gitlab.winehq.org
Thu Jun 2 19:51:19 CDT 2022


From: Jacek Caban <jacek at codeweavers.com>

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 dlls/winemac.drv/clipboard.c   | 61 +++++++++++++++++++++++-----------
 dlls/winemac.drv/dragdrop.c    | 34 ++++++++++---------
 dlls/winemac.drv/macdrv.h      |  6 ++--
 dlls/winemac.drv/macdrv_main.c |  4 +++
 dlls/winemac.drv/unixlib.h     | 18 ++++++++++
 5 files changed, 86 insertions(+), 37 deletions(-)

diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c
index 16c44ddfde6..f46bb389cc9 100644
--- a/dlls/winemac.drv/clipboard.c
+++ b/dlls/winemac.drv/clipboard.c
@@ -248,6 +248,12 @@ static const char *debugstr_format(UINT id)
 }
 
 
+static CFTypeRef pasteboard_from_handle(UINT64 handle)
+{
+    return (CFTypeRef)(UINT_PTR)handle;
+}
+
+
 /**************************************************************************
  *              insert_clipboard_format
  */
@@ -1201,14 +1207,16 @@ HANDLE macdrv_get_pasteboard_data(CFTypeRef pasteboard, UINT desired_format)
 /**************************************************************************
  *              macdrv_pasteboard_has_format
  */
-BOOL macdrv_pasteboard_has_format(CFTypeRef pasteboard, UINT desired_format)
+NTSTATUS macdrv_dnd_have_format(void *arg)
 {
+    struct dnd_have_format_params *params = arg;
+    CFTypeRef pasteboard = pasteboard_from_handle(params->handle);
     CFArrayRef types;
     int count;
     UINT i;
     BOOL found = FALSE;
 
-    TRACE("pasteboard %p, desired_format %s\n", pasteboard, debugstr_format(desired_format));
+    TRACE("pasteboard %p, desired_format %s\n", pasteboard, debugstr_format(params->format));
 
     types = macdrv_copy_pasteboard_types(pasteboard);
     if (!types)
@@ -1229,7 +1237,7 @@ BOOL macdrv_pasteboard_has_format(CFTypeRef pasteboard, UINT desired_format)
         {
             TRACE("for type %s got format %s\n", debugstr_cf(type), debugstr_format(format->format_id));
 
-            if (format->format_id == desired_format)
+            if (format->format_id == params->format)
             {
                 found = TRUE;
                 break;
@@ -1365,33 +1373,24 @@ static WINE_CLIPFORMAT** get_formats_for_pasteboard(CFTypeRef pasteboard, UINT *
 
 
 /**************************************************************************
- *              macdrv_get_pasteboard_formats
+ *              macdrv_dnd_get_formats
  */
-UINT* macdrv_get_pasteboard_formats(CFTypeRef pasteboard, UINT* num_formats)
+NTSTATUS macdrv_dnd_get_formats(void *arg)
 {
+    struct dnd_get_formats_params *params = arg;
+    CFTypeRef pasteboard = pasteboard_from_handle(params->handle);
     WINE_CLIPFORMAT** formats;
     UINT count, i;
-    UINT* format_ids;
 
     formats = get_formats_for_pasteboard(pasteboard, &count);
     if (!formats)
-        return NULL;
-
-    format_ids = malloc(count);
-    if (!format_ids)
-    {
-        WARN("Failed to allocate formats IDs array\n");
-        free(formats);
-        return NULL;
-    }
+        return 0;
+    count = min(count, ARRAYSIZE(params->formats));
 
     for (i = 0; i < count; i++)
-        format_ids[i] = formats[i]->format_id;
-
-    free(formats);
+        params->formats[i] = formats[i]->format_id;
 
-    *num_formats = count;
-    return format_ids;
+    return count;
 }
 
 
@@ -1746,3 +1745,25 @@ void macdrv_lost_pasteboard_ownership(HWND hwnd)
     if (!macdrv_is_pasteboard_owner(clipboard_cocoa_window))
         grab_win32_clipboard();
 }
+
+
+/**************************************************************************
+ *              macdrv_dnd_release
+ */
+NTSTATUS macdrv_dnd_release(void *arg)
+{
+    UINT64 handle = *(UINT64 *)arg;
+    CFRelease(pasteboard_from_handle(handle));
+    return 0;
+}
+
+
+/**************************************************************************
+ *              macdrv_dnd_retain
+ */
+NTSTATUS macdrv_dnd_retain(void *arg)
+{
+    UINT64 handle = *(UINT64 *)arg;
+    CFRetain(pasteboard_from_handle(handle));
+    return 0;
+}
diff --git a/dlls/winemac.drv/dragdrop.c b/dlls/winemac.drv/dragdrop.c
index c3172a29467..962a9d8c24b 100644
--- a/dlls/winemac.drv/dragdrop.c
+++ b/dlls/winemac.drv/dragdrop.c
@@ -42,7 +42,7 @@ typedef struct
 {
     IDataObject IDataObject_iface;
     LONG        ref;
-    CFTypeRef   pasteboard;
+    UINT64      pasteboard;
 } DragDropDataObject;
 
 
@@ -131,7 +131,7 @@ static ULONG WINAPI dddo_Release(IDataObject* iface)
         return refCount;
 
     TRACE("-- destroying DragDropDataObject (%p)\n", This);
-    CFRelease(This->pasteboard);
+    MACDRV_CALL(dnd_release, &This->pasteboard);
     HeapFree(GetProcessHeap(), 0, This);
     return 0;
 }
@@ -148,7 +148,7 @@ static HRESULT WINAPI dddo_GetData(IDataObject* iface, FORMATETC* formatEtc, STG
     if (SUCCEEDED(hr))
     {
         medium->tymed = TYMED_HGLOBAL;
-        medium->u.hGlobal = macdrv_get_pasteboard_data(This->pasteboard, formatEtc->cfFormat);
+        medium->u.hGlobal = macdrv_get_pasteboard_data((void *)(UINT_PTR)This->pasteboard, formatEtc->cfFormat);
         medium->pUnkForRelease = NULL;
         hr = medium->u.hGlobal ? S_OK : E_OUTOFMEMORY;
     }
@@ -168,6 +168,7 @@ static HRESULT WINAPI dddo_GetDataHere(IDataObject* iface, FORMATETC* formatEtc,
 static HRESULT WINAPI dddo_QueryGetData(IDataObject* iface, FORMATETC* formatEtc)
 {
     DragDropDataObject *This = impl_from_IDataObject(iface);
+    struct dnd_have_format_params params;
     HRESULT hr = DV_E_FORMATETC;
 
     TRACE("This %p formatEtc %p={.tymed=0x%x, .dwAspect=%d, .cfFormat=%s}\n",
@@ -185,7 +186,9 @@ static HRESULT WINAPI dddo_QueryGetData(IDataObject* iface, FORMATETC* formatEtc
         return E_NOTIMPL;
     }
 
-    if (macdrv_pasteboard_has_format(This->pasteboard, formatEtc->cfFormat))
+    params.handle = This->pasteboard;
+    params.format = formatEtc->cfFormat;
+    if (MACDRV_CALL(dnd_have_format, &params))
         hr = S_OK;
 
     TRACE(" -> 0x%x\n", hr);
@@ -225,7 +228,8 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction,
                                          IEnumFORMATETC** enumFormatEtc)
 {
     DragDropDataObject *This = impl_from_IDataObject(iface);
-    UINT *formats, count;
+    struct dnd_get_formats_params params;
+    UINT count;
     HRESULT hr;
 
     TRACE("This %p direction %u enumFormatEtc %p\n", This, direction, enumFormatEtc);
@@ -236,8 +240,9 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction,
         return E_NOTIMPL;
     }
 
-    formats = macdrv_get_pasteboard_formats(This->pasteboard, &count);
-    if (formats)
+    params.handle = This->pasteboard;
+    count = MACDRV_CALL(dnd_get_formats, &params);
+    if (count)
     {
         FORMATETC *formatEtcs = HeapAlloc(GetProcessHeap(), 0, count * sizeof(FORMATETC));
         if (formatEtcs)
@@ -246,7 +251,7 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction,
 
             for (i = 0; i < count; i++)
             {
-                formatEtcs[i].cfFormat = formats[i];
+                formatEtcs[i].cfFormat = params.formats[i];
                 formatEtcs[i].ptd = NULL;
                 formatEtcs[i].dwAspect = DVASPECT_CONTENT;
                 formatEtcs[i].lindex = -1;
@@ -258,8 +263,6 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction,
         }
         else
             hr = E_OUTOFMEMORY;
-
-        HeapFree(GetProcessHeap(), 0, formats);
     }
     else
         hr = SHCreateStdEnumFmtEtc(0, NULL, enumFormatEtc);
@@ -309,7 +312,7 @@ static const IDataObjectVtbl dovt =
 };
 
 
-static IDataObject *create_data_object_for_pasteboard(CFTypeRef pasteboard)
+static IDataObject *create_data_object_for_pasteboard(UINT64 pasteboard)
 {
     DragDropDataObject *dddo;
 
@@ -319,7 +322,8 @@ static IDataObject *create_data_object_for_pasteboard(CFTypeRef pasteboard)
 
     dddo->ref = 1;
     dddo->IDataObject_iface.lpVtbl = &dovt;
-    dddo->pasteboard = CFRetain(pasteboard);
+    dddo->pasteboard = pasteboard;
+    MACDRV_CALL(dnd_retain, &dddo->pasteboard);
 
     return &dddo->IDataObject_iface;
 }
@@ -421,7 +425,7 @@ NTSTATUS WINAPI macdrv_dnd_query_drop(void *arg, ULONG size)
         if (!active_data_object)
         {
             WARN("shouldn't happen: no active IDataObject\n");
-            active_data_object = create_data_object_for_pasteboard((void *)(UINT_PTR)params->handle);
+            active_data_object = create_data_object_for_pasteboard(params->handle);
         }
 
         pointl.x = pt.x;
@@ -564,7 +568,7 @@ NTSTATUS WINAPI macdrv_dnd_query_drag(void *arg, ULONG size)
             POINTL pointl = { pt.x, pt.y };
 
             if (!active_data_object)
-                active_data_object = create_data_object_for_pasteboard((void *)(UINT_PTR)params->handle);
+                active_data_object = create_data_object_for_pasteboard(params->handle);
 
             TRACE("DragEnter hwnd %p droptarget %p\n", hwnd, droptarget);
             hr = IDropTarget_DragEnter(droptarget, active_data_object, MK_LBUTTON,
@@ -605,7 +609,7 @@ NTSTATUS WINAPI macdrv_dnd_query_drag(void *arg, ULONG size)
             FORMATETC formatEtc;
 
             if (!active_data_object)
-                active_data_object = create_data_object_for_pasteboard((void *)(UINT_PTR)params->handle);
+                active_data_object = create_data_object_for_pasteboard(params->handle);
 
             formatEtc.cfFormat = CF_HDROP;
             formatEtc.ptd = NULL;
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
index ce71baa5735..4c1a21a3fe8 100644
--- a/dlls/winemac.drv/macdrv.h
+++ b/dlls/winemac.drv/macdrv.h
@@ -256,8 +256,6 @@ extern void macdrv_UpdateClipboard(void) DECLSPEC_HIDDEN;
 extern BOOL query_pasteboard_data(HWND hwnd, CFStringRef type) DECLSPEC_HIDDEN;
 extern void macdrv_lost_pasteboard_ownership(HWND hwnd) DECLSPEC_HIDDEN;
 extern HANDLE macdrv_get_pasteboard_data(CFTypeRef pasteboard, UINT desired_format) DECLSPEC_HIDDEN;
-extern BOOL macdrv_pasteboard_has_format(CFTypeRef pasteboard, UINT desired_format) DECLSPEC_HIDDEN;
-extern UINT* macdrv_get_pasteboard_formats(CFTypeRef pasteboard, UINT* num_formats) DECLSPEC_HIDDEN;
 
 extern struct opengl_funcs *macdrv_wine_get_wgl_driver(UINT version) DECLSPEC_HIDDEN;
 extern const struct vulkan_funcs *macdrv_wine_get_vulkan_driver(UINT version) DECLSPEC_HIDDEN;
@@ -287,6 +285,10 @@ extern NTSTATUS WINAPI macdrv_ime_query_char_rect(void *params, ULONG size) DECL
 
 /* unixlib interface */
 
+extern NTSTATUS macdrv_dnd_get_formats(void *arg) DECLSPEC_HIDDEN;
+extern NTSTATUS macdrv_dnd_have_format(void *arg) DECLSPEC_HIDDEN;
+extern NTSTATUS macdrv_dnd_release(void *arg) DECLSPEC_HIDDEN;
+extern NTSTATUS macdrv_dnd_retain(void *arg) DECLSPEC_HIDDEN;
 extern NTSTATUS macdrv_ime_process_text_input(void *arg) DECLSPEC_HIDDEN;
 extern NTSTATUS macdrv_notify_icon(void *arg) DECLSPEC_HIDDEN;
 
diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c
index 4ef9060ea4b..a0b29604e62 100644
--- a/dlls/winemac.drv/macdrv_main.c
+++ b/dlls/winemac.drv/macdrv_main.c
@@ -630,6 +630,10 @@ static NTSTATUS macdrv_ime_using_input_method(void *arg)
 
 const unixlib_entry_t __wine_unix_call_funcs[] =
 {
+    macdrv_dnd_get_formats,
+    macdrv_dnd_have_format,
+    macdrv_dnd_release,
+    macdrv_dnd_retain,
     macdrv_ime_clear,
     macdrv_ime_process_text_input,
     macdrv_ime_using_input_method,
diff --git a/dlls/winemac.drv/unixlib.h b/dlls/winemac.drv/unixlib.h
index f4a8b7982f5..b29bf99e7f4 100644
--- a/dlls/winemac.drv/unixlib.h
+++ b/dlls/winemac.drv/unixlib.h
@@ -21,6 +21,10 @@
 
 enum macdrv_funcs
 {
+    unix_dnd_get_formats,
+    unix_dnd_have_format,
+    unix_dnd_release,
+    unix_dnd_retain,
     unix_ime_clear,
     unix_ime_process_text_input,
     unix_ime_using_input_method,
@@ -33,6 +37,20 @@ enum macdrv_funcs
 extern NTSTATUS unix_call(enum macdrv_funcs code, void *params) DECLSPEC_HIDDEN;
 #define MACDRV_CALL(func, params) unix_call( unix_ ## func, params )
 
+/* macdrv_dnd_get_formats params */
+struct dnd_get_formats_params
+{
+    UINT64 handle;
+    UINT formats[64];
+};
+
+/* macdrv_dnd_have_format params */
+struct dnd_have_format_params
+{
+    UINT64 handle;
+    UINT format;
+};
+
 /* macdrv_ime_process_text_input params */
 struct process_text_input_params
 {
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/177



More information about the wine-devel mailing list