Commit a21983f1 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

winemac: Use unixlib interface for dragdrop.c calls.

parent 4938929c
...@@ -248,6 +248,12 @@ static const char *debugstr_format(UINT id) ...@@ -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 * insert_clipboard_format
*/ */
...@@ -1201,14 +1207,16 @@ HANDLE macdrv_get_pasteboard_data(CFTypeRef pasteboard, UINT desired_format) ...@@ -1201,14 +1207,16 @@ HANDLE macdrv_get_pasteboard_data(CFTypeRef pasteboard, UINT desired_format)
/************************************************************************** /**************************************************************************
* macdrv_pasteboard_has_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; CFArrayRef types;
int count; int count;
UINT i; UINT i;
BOOL found = FALSE; 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); types = macdrv_copy_pasteboard_types(pasteboard);
if (!types) if (!types)
...@@ -1229,7 +1237,7 @@ BOOL macdrv_pasteboard_has_format(CFTypeRef pasteboard, UINT desired_format) ...@@ -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)); 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; found = TRUE;
break; break;
...@@ -1365,33 +1373,24 @@ static WINE_CLIPFORMAT** get_formats_for_pasteboard(CFTypeRef pasteboard, UINT * ...@@ -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; WINE_CLIPFORMAT** formats;
UINT count, i; UINT count, i;
UINT* format_ids;
formats = get_formats_for_pasteboard(pasteboard, &count); formats = get_formats_for_pasteboard(pasteboard, &count);
if (!formats) if (!formats)
return NULL; return 0;
count = min(count, ARRAYSIZE(params->formats));
format_ids = malloc(count);
if (!format_ids)
{
WARN("Failed to allocate formats IDs array\n");
free(formats);
return NULL;
}
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
format_ids[i] = formats[i]->format_id; params->formats[i] = formats[i]->format_id;
free(formats);
*num_formats = count; return count;
return format_ids;
} }
...@@ -1746,3 +1745,25 @@ void macdrv_lost_pasteboard_ownership(HWND hwnd) ...@@ -1746,3 +1745,25 @@ void macdrv_lost_pasteboard_ownership(HWND hwnd)
if (!macdrv_is_pasteboard_owner(clipboard_cocoa_window)) if (!macdrv_is_pasteboard_owner(clipboard_cocoa_window))
grab_win32_clipboard(); 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;
}
...@@ -42,7 +42,7 @@ typedef struct ...@@ -42,7 +42,7 @@ typedef struct
{ {
IDataObject IDataObject_iface; IDataObject IDataObject_iface;
LONG ref; LONG ref;
CFTypeRef pasteboard; UINT64 pasteboard;
} DragDropDataObject; } DragDropDataObject;
...@@ -131,7 +131,7 @@ static ULONG WINAPI dddo_Release(IDataObject* iface) ...@@ -131,7 +131,7 @@ static ULONG WINAPI dddo_Release(IDataObject* iface)
return refCount; return refCount;
TRACE("-- destroying DragDropDataObject (%p)\n", This); TRACE("-- destroying DragDropDataObject (%p)\n", This);
CFRelease(This->pasteboard); MACDRV_CALL(dnd_release, &This->pasteboard);
HeapFree(GetProcessHeap(), 0, This); HeapFree(GetProcessHeap(), 0, This);
return 0; return 0;
} }
...@@ -148,7 +148,7 @@ static HRESULT WINAPI dddo_GetData(IDataObject* iface, FORMATETC* formatEtc, STG ...@@ -148,7 +148,7 @@ static HRESULT WINAPI dddo_GetData(IDataObject* iface, FORMATETC* formatEtc, STG
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
medium->tymed = TYMED_HGLOBAL; 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; medium->pUnkForRelease = NULL;
hr = medium->u.hGlobal ? S_OK : E_OUTOFMEMORY; hr = medium->u.hGlobal ? S_OK : E_OUTOFMEMORY;
} }
...@@ -168,6 +168,7 @@ static HRESULT WINAPI dddo_GetDataHere(IDataObject* iface, FORMATETC* formatEtc, ...@@ -168,6 +168,7 @@ static HRESULT WINAPI dddo_GetDataHere(IDataObject* iface, FORMATETC* formatEtc,
static HRESULT WINAPI dddo_QueryGetData(IDataObject* iface, FORMATETC* formatEtc) static HRESULT WINAPI dddo_QueryGetData(IDataObject* iface, FORMATETC* formatEtc)
{ {
DragDropDataObject *This = impl_from_IDataObject(iface); DragDropDataObject *This = impl_from_IDataObject(iface);
struct dnd_have_format_params params;
HRESULT hr = DV_E_FORMATETC; HRESULT hr = DV_E_FORMATETC;
TRACE("This %p formatEtc %p={.tymed=0x%x, .dwAspect=%d, .cfFormat=%s}\n", 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 ...@@ -185,7 +186,9 @@ static HRESULT WINAPI dddo_QueryGetData(IDataObject* iface, FORMATETC* formatEtc
return E_NOTIMPL; 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; hr = S_OK;
TRACE(" -> 0x%x\n", hr); TRACE(" -> 0x%x\n", hr);
...@@ -225,7 +228,8 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction, ...@@ -225,7 +228,8 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction,
IEnumFORMATETC** enumFormatEtc) IEnumFORMATETC** enumFormatEtc)
{ {
DragDropDataObject *This = impl_from_IDataObject(iface); DragDropDataObject *This = impl_from_IDataObject(iface);
UINT *formats, count; struct dnd_get_formats_params params;
UINT count;
HRESULT hr; HRESULT hr;
TRACE("This %p direction %u enumFormatEtc %p\n", This, direction, enumFormatEtc); TRACE("This %p direction %u enumFormatEtc %p\n", This, direction, enumFormatEtc);
...@@ -236,8 +240,9 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction, ...@@ -236,8 +240,9 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction,
return E_NOTIMPL; return E_NOTIMPL;
} }
formats = macdrv_get_pasteboard_formats(This->pasteboard, &count); params.handle = This->pasteboard;
if (formats) count = MACDRV_CALL(dnd_get_formats, &params);
if (count)
{ {
FORMATETC *formatEtcs = HeapAlloc(GetProcessHeap(), 0, count * sizeof(FORMATETC)); FORMATETC *formatEtcs = HeapAlloc(GetProcessHeap(), 0, count * sizeof(FORMATETC));
if (formatEtcs) if (formatEtcs)
...@@ -246,7 +251,7 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction, ...@@ -246,7 +251,7 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction,
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
formatEtcs[i].cfFormat = formats[i]; formatEtcs[i].cfFormat = params.formats[i];
formatEtcs[i].ptd = NULL; formatEtcs[i].ptd = NULL;
formatEtcs[i].dwAspect = DVASPECT_CONTENT; formatEtcs[i].dwAspect = DVASPECT_CONTENT;
formatEtcs[i].lindex = -1; formatEtcs[i].lindex = -1;
...@@ -258,8 +263,6 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction, ...@@ -258,8 +263,6 @@ static HRESULT WINAPI dddo_EnumFormatEtc(IDataObject* iface, DWORD direction,
} }
else else
hr = E_OUTOFMEMORY; hr = E_OUTOFMEMORY;
HeapFree(GetProcessHeap(), 0, formats);
} }
else else
hr = SHCreateStdEnumFmtEtc(0, NULL, enumFormatEtc); hr = SHCreateStdEnumFmtEtc(0, NULL, enumFormatEtc);
...@@ -309,7 +312,7 @@ static const IDataObjectVtbl dovt = ...@@ -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; DragDropDataObject *dddo;
...@@ -319,7 +322,8 @@ static IDataObject *create_data_object_for_pasteboard(CFTypeRef pasteboard) ...@@ -319,7 +322,8 @@ static IDataObject *create_data_object_for_pasteboard(CFTypeRef pasteboard)
dddo->ref = 1; dddo->ref = 1;
dddo->IDataObject_iface.lpVtbl = &dovt; dddo->IDataObject_iface.lpVtbl = &dovt;
dddo->pasteboard = CFRetain(pasteboard); dddo->pasteboard = pasteboard;
MACDRV_CALL(dnd_retain, &dddo->pasteboard);
return &dddo->IDataObject_iface; return &dddo->IDataObject_iface;
} }
...@@ -421,7 +425,7 @@ NTSTATUS WINAPI macdrv_dnd_query_drop(void *arg, ULONG size) ...@@ -421,7 +425,7 @@ NTSTATUS WINAPI macdrv_dnd_query_drop(void *arg, ULONG size)
if (!active_data_object) if (!active_data_object)
{ {
WARN("shouldn't happen: no active IDataObject\n"); 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; pointl.x = pt.x;
...@@ -564,7 +568,7 @@ NTSTATUS WINAPI macdrv_dnd_query_drag(void *arg, ULONG size) ...@@ -564,7 +568,7 @@ NTSTATUS WINAPI macdrv_dnd_query_drag(void *arg, ULONG size)
POINTL pointl = { pt.x, pt.y }; POINTL pointl = { pt.x, pt.y };
if (!active_data_object) 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); TRACE("DragEnter hwnd %p droptarget %p\n", hwnd, droptarget);
hr = IDropTarget_DragEnter(droptarget, active_data_object, MK_LBUTTON, hr = IDropTarget_DragEnter(droptarget, active_data_object, MK_LBUTTON,
...@@ -605,7 +609,7 @@ NTSTATUS WINAPI macdrv_dnd_query_drag(void *arg, ULONG size) ...@@ -605,7 +609,7 @@ NTSTATUS WINAPI macdrv_dnd_query_drag(void *arg, ULONG size)
FORMATETC formatEtc; FORMATETC formatEtc;
if (!active_data_object) 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.cfFormat = CF_HDROP;
formatEtc.ptd = NULL; formatEtc.ptd = NULL;
......
...@@ -256,8 +256,6 @@ extern void macdrv_UpdateClipboard(void) DECLSPEC_HIDDEN; ...@@ -256,8 +256,6 @@ extern void macdrv_UpdateClipboard(void) DECLSPEC_HIDDEN;
extern BOOL query_pasteboard_data(HWND hwnd, CFStringRef type) DECLSPEC_HIDDEN; extern BOOL query_pasteboard_data(HWND hwnd, CFStringRef type) DECLSPEC_HIDDEN;
extern void macdrv_lost_pasteboard_ownership(HWND hwnd) 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 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 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 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 ...@@ -287,6 +285,10 @@ extern NTSTATUS WINAPI macdrv_ime_query_char_rect(void *params, ULONG size) DECL
/* unixlib interface */ /* 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_ime_process_text_input(void *arg) DECLSPEC_HIDDEN;
extern NTSTATUS macdrv_notify_icon(void *arg) DECLSPEC_HIDDEN; extern NTSTATUS macdrv_notify_icon(void *arg) DECLSPEC_HIDDEN;
......
...@@ -630,6 +630,10 @@ static NTSTATUS macdrv_ime_using_input_method(void *arg) ...@@ -630,6 +630,10 @@ static NTSTATUS macdrv_ime_using_input_method(void *arg)
const unixlib_entry_t __wine_unix_call_funcs[] = 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_clear,
macdrv_ime_process_text_input, macdrv_ime_process_text_input,
macdrv_ime_using_input_method, macdrv_ime_using_input_method,
......
...@@ -21,6 +21,10 @@ ...@@ -21,6 +21,10 @@
enum macdrv_funcs enum macdrv_funcs
{ {
unix_dnd_get_formats,
unix_dnd_have_format,
unix_dnd_release,
unix_dnd_retain,
unix_ime_clear, unix_ime_clear,
unix_ime_process_text_input, unix_ime_process_text_input,
unix_ime_using_input_method, unix_ime_using_input_method,
...@@ -33,6 +37,20 @@ enum macdrv_funcs ...@@ -33,6 +37,20 @@ enum macdrv_funcs
extern NTSTATUS unix_call(enum macdrv_funcs code, void *params) DECLSPEC_HIDDEN; extern NTSTATUS unix_call(enum macdrv_funcs code, void *params) DECLSPEC_HIDDEN;
#define MACDRV_CALL(func, params) unix_call( unix_ ## func, params ) #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 */ /* macdrv_ime_process_text_input params */
struct process_text_input_params struct process_text_input_params
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment