/unmaintained/dragdrop-listener/dragdrop-listener.factor

http://github.com/abeaumont/factor · Factor · 74 lines · 68 code · 6 blank · 0 comment · 5 complexity · d264a5623cfe8682a3231188820ec728 MD5 · raw file

  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
  8. : filenames-from-hdrop ( hdrop -- filenames )
  9. dup 0xFFFFFFFF f 0 DragQueryFile ! get count of files
  10. [
  11. 2dup f 0 DragQueryFile 1 + ! get size of filename buffer
  12. dup WCHAR <c-array>
  13. [ swap DragQueryFile drop ] keep
  14. utf16n alien>string
  15. ] with map ;
  16. : filenames-from-data-object ( data-object -- filenames )
  17. FORMATETC <struct>
  18. CF_HDROP >>cfFormat
  19. f >>ptd
  20. DVASPECT_CONTENT >>dwAspect
  21. -1 >>lindex
  22. TYMED_HGLOBAL >>tymed
  23. STGMEDIUM <struct>
  24. [ IDataObject::GetData ] keep swap succeeded? [
  25. dup data>>
  26. [ filenames-from-hdrop ] with-global-lock
  27. swap ReleaseStgMedium
  28. ] [ drop f ] if ;
  29. TUPLE: listener-dragdrop hWnd last-drop-effect ;
  30. : <listener-dragdrop> ( hWnd -- object )
  31. DROPEFFECT_NONE listener-dragdrop construct-boa ;
  32. SYMBOL: +listener-dragdrop-wrapper+
  33. {
  34. { "IDropTarget" {
  35. [ ! DragEnter
  36. [
  37. 2drop
  38. filenames-from-data-object
  39. length 1 = [ DROPEFFECT_COPY ] [ DROPEFFECT_NONE ] if
  40. dup 0
  41. ] dip set-ulong-nth
  42. >>last-drop-effect drop
  43. S_OK
  44. ] [ ! DragOver
  45. [ 2drop last-drop-effect>> 0 ] dip set-ulong-nth
  46. S_OK
  47. ] [ ! DragLeave
  48. drop S_OK
  49. ] [ ! Drop
  50. [
  51. 2drop nip
  52. filenames-from-data-object
  53. dup length 1 = [
  54. first unparse [ "USE: parser " % % " run-file" % ] "" make
  55. eval-listener
  56. DROPEFFECT_COPY
  57. ] [ 2drop DROPEFFECT_NONE ] if
  58. 0
  59. ] dip set-ulong-nth
  60. S_OK
  61. ]
  62. } }
  63. } <com-wrapper> +listener-dragdrop-wrapper+ set-global
  64. : dragdrop-listener-window ( -- )
  65. get-workspace parent>> handle>> hWnd>>
  66. dup <listener-dragdrop>
  67. +listener-dragdrop-wrapper+ get-global com-wrap
  68. [ RegisterDragDrop ole32-error ] with-com-interface ;