windows.dragdrop-listener: move from unmaintained to basis
parent
3faad21b3d
commit
5f87b1d577
|
@ -0,0 +1,74 @@
|
||||||
|
USING: alien.strings io.encodings.utf16n windows.com
|
||||||
|
windows.com.wrapper combinators windows.kernel32 windows.ole32
|
||||||
|
windows.shell32 kernel accessors windows.types
|
||||||
|
prettyprint namespaces ui.tools.listener ui.tools.workspace
|
||||||
|
alien.data alien sequences math classes.struct ;
|
||||||
|
SPECIALIZED-ARRAY: WCHAR
|
||||||
|
IN: windows.dragdrop-listener
|
||||||
|
|
||||||
|
: filenames-from-hdrop ( hdrop -- filenames )
|
||||||
|
dup 0xFFFFFFFF f 0 DragQueryFile ! get count of files
|
||||||
|
[
|
||||||
|
2dup f 0 DragQueryFile 1 + ! get size of filename buffer
|
||||||
|
dup WCHAR <c-array>
|
||||||
|
[ swap DragQueryFile drop ] keep
|
||||||
|
utf16n alien>string
|
||||||
|
] with map ;
|
||||||
|
|
||||||
|
: filenames-from-data-object ( data-object -- filenames )
|
||||||
|
FORMATETC <struct>
|
||||||
|
CF_HDROP >>cfFormat
|
||||||
|
f >>ptd
|
||||||
|
DVASPECT_CONTENT >>dwAspect
|
||||||
|
-1 >>lindex
|
||||||
|
TYMED_HGLOBAL >>tymed
|
||||||
|
STGMEDIUM <struct>
|
||||||
|
[ IDataObject::GetData ] keep swap succeeded? [
|
||||||
|
dup data>>
|
||||||
|
[ filenames-from-hdrop ] with-global-lock
|
||||||
|
swap ReleaseStgMedium
|
||||||
|
] [ drop f ] if ;
|
||||||
|
|
||||||
|
TUPLE: listener-dragdrop hWnd last-drop-effect ;
|
||||||
|
|
||||||
|
: <listener-dragdrop> ( hWnd -- object )
|
||||||
|
DROPEFFECT_NONE listener-dragdrop construct-boa ;
|
||||||
|
|
||||||
|
SYMBOL: +listener-dragdrop-wrapper+
|
||||||
|
{
|
||||||
|
{ "IDropTarget" {
|
||||||
|
[ ! DragEnter
|
||||||
|
[
|
||||||
|
2drop
|
||||||
|
filenames-from-data-object
|
||||||
|
length 1 = [ DROPEFFECT_COPY ] [ DROPEFFECT_NONE ] if
|
||||||
|
dup 0
|
||||||
|
] dip set-ulong-nth
|
||||||
|
>>last-drop-effect drop
|
||||||
|
S_OK
|
||||||
|
] [ ! DragOver
|
||||||
|
[ 2drop last-drop-effect>> 0 ] dip set-ulong-nth
|
||||||
|
S_OK
|
||||||
|
] [ ! DragLeave
|
||||||
|
drop S_OK
|
||||||
|
] [ ! Drop
|
||||||
|
[
|
||||||
|
2drop nip
|
||||||
|
filenames-from-data-object
|
||||||
|
dup length 1 = [
|
||||||
|
first unparse [ "USE: parser " % % " run-file" % ] "" make
|
||||||
|
eval-listener
|
||||||
|
DROPEFFECT_COPY
|
||||||
|
] [ 2drop DROPEFFECT_NONE ] if
|
||||||
|
0
|
||||||
|
] dip set-ulong-nth
|
||||||
|
S_OK
|
||||||
|
]
|
||||||
|
} }
|
||||||
|
} <com-wrapper> +listener-dragdrop-wrapper+ set-global
|
||||||
|
|
||||||
|
: dragdrop-listener-window ( -- )
|
||||||
|
get-workspace parent>> handle>> hWnd>>
|
||||||
|
dup <listener-dragdrop>
|
||||||
|
+listener-dragdrop-wrapper+ get-global com-wrap
|
||||||
|
[ RegisterDragDrop ole32-error ] with-com-interface ;
|
|
@ -0,0 +1 @@
|
||||||
|
windows
|
Loading…
Reference in New Issue