]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix file drag-and-drop on GNUstep
authorPo Lu <luangruo@yahoo.com>
Sat, 4 Jun 2022 08:19:01 +0000 (16:19 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 4 Jun 2022 08:19:01 +0000 (16:19 +0800)
* src/nsselect.m (ns_decode_data_to_pasteboard): Convert URL to
path names when we're using NSFilenamesPboardType.
* src/nsterm.m: ([EmacsView performDragOperation:]): Handle
cases where plist is a string.

src/nsselect.m
src/nsterm.m

index a719eef4e860510e7e01b4b6ec18473642214f34..6831090aa2013aa39bca1d2ebfaab63e90a462be 100644 (file)
@@ -565,6 +565,9 @@ ns_decode_data_to_pasteboard (Lisp_Object type, Lisp_Object data,
   NSMutableArray *temp;
   Lisp_Object tem;
   specpdl_ref count;
+#if !NS_USE_NSPasteboardTypeFileURL
+  NSURL *url;
+#endif
 
   types = [pasteboard types];
   count = SPECPDL_INDEX ();
@@ -602,7 +605,12 @@ ns_decode_data_to_pasteboard (Lisp_Object type, Lisp_Object data,
          [pasteboard setString: [NSString stringWithLispString: data]
                        forType: NSPasteboardTypeFileURL];
 #else
-         [pasteboard setString: [NSString stringWithLispString: data]
+         url = [NSURL URLWithString: [NSString stringWithLispString: data]];
+
+         if (!url)
+           signal_error ("Invalid file URL", data);
+
+         [pasteboard setString: [url path]
                        forType: NSFilenamesPboardType];
 #endif
        }
index 04475bbba0598766ea39106c38034ac00fe42815..4663ac85d843a8811523f46537a5fa159824dc90 100644 (file)
@@ -8724,7 +8724,7 @@ ns_create_font_panel_buttons (id target, SEL select, SEL cancel_action)
   Lisp_Object type_sym;
   struct input_event ie;
 
-  NSTRACE ("[EmacsView performDragOperation:]");
+  NSTRACE (@"[EmacsView performDragOperation:]");
 
   source = [sender draggingSource];
 
@@ -8752,7 +8752,7 @@ ns_create_font_panel_buttons (id target, SEL select, SEL cancel_action)
 
   if (!type)
     return NO;
-#if NS_USE_NSPasteboardTypeFileURL != 0
+#if NS_USE_NSPasteboardTypeFileURL
   else if ([type isEqualToString: NSPasteboardTypeFileURL])
     {
       type_sym = Qfile;
@@ -8767,18 +8767,29 @@ ns_create_font_panel_buttons (id target, SEL select, SEL cancel_action)
 #else  // !NS_USE_NSPasteboardTypeFileURL
   else if ([type isEqualToString: NSFilenamesPboardType])
     {
-      NSArray *files;
+      id files;
       NSEnumerator *fenum;
       NSString *file;
 
-      if (!(files = [pb propertyListForType: type]))
+      files = [pb propertyListForType: type];
+
+      if (!files)
         return NO;
 
       type_sym = Qfile;
 
-      fenum = [files objectEnumerator];
-      while ( (file = [fenum nextObject]) )
-        strings = Fcons ([file lispString], strings);
+      /* On GNUstep, files might be a string.  */
+
+      if ([files respondsToSelector: @selector (objectEnumerator:)])
+       {
+         fenum = [files objectEnumerator];
+
+         while ((file = [fenum nextObject]))
+           strings = Fcons ([file lispString], strings);
+       }
+      else
+       /* Then `files' is an NSString.  */
+       strings = list1 ([files lispString]);
     }
 #endif   // !NS_USE_NSPasteboardTypeFileURL
   else if ([type isEqualToString: NSPasteboardTypeURL])
@@ -8795,11 +8806,12 @@ ns_create_font_panel_buttons (id target, SEL select, SEL cancel_action)
     {
       NSString *data;
 
-      if (! (data = [pb stringForType: type]))
+      data = [pb stringForType: type];
+
+      if (!data)
         return NO;
 
       type_sym = Qnil;
-
       strings = list1 ([data lispString]);
     }
   else
@@ -8807,7 +8819,8 @@ ns_create_font_panel_buttons (id target, SEL select, SEL cancel_action)
 
   EVENT_INIT (ie);
   ie.kind = DRAG_N_DROP_EVENT;
-  ie.arg = Fcons (type_sym, Fcons (operations, strings));
+  ie.arg = Fcons (type_sym, Fcons (operations,
+                                  strings));
   XSETINT (ie.x, x);
   XSETINT (ie.y, y);
   XSETFRAME (ie.frame_or_window, emacsframe);