[PATCH 03/11] winemac: Use unixlib interface for query_drag_operation.

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


From: Jacek Caban <jacek at codeweavers.com>

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 dlls/winemac.drv/dllmain.c  |  1 +
 dlls/winemac.drv/dragdrop.c | 72 ++++++++-----------------------------
 dlls/winemac.drv/event.c    | 47 ++++++++++++++++++++++++
 dlls/winemac.drv/macdrv.h   |  3 +-
 dlls/winemac.drv/unixlib.h  | 13 ++++++-
 5 files changed, 75 insertions(+), 61 deletions(-)

diff --git a/dlls/winemac.drv/dllmain.c b/dlls/winemac.drv/dllmain.c
index 69bc02e46c2..4bedb2aaf61 100644
--- a/dlls/winemac.drv/dllmain.c
+++ b/dlls/winemac.drv/dllmain.c
@@ -29,6 +29,7 @@ HMODULE macdrv_module = 0;
 typedef NTSTATUS (WINAPI *kernel_callback)(void *params, ULONG size);
 static const kernel_callback kernel_callbacks[] =
 {
+    macdrv_dnd_query_drag,
     macdrv_dnd_query_drop,
     macdrv_dnd_query_exited,
     macdrv_ime_query_char_rect,
diff --git a/dlls/winemac.drv/dragdrop.c b/dlls/winemac.drv/dragdrop.c
index a57caab423b..c3172a29467 100644
--- a/dlls/winemac.drv/dragdrop.c
+++ b/dlls/winemac.drv/dragdrop.c
@@ -325,37 +325,6 @@ static IDataObject *create_data_object_for_pasteboard(CFTypeRef pasteboard)
 }
 
 
-/**************************************************************************
- *              drag_operations_to_dropeffects
- */
-static DWORD drag_operations_to_dropeffects(uint32_t ops)
-{
-    DWORD effects = DROPEFFECT_NONE;
-    if (ops & (DRAG_OP_COPY | DRAG_OP_GENERIC))
-        effects |= DROPEFFECT_COPY;
-    if (ops & DRAG_OP_MOVE)
-        effects |= DROPEFFECT_MOVE;
-    if (ops & (DRAG_OP_LINK | DRAG_OP_GENERIC))
-        effects |= DROPEFFECT_LINK;
-    return effects;
-}
-
-
-/**************************************************************************
- *              dropeffect_to_drag_operation
- */
-static uint32_t dropeffect_to_drag_operation(DWORD effect, uint32_t ops)
-{
-    if (effect & DROPEFFECT_LINK && ops & DRAG_OP_LINK) return DRAG_OP_LINK;
-    if (effect & DROPEFFECT_COPY && ops & DRAG_OP_COPY) return DRAG_OP_COPY;
-    if (effect & DROPEFFECT_MOVE && ops & DRAG_OP_MOVE) return DRAG_OP_MOVE;
-    if (effect & DROPEFFECT_LINK && ops & DRAG_OP_GENERIC) return DRAG_OP_GENERIC;
-    if (effect & DROPEFFECT_COPY && ops & DRAG_OP_GENERIC) return DRAG_OP_GENERIC;
-
-    return DRAG_OP_NONE;
-}
-
-
 /* Based on functions in dlls/ole32/ole2.c */
 static HANDLE get_droptarget_local_handle(HWND hwnd)
 {
@@ -547,31 +516,22 @@ NTSTATUS WINAPI macdrv_dnd_query_exited(void *arg, ULONG size)
 /**************************************************************************
  *              query_drag_operation
  */
-BOOL query_drag_operation(macdrv_query* query)
+NTSTATUS WINAPI macdrv_dnd_query_drag(void *arg, ULONG size)
 {
+    struct dnd_query_drag_params *params = arg;
+    HWND hwnd = params->hwnd;
     BOOL ret = FALSE;
-    HWND hwnd = macdrv_get_window_hwnd(query->window);
-    struct macdrv_win_data *data = get_win_data(hwnd);
     POINT pt;
     DWORD effect;
     IDropTarget *droptarget;
     HRESULT hr;
 
-    TRACE("win %p/%p x,y %d,%d offered_ops 0x%x pasteboard %p\n", hwnd, query->window,
-          query->drag_operation.x, query->drag_operation.y, query->drag_operation.offered_ops,
-          query->drag_operation.pasteboard);
-
-    if (!data)
-    {
-        WARN("no win_data for win %p/%p\n", hwnd, query->window);
-        return FALSE;
-    }
-
-    pt.x = query->drag_operation.x + data->whole_rect.left;
-    pt.y = query->drag_operation.y + data->whole_rect.top;
-    release_win_data(data);
+    TRACE("win %p x,y %d,%d effect %x pasteboard %s\n", hwnd, params->x, params->y,
+          params->effect, wine_dbgstr_longlong(params->handle));
 
-    effect = drag_operations_to_dropeffects(query->drag_operation.offered_ops);
+    pt.x = params->x;
+    pt.y = params->y;
+    effect = params->effect;
 
     /* Instead of the top-level window we got in the query, start with the deepest
        child under the cursor.  Travel up the hierarchy looking for a window that
@@ -604,16 +564,14 @@ BOOL query_drag_operation(macdrv_query* query)
             POINTL pointl = { pt.x, pt.y };
 
             if (!active_data_object)
-                active_data_object = create_data_object_for_pasteboard(query->drag_operation.pasteboard);
+                active_data_object = create_data_object_for_pasteboard((void *)(UINT_PTR)params->handle);
 
             TRACE("DragEnter hwnd %p droptarget %p\n", hwnd, droptarget);
             hr = IDropTarget_DragEnter(droptarget, active_data_object, MK_LBUTTON,
                                        pointl, &effect);
             if (SUCCEEDED(hr))
             {
-                query->drag_operation.accepted_op = dropeffect_to_drag_operation(effect,
-                                                        query->drag_operation.offered_ops);
-                TRACE("    effect %d accepted op %d\n", effect, query->drag_operation.accepted_op);
+                TRACE("    effect %d\n", effect);
                 ret = TRUE;
             }
             else
@@ -629,9 +587,7 @@ BOOL query_drag_operation(macdrv_query* query)
         hr = IDropTarget_DragOver(droptarget, MK_LBUTTON, pointl, &effect);
         if (SUCCEEDED(hr))
         {
-            query->drag_operation.accepted_op = dropeffect_to_drag_operation(effect,
-                                                    query->drag_operation.offered_ops);
-            TRACE("    effect %d accepted op %d\n", effect, query->drag_operation.accepted_op);
+            TRACE("    effect %d\n", effect);
             ret = TRUE;
         }
         else
@@ -649,7 +605,7 @@ BOOL query_drag_operation(macdrv_query* query)
             FORMATETC formatEtc;
 
             if (!active_data_object)
-                active_data_object = create_data_object_for_pasteboard(query->drag_operation.pasteboard);
+                active_data_object = create_data_object_for_pasteboard((void *)(UINT_PTR)params->handle);
 
             formatEtc.cfFormat = CF_HDROP;
             formatEtc.ptd = NULL;
@@ -659,12 +615,12 @@ BOOL query_drag_operation(macdrv_query* query)
             if (SUCCEEDED(IDataObject_QueryGetData(active_data_object, &formatEtc)))
             {
                 TRACE("WS_EX_ACCEPTFILES hwnd %p\n", hwnd);
-                query->drag_operation.accepted_op = DRAG_OP_GENERIC;
+                effect = DROPEFFECT_COPY | DROPEFFECT_LINK;
                 ret = TRUE;
             }
         }
     }
 
     TRACE(" -> %s\n", ret ? "TRUE" : "FALSE");
-    return ret;
+    return ret ? effect : 0;
 }
diff --git a/dlls/winemac.drv/event.c b/dlls/winemac.drv/event.c
index 8432218d8d1..ce7f06b07dd 100644
--- a/dlls/winemac.drv/event.c
+++ b/dlls/winemac.drv/event.c
@@ -195,6 +195,21 @@ static DWORD drag_operations_to_dropeffects(uint32_t ops)
 }
 
 
+/**************************************************************************
+ *              dropeffect_to_drag_operation
+ */
+static uint32_t dropeffect_to_drag_operation(DWORD effect, uint32_t ops)
+{
+    if (effect & DROPEFFECT_LINK && ops & DRAG_OP_LINK) return DRAG_OP_LINK;
+    if (effect & DROPEFFECT_COPY && ops & DRAG_OP_COPY) return DRAG_OP_COPY;
+    if (effect & DROPEFFECT_MOVE && ops & DRAG_OP_MOVE) return DRAG_OP_MOVE;
+    if (effect & DROPEFFECT_LINK && ops & DRAG_OP_GENERIC) return DRAG_OP_GENERIC;
+    if (effect & DROPEFFECT_COPY && ops & DRAG_OP_GENERIC) return DRAG_OP_GENERIC;
+
+    return DRAG_OP_NONE;
+}
+
+
 /**************************************************************************
  *              query_drag_drop
  */
@@ -230,6 +245,38 @@ static BOOL query_drag_exited(macdrv_query *query)
 }
 
 
+/**************************************************************************
+ *              query_drag_operation
+ */
+static BOOL query_drag_operation(macdrv_query *query)
+{
+    struct dnd_query_drag_params params;
+    HWND hwnd = macdrv_get_window_hwnd(query->window);
+    struct macdrv_win_data *data = get_win_data(hwnd);
+    DWORD effect;
+
+    if (!data)
+    {
+        WARN("no win_data for win %p/%p\n", hwnd, query->window);
+        return FALSE;
+    }
+
+    params.hwnd = hwnd;
+    params.effect = drag_operations_to_dropeffects(query->drag_operation.offered_ops);
+    params.x = query->drag_operation.x + data->whole_rect.left;
+    params.y = query->drag_operation.y + data->whole_rect.top;
+    params.handle = (UINT_PTR)query->drag_operation.pasteboard;
+    release_win_data(data);
+
+    effect = macdrv_client_func(client_func_dnd_query_drag, &params, sizeof(params));
+    if (!effect) return FALSE;
+
+    query->drag_operation.accepted_op = dropeffect_to_drag_operation(effect,
+                                                                     query->drag_operation.offered_ops);
+    return TRUE;
+}
+
+
 /**************************************************************************
  *              query_ime_char_rect
  */
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
index a0ae0225423..ce71baa5735 100644
--- a/dlls/winemac.drv/macdrv.h
+++ b/dlls/winemac.drv/macdrv.h
@@ -259,8 +259,6 @@ extern HANDLE macdrv_get_pasteboard_data(CFTypeRef pasteboard, UINT desired_form
 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 BOOL query_drag_operation(macdrv_query* query) 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;
 extern void sync_gl_view(struct macdrv_win_data* data, const RECT* old_whole_rect, const RECT* old_client_rect) DECLSPEC_HIDDEN;
@@ -295,6 +293,7 @@ extern NTSTATUS macdrv_notify_icon(void *arg) DECLSPEC_HIDDEN;
 extern NTSTATUS macdrv_client_func(enum macdrv_client_funcs func, const void *params,
                                    ULONG size) DECLSPEC_HIDDEN;
 
+extern NTSTATUS WINAPI macdrv_dnd_query_drag(void *arg, ULONG size) DECLSPEC_HIDDEN;
 extern NTSTATUS WINAPI macdrv_dnd_query_drop(void *arg, ULONG size) DECLSPEC_HIDDEN;
 extern NTSTATUS WINAPI macdrv_dnd_query_exited(void *arg, ULONG size) DECLSPEC_HIDDEN;
 
diff --git a/dlls/winemac.drv/unixlib.h b/dlls/winemac.drv/unixlib.h
index a858b29baaa..f4a8b7982f5 100644
--- a/dlls/winemac.drv/unixlib.h
+++ b/dlls/winemac.drv/unixlib.h
@@ -67,13 +67,24 @@ struct notify_icon_params
 /* driver client callbacks exposed with KernelCallbackTable interface */
 enum macdrv_client_funcs
 {
-    client_func_dnd_query_drop = NtUserDriverCallbackFirst,
+    client_func_dnd_query_drag = NtUserDriverCallbackFirst,
+    client_func_dnd_query_drop,
     client_func_dnd_query_exited,
     client_func_ime_query_char_rect,
     client_func_ime_set_text,
     client_func_last
 };
 
+/* macdrv_dnd_query_drag params */
+struct dnd_query_drag_params
+{
+    HWND hwnd;
+    UINT32 effect;
+    INT32 x;
+    INT32 y;
+    UINT64 handle;
+};
+
 /* macdrv_dnd_query_drop params */
 struct dnd_query_drop_params
 {
-- 
GitLab


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



More information about the wine-devel mailing list