From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winemac.drv/clipboard.c | 46 +++++++++++++++++++++++++++++++++ dlls/winemac.drv/cocoa_event.m | 1 + dlls/winemac.drv/cocoa_window.m | 10 +++++++ dlls/winemac.drv/event.c | 19 ++++++++++++++ dlls/winemac.drv/macdrv.h | 2 ++ dlls/winemac.drv/macdrv_cocoa.h | 1 + 6 files changed, 79 insertions(+)
diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c index 5a1065cf7c4..7e4e7dd30df 100644 --- a/dlls/winemac.drv/clipboard.c +++ b/dlls/winemac.drv/clipboard.c @@ -1130,6 +1130,52 @@ static CFDataRef export_unicodetext_to_utf16(void *data, size_t size) return ret; }
+struct format_entry *get_format_entries(CFTypeRef pasteboard, UINT *entries_size) +{ + struct format_entry *entries = NULL; + CFStringRef type; + CFArrayRef types; + size_t size = 0; + CFIndex i; + char *tmp; + + TRACE("pasteboard %p\n", pasteboard); + + types = macdrv_copy_pasteboard_types(pasteboard); + if (!types) return NULL; + + for (i = 0; i < CFArrayGetCount(types); i++) + { + WINE_CLIPFORMAT *format; + size_t import_size; + CFDataRef data; + void *import; + + type = CFArrayGetValueAtIndex(types, i); + if (!(format = format_for_type(type))) continue; + + data = macdrv_copy_pasteboard_data(pasteboard, type); + import = format->import_func(data, &import_size); + + if ((tmp = realloc(entries, size + sizeof(*entries) + import_size))) + { + struct format_entry *entry = (struct format_entry *)(tmp + size); + entry->format = format->format_id; + entry->size = import_size; + memcpy(entry->data, import, import_size); + + entries = (struct format_entry *)tmp; + size += sizeof(*entry) + import_size; + } + + free(import); + } + + CFRelease(types); + + *entries_size = size; + return entries; +}
/************************************************************************** * macdrv_dnd_get_data diff --git a/dlls/winemac.drv/cocoa_event.m b/dlls/winemac.drv/cocoa_event.m index 8fad083f6e5..336de1c9047 100644 --- a/dlls/winemac.drv/cocoa_event.m +++ b/dlls/winemac.drv/cocoa_event.m @@ -720,6 +720,7 @@ void macdrv_release_query(macdrv_query *query) { switch (query->type) { + case QUERY_DRAG_DROP_ENTER: case QUERY_DRAG_DROP_LEAVE: case QUERY_DRAG_DROP_DRAG: case QUERY_DRAG_DROP_DROP: diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 1682c612de8..435a3d9162f 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -3256,6 +3256,16 @@ - (void) pasteboardChangedOwner:(NSPasteboard*)sender */ - (NSDragOperation) draggingEntered:(id <NSDraggingInfo>)sender { + macdrv_query* query = macdrv_create_query(); + NSPasteboard* pb = [sender draggingPasteboard]; + + query->type = QUERY_DRAG_DROP_ENTER; + query->window = (macdrv_window)[self retain]; + query->drag_drop.pasteboard = (CFTypeRef)[pb retain]; + + [self.queue query:query timeout:0.1]; + macdrv_release_query(query); + return [self draggingUpdated:sender]; }
diff --git a/dlls/winemac.drv/event.c b/dlls/winemac.drv/event.c index cd5fee519bb..f5ebd1675b9 100644 --- a/dlls/winemac.drv/event.c +++ b/dlls/winemac.drv/event.c @@ -250,6 +250,21 @@ static BOOL query_drag_drop_drop(macdrv_query *query) return *(BOOL *)ret_ptr; }
+/************************************************************************** + * query_drag_drop_enter + */ +static BOOL query_drag_drop_enter(macdrv_query *query) +{ + CFTypeRef pasteboard = query->drag_drop.pasteboard; + struct format_entry *entries; + UINT entries_size; + + if (!(entries = get_format_entries(pasteboard, &entries_size))) return FALSE; + free(entries); + + return TRUE; +} + /************************************************************************** * query_drag_drop_leave */ @@ -359,6 +374,10 @@ static void macdrv_query_event(HWND hwnd, const macdrv_event *event)
switch (query->type) { + case QUERY_DRAG_DROP_ENTER: + TRACE("QUERY_DRAG_DROP_ENTER\n"); + success = query_drag_drop_enter(query); + break; case QUERY_DRAG_DROP_LEAVE: TRACE("QUERY_DRAG_DROP_LEAVE\n"); success = query_drag_drop_leave(query); diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index 76c9be9519f..8053ff434ca 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -261,6 +261,8 @@ extern CGImageRef create_cgimage_from_icon_bitmaps(HDC hdc, HANDLE icon, HBITMAP extern void check_retina_status(void); extern void init_user_driver(void);
+extern struct format_entry *get_format_entries(CFTypeRef pasteboard, UINT *entries_size); + /* unixlib interface */
extern NTSTATUS macdrv_dnd_get_data(void *arg); diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index 1c9266d4564..20d82b9bef8 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -440,6 +440,7 @@ extern int macdrv_set_display_mode(const struct macdrv_display* display, } macdrv_event;
enum { + QUERY_DRAG_DROP_ENTER, QUERY_DRAG_DROP_LEAVE, QUERY_DRAG_DROP_DRAG, QUERY_DRAG_DROP_DROP,