thoughts on drag and drop events

Andreas Raab andreas.raab at gmx.de
Mon Apr 10 22:50:56 UTC 2006


Hi Guys -

On Windows, what you get is a (set of) format identifier (either one of 
the "standard" ones like CF_TEXT, CF_BITMAP, or one of the "private" 
ones that applications can register directly) and its interpretation is 
up to your app. This is the same between DnD and clipboard, but DnD may 
also indicate feedback for the DnD operation (e.g., whether the app can 
support the operation, whether it would "move" or "copy" the contents etc).

The interface that I could support most easily would be one where we 
query for the available formats and (later) request a byte array 
consisting of data in the requested format. Put together, it might look 
like here:

* ioGetClipboardFormat(clp,n): Get the n-th format of clipboard data.
   This function is used to enumerate available clipboard formats.
   Arguments:
     clp <Integer> - identifier of clipboard (0 - default)
     n   <Integer> - format index
   Return value:
     format <Integer> - the identifier for the clipboard format
                        returns -1 for last entry

* ioReadClipboard(clp, fmt): Get clipboard data in format "fmt".
   This function answers a byte array consisting of the clipboard data 
in the request format.
   Arguments:
     clp <Integer> - identifier of clipboard (0 - default)
     fmt <Integer> - format index
   Return value:
     bytes <ByteArray> - the data read from the clipboard

* ioClearClipboard(clp): Clears the clipboard.
   This function is used to clear the entire clipboard so that 
subsequent operations can set multiple formats for the same data.
   Arguments:
     clp <Integer> - identifier of clipboard (0 - default)

* ioAddClipboardData(fmt, data): Add clipboard data in format fmt.
   This function is used for adding clipboard data in the given format.
   Arguments:
     clp  <Integer> - identifier of clipboard (0 - default)
     data <ByteArray> - the data for the clipboard


I'd do the same thing for DnD, e.g.,

* ioGetDropFormat(dh,n): Get the n-th format of drop data
   This function is used to enumerate available drop formats.
   Arguments:
     dh  <Integer> - drop handle
     n   <Integer> - format index
   Return value:
     format <Integer> - the identifier for the drop format
                        returns -1 for last entry

* ioGetDropData(dh, fmt): Get drop data in format "fmt".
   This function answers a byte array consisting of the clipboard data 
in the request format.
   Arguments:
     dh  <Integer> - drop handle
     fmt <Integer> - format index
   Return value:
     bytes <ByteArray> - the data read from the drop handle

* ioDeleteDropHandle(dh): Free a drop handle
   This function is necessary since the drop handle will have to be 
preserved until the (Squeak) DnD operation is complete which typically 
outlasts the OS' transaction.
   Arguments:
     dh  <Integer> - drop handle

* ioSetDropFlags(dh, flags): Set drop flags during drag and drop.
   This function allows us to customize user feedback for the drop.
   Arguments:
     dh    <Integer> - drop handle
     flags <Integer> Either one of "reject drop", "move operation", 
"copy operation" etc.

Would this work on other platforms?

Cheers,
   - Andreas

John M McIntosh wrote:
> Someone asked about drag and drop of a URL from Safari to Squeak. Turns 
> out we get a drag
> and drop event with a flavor type of URL, mind we get 7 other flavors 
> too, like txt, utf, etc all these
> are indicators of an object we want Squeak to process.
> 
> Problem is we don't have any way for the VM to feed those back to us 
> because the logic is setup
> only to consider a file drag/drop event.
> 
> So, either I create a file and stuff the data into it, messy but would 
> work with existing logic, and have the
> drag file dispatcher would need to do the right thing.
> 
> Or alter sqDragDropFilesEvent and have a different drag type and pass up 
> an object containing the bits in question
> 
> Thoughts on the choices are welcome
> -- 
> ===========================================================================
> John M. McIntosh <johnmci at smalltalkconsulting.com> 1-800-477-2659
> Corporate Smalltalk Consulting Ltd.  http://www.smalltalkconsulting.com
> ===========================================================================
> 
> 



More information about the Vm-dev mailing list