summaryrefslogtreecommitdiffstats
path: root/macosx/macdnd.m
diff options
context:
space:
mode:
Diffstat (limited to 'macosx/macdnd.m')
-rw-r--r--macosx/macdnd.m337
1 files changed, 264 insertions, 73 deletions
diff --git a/macosx/macdnd.m b/macosx/macdnd.m
index da1d283..1745d5b 100644
--- a/macosx/macdnd.m
+++ b/macosx/macdnd.m
@@ -19,6 +19,8 @@
#import <tkMacOSXInt.h>
#import <Cocoa/Cocoa.h>
+#pragma clang diagnostic ignored "-Warc-bridge-casts-disallowed-in-nonarc"
+#if 0
// not using clang LLVM compiler, or LLVM version is not 3.x
#if !defined(__clang__) || __clang_major__ < 3
@@ -44,6 +46,8 @@
#define __unsafe_unretained
#endif
+#endif
+
#endif // __clang_major__ < 3
#define TKDND_OSX_KEVIN_WORKARROUND
@@ -80,16 +84,15 @@ Tcl_Interp * TkDND_Interp(Tk_Window tkwin) {
#define Tk_Interp TkDND_Interp
#endif /* Tk_Interp */
-
/*
* Here we need to wrap Cocoa methods in Cocoa class: methods for initiating,
* tracking, and terminating drag from inside and outside the application.
*/
@interface DNDView : NSView {
- NSDragOperation sourceDragMask;
- NSPasteboard *sourcePasteBoard;
- NSMutableArray *draggedtypes;
+// NSDragOperation sourceDragMask;
+// NSPasteboard *sourcePasteBoard;
+// NSMutableArray *draggedtypes;
NSInteger tag;
}
@@ -100,7 +103,7 @@ Tcl_Interp * TkDND_Interp(Tk_Window tkwin) {
- (int)draggingSourceOperationMaskForLocal:(BOOL)isLocal;
- (void)setTag:(NSInteger) t;
- (NSInteger)tag;
-TkWindow* TkMacOSXGetTkWindow( NSWindow *w);
+Tk_Window TkMacOSXGetTkWindow(NSWindow *w);
DNDView* TkDND_GetDNDSubview(NSView *view, Tk_Window tkwin);
@end
@@ -117,12 +120,11 @@ DNDView* TkDND_GetDNDSubview(NSView *view, Tk_Window tkwin);
/*
* Ripped from Tk-Cocoa source code to map Tk window to Cocoa window
*/
-TkWindow* TkMacOSXGetTkWindow(NSWindow *w) {
+Tk_Window TkMacOSXGetTkWindow(NSWindow *w) {
Window window = TkMacOSXGetXWindow((__bridge void*)w);
TkDisplay *dispPtr = TkGetDisplayList();
- return (window != None ? (TkWindow *)Tk_IdToWindow(dispPtr->display, window) :
- NULL);
+ return (window != None ? Tk_IdToWindow(dispPtr->display, window) : NULL);
}; /* TkMacOSXGetTkWindow */
/*
@@ -185,6 +187,122 @@ DNDView* TkDND_GetDNDSubview(NSView *view, Tk_Window tkwin) {
return NSDragOperationCopy|NSDragOperationMove|NSDragOperationLink;
}
+/*
+ * Convert from strings to OS X type NSString objects...
+ */
+const NSString *TKDND_Obj2NSString(Tcl_Interp *interp, Tcl_Obj *obj) {
+ int index, status;
+ NSString *str = NULL;
+ static char *OSXTypes[] = {
+ /* OS X v10.6 and later */
+ "NSPasteboardTypeString",
+ "NSPasteboardTypePDF",
+ "NSPasteboardTypeTIFF",
+ "NSPasteboardTypePNG",
+ "NSPasteboardTypeRTF",
+ "NSPasteboardTypeRTFD",
+ "NSPasteboardTypeHTML",
+ "NSPasteboardTypeTabularText",
+ "NSPasteboardTypeFont",
+ "NSPasteboardTypeRuler",
+ "NSPasteboardTypeColor",
+ "NSPasteboardTypeSound",
+ "NSPasteboardTypeMultipleTextSelection",
+ "NSPasteboardTypeFindPanelSearchOptions",
+ /* OS X v10.5 and earlier */
+ "NSStringPboardType",
+ "NSFilenamesPboardType",
+ "NSPostScriptPboardType",
+ "NSTIFFPboardType",
+ "NSRTFPboardType",
+ "NSTabularTextPboardType",
+ "NSFontPboardType",
+ "NSRulerPboardType",
+ "NSFileContentsPboardType",
+ "NSColorPboardType",
+ "NSRTFDPboardType",
+ "NSHTMLPboardType",
+ "NSURLPboardType",
+ "NSPDFPboardType",
+ "NSVCardPboardType",
+ "NSFilesPromisePboardType",
+ "NSMultipleTextSelectionPboardType",
+ (char *) NULL
+ };
+ enum osxtypes {
+ /* OS X v10.6 and later */
+ TYPE_NSPasteboardTypeString,
+ TYPE_NSPasteboardTypePDF,
+ TYPE_NSPasteboardTypeTIFF,
+ TYPE_NSPasteboardTypePNG,
+ TYPE_NSPasteboardTypeRTF,
+ TYPE_NSPasteboardTypeRTFD,
+ TYPE_NSPasteboardTypeHTML,
+ TYPE_NSPasteboardTypeTabularText,
+ TYPE_NSPasteboardTypeFont,
+ TYPE_NSPasteboardTypeRuler,
+ TYPE_NSPasteboardTypeColor,
+ TYPE_NSPasteboardTypeSound,
+ TYPE_NSPasteboardTypeMultipleTextSelection,
+ TYPE_NSPasteboardTypeFindPanelSearchOptions,
+ /* OS X v10.5 and earlier */
+ TYPE_NSStringPboardType,
+ TYPE_NSFilenamesPboardType,
+ TYPE_NSPostScriptPboardType,
+ TYPE_NSTIFFPboardType,
+ TYPE_NSRTFPboardType,
+ TYPE_NSTabularTextPboardType,
+ TYPE_NSFontPboardType,
+ TYPE_NSRulerPboardType,
+ TYPE_NSFileContentsPboardType,
+ TYPE_NSColorPboardType,
+ TYPE_NSRTFDPboardType,
+ TYPE_NSHTMLPboardType,
+ TYPE_NSURLPboardType,
+ TYPE_NSPDFPboardType,
+ TYPE_NSVCardPboardType,
+ TYPE_NSFilesPromisePboardType,
+ TYPE_NSMultipleTextSelectionPboardType,
+ };
+ status = Tcl_GetIndexFromObj(interp, obj, (const char **) OSXTypes,
+ "osxtypes", 0, &index);
+ if (status != TCL_OK) return NULL;
+ switch ((enum osxtypes) index) {
+ case TYPE_NSPasteboardTypeString: {str = NSPasteboardTypeString ; break;}
+ case TYPE_NSPasteboardTypePDF: {str = NSPasteboardTypePDF ; break;}
+ case TYPE_NSPasteboardTypeTIFF: {str = NSPasteboardTypeTIFF ; break;}
+ case TYPE_NSPasteboardTypePNG: {str = NSPasteboardTypePNG ; break;}
+ case TYPE_NSPasteboardTypeRTF: {str = NSPasteboardTypeRTF ; break;}
+ case TYPE_NSPasteboardTypeRTFD: {str = NSPasteboardTypeRTFD ; break;}
+ case TYPE_NSPasteboardTypeHTML: {str = NSPasteboardTypeHTML ; break;}
+ case TYPE_NSPasteboardTypeTabularText: {str = NSPasteboardTypeTabularText ; break;}
+ case TYPE_NSPasteboardTypeFont: {str = NSPasteboardTypeFont ; break;}
+ case TYPE_NSPasteboardTypeRuler: {str = NSPasteboardTypeRuler ; break;}
+ case TYPE_NSPasteboardTypeColor: {str = NSPasteboardTypeColor ; break;}
+ case TYPE_NSPasteboardTypeSound: {str = NSPasteboardTypeSound ; break;}
+ case TYPE_NSPasteboardTypeMultipleTextSelection: {str = NSPasteboardTypeMultipleTextSelection ; break;}
+ case TYPE_NSPasteboardTypeFindPanelSearchOptions: {str = NSPasteboardTypeFindPanelSearchOptions; break;}
+ case TYPE_NSStringPboardType: {str = NSStringPboardType ; break;}
+ case TYPE_NSFilenamesPboardType: {str = NSFilenamesPboardType ; break;}
+ case TYPE_NSPostScriptPboardType: {str = NSPostScriptPboardType ; break;}
+ case TYPE_NSTIFFPboardType: {str = NSTIFFPboardType ; break;}
+ case TYPE_NSRTFPboardType: {str = NSRTFPboardType ; break;}
+ case TYPE_NSTabularTextPboardType: {str = NSTabularTextPboardType ; break;}
+ case TYPE_NSFontPboardType: {str = NSFontPboardType ; break;}
+ case TYPE_NSRulerPboardType: {str = NSRulerPboardType ; break;}
+ case TYPE_NSFileContentsPboardType: {str = NSFileContentsPboardType ; break;}
+ case TYPE_NSColorPboardType: {str = NSColorPboardType ; break;}
+ case TYPE_NSRTFDPboardType: {str = NSRTFDPboardType ; break;}
+ case TYPE_NSHTMLPboardType: {str = NSHTMLPboardType ; break;}
+ case TYPE_NSURLPboardType: {str = NSURLPboardType ; break;}
+ case TYPE_NSPDFPboardType: {str = NSPDFPboardType ; break;}
+ case TYPE_NSVCardPboardType: {str = NSVCardPboardType ; break;}
+ case TYPE_NSFilesPromisePboardType: {str = NSFilesPromisePboardType ; break;}
+ case TYPE_NSMultipleTextSelectionPboardType: {str = NSMultipleTextSelectionPboardType ; break;}
+ }
+ return str;
+}; /* TKDND_Obj2NSString */
+
/*******************************************************************************
*******************************************************************************
***** Drop Target Operations *****
@@ -205,10 +323,9 @@ DNDView* TkDND_GetDNDSubview(NSView *view, Tk_Window tkwin) {
refuse_drop, ActionDefault
};
- TkWindow *winPtr = TkMacOSXGetTkWindow([self window]);
- Tk_Window tkwin = (Tk_Window) winPtr;
- Tcl_Interp *interp = Tk_Interp(tkwin);
- sourcePasteBoard = [sender draggingPasteboard];
+ Tk_Window tkwin = TkMacOSXGetTkWindow([self window]);
+ Tcl_Interp *interp = Tk_Interp(tkwin);
+ NSPasteboard *sourcePasteBoard = [sender draggingPasteboard];
Tcl_Obj* objv[4], *element, *result;
int i, index, status;
@@ -220,8 +337,8 @@ DNDView* TkDND_GetDNDSubview(NSView *view, Tk_Window tkwin) {
/*
* Search for known types...
*/
- if ([[sourcePasteBoard types] containsObject:NSStringPboardType]) {
- element = Tcl_NewStringObj("NSStringPboardType", -1);
+ if ([[sourcePasteBoard types] containsObject:NSPasteboardTypeString]) {
+ element = Tcl_NewStringObj("NSPasteboardTypeString", -1);
Tcl_ListObjAppendElement(NULL, objv[3], element);
}
if ([[sourcePasteBoard types] containsObject:NSFilenamesPboardType]) {
@@ -272,10 +389,9 @@ DNDView* TkDND_GetDNDSubview(NSView *view, Tk_Window tkwin) {
Tk_Window mouse_tkwin;
NSPoint mouseLoc;
- TkWindow *winPtr = TkMacOSXGetTkWindow([self window]);
- Tk_Window tkwin = (Tk_Window) winPtr;
- Tcl_Interp *interp = Tk_Interp(tkwin);
- sourcePasteBoard = [sender draggingPasteboard];
+ Tk_Window tkwin = TkMacOSXGetTkWindow([self window]);
+ Tcl_Interp *interp = Tk_Interp(tkwin);
+ NSPasteboard *sourcePasteBoard = [sender draggingPasteboard];
/* Get the coordinates of the cursor... */
mouseLoc = [NSEvent mouseLocation];
@@ -336,7 +452,7 @@ DNDView* TkDND_GetDNDSubview(NSView *view, Tk_Window tkwin) {
//prepare to perform drag operation
- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender {
- sourcePasteBoard = [sender draggingPasteboard];
+ // sourcePasteBoard = [sender draggingPasteboard];
return YES;
}; /* prepareForDragOperation */
@@ -353,40 +469,74 @@ DNDView* TkDND_GetDNDSubview(NSView *view, Tk_Window tkwin) {
ActionCopy, ActionMove, ActionLink, ActionAsk, ActionPrivate,
refuse_drop, ActionDefault, NoReturnedAction
};
- TkWindow *winPtr = TkMacOSXGetTkWindow([self window]);
- Tk_Window tkwin = (Tk_Window) winPtr;
- Tcl_Interp *interp = Tk_Interp(tkwin);
- sourcePasteBoard = [sender draggingPasteboard];
+ Tk_Window tkwin = TkMacOSXGetTkWindow([self window]);
+ Tcl_Interp *interp = Tk_Interp(tkwin);
+ NSPasteboard *sourcePasteBoard = [sender draggingPasteboard];
Tcl_Obj *data = NULL;
+ Tcl_Obj* objv[3], **elem, *result;
+ int i, index, status, elem_nu;
+ const NSString *type;
+
+ /* Retrieve the common types, as prefered by the drag source... */
+ objv[0] = Tcl_NewStringObj("tkdnd::macdnd::_GetDragSourceCommonTypes", -1);
+ /* Evaluate the command and get the result...*/
+ TkDND_Status_Eval(1);
+ // printf("Status=%d (%d)\n", status, TCL_OK);fflush(0);
+ if (status != TCL_OK) {
+ /* An error has happened. Cancel the drop! */
+ return NO;
+ }
+ result = Tcl_GetObjResult(interp); Tcl_IncrRefCount(result);
+ status = Tcl_ListObjGetElements(interp, result, &elem_nu, &elem);
+ if (status != TCL_OK) {
+ Tcl_DecrRefCount(result);
+ return NO;
+ }
+
+#if 0
+ /* Print what exists in the clipboard... */
+ i = 0;
+ for (NSPasteboardItem *item in [sourcePasteBoard pasteboardItems]) {
+ for (NSString *type in [item types]) {
+ printf("item %d: type: %s\n", i++, [type UTF8String]);
+ }
+ }
+ /* Print what we can accept... */
+ for (int j = 0; j < elem_nu; ++j) {
+ printf("accept: %s\n", Tcl_GetString(elem[j]));
+ }
+#endif
- /* Retrieve string data from clipboard... */
- NSArray *types = [sourcePasteBoard types];
- NSString *pasteboardvalue = nil;
- for (NSString *type in types) {
- if ([type isEqualToString:NSStringPboardType]) {
+ /* Retrieve data from clipboard, checking all items... */
+ for (int j = 0; j < elem_nu; ++j) {
+ type = TKDND_Obj2NSString(interp, elem[j]);
+ if ([type isEqualToString:NSPasteboardTypeString]) {
/* String type... */
- pasteboardvalue = [sourcePasteBoard stringForType:NSStringPboardType];
- data = Tcl_NewStringObj([pasteboardvalue UTF8String], -1);
+ for (NSPasteboardItem *item in [sourcePasteBoard pasteboardItems]) {
+ NSString *pasteboardvalue = [item stringForType:NSPasteboardTypeString];
+ if (pasteboardvalue) {
+ data = Tcl_NewStringObj([pasteboardvalue UTF8String], -1);
+ break;
+ }
+ }
} else if ([type isEqualToString:NSFilenamesPboardType]) {
- Tcl_Obj *element;
- data = Tcl_NewListObj(0, NULL);
- /* File array... */
- NSArray *files =
- [sourcePasteBoard propertyListForType:NSFilenamesPboardType];
- for (NSString *filename in files) {
- element = Tcl_NewStringObj([filename UTF8String], -1);
- if (element == NULL) continue;
- Tcl_IncrRefCount(element);
- Tcl_ListObjAppendElement(interp, data, element);
- Tcl_DecrRefCount(element);
+ /* Filenames array... */
+ NSArray *files = [sourcePasteBoard propertyListForType:NSFilenamesPboardType];
+ if (files) {
+ Tcl_Obj *element;
+ data = Tcl_NewListObj(0, NULL);
+ for (NSString *filename in files) {
+ element = Tcl_NewStringObj([filename UTF8String], -1);
+ if (element == NULL) continue;
+ Tcl_ListObjAppendElement(interp, data, element);
+ }
}
}
+ if (data != NULL) break;
}
+ Tcl_DecrRefCount(result);
if (data == NULL) data = Tcl_NewStringObj(NULL, 0);
- Tcl_Obj* objv[3], *result;
- int i, index, status;
-
objv[0] = Tcl_NewStringObj("tkdnd::macdnd::_HandleDrop", -1);
objv[1] = Tcl_NewStringObj(Tk_PathName(tkwin), -1);
objv[2] = data;
@@ -425,10 +575,8 @@ DNDView* TkDND_GetDNDSubview(NSView *view, Tk_Window tkwin) {
* Calls tkdnd::macdnd::_HandleXdndDrop
*/
- (void)draggingExited:(id < NSDraggingInfo >)sender {
- TkWindow *winPtr = TkMacOSXGetTkWindow([self window]);
- Tk_Window tkwin = (Tk_Window) winPtr;
+ Tk_Window tkwin = TkMacOSXGetTkWindow([self window]);
Tcl_Interp *interp = Tk_Interp(tkwin);
- sourcePasteBoard = [sender draggingPasteboard];
Tcl_Obj* objv[4];
int i;
@@ -459,20 +607,20 @@ DNDView* TkDND_GetDNDSubview(NSView *view, Tk_Window tkwin) {
*/
int TkDND_DoDragDropObjCmd(ClientData clientData, Tcl_Interp *interp,
int objc, Tcl_Obj *CONST objv[]) {
- Tcl_Obj **elem;
+ Tcl_Obj **elem, **data_elem, **files_elem;
int actions = 0;
- int status, elem_nu, i, index;
+ int status, elem_nu, data_elem_nu, files_elem_nu, i, j, index;
Tk_Window path;
Drawable d;
NSView *view;
DNDView *dragview;
NSImage *dragicon = NULL;
static char *DropTypes[] = {
- "NSStringPboardType", "NSFilenamesPboardType",
+ "NSPasteboardTypeString", "NSFilenamesPboardType",
(char *) NULL
};
enum droptypes {
- TYPE_NSStringPboardType, TYPE_NSFilenamesPboardType
+ TYPE_NSPasteboardTypeString, TYPE_NSFilenamesPboardType
};
static char *DropActions[] = {
"copy", "move", "link", "ask", "private", "refuse_drop",
@@ -485,8 +633,8 @@ int TkDND_DoDragDropObjCmd(ClientData clientData, Tcl_Interp *interp,
};
bool added_string = false, added_filenames = false, perform_drag = false;
- if (objc != 5) {
- Tcl_WrongNumArgs(interp, 1, objv, "path actions types data");
+ if (objc != 6) {
+ Tcl_WrongNumArgs(interp, 1, objv, "path actions types data button");
return TCL_ERROR;
}
Tcl_ResetResult(interp);
@@ -524,18 +672,25 @@ int TkDND_DoDragDropObjCmd(ClientData clientData, Tcl_Interp *interp,
/* Process drag types. */
status = Tcl_ListObjGetElements(interp, objv[3], &elem_nu, &elem);
if (status != TCL_OK) return status;
+ /* objv[4] contains a list, one element for each data drag type... */
+ status = Tcl_ListObjGetElements(interp, objv[4], &data_elem_nu, &data_elem);
+ if (status != TCL_OK) return status;
+ if (elem_nu != data_elem_nu) {
+ /* This can never happen... */
+ return TCL_ERROR;
+ }
/* Initialize array of drag types... */
- NSMutableArray *draggedtypes=[[NSMutableArray alloc] init];
+ NSMutableArray *draggedtypes=[[[NSMutableArray alloc] init] autorelease];
/* Iterate over all data, to collect the types... */
for (i = 0; i < elem_nu; i++) {
status = Tcl_GetIndexFromObj(interp, elem[i], (const char **) DropTypes,
- "dropactions", 0, &index);
+ "droptypes", 0, &index);
if (status != TCL_OK) continue;
switch ((enum droptypes) index) {
- case TYPE_NSStringPboardType: {
+ case TYPE_NSPasteboardTypeString: {
if (!added_string) {
- [draggedtypes addObject: NSStringPboardType];
+ // [draggedtypes addObject: NSPasteboardTypeString];
added_string = true;
perform_drag = true;
}
@@ -563,7 +718,18 @@ int TkDND_DoDragDropObjCmd(ClientData clientData, Tcl_Interp *interp,
* to drop targets via [sender draggingPasteboard]
*/
NSPasteboard *dragpasteboard = [NSPasteboard pasteboardWithName:NSDragPboard];
- [dragpasteboard declareTypes:draggedtypes owner:dragview];
+ NSMutableArray *dataitems =[[[NSMutableArray alloc] init] autorelease];
+ NSMutableArray *filelist = [[[NSMutableArray alloc] init] autorelease];
+ [dragpasteboard clearContents];
+
+ if (added_filenames) {
+ /* There is a request about deprecated NSFilenamesPboardType. The only way to
+ use it, is through setPropertyList:forType, which operates only on the first
+ item. So, call declareTypes, to create this first item... */
+ //[dragpasteboard declareTypes:draggedtypes owner:dragview];
+ NSPasteboardItem *item = [[[NSPasteboardItem alloc] init] autorelease];
+ [dataitems addObject: item];
+ }
/*
* We need an icon for the drag:
@@ -572,14 +738,18 @@ int TkDND_DoDragDropObjCmd(ClientData clientData, Tcl_Interp *interp,
*/
for (i = 0; i < elem_nu; i++) {
status = Tcl_GetIndexFromObj(interp, elem[i], (const char **) DropTypes,
- "dropactions", 0, &index);
+ "droptypes", 0, &index);
if (status == TCL_OK) {
switch ((enum droptypes) index) {
- case TYPE_NSStringPboardType: {
+ case TYPE_NSPasteboardTypeString: {
/* Place the string into the clipboard. */
NSString *datastring =
- [NSString stringWithUTF8String:Tcl_GetString(objv[4])];
- [dragpasteboard setString:datastring forType:NSStringPboardType];
+ [NSString stringWithUTF8String:Tcl_GetString(data_elem[i])];
+ NSPasteboardItem *item = [[[NSPasteboardItem alloc] init] autorelease];
+ [item setString:datastring forType:NSPasteboardTypeString];
+ [dataitems addObject: item];
+ //[dragpasteboard writeObjects:[NSArray arrayWithObject:item]];
+ //[dragpasteboard setString:datastring forType:NSPasteboardTypeString];
/* Create a custom icon: draw dragged string into drag icon,
* make sure icon is large enough to contain several lines of text */
@@ -595,24 +765,24 @@ int TkDND_DoDragDropObjCmd(ClientData clientData, Tcl_Interp *interp,
break;
}
case TYPE_NSFilenamesPboardType: {
- NSMutableArray *filelist = [[NSMutableArray alloc] init];
/* Place the filenames into the clipboard. */
- status = Tcl_ListObjGetElements(interp, objv[4], &elem_nu, &elem);
+ status = Tcl_ListObjGetElements(interp, data_elem[i],
+ &files_elem_nu, &files_elem);
if ( status == TCL_OK) {
- for (i = 0; i < elem_nu; i++) {
+ for (j = 0; j < files_elem_nu; j++) {
/* Get string value of file name from list */
- char* filename = Tcl_GetString(elem[i]);
+ char* filename = Tcl_GetString(files_elem[j]);
/* Convert file names to NSSString, add to NSMutableArray,
* and set pasteboard type */
NSString *filestring = [NSString stringWithUTF8String:filename];
- [filelist addObject: filestring];
+ [filelist addObject: /*[NSURL fileURLWithPath:*/ filestring] /*]*/;
}
}
/* This successfully writes the file path data to the clipboard,
* and it is available to other non-Tk applications... */
- [dragpasteboard setPropertyList:filelist
- forType:NSFilenamesPboardType];
+ // [dragpasteboard writeObjects: filelist];
+ // [dragpasteboard setPropertyList:filelist forType:NSFilenamesPboardType];
/* Set the correct icon depending on whether a single file
* [iconForFileType] or multiple files [NSImageNameMultipleDocuments]
@@ -620,7 +790,7 @@ int TkDND_DoDragDropObjCmd(ClientData clientData, Tcl_Interp *interp,
if (dragicon == NULL) {
if ([filelist count] == 1) {
NSString *pathtype = [[filelist objectAtIndex:0] pathExtension];
- dragicon = [[NSWorkspace sharedWorkspace]
+ dragicon = [[NSWorkspace sharedWorkspace]
iconForFileType:pathtype];
} else {
dragicon = [NSImage imageNamed:NSImageNameMultipleDocuments];
@@ -633,6 +803,10 @@ int TkDND_DoDragDropObjCmd(ClientData clientData, Tcl_Interp *interp,
/* An unknown (or user defined) type. Silently skip it... */
}
}
+ [dragpasteboard writeObjects: dataitems];
+ if (added_filenames) {
+ [dragpasteboard setPropertyList:filelist forType:NSFilenamesPboardType];
+ }
/* Do drag & drop... */
@@ -721,16 +895,16 @@ int TkDND_RegisterDragWidgetObjCmd(ClientData clientData, Tcl_Interp *ip,
if (strncmp(str, "*", len) == 0) {
/* A request for all available types... */
if (!added_string) {
- [draggedtypes addObject: NSStringPboardType];
+ [draggedtypes addObject: NSPasteboardTypeString];
added_string = true;
}
if (!added_filenames) {
[draggedtypes addObject: NSFilenamesPboardType];
added_filenames = true;
}
- } else if (strncmp(str, "NSStringPboardType", len) == 0) {
+ } else if (strncmp(str, "NSPasteboardTypeString", len) == 0) {
if (!added_string) {
- [draggedtypes addObject: NSStringPboardType];
+ [draggedtypes addObject: NSPasteboardTypeString];
added_string = true;
}
} else if (strncmp(str, "NSFilenamesPboardType", len) == 0) {
@@ -772,6 +946,20 @@ int TkDND_UnregisterDragWidgetObjCmd(ClientData clientData, Tcl_Interp *ip,
return TCL_OK;
}; /* TkDND_UnregisterDragWidgetObjCmd */
+/* Convert OS X types to strings... */
+int TkDND_Type2StringObjCmd(ClientData clientData, Tcl_Interp *interp,
+ int objc, Tcl_Obj *CONST objv[]) {
+ const NSString *str;
+ if (objc != 2) {
+ Tcl_WrongNumArgs(interp, 1, objv, "type");
+ return TCL_ERROR;
+ }
+ str = TKDND_Obj2NSString(interp, objv[1]);
+ if (str == NULL) return TCL_ERROR;
+ Tcl_SetObjResult(interp, Tcl_NewStringObj([str UTF8String], -1));
+ return TCL_OK;
+}; /* TkDND_Type2StringObjCmd */
+
/*
* Initalize the package in the tcl interpreter, create tcl commands...
*/
@@ -794,6 +982,9 @@ int Tkdnd_Init (Tcl_Interp *interp) {
Tcl_CreateObjCommand(interp, "::macdnd::dodragdrop",
TkDND_DoDragDropObjCmd,
(ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
+ Tcl_CreateObjCommand(interp, "::macdnd::osxtype2string",
+ TkDND_Type2StringObjCmd,
+ (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
if (Tcl_PkgProvide(interp, PACKAGE_NAME, PACKAGE_VERSION) != TCL_OK) {
return TCL_ERROR;