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
This commit is contained in:
parent
ff4722e07a
commit
6f6cab4d6e
2
CHANGES
2
CHANGES
@ -3,6 +3,8 @@ CHANGES IN FLTK 1.1.7
|
||||
- Documentation fixes (STR #571, STR #648, STR #692, STR
|
||||
#730, STR #744, STR #745, STR #931, STR #942, STR #960,
|
||||
STR #969)
|
||||
- Fixed event_text() field on FL_DND_* event on
|
||||
OS X (STR #968)
|
||||
- The fltk-config utility now supports "--cc" and "--cxx"
|
||||
options to get the C and C++ compilers that were used
|
||||
to compile FLTK (STR #868)
|
||||
|
||||
160
src/Fl_mac.cxx
160
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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user