1 USING: alien.strings io.encodings.utf16n windows.com
2 windows.com.wrapper combinators windows.kernel32 windows.ole32
3 windows.shell32 kernel accessors windows.types
4 prettyprint namespaces ui.tools.listener ui.tools.workspace
5 alien.data alien sequences math classes.struct ;
6 SPECIALIZED-ARRAY: WCHAR
7 IN: windows.dragdrop-listener
9 : filenames-from-hdrop ( hdrop -- filenames )
10 dup 0xFFFFFFFF f 0 DragQueryFile ! get count of files
12 2dup f 0 DragQueryFile 1 + ! get size of filename buffer
14 [ swap DragQueryFile drop ] keep
18 : filenames-from-data-object ( data-object -- filenames )
22 DVASPECT_CONTENT >>dwAspect
26 [ IDataObject::GetData ] keep swap succeeded? [
28 [ filenames-from-hdrop ] with-global-lock
32 TUPLE: listener-dragdrop hWnd last-drop-effect ;
34 : <listener-dragdrop> ( hWnd -- object )
35 DROPEFFECT_NONE listener-dragdrop construct-boa ;
37 SYMBOL: +listener-dragdrop-wrapper+
43 filenames-from-data-object
44 length 1 = [ DROPEFFECT_COPY ] [ DROPEFFECT_NONE ] if
47 >>last-drop-effect drop
50 [ 2drop last-drop-effect>> 0 ] dip set-ulong-nth
57 filenames-from-data-object
59 first unparse [ "USE: parser " % % " run-file" % ] "" make
62 ] [ 2drop DROPEFFECT_NONE ] if
68 } <com-wrapper> +listener-dragdrop-wrapper+ set-global
70 : dragdrop-listener-window ( -- )
71 get-workspace parent>> handle>> hWnd>>
72 dup <listener-dragdrop>
73 +listener-dragdrop-wrapper+ get-global com-wrap
74 [ RegisterDragDrop ole32-error ] with-com-interface ;