Skip to content

Commit b80e27f

Browse files
committed
darwin-external-dragndrop: implement external drag n' drop for darwin
1 parent 5f818bc commit b80e27f

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

app/os_macos.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ package app
88
import (
99
"errors"
1010
"image"
11+
"io"
12+
"mime"
13+
"path/filepath"
1114
"runtime"
15+
"strings"
1216
"time"
1317
"unicode"
1418
"unicode/utf8"
@@ -18,6 +22,7 @@ import (
1822
"gioui.org/io/key"
1923
"gioui.org/io/pointer"
2024
"gioui.org/io/system"
25+
"gioui.org/io/transfer"
2126
"gioui.org/unit"
2227

2328
_ "gioui.org/internal/cocoainit"
@@ -557,6 +562,22 @@ func gio_onMouse(view, evt C.CFTypeRef, cdir C.int, cbtn C.NSInteger, x, y, dx,
557562
})
558563
}
559564

565+
//export gio_onExternalDrop
566+
func gio_onExternalDrop(view C.CFTypeRef, path *C.char) {
567+
fileUrl := C.GoString(path)
568+
w := mustView(view)
569+
570+
fileExtension := filepath.Ext(fileUrl)
571+
mime := mime.TypeByExtension(fileExtension)
572+
573+
w.w.Event(transfer.DataEvent{
574+
Type: mime,
575+
Open: func() io.ReadCloser {
576+
return io.NopCloser(strings.NewReader(fileUrl))
577+
},
578+
})
579+
}
580+
560581
//export gio_onDraw
561582
func gio_onDraw(view C.CFTypeRef) {
562583
w := mustView(view)

app/os_macos.m

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,20 @@ - (void)mouseMoved:(NSEvent *)event {
110110
- (void)mouseDragged:(NSEvent *)event {
111111
handleMouse(self, event, MOUSE_MOVE, 0, 0);
112112
}
113+
-(NSDragOperation)draggingEntered:(id < NSDraggingInfo >)sender
114+
{
115+
return NSDragOperationCopy; // NSDragOperationGeneric
116+
}
117+
- (void)draggingEnded:(id <NSDraggingInfo>)sender
118+
{
119+
NSPasteboard* pbrd = [sender draggingPasteboard];
120+
NSArray* droppedFiles = [pbrd propertyListForType:NSFilenamesPboardType];
121+
122+
for (NSString* filePath in droppedFiles) {
123+
NSURL* url = [NSURL fileURLWithPath:filePath];
124+
gio_onExternalDrop((__bridge CFTypeRef)self, (char*)[[url path] UTF8String]);
125+
}
126+
}
113127
- (void)scrollWheel:(NSEvent *)event {
114128
CGFloat dx = -event.scrollingDeltaX;
115129
CGFloat dy = -event.scrollingDeltaY;
@@ -366,6 +380,7 @@ CFTypeRef gio_createView(void) {
366380
@autoreleasepool {
367381
NSRect frame = NSMakeRect(0, 0, 0, 0);
368382
GioView* view = [[GioView alloc] initWithFrame:frame];
383+
[view registerForDraggedTypes: [NSArray arrayWithObjects:NSTIFFPboardType, NSFilenamesPboardType, nil]];
369384
view.wantsLayer = YES;
370385
view.layerContentsRedrawPolicy = NSViewLayerContentsRedrawDuringViewResize;
371386
return CFBridgingRetain(view);

io/router/router.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,14 @@ func (q *Router) Queue(events ...event.Event) bool {
182182
}
183183
case clipboard.Event:
184184
q.cqueue.Push(e, &q.handlers)
185+
case transfer.DataEvent:
186+
for tag, handler := range q.pointer.queue.handlers {
187+
for _, mimeType := range (*handler).targetMimes {
188+
if mimeType == e.Type {
189+
q.handlers.Add(tag, e)
190+
}
191+
}
192+
}
185193
}
186194
}
187195
return q.handlers.HadEvents()

0 commit comments

Comments
 (0)