mirror of
https://github.com/kovidgoyal/kitty
synced 2026-06-08 22:28:24 +02:00
dnd kitten: get local -> finder working
This commit is contained in:
@@ -4258,6 +4258,73 @@ set_image_for_dragging_item(NSDraggingItem *draggingItem, const GLFWimage *thumb
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
add_drag_item(_GLFWwindow *window, NSMutableArray<NSDraggingItem*>* dragItems, NSDraggingItem* dragItem, const GLFWimage *thumbnail) {
|
||||||
|
if (dragItems.count == 0 && thumbnail && thumbnail->pixels) {
|
||||||
|
int err = set_image_for_dragging_item(dragItem, thumbnail, window->ns.object);
|
||||||
|
if (err) return err;
|
||||||
|
} else {
|
||||||
|
[dragItem setDraggingFrame:NSMakeRect(0, 0, 32, 32) contents:nil];
|
||||||
|
}
|
||||||
|
[dragItems addObject:dragItem];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
add_uri_list_drag_items(_GLFWwindow *window, NSMutableArray<NSDraggingItem*>* dragItems, const char *uri_list, size_t uri_list_sz, bool use_promises, const GLFWimage *thumbnail) {
|
||||||
|
NSString *input = [[[NSString alloc] initWithBytes:uri_list length:uri_list_sz encoding:NSUTF8StringEncoding] autorelease];
|
||||||
|
NSArray *lines = [input componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
|
||||||
|
id dragItem; int count = 0; char buf[256];
|
||||||
|
for (NSString *rawLine in lines) {
|
||||||
|
NSString *line = [rawLine stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
||||||
|
if (line.length == 0 || [line hasPrefix:@"#"]) continue;
|
||||||
|
NSURL *url = [NSURL URLWithString:line];
|
||||||
|
if (use_promises && [[url scheme] caseInsensitiveCompare:@"file"] == NSOrderedSame) {
|
||||||
|
NSString *extension = [url pathExtension];
|
||||||
|
UTType *type = [UTType typeWithFilenameExtension:extension];
|
||||||
|
if (!type) type = UTTypeItem;
|
||||||
|
snprintf(buf, sizeof(buf), "text/uri-list:%d", count);
|
||||||
|
GLFWFilePromiseProviderDelegate* delegate = [[[GLFWFilePromiseProviderDelegate alloc]
|
||||||
|
initWithWindow:window mimeType:buf instanceId:_glfw.drag.instance_id] autorelease];
|
||||||
|
NSFilePromiseProvider *provider = [[[NSFilePromiseProvider alloc]
|
||||||
|
initWithFileType:type.identifier delegate:delegate] autorelease];
|
||||||
|
// Store the delegate in the provider's user info so it's retained
|
||||||
|
provider.userInfo = delegate;
|
||||||
|
dragItem = provider;
|
||||||
|
} else dragItem = [[[NSDraggingItem alloc] initWithPasteboardWriter:url] autorelease];
|
||||||
|
int err = add_drag_item(window, dragItems, dragItem, thumbnail);
|
||||||
|
if (err) return err;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
add_drag_items(_GLFWwindow *window, NSMutableArray<NSDraggingItem*>* dragItems, GLFWDragSourceItem *mime_item, const GLFWimage *thumbnail) {
|
||||||
|
if (strcmp(mime_item->mime_type, "text/uri-list") == 0 && mime_item->optional_data && mime_item->data_size) {
|
||||||
|
return add_uri_list_drag_items(window, dragItems, mime_item->optional_data, mime_item->data_size, mime_item->is_remote_client, thumbnail);
|
||||||
|
}
|
||||||
|
NSString* utiString = mime_to_uti(mime_item->mime_type);
|
||||||
|
id w;
|
||||||
|
if (mime_item->optional_data) {
|
||||||
|
NSPasteboardItem *pbItem = [[[NSPasteboardItem alloc] init] autorelease];
|
||||||
|
NSData *data = [NSData dataWithBytes:mime_item->optional_data length:mime_item->data_size];
|
||||||
|
[pbItem setData:data forType:utiString];
|
||||||
|
w = pbItem;
|
||||||
|
} else {
|
||||||
|
// Create file promise provider with our delegate
|
||||||
|
GLFWFilePromiseProviderDelegate* delegate = [[[GLFWFilePromiseProviderDelegate alloc]
|
||||||
|
initWithWindow:window mimeType:mime_item->mime_type instanceId:_glfw.drag.instance_id] autorelease];
|
||||||
|
NSFilePromiseProvider *provider = [[[NSFilePromiseProvider alloc]
|
||||||
|
initWithFileType:utiString delegate:delegate] autorelease];
|
||||||
|
// Store the delegate in the provider's user info so it's retained
|
||||||
|
provider.userInfo = delegate;
|
||||||
|
w = provider;
|
||||||
|
}
|
||||||
|
NSDraggingItem* dragItem = [[[NSDraggingItem alloc] initWithPasteboardWriter:w] autorelease];
|
||||||
|
return add_drag_item(window, dragItems, dragItem, thumbnail);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
_glfwPlatformStartDrag(_GLFWwindow* window, const GLFWimage* thumbnail) {@autoreleasepool{
|
_glfwPlatformStartDrag(_GLFWwindow* window, const GLFWimage* thumbnail) {@autoreleasepool{
|
||||||
@@ -4292,32 +4359,8 @@ _glfwPlatformStartDrag(_GLFWwindow* window, const GLFWimage* thumbnail) {@autore
|
|||||||
GLFWContentView *v = window->ns.view;
|
GLFWContentView *v = window->ns.view;
|
||||||
NSMutableArray<NSDraggingItem*>* dragItems = [[[NSMutableArray alloc] init] autorelease];
|
NSMutableArray<NSDraggingItem*>* dragItems = [[[NSMutableArray alloc] init] autorelease];
|
||||||
for (size_t i = 0; i < _glfw.drag.item_count; i++) {
|
for (size_t i = 0; i < _glfw.drag.item_count; i++) {
|
||||||
NSString* utiString = mime_to_uti(_glfw.drag.items[i].mime_type);
|
int err = add_drag_items(window, dragItems, _glfw.drag.items + i, thumbnail);
|
||||||
id w;
|
|
||||||
if (_glfw.drag.items[i].optional_data) {
|
|
||||||
NSPasteboardItem *pbItem = [[[NSPasteboardItem alloc] init] autorelease];
|
|
||||||
NSData *data = [NSData dataWithBytes:_glfw.drag.items[i].optional_data length:_glfw.drag.items[i].data_size];
|
|
||||||
[pbItem setData:data forType:utiString];
|
|
||||||
w = pbItem;
|
|
||||||
} else {
|
|
||||||
// Create file promise provider with our delegate
|
|
||||||
GLFWFilePromiseProviderDelegate* delegate = [[[GLFWFilePromiseProviderDelegate alloc]
|
|
||||||
initWithWindow:window mimeType:_glfw.drag.items[i].mime_type instanceId:_glfw.drag.instance_id] autorelease];
|
|
||||||
NSFilePromiseProvider *provider = [[[NSFilePromiseProvider alloc]
|
|
||||||
initWithFileType:utiString delegate:delegate] autorelease];
|
|
||||||
// Store the delegate in the provider's user info so it's retained
|
|
||||||
provider.userInfo = delegate;
|
|
||||||
w = provider;
|
|
||||||
}
|
|
||||||
NSDraggingItem* dragItem = [[[NSDraggingItem alloc] initWithPasteboardWriter:w] autorelease];
|
|
||||||
|
|
||||||
if (i == 0 && thumbnail && thumbnail->pixels) {
|
|
||||||
int err = set_image_for_dragging_item(dragItem, thumbnail, window->ns.object);
|
|
||||||
if (err) return err;
|
if (err) return err;
|
||||||
} else {
|
|
||||||
[dragItem setDraggingFrame:NSMakeRect(0, 0, 32, 32) contents:nil];
|
|
||||||
}
|
|
||||||
[dragItems addObject:dragItem];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NSDraggingSession *s = [v beginDraggingSessionWithItems:dragItems event:event source:[v draggingSource]];
|
NSDraggingSession *s = [v beginDraggingSessionWithItems:dragItems event:event source:[v draggingSource]];
|
||||||
|
|||||||
Reference in New Issue
Block a user