diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2005-08-08 19:30:09 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2005-08-08 19:30:09 +0000 |
| commit | 6f6cab4d6e72ef3cf91a4d3c383c11462fc292f7 (patch) | |
| tree | f01e3eef60ac3124f3aaaba4a937b74f90045ec0 /src | |
| parent | ff4722e07af6e97436f8b3d6dd29c0d935702460 (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.cxx | 160 |
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; } |
