summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2005-08-08 19:30:09 +0000
committerMatthias Melcher <fltk@matthiasm.com>2005-08-08 19:30:09 +0000
commit6f6cab4d6e72ef3cf91a4d3c383c11462fc292f7 (patch)
treef01e3eef60ac3124f3aaaba4a937b74f90045ec0 /src
parentff4722e07af6e97436f8b3d6dd29c0d935702460 (diff)
Moved some code around so that FLTK will figure out the
event_text for dnd text on the first FL_DND_ENTER event and then keep if in a temporary buffer until FL_PASTE or the next DND event. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4491 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
-rw-r--r--src/Fl_mac.cxx160
1 files changed, 103 insertions, 57 deletions
diff --git a/src/Fl_mac.cxx b/src/Fl_mac.cxx
index 2645f63b6..315fc6617 100644
--- a/src/Fl_mac.cxx
+++ b/src/Fl_mac.cxx
@@ -1418,9 +1418,93 @@ static int FSSpec2UnixPath( FSSpec *fs, char *dst )
FSRefMakePath( &fsRef, (UInt8*)dst, 1024 );
return strlen(dst);
}
-
+
+static DragReference currDragRef = 0;
+static char *currDragData = 0L;
+static int currDragSize = 0;
+static OSErr currDragErr = noErr;
Fl_Window *fl_dnd_target_window = 0;
#include <FL/fl_draw.H>
+
+/**
+ * Fill the currDrag* variables with the current DnD ASCII text.
+ */
+static OSErr fillCurrentDragData(DragReference dragRef)
+{
+ OSErr ret = noErr;
+ char *dst = 0L;
+
+ // shortcut through this whole procedure if this is still the same drag event
+ if (dragRef==currDragRef)
+ return currDragErr;
+
+ // clear currDrag* for a new drag event
+ currDragRef = dragRef;
+ if (currDragData) free(currDragData);
+ currDragData = 0;
+ currDragSize = 0;
+
+ // fill currDRag* with ASCII data, if available
+ UInt16 i, nItem;
+ ItemReference itemRef;
+ FlavorFlags flags;
+ Size itemSize, size = 0;
+ CountDragItems( dragRef, &nItem );
+ for ( i = 1; i <= nItem; i++ )
+ {
+ GetDragItemReferenceNumber( dragRef, i, &itemRef );
+ ret = GetFlavorFlags( dragRef, itemRef, 'TEXT', &flags );
+ if ( ret == noErr )
+ {
+ GetFlavorDataSize( dragRef, itemRef, 'TEXT', &itemSize );
+ size += itemSize;
+ }
+ ret = GetFlavorFlags( dragRef, itemRef, 'hfs ', &flags );
+ if ( ret == noErr )
+ {
+ size += 1024; //++ ouch! We should create the full pathname and figure out its length
+ }
+ }
+
+ if ( !size )
+ {
+ currDragErr = userCanceledErr;
+ return currDragErr;
+ }
+
+ currDragSize = size + nItem - 1;
+ currDragData = dst = (char*)malloc( size+nItem );;
+
+ for ( i = 1; i <= nItem; i++ )
+ {
+ GetDragItemReferenceNumber( dragRef, i, &itemRef );
+ ret = GetFlavorFlags( dragRef, itemRef, 'TEXT', &flags );
+ if ( ret == noErr )
+ {
+ GetFlavorDataSize( dragRef, itemRef, 'TEXT', &itemSize );
+ GetFlavorData( dragRef, itemRef, 'TEXT', dst, &itemSize, 0L );
+ dst += itemSize;
+ *dst++ = '\n'; // add our element seperator
+ }
+ ret = GetFlavorFlags( dragRef, itemRef, 'hfs ', &flags );
+ if ( ret == noErr )
+ {
+ HFSFlavor hfs; itemSize = sizeof( hfs );
+ GetFlavorData( dragRef, itemRef, 'hfs ', &hfs, &itemSize, 0L );
+ itemSize = FSSpec2UnixPath( &hfs.fileSpec, dst );
+ dst += itemSize;
+ if ( itemSize>1 && ( hfs.fileType=='fold' || hfs.fileType=='disk' ) )
+ *dst++ = '/';
+ *dst++ = '\n'; // add our element seperator
+ }
+ }
+
+ dst[-1] = 0;
+ currDragSize = dst - currDragData - 1;
+ currDragErr = ret;
+ return ret;
+}
+
/**
* Drag'n'drop tracking handler
*/
@@ -1430,6 +1514,10 @@ static pascal OSErr dndTrackingHandler( DragTrackingMessage msg, WindowPtr w, vo
Point mp;
static int px, py;
+ fillCurrentDragData(dragRef);
+ Fl::e_length = currDragSize;
+ Fl::e_text = currDragData;
+
switch ( msg )
{
case kDragTrackingEnterWindow:
@@ -1493,69 +1581,27 @@ static pascal OSErr dndReceiveHandler( WindowPtr w, void *userData, DragReferenc
Fl::e_y = Fl::e_y_root - target->y();
if ( !Fl::handle( FL_DND_RELEASE, target ) )
return userCanceledErr;
-
- // get the ASCII text
- UInt16 i, nItem;
- ItemReference itemRef;
- FlavorFlags flags;
- Size itemSize, size = 0;
- CountDragItems( dragRef, &nItem );
- for ( i = 1; i <= nItem; i++ )
- {
- GetDragItemReferenceNumber( dragRef, i, &itemRef );
- ret = GetFlavorFlags( dragRef, itemRef, 'TEXT', &flags );
- if ( ret == noErr )
- {
- GetFlavorDataSize( dragRef, itemRef, 'TEXT', &itemSize );
- size += itemSize;
- }
- ret = GetFlavorFlags( dragRef, itemRef, 'hfs ', &flags );
- if ( ret == noErr )
- {
- size += 1024; //++ ouch! We should create the full pathname and figure out its length
- }
- }
-
- if ( !size )
+
+ ret = fillCurrentDragData(dragRef);
+ if (ret==userCanceledErr)
return userCanceledErr;
- Fl::e_length = size + nItem - 1;
- char *dst = Fl::e_text = (char*)malloc( size+nItem );;
-
- for ( i = 1; i <= nItem; i++ )
- {
- GetDragItemReferenceNumber( dragRef, i, &itemRef );
- ret = GetFlavorFlags( dragRef, itemRef, 'TEXT', &flags );
- if ( ret == noErr )
- {
- GetFlavorDataSize( dragRef, itemRef, 'TEXT', &itemSize );
- GetFlavorData( dragRef, itemRef, 'TEXT', dst, &itemSize, 0L );
- dst += itemSize;
- *dst++ = '\n'; // add our element seperator
- }
- ret = GetFlavorFlags( dragRef, itemRef, 'hfs ', &flags );
- if ( ret == noErr )
- {
- HFSFlavor hfs; itemSize = sizeof( hfs );
- GetFlavorData( dragRef, itemRef, 'hfs ', &hfs, &itemSize, 0L );
- itemSize = FSSpec2UnixPath( &hfs.fileSpec, dst );
- dst += itemSize;
- if ( itemSize>1 && ( hfs.fileType=='fold' || hfs.fileType=='disk' ) )
- *dst++ = '/';
- *dst++ = '\n'; // add our element seperator
- }
- }
-
- dst[-1] = 0;
-// if ( Fl::e_text[Fl::e_length-1]==0 ) Fl::e_length--; // modify, if trailing 0 is part of string
- Fl::e_length = dst - Fl::e_text - 1;
+ Fl::e_length = currDragSize;
+ Fl::e_text = currDragData;
// printf("Sending following text to widget %p:\n%s\n", Fl::belowmouse(), Fl::e_text);
int old_event = Fl::e_number;
target->handle(Fl::e_number = FL_PASTE);
Fl::e_number = old_event;
- free( Fl::e_text );
-
+
+ if (currDragData) {
+ free(currDragData);
+ }
+ currDragData = 0L;
+ currDragRef = 0;
+ Fl::e_text = 0L;
+ Fl::e_length = 0;
fl_dnd_target_window = 0L;
+
breakMacEventLoop();
return noErr;
}