Drag-and-Drop Protocol for the X Window System
Dropping on windows that do not support XDND
Since middle clicking is the universal shortcut for pasting in X, one can drop data into a window that does not support XDND by:
-
After the mouse has been released to trigger the drop, obtain ownership of XA_PRIMARY.
-
Send a ButtonPress event and then a ButtonRelease event to the deepest subwindow containing the mouse to simulate a middle click. The times for these events should be the time of the actual button release +1 and +2, respectively. These values will not be used by anybody else, so one can unambiguously recognize the resulting XConvertSelection() request.
-
If a request for XA_PRIMARY arrives bearing the timestamp of either the ButtonPress or the ButtonRelease event, treat it as a request for XdndSelection. Note that you must use the X data types instead of the MIME types in this case. (e.g. XA_STRING instead of text/plain)
Since text is usually the only data that can be pasted into older programs that do not support XDND (e.g. xterm and emacs), it is a good idea to only use the above trick when dragging text. As an example, if one drags anything else and fakes a middle click in xterm, it will paste the contents of XA_SECONDARY, which is not what the user wants.
Thanks to Jeroen van der Zijp for the idea.
Notes
To get this to work with xterm, you must add
XTerm.VT100.allowSendEvents: True
to your .Xdefaults file.