@@ -426,6 +426,7 @@ typedef struct { i32 x, y; } RGFW_vector;
426
426
u32 display ;
427
427
void * displayLink ;
428
428
void * window ;
429
+ u8 dndPassed ;
429
430
#endif
430
431
431
432
#if (defined(RGFW_OPENGL )) && !defined(RGFW_OSMESA )
@@ -1164,21 +1165,17 @@ typedef struct { i32 x, y; } RGFW_vector;
1164
1165
}
1165
1166
1166
1167
NSArray * c_array_to_NSArray (void * array , size_t len ) {
1167
- void * func = sel_registerName ("initWithObjects:count:" );
1168
+ SEL func = sel_registerName ("initWithObjects:count:" );
1168
1169
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 );
1172
1172
}
1173
-
1173
+
1174
1174
void NSregisterForDraggedTypes (void * view , NSPasteboardType * newTypes , size_t len ) {
1175
1175
NSString * * ntypes = cstrToNSStringArray ((char * * )newTypes , len );
1176
1176
1177
-
1178
1177
NSArray * array = c_array_to_NSArray (ntypes , len );
1179
-
1180
1178
objc_msgSend_void_id (view , sel_registerName ("registerForDraggedTypes:" ), array );
1181
-
1182
1179
NSRelease (array );
1183
1180
}
1184
1181
@@ -1271,13 +1268,17 @@ typedef struct { i32 x, y; } RGFW_vector;
1271
1268
(pasteboard , func , array , options );
1272
1269
1273
1270
NSRelease (array );
1274
-
1275
1271
NSUInteger count = NSArray_count (output );
1276
1272
1277
1273
const char * * res = si_array_init_reserve (sizeof (const char * ), count );
1278
1274
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
+ }
1281
1282
1282
1283
return res ;
1283
1284
}
@@ -5160,9 +5161,9 @@ static HMODULE wglinstance = NULL;
5160
5161
i = 0 ;
5161
5162
5162
5163
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 );
5166
5167
5167
5168
RGFW_windows [i ]-> event .droppedFilesCount = si_array_len (droppedFiles );
5168
5169
@@ -5172,11 +5173,12 @@ static HMODULE wglinstance = NULL;
5172
5173
strcpy (RGFW_windows [i ]-> event .droppedFiles [y ], droppedFiles [y ]);
5173
5174
5174
5175
RGFW_windows [i ]-> event .type = RGFW_dnd ;
5176
+ RGFW_windows [i ]-> src .dndPassed = false;
5175
5177
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" ));
5179
5179
5180
+ RGFW_windows [i ]-> event .point .x = (i32 )p .x ;
5181
+ RGFW_windows [i ]-> event .point .x = (i32 )p .y ;
5180
5182
return true;
5181
5183
}
5182
5184
@@ -5369,43 +5371,31 @@ static HMODULE wglinstance = NULL;
5369
5371
NSMoveToResourceDir ();
5370
5372
5371
5373
Class delegateClass = objc_allocateClassPair (objc_getClass ("NSObject" ), "WindowDelegate" , 0 );
5374
+
5375
+
5372
5376
class_addMethod (delegateClass , sel_registerName ("windowWillResize:toSize:" ), (IMP ) RGFW__osxWindowResize , "{NSSize=ff}@:{NSSize=ff}" );
5373
5377
class_addMethod (delegateClass , sel_registerName ("windowWillMove:" ), (IMP ) RGFW__osxWindowMove , "" );
5374
5378
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@:@" );
5402
5385
5403
5386
id delegate = objc_msgSend_id (NSAlloc (delegateClass ), sel_registerName ("init" ));
5404
5387
5405
5388
object_setInstanceVariable (delegate , "RGFW_window" , win );
5406
5389
5407
5390
objc_msgSend_void_id (win -> src .window , sel_registerName ("setDelegate:" ), delegate );
5408
5391
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
+
5409
5399
// Show the window
5410
5400
((id (* )(id , SEL , SEL ))objc_msgSend )(win -> src .window , sel_registerName ("makeKeyAndOrderFront:" ), NULL );
5411
5401
objc_msgSend_void_bool (win -> src .window , sel_registerName ("setIsVisible:" ), true);
@@ -5416,6 +5406,8 @@ static HMODULE wglinstance = NULL;
5416
5406
RGFW_loaded = 1 ;
5417
5407
}
5418
5408
5409
+ objc_msgSend_void (win -> src .window , sel_registerName ("makeKeyWindow" ));
5410
+
5419
5411
NSApplication_finishLaunching (NSApp );
5420
5412
5421
5413
RGFW_windows_size ++ ;
@@ -5556,6 +5548,11 @@ static HMODULE wglinstance = NULL;
5556
5548
if (win -> event .type == RGFW_quit )
5557
5549
return & win -> event ;
5558
5550
5551
+ if (win -> event .type == RGFW_dnd && win -> src .dndPassed == 0 ) {
5552
+ win -> src .dndPassed = 1 ;
5553
+ return & win -> event ;
5554
+ }
5555
+
5559
5556
static void * eventFunc = NULL ;
5560
5557
if (eventFunc == NULL )
5561
5558
eventFunc = sel_registerName ("nextEventMatchingMask:untilDate:inMode:dequeue:" );
0 commit comments