Skip to content

Commit 05eb272

Browse files
fix drag and drop support (macos)
1 parent ad122a2 commit 05eb272

File tree

1 file changed

+41
-44
lines changed

1 file changed

+41
-44
lines changed

RGFW.h

Lines changed: 41 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,7 @@ typedef struct { i32 x, y; } RGFW_vector;
426426
u32 display;
427427
void* displayLink;
428428
void* window;
429+
u8 dndPassed;
429430
#endif
430431

431432
#if (defined(RGFW_OPENGL)) && !defined(RGFW_OSMESA)
@@ -1164,21 +1165,17 @@ typedef struct { i32 x, y; } RGFW_vector;
11641165
}
11651166

11661167
NSArray* c_array_to_NSArray(void* array, size_t len) {
1167-
void* func = sel_registerName("initWithObjects:count:");
1168+
SEL func = sel_registerName("initWithObjects:count:");
11681169
void* nsclass = objc_getClass("NSArray");
1169-
1170-
return ((id(*)(id, SEL, void*, NSUInteger))objc_msgSend)
1171-
(NSAlloc(nsclass), func, array, len);
1170+
return ((id (*)(id, SEL, void*, NSUInteger))objc_msgSend)
1171+
(NSAlloc(nsclass), func, array, len);
11721172
}
1173-
1173+
11741174
void NSregisterForDraggedTypes(void* view, NSPasteboardType* newTypes, size_t len) {
11751175
NSString** ntypes = cstrToNSStringArray((char**)newTypes, len);
11761176

1177-
11781177
NSArray* array = c_array_to_NSArray(ntypes, len);
1179-
11801178
objc_msgSend_void_id(view, sel_registerName("registerForDraggedTypes:"), array);
1181-
11821179
NSRelease(array);
11831180
}
11841181

@@ -1271,13 +1268,17 @@ typedef struct { i32 x, y; } RGFW_vector;
12711268
(pasteboard, func, array, options);
12721269

12731270
NSRelease(array);
1274-
12751271
NSUInteger count = NSArray_count(output);
12761272

12771273
const char** res = si_array_init_reserve(sizeof(const char*), count);
12781274

1279-
for (NSUInteger i = 0; i < count; i++)
1280-
res[i] = NSString_to_char(NSArray_objectAtIndex(output, i));
1275+
void* path_func = sel_registerName("path");
1276+
1277+
for (NSUInteger i = 0; i < count; i++) {
1278+
void* url = NSArray_objectAtIndex(output, i);
1279+
NSString* url_str = ((id(*)(id, SEL))objc_msgSend)(url, path_func);
1280+
res[i] = NSString_to_char(url_str);
1281+
}
12811282

12821283
return res;
12831284
}
@@ -5160,9 +5161,9 @@ static HMODULE wglinstance = NULL;
51605161
i = 0;
51615162

51625163
Class array[] = { objc_getClass("NSURL"), NULL };
5163-
char** droppedFiles = (char**) NSPasteboard_readObjectsForClasses(
5164-
(NSPasteboard*) objc_msgSend_id(sender, sel_registerName("draggingPasteboard")),
5165-
array, 1, NULL);
5164+
NSPasteboard* pasteBoard = objc_msgSend_id(sender, sel_registerName("draggingPasteboard"));
5165+
5166+
char** droppedFiles = (char**) NSPasteboard_readObjectsForClasses(pasteBoard, array, 1, NULL);
51665167

51675168
RGFW_windows[i]->event.droppedFilesCount = si_array_len(droppedFiles);
51685169

@@ -5172,11 +5173,12 @@ static HMODULE wglinstance = NULL;
51725173
strcpy(RGFW_windows[i]->event.droppedFiles[y], droppedFiles[y]);
51735174

51745175
RGFW_windows[i]->event.type = RGFW_dnd;
5176+
RGFW_windows[i]->src.dndPassed = false;
51755177

5176-
NSPoint p = *(NSPoint*) objc_msgSend_id(sender, sel_registerName("draggingLocation"));
5177-
RGFW_windows[i]->event.point.x = p.x;
5178-
RGFW_windows[i]->event.point.x = p.y;
5178+
NSPoint p = ((NSPoint(*)(id, SEL)) objc_msgSend)(sender, sel_registerName("draggingLocation"));
51795179

5180+
RGFW_windows[i]->event.point.x = (i32)p.x;
5181+
RGFW_windows[i]->event.point.x = (i32)p.y;
51805182
return true;
51815183
}
51825184

@@ -5369,43 +5371,31 @@ static HMODULE wglinstance = NULL;
53695371
NSMoveToResourceDir();
53705372

53715373
Class delegateClass = objc_allocateClassPair(objc_getClass("NSObject"), "WindowDelegate", 0);
5374+
5375+
53725376
class_addMethod(delegateClass, sel_registerName("windowWillResize:toSize:"), (IMP) RGFW__osxWindowResize, "{NSSize=ff}@:{NSSize=ff}");
53735377
class_addMethod(delegateClass, sel_registerName("windowWillMove:"), (IMP) RGFW__osxWindowMove, "");
53745378
class_addMethod(delegateClass, sel_registerName("windowDidMove:"), (IMP) RGFW__osxWindowMove, "");
5375-
class_addMethod(delegateClass, sel_registerName("windowKeyPressed:"), (IMP) RGFW__osxWindowMove, "");
5376-
5377-
5378-
if (args & RGFW_ALLOW_DND) {
5379-
win->src.winArgs |= RGFW_ALLOW_DND;
5380-
5381-
/*
5382-
NSPasteboardType types[] = {NSPasteboardTypeURL, NSPasteboardTypeFileURL, NSPasteboardTypeString};
5383-
5384-
siArray(NSPasteboardType) array = sic_arrayInit(types, sizeof(id), countof(types));
5385-
NSWindow_registerForDraggedTypes(win->hwnd, array);
5386-
5387-
win->dndHead = win->dndPrev = out;
5388-
*/
5389-
5390-
NSPasteboardType array[] = {NSPasteboardTypeURL, NSPasteboardTypeFileURL, NSPasteboardTypeString};
5391-
NSregisterForDraggedTypes(win->src.window, array, 3);
5392-
5393-
/* NOTE(EimaMei): Drag 'n Drop requires too many damn functions for just a Drag 'n Drop event. */
5394-
class_addMethod(delegateClass, (SEL)"draggingEntered:", (IMP)draggingEntered, "l@:@");
5395-
class_addMethod(delegateClass, (SEL)"draggingUpdated:", (IMP)draggingUpdated, "l@:@");
5396-
class_addMethod(delegateClass, (SEL)"draggingExited:", (IMP)RGFW__osxDraggingEnded, "v@:@");
5397-
class_addMethod(delegateClass, (SEL)"draggingEnded:", (IMP)RGFW__osxDraggingEnded, "v@:@");
5398-
class_addMethod(delegateClass, (SEL)"prepareForDragOperation:", (IMP)prepareForDragOperation, "B@:@");
5399-
class_addMethod(delegateClass, (SEL)"performDragOperation:", (IMP)performDragOperation, "B@:@");
5400-
5401-
}
5379+
class_addMethod(delegateClass, sel_registerName("draggingEntered:"), (IMP)draggingEntered, "l@:@");
5380+
class_addMethod(delegateClass, sel_registerName("draggingUpdated:"), (IMP)draggingUpdated, "l@:@");
5381+
class_addMethod(delegateClass, sel_registerName("draggingExited:"), (IMP)RGFW__osxDraggingEnded, "v@:@");
5382+
class_addMethod(delegateClass, sel_registerName("draggingEnded:"), (IMP)RGFW__osxDraggingEnded, "v@:@");
5383+
class_addMethod(delegateClass, sel_registerName("prepareForDragOperation:"), (IMP)prepareForDragOperation, "B@:@");
5384+
class_addMethod(delegateClass, sel_registerName("performDragOperation:"), (IMP)performDragOperation, "B@:@");
54025385

54035386
id delegate = objc_msgSend_id(NSAlloc(delegateClass), sel_registerName("init"));
54045387

54055388
object_setInstanceVariable(delegate, "RGFW_window", win);
54065389

54075390
objc_msgSend_void_id(win->src.window, sel_registerName("setDelegate:"), delegate);
54085391

5392+
if (args & RGFW_ALLOW_DND) {
5393+
win->src.winArgs |= RGFW_ALLOW_DND;
5394+
5395+
NSPasteboardType types[] = {NSPasteboardTypeURL, NSPasteboardTypeFileURL, NSPasteboardTypeString};
5396+
NSregisterForDraggedTypes(win->src.window, types, 3);
5397+
}
5398+
54095399
// Show the window
54105400
((id(*)(id, SEL, SEL))objc_msgSend)(win->src.window, sel_registerName("makeKeyAndOrderFront:"), NULL);
54115401
objc_msgSend_void_bool(win->src.window, sel_registerName("setIsVisible:"), true);
@@ -5416,6 +5406,8 @@ static HMODULE wglinstance = NULL;
54165406
RGFW_loaded = 1;
54175407
}
54185408

5409+
objc_msgSend_void(win->src.window, sel_registerName("makeKeyWindow"));
5410+
54195411
NSApplication_finishLaunching(NSApp);
54205412

54215413
RGFW_windows_size++;
@@ -5556,6 +5548,11 @@ static HMODULE wglinstance = NULL;
55565548
if (win->event.type == RGFW_quit)
55575549
return &win->event;
55585550

5551+
if (win->event.type == RGFW_dnd && win->src.dndPassed == 0) {
5552+
win->src.dndPassed = 1;
5553+
return &win->event;
5554+
}
5555+
55595556
static void* eventFunc = NULL;
55605557
if (eventFunc == NULL)
55615558
eventFunc = sel_registerName("nextEventMatchingMask:untilDate:inMode:dequeue:");

0 commit comments

Comments
 (0)