tkinterdnd2 0.5.0__tar.gz → 0.6.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. {tkinterdnd2-0.5.0/tkinterdnd2.egg-info → tkinterdnd2-0.6.1}/PKG-INFO +3 -9
  2. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/README.md +2 -8
  3. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/setup.py +9 -2
  4. tkinterdnd2-0.6.1/tests/test_tkinterdnd2.py +81 -0
  5. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2/TkinterDnD.py +6 -1
  6. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64/libtkdnd2.10.1.so +0 -0
  7. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/pkgIndex.tcl +4 -4
  8. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_generic.tcl +48 -0
  9. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_unix.tcl +51 -10
  10. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9/libtcl9tkdnd2.10.1.so +0 -0
  11. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/pkgIndex.tcl +4 -4
  12. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_generic.tcl +48 -0
  13. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_unix.tcl +51 -10
  14. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64/libtkdnd2.10.1.so +0 -0
  15. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/pkgIndex.tcl +4 -4
  16. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64/tkdnd_generic.tcl +635 -0
  17. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd_unix.tcl +51 -10
  18. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9/libtcl9tkdnd2.10.1.so +0 -0
  19. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9/pkgIndex.tcl +62 -0
  20. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_generic.tcl +48 -0
  21. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_unix.tcl +51 -10
  22. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64/libtcl9tkdnd2.9.5.dylib → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/libtkdnd2.10.1.dylib +0 -0
  23. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/pkgIndex.tcl +62 -0
  24. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/tkdnd.tcl +554 -0
  25. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/tkdnd_generic.tcl +635 -0
  26. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/tkdnd_macosx.tcl +144 -0
  27. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/tkdnd_unix.tcl +924 -0
  28. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/tkdnd_windows.tcl +167 -0
  29. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/libtcl9tkdnd2.10.1.dylib +0 -0
  30. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/pkgIndex.tcl +62 -0
  31. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/tkdnd.tcl +554 -0
  32. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/tkdnd_generic.tcl +635 -0
  33. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/tkdnd_unix.tcl +924 -0
  34. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/tkdnd_windows.tcl +167 -0
  35. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64/tkdnd_macosx.tcl +144 -0
  36. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/libtkdnd2.10.1.dll +0 -0
  37. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/pkgIndex.tcl +62 -0
  38. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd.tcl +554 -0
  39. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd2.10.1.lib +0 -0
  40. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_compat.tcl +160 -0
  41. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_generic.tcl +635 -0
  42. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_macosx.tcl +144 -0
  43. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_unix.tcl +924 -0
  44. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_utils.tcl +256 -0
  45. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_windows.tcl +167 -0
  46. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/libtkdnd2.10.1.dll +0 -0
  47. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/pkgIndex.tcl +62 -0
  48. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd.tcl +554 -0
  49. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd2.10.1.lib +0 -0
  50. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_compat.tcl +160 -0
  51. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_generic.tcl +635 -0
  52. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_macosx.tcl +144 -0
  53. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_unix.tcl +924 -0
  54. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_utils.tcl +256 -0
  55. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_windows.tcl +167 -0
  56. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/libtkdnd2.10.1.dll +0 -0
  57. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/pkgIndex.tcl +62 -0
  58. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd.tcl +554 -0
  59. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd2.10.1.lib +0 -0
  60. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_compat.tcl +160 -0
  61. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_generic.tcl +635 -0
  62. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_macosx.tcl +144 -0
  63. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_unix.tcl +924 -0
  64. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_utils.tcl +256 -0
  65. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_windows.tcl +167 -0
  66. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/libtkdnd2.10.1.dll +0 -0
  67. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/pkgIndex.tcl +62 -0
  68. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd.tcl +554 -0
  69. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd2.10.1.lib +0 -0
  70. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_compat.tcl +160 -0
  71. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_generic.tcl +635 -0
  72. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_macosx.tcl +144 -0
  73. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_unix.tcl +924 -0
  74. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_utils.tcl +256 -0
  75. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_windows.tcl +167 -0
  76. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/libtkdnd2.10.1.dll +0 -0
  77. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/pkgIndex.tcl +62 -0
  78. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd.tcl +554 -0
  79. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd2.10.1.lib +0 -0
  80. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_compat.tcl +160 -0
  81. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_generic.tcl +635 -0
  82. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_macosx.tcl +144 -0
  83. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_unix.tcl +924 -0
  84. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_utils.tcl +256 -0
  85. tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_windows.tcl +167 -0
  86. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1/tkinterdnd2.egg-info}/PKG-INFO +3 -9
  87. tkinterdnd2-0.6.1/tkinterdnd2.egg-info/SOURCES.txt +123 -0
  88. tkinterdnd2-0.5.0/tests/test_tkinterdnd2.py +0 -14
  89. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64/libtkdnd2.9.3.so +0 -0
  90. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64/tkdnd.tcl +0 -539
  91. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64/tkdnd_generic.tcl +0 -587
  92. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64/tkdnd_macosx.tcl +0 -144
  93. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64/libtkdnd2.9.5.so +0 -0
  94. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64/tkdnd_unix.tcl +0 -883
  95. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64/tkdnd_windows.tcl +0 -167
  96. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/libtkdnd2.9.3.dll +0 -0
  97. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/pkgIndex.tcl +0 -62
  98. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd.tcl +0 -539
  99. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd2.9.3.lib +0 -0
  100. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd_generic.tcl +0 -587
  101. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd_macosx.tcl +0 -144
  102. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd_unix.tcl +0 -883
  103. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd_windows.tcl +0 -167
  104. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64/libtkdnd2.9.5.dll +0 -0
  105. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64/pkgIndex.tcl +0 -62
  106. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64/tkdnd2.9.5.lib +0 -0
  107. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86/libtkdnd2.9.5.dll +0 -0
  108. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86/pkgIndex.tcl +0 -62
  109. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86/tkdnd2.9.5.lib +0 -0
  110. tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86/tkdnd_generic.tcl +0 -587
  111. tkinterdnd2-0.5.0/tkinterdnd2.egg-info/SOURCES.txt +0 -76
  112. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/LICENSE +0 -0
  113. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/setup.cfg +0 -0
  114. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2/__init__.py +0 -0
  115. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd.tcl +0 -0
  116. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_compat.tcl +0 -0
  117. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_macosx.tcl +0 -0
  118. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_utils.tcl +0 -0
  119. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_windows.tcl +0 -0
  120. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd.tcl +0 -0
  121. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_compat.tcl +0 -0
  122. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_macosx.tcl +0 -0
  123. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_utils.tcl +0 -0
  124. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_windows.tcl +0 -0
  125. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd.tcl +0 -0
  126. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd_compat.tcl +0 -0
  127. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd_macosx.tcl +0 -0
  128. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd_utils.tcl +0 -0
  129. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd_windows.tcl +0 -0
  130. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd.tcl +0 -0
  131. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_compat.tcl +0 -0
  132. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_macosx.tcl +0 -0
  133. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_utils.tcl +0 -0
  134. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_windows.tcl +0 -0
  135. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64}/tkdnd_compat.tcl +0 -0
  136. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64}/tkdnd_utils.tcl +0 -0
  137. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9}/tkdnd_compat.tcl +0 -0
  138. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9}/tkdnd_macosx.tcl +0 -0
  139. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9}/tkdnd_utils.tcl +0 -0
  140. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2/tkdnd/osx-x64/libtkdnd2.9.4.dylib +0 -0
  141. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2/tkdnd/osx-x64/pkgIndex.tcl +0 -0
  142. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2/tkdnd/osx-x64/tkdnd.tcl +0 -0
  143. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64}/tkdnd_compat.tcl +0 -0
  144. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64}/tkdnd_generic.tcl +0 -0
  145. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64}/tkdnd_unix.tcl +0 -0
  146. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64}/tkdnd_utils.tcl +0 -0
  147. {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64}/tkdnd_windows.tcl +0 -0
  148. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2.egg-info/dependency_links.txt +0 -0
  149. {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tkinterdnd2
3
- Version: 0.5.0
3
+ Version: 0.6.1
4
4
  Summary: TkinterDnD2 is a python wrapper for George Petasis'' tkDnD Tk extension version 2
5
5
  Home-page: https://github.com/Eliav2/tkinterdnd2
6
6
  Author: petasis\pmgagne\eliav2\squiblydoo
@@ -28,17 +28,11 @@ This repo was originally forked and edited for the purpose of publishing to pypi
28
28
  This repository is being maintained to ensure availability of `tkinterdnd2` into the future, providing Tkinter native drag and drop support for windows, unix and Mac OSX.
29
29
 
30
30
 
31
- ### What is TkDnD2
31
+ ### What is TkDnD
32
32
 
33
33
  [tkDnD2](https://github.com/petasis/tkdnd) is a tcl/Tk extension adding native drag and drop support.
34
34
 
35
- ### What this repository is about
36
-
37
- This repo package TkinterDnD2 and tkdnd2 into a standard python module.
38
-
39
- When the extension is imported in python its location will be automatically added to the Tk search path.
40
-
41
- This repository contains the compiled binaries from https://github.com/petasis/tkdnd/releases/tag/tkdnd-release-test-v2.9.4. In order to provide support on ARM, we include built binaries from the now defunct [tkinterdnd2-universal](https://pypi.org/project/tkinterdnd2-universal/#files) which added ARM support.
35
+ This repository contains the compiled binaries from https://github.com/petasis/tkdnd/releases/tag/tkdnd-release-test-v2.9.5 and my own compiled binaries for full Tcl 9 support: https://github.com/Squiblydoo/tkdnd.
42
36
 
43
37
 
44
38
  ## Install
@@ -7,17 +7,11 @@ This repo was originally forked and edited for the purpose of publishing to pypi
7
7
  This repository is being maintained to ensure availability of `tkinterdnd2` into the future, providing Tkinter native drag and drop support for windows, unix and Mac OSX.
8
8
 
9
9
 
10
- ### What is TkDnD2
10
+ ### What is TkDnD
11
11
 
12
12
  [tkDnD2](https://github.com/petasis/tkdnd) is a tcl/Tk extension adding native drag and drop support.
13
13
 
14
- ### What this repository is about
15
-
16
- This repo package TkinterDnD2 and tkdnd2 into a standard python module.
17
-
18
- When the extension is imported in python its location will be automatically added to the Tk search path.
19
-
20
- This repository contains the compiled binaries from https://github.com/petasis/tkdnd/releases/tag/tkdnd-release-test-v2.9.4. In order to provide support on ARM, we include built binaries from the now defunct [tkinterdnd2-universal](https://pypi.org/project/tkinterdnd2-universal/#files) which added ARM support.
14
+ This repository contains the compiled binaries from https://github.com/petasis/tkdnd/releases/tag/tkdnd-release-test-v2.9.5 and my own compiled binaries for full Tcl 9 support: https://github.com/Squiblydoo/tkdnd.
21
15
 
22
16
 
23
17
  ## Install
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
5
5
 
6
6
  setuptools.setup(
7
7
  name="tkinterdnd2",
8
- version="0.5.0",
8
+ version="0.6.1",
9
9
  author="petasis\\pmgagne\\eliav2\\squiblydoo",
10
10
  description="TkinterDnD2 is a python wrapper for George Petasis'' tkDnD Tk extension version 2",
11
11
  long_description=long_description,
@@ -15,7 +15,14 @@ setuptools.setup(
15
15
  include_package_data=True,
16
16
  package_data={
17
17
  # Include tkdnd extension files.
18
- "tkinterdnd2": ["tkdnd/linux-x64/*.*", "tkdnd/linux-arm64/*.*", "tkdnd/osx-x64/*.*", "tkdnd/osx-arm64/*.*", "tkdnd/win-x64/*.*", "tkdnd/win-x86/*.*", "tkdnd/win-arm64/*.*"],
18
+ "tkinterdnd2": [
19
+ "tkdnd/linux-x64/*.*", "tkdnd/linux-x64-tcl9/*.*",
20
+ "tkdnd/linux-arm64/*.*", "tkdnd/linux-arm64-tcl9/*.*",
21
+ "tkdnd/osx-x64/*.*", "tkdnd/osx-arm64/*.*", "tkdnd/osx-arm64-tcl9/*.*",
22
+ "tkdnd/win-x64/*.*", "tkdnd/win-x64-tcl9/*.*",
23
+ "tkdnd/win-x86/*.*", "tkdnd/win-x86-tcl9/*.*",
24
+ "tkdnd/win-arm64/*.*",
25
+ ],
19
26
  },
20
27
  classifiers=[
21
28
  "Development Status :: 2 - Pre-Alpha",
@@ -0,0 +1,81 @@
1
+ import os
2
+ import platform
3
+ import unittest
4
+ import tkinterdnd2
5
+
6
+
7
+ class TestTkinterDnD2(unittest.TestCase):
8
+
9
+ @classmethod
10
+ def setUpClass(cls):
11
+ cls.root = tkinterdnd2.Tk()
12
+ cls.root.withdraw()
13
+
14
+ cls.tcl_version_str = cls.root.tk.call('info', 'tclversion')
15
+ cls.tcl_major = int(cls.tcl_version_str.split('.')[0])
16
+
17
+ system = platform.system()
18
+ if system == "Windows":
19
+ machine = os.environ.get('PROCESSOR_ARCHITECTURE', platform.machine())
20
+ else:
21
+ machine = platform.machine()
22
+
23
+ platform_map = {
24
+ ("Darwin", "arm64"): "osx-arm64",
25
+ ("Darwin", "x86_64"): "osx-x64",
26
+ ("Linux", "aarch64"): "linux-arm64",
27
+ ("Linux", "x86_64"): "linux-x64",
28
+ ("Windows", "ARM64"): "win-arm64",
29
+ ("Windows", "AMD64"): "win-x64",
30
+ ("Windows", "x86"): "win-x86",
31
+ }
32
+ cls.base_dir = platform_map.get((system, machine), "unknown")
33
+ cls.tkdnd_root = os.path.join(os.path.dirname(tkinterdnd2.__file__), 'tkdnd')
34
+ tcl9_path = os.path.join(cls.tkdnd_root, cls.base_dir + '-tcl9')
35
+ cls.chosen_dir = (
36
+ cls.base_dir + '-tcl9'
37
+ if cls.tcl_major >= 9 and os.path.isdir(tcl9_path)
38
+ else cls.base_dir
39
+ )
40
+
41
+ print(
42
+ f"\nPlatform: {system}/{machine} "
43
+ f"Tcl: {cls.tcl_version_str} "
44
+ f"dir: {cls.chosen_dir} "
45
+ f"tkdnd: {tkinterdnd2.TkinterDnD.TkdndVersion}"
46
+ )
47
+
48
+ @classmethod
49
+ def tearDownClass(cls):
50
+ cls.root.destroy()
51
+
52
+ def test_version_is_set(self):
53
+ """Binary loaded and TkdndVersion is populated."""
54
+ self.assertIsNotNone(tkinterdnd2.TkinterDnD.TkdndVersion)
55
+
56
+ def test_binary_directory_exists(self):
57
+ """The directory that was selected exists inside the installed package."""
58
+ path = os.path.join(self.tkdnd_root, self.chosen_dir)
59
+ self.assertTrue(os.path.isdir(path), f"tkdnd directory not found: {path}")
60
+
61
+ def test_tcl9_routing(self):
62
+ """When Tcl 9 is active and a -tcl9 directory is present, it must be chosen."""
63
+ tcl9_dir = os.path.join(self.tkdnd_root, self.base_dir + '-tcl9')
64
+ if self.tcl_major >= 9 and os.path.isdir(tcl9_dir):
65
+ self.assertTrue(
66
+ self.chosen_dir.endswith('-tcl9'),
67
+ f"Tcl {self.tcl_major} active but -tcl9 directory not chosen; got '{self.chosen_dir}'"
68
+ )
69
+
70
+ def test_tcl8_fallback(self):
71
+ """When Tcl 8 is active (or no -tcl9 directory exists), base directory must be chosen."""
72
+ tcl9_dir = os.path.join(self.tkdnd_root, self.base_dir + '-tcl9')
73
+ if self.tcl_major < 9 or not os.path.isdir(tcl9_dir):
74
+ self.assertFalse(
75
+ self.chosen_dir.endswith('-tcl9'),
76
+ f"Expected base directory but got '{self.chosen_dir}'"
77
+ )
78
+
79
+
80
+ if __name__ == '__main__':
81
+ unittest.main()
@@ -64,7 +64,12 @@ def _require(tkroot):
64
64
  else:
65
65
  raise RuntimeError('Plaform not supported.')
66
66
 
67
- module_path = os.path.join(os.path.dirname(__file__), 'tkdnd', tkdnd_platform_rep)
67
+ tcl_major = int(tkroot.tk.call('info', 'tclversion').split('.')[0])
68
+ if tcl_major >= 9:
69
+ tcl9_path = os.path.join(os.path.dirname(__file__), 'tkdnd', tkdnd_platform_rep + '-tcl9')
70
+ module_path = tcl9_path if os.path.isdir(tcl9_path) else os.path.join(os.path.dirname(__file__), 'tkdnd', tkdnd_platform_rep)
71
+ else:
72
+ module_path = os.path.join(os.path.dirname(__file__), 'tkdnd', tkdnd_platform_rep)
68
73
  tkroot.tk.call('lappend', 'auto_path', module_path)
69
74
  TkdndVersion = tkroot.tk.call('package', 'require', 'tkdnd')
70
75
  except tkinter.TclError:
@@ -53,10 +53,10 @@ namespace eval ::tkdnd {
53
53
 
54
54
  }; # namespace ::tkdnd
55
55
 
56
- package ifneeded tkdnd 2.9.5 \
56
+ package ifneeded tkdnd 2.10.1 \
57
57
  "tkdnd::source \{$dir/tkdnd.tcl\} ; \
58
- tkdnd::initialise \{$dir\} libtkdnd2.9.5.so tkdnd"
58
+ tkdnd::initialise \{$dir\} libtkdnd2.10.1.so tkdnd"
59
59
 
60
- package ifneeded tkdnd::utils 2.9.5 \
60
+ package ifneeded tkdnd::utils 2.10.1 \
61
61
  "tkdnd::source \{$dir/tkdnd_utils.tcl\} ; \
62
- package provide tkdnd::utils 2.9.5"
62
+ package provide tkdnd::utils 2.10.1"
@@ -520,6 +520,54 @@ proc generic::GetDropTargetCommonTypes { } {
520
520
  return $_common_drag_source_types
521
521
  };# generic::GetDropTargetCommonTypes
522
522
 
523
+ # ----------------------------------------------------------------------------
524
+ # Command generic::GetDropState / generic::RestoreDropState
525
+ #
526
+ # Snapshot & restore the in-flight drop state (the subset of variables that
527
+ # HandleLeave resets). Used by platform layers to survive a spurious
528
+ # <<Leave>> that gets processed while waiting on a blocking data fetch
529
+ # during a drop (e.g. the XWayland race in issue #77).
530
+ # ----------------------------------------------------------------------------
531
+ proc generic::GetDropState { } {
532
+ variable _types
533
+ variable _typelist
534
+ variable _actionlist
535
+ variable _action
536
+ variable _common_drag_source_types
537
+ variable _common_drop_target_types
538
+ variable _drag_source
539
+ variable _drop_target
540
+ return [dict create \
541
+ types $_types \
542
+ typelist $_typelist \
543
+ actionlist $_actionlist \
544
+ action $_action \
545
+ common_drag_source_types $_common_drag_source_types \
546
+ common_drop_target_types $_common_drop_target_types \
547
+ drag_source $_drag_source \
548
+ drop_target $_drop_target \
549
+ ]
550
+ };# generic::GetDropState
551
+
552
+ proc generic::RestoreDropState { state } {
553
+ variable _types
554
+ variable _typelist
555
+ variable _actionlist
556
+ variable _action
557
+ variable _common_drag_source_types
558
+ variable _common_drop_target_types
559
+ variable _drag_source
560
+ variable _drop_target
561
+ set _types [dict get $state types]
562
+ set _typelist [dict get $state typelist]
563
+ set _actionlist [dict get $state actionlist]
564
+ set _action [dict get $state action]
565
+ set _common_drag_source_types [dict get $state common_drag_source_types]
566
+ set _common_drop_target_types [dict get $state common_drop_target_types]
567
+ set _drag_source [dict get $state drag_source]
568
+ set _drop_target [dict get $state drop_target]
569
+ };# generic::RestoreDropState
570
+
523
571
  # ----------------------------------------------------------------------------
524
572
  # Command generic::platform_specific_types
525
573
  # ----------------------------------------------------------------------------
@@ -134,10 +134,20 @@ proc xdnd::HandleXdndDrop { time } {
134
134
  variable _last_mouse_root_y
135
135
  set _pressedkeys [GetPressedKeys [::tkdnd::generic::GetDropTarget]]
136
136
  #DBG debug "xdnd::HandleXdndDrop: $time"
137
+ ## Snapshot the in-flight drop state before GetDroppedData below: it pumps
138
+ ## the Tk event queue while waiting for the SelectionNotify round-trip, and
139
+ ## a queued XdndLeave processed during that wait resets this state via
140
+ ## ::tkdnd::generic::HandleLeave before HandleDrop gets to use it -- a race
141
+ ## commonly hit under XWayland (issue #77). Restore the snapshot if that
142
+ ## happened so the drop can still be delivered.
143
+ set dropstate [::tkdnd::generic::GetDropState]
137
144
  ## Get the dropped data...
138
145
  ::tkdnd::generic::SetDroppedData [GetDroppedData \
139
146
  [::tkdnd::generic::GetDragSource] [::tkdnd::generic::GetDropTarget] \
140
147
  [::tkdnd::generic::GetDragSourceCommonTypes] $time]
148
+ if {![string length [::tkdnd::generic::GetDropTarget]]} {
149
+ ::tkdnd::generic::RestoreDropState $dropstate
150
+ }
141
151
  ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \
142
152
  $_last_mouse_root_x $_last_mouse_root_y $time
143
153
  };# xdnd::HandleXdndDrop
@@ -231,7 +241,7 @@ proc xdnd::normalise_data { type data } {
231
241
  STRING - UTF8_STRING - TEXT - COMPOUND_TEXT {return $data}
232
242
  text/html {
233
243
  if {[catch {
234
- ::tkdnd::from_encoding unicode $data
244
+ ::tkdnd::from_encoding utf-16 $data
235
245
  } string]} {
236
246
  set string $data
237
247
  }
@@ -355,9 +365,19 @@ proc xdnd::_dodragdrop { source actions types data button { cursor_map {} } } {
355
365
  -selection XdndSelection $source
356
366
  set _dragging 1
357
367
 
358
- ## Grab the mouse pointer...
359
- #DBG debug "xdnd::_dodragdrop: _grab_pointer $source [_get_mapped_cursor $_dodragdrop_default_action]"
360
- _grab_pointer $source [_get_mapped_cursor $_dodragdrop_default_action]
368
+ ## Grab the mouse pointer on a dedicated offscreen window rather than the
369
+ ## source widget itself: X automatically drops a grab when its window
370
+ ## becomes unviewable, which breaks the whole drag if the source widget
371
+ ## (or an ancestor) gets unmapped mid-drag, e.g. by switching virtual
372
+ ## desktops via a pager (issue #6).
373
+ set _dodragdrop_grab_window [_create_grab_window]
374
+ #DBG debug "xdnd::_dodragdrop: _grab_pointer $_dodragdrop_grab_window [_get_mapped_cursor $_dodragdrop_default_action]"
375
+ _grab_pointer $_dodragdrop_grab_window [_get_mapped_cursor $_dodragdrop_default_action]
376
+
377
+ ## If the source widget is destroyed mid-drag (e.g. its toplevel is closed
378
+ ## with Alt+F4), make sure we don't hang forever on tkwait below.
379
+ set _dodragdrop_source_destroy_binding [bind $source <Destroy>]
380
+ bind $source <Destroy> {+ set ::tkdnd::xdnd::_dragging 0}
361
381
 
362
382
  ## Register our generic event handler...
363
383
  # The generic event callback will report events by modifying variable
@@ -372,19 +392,41 @@ proc xdnd::_dodragdrop { source actions types data button { cursor_map {} } } {
372
392
  #DBG debug "xdnd::_dodragdrop: waiting drag action to finish..."
373
393
  tkwait variable ::tkdnd::xdnd::_dragging
374
394
  #DBG debug "xdnd::_dodragdrop: drag action finished!"
375
- _SendXdndLeave
395
+ catch {_SendXdndLeave}
376
396
 
377
397
  set _dragging 0
378
- #DBG debug "xdnd::_dodragdrop: _ungrab_pointer $source"
379
- _ungrab_pointer $source
398
+ catch {bind $source <Destroy> $_dodragdrop_source_destroy_binding}
399
+ #DBG debug "xdnd::_dodragdrop: _ungrab_pointer $_dodragdrop_grab_window"
400
+ _ungrab_pointer $_dodragdrop_grab_window
380
401
  #DBG debug "xdnd::_dodragdrop: _unregister_generic_event_handler"
381
402
  _unregister_generic_event_handler
382
403
  catch {selection clear -selection XdndSelection}
383
404
  #DBG debug "xdnd::_dodragdrop: unregisterSelectionHandler $source $types"
384
- unregisterSelectionHandler $source $types
405
+ catch {unregisterSelectionHandler $source $types}
385
406
  return $_dodragdrop_drop_target_accepts_action
386
407
  };# xdnd::_dodragdrop
387
408
 
409
+ # ----------------------------------------------------------------------------
410
+ # Command xdnd::_create_grab_window
411
+ #
412
+ # Returns a small, offscreen, override-redirect helper toplevel used solely
413
+ # as the target of the pointer grab during a drag. Created lazily once and
414
+ # reused for subsequent drags (only one drag can be in progress at a time).
415
+ # ----------------------------------------------------------------------------
416
+ proc xdnd::_create_grab_window { } {
417
+ set w .___tkdnd___grab___window___
418
+ if {![winfo exists $w]} {
419
+ toplevel $w -class TkDndGrab
420
+ wm overrideredirect $w 1
421
+ wm geometry $w 1x1+-32000+-32000
422
+ ## Force the toplevel to actually be mapped now: XGrabPointer requires
423
+ ## a viewable grab window, and the map request otherwise happens lazily
424
+ ## on the next idle pass.
425
+ update idletasks
426
+ }
427
+ return $w
428
+ };# xdnd::_create_grab_window
429
+
388
430
  # ----------------------------------------------------------------------------
389
431
  # Command xdnd::_process_drag_events
390
432
  # ----------------------------------------------------------------------------
@@ -727,7 +769,6 @@ proc xdnd::getFormatForType {type} {
727
769
  string -
728
770
  text -
729
771
  compound_text {set format STRING}
730
- text/uri-list* {set format UTF8_STRING}
731
772
  application/x-color {set format $type}
732
773
  default {set format $type}
733
774
  }
@@ -838,7 +879,7 @@ proc xdnd::_SendData {type offset bytes args} {
838
879
  }
839
880
  default {
840
881
  set format 32
841
- binary scan $typed_data c* _dodragdrop_transfer_data
882
+ binary scan [encoding convertto utf-8 $typed_data] c* _dodragdrop_transfer_data
842
883
  }
843
884
  }
844
885
  }
@@ -53,10 +53,10 @@ namespace eval ::tkdnd {
53
53
 
54
54
  }; # namespace ::tkdnd
55
55
 
56
- package ifneeded tkdnd 2.9.3 \
56
+ package ifneeded tkdnd 2.10.1 \
57
57
  "tkdnd::source \{$dir/tkdnd.tcl\} ; \
58
- tkdnd::initialise \{$dir\} libtkdnd2.9.3[info sharedlibextension] tkdnd"
58
+ tkdnd::initialise \{$dir\} libtcl9tkdnd2.10.1.so tkdnd"
59
59
 
60
- package ifneeded tkdnd::utils 2.9.3 \
60
+ package ifneeded tkdnd::utils 2.10.1 \
61
61
  "tkdnd::source \{$dir/tkdnd_utils.tcl\} ; \
62
- package provide tkdnd::utils 2.9.3"
62
+ package provide tkdnd::utils 2.10.1"
@@ -520,6 +520,54 @@ proc generic::GetDropTargetCommonTypes { } {
520
520
  return $_common_drag_source_types
521
521
  };# generic::GetDropTargetCommonTypes
522
522
 
523
+ # ----------------------------------------------------------------------------
524
+ # Command generic::GetDropState / generic::RestoreDropState
525
+ #
526
+ # Snapshot & restore the in-flight drop state (the subset of variables that
527
+ # HandleLeave resets). Used by platform layers to survive a spurious
528
+ # <<Leave>> that gets processed while waiting on a blocking data fetch
529
+ # during a drop (e.g. the XWayland race in issue #77).
530
+ # ----------------------------------------------------------------------------
531
+ proc generic::GetDropState { } {
532
+ variable _types
533
+ variable _typelist
534
+ variable _actionlist
535
+ variable _action
536
+ variable _common_drag_source_types
537
+ variable _common_drop_target_types
538
+ variable _drag_source
539
+ variable _drop_target
540
+ return [dict create \
541
+ types $_types \
542
+ typelist $_typelist \
543
+ actionlist $_actionlist \
544
+ action $_action \
545
+ common_drag_source_types $_common_drag_source_types \
546
+ common_drop_target_types $_common_drop_target_types \
547
+ drag_source $_drag_source \
548
+ drop_target $_drop_target \
549
+ ]
550
+ };# generic::GetDropState
551
+
552
+ proc generic::RestoreDropState { state } {
553
+ variable _types
554
+ variable _typelist
555
+ variable _actionlist
556
+ variable _action
557
+ variable _common_drag_source_types
558
+ variable _common_drop_target_types
559
+ variable _drag_source
560
+ variable _drop_target
561
+ set _types [dict get $state types]
562
+ set _typelist [dict get $state typelist]
563
+ set _actionlist [dict get $state actionlist]
564
+ set _action [dict get $state action]
565
+ set _common_drag_source_types [dict get $state common_drag_source_types]
566
+ set _common_drop_target_types [dict get $state common_drop_target_types]
567
+ set _drag_source [dict get $state drag_source]
568
+ set _drop_target [dict get $state drop_target]
569
+ };# generic::RestoreDropState
570
+
523
571
  # ----------------------------------------------------------------------------
524
572
  # Command generic::platform_specific_types
525
573
  # ----------------------------------------------------------------------------
@@ -134,10 +134,20 @@ proc xdnd::HandleXdndDrop { time } {
134
134
  variable _last_mouse_root_y
135
135
  set _pressedkeys [GetPressedKeys [::tkdnd::generic::GetDropTarget]]
136
136
  #DBG debug "xdnd::HandleXdndDrop: $time"
137
+ ## Snapshot the in-flight drop state before GetDroppedData below: it pumps
138
+ ## the Tk event queue while waiting for the SelectionNotify round-trip, and
139
+ ## a queued XdndLeave processed during that wait resets this state via
140
+ ## ::tkdnd::generic::HandleLeave before HandleDrop gets to use it -- a race
141
+ ## commonly hit under XWayland (issue #77). Restore the snapshot if that
142
+ ## happened so the drop can still be delivered.
143
+ set dropstate [::tkdnd::generic::GetDropState]
137
144
  ## Get the dropped data...
138
145
  ::tkdnd::generic::SetDroppedData [GetDroppedData \
139
146
  [::tkdnd::generic::GetDragSource] [::tkdnd::generic::GetDropTarget] \
140
147
  [::tkdnd::generic::GetDragSourceCommonTypes] $time]
148
+ if {![string length [::tkdnd::generic::GetDropTarget]]} {
149
+ ::tkdnd::generic::RestoreDropState $dropstate
150
+ }
141
151
  ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \
142
152
  $_last_mouse_root_x $_last_mouse_root_y $time
143
153
  };# xdnd::HandleXdndDrop
@@ -231,7 +241,7 @@ proc xdnd::normalise_data { type data } {
231
241
  STRING - UTF8_STRING - TEXT - COMPOUND_TEXT {return $data}
232
242
  text/html {
233
243
  if {[catch {
234
- ::tkdnd::from_encoding unicode $data
244
+ ::tkdnd::from_encoding utf-16 $data
235
245
  } string]} {
236
246
  set string $data
237
247
  }
@@ -355,9 +365,19 @@ proc xdnd::_dodragdrop { source actions types data button { cursor_map {} } } {
355
365
  -selection XdndSelection $source
356
366
  set _dragging 1
357
367
 
358
- ## Grab the mouse pointer...
359
- #DBG debug "xdnd::_dodragdrop: _grab_pointer $source [_get_mapped_cursor $_dodragdrop_default_action]"
360
- _grab_pointer $source [_get_mapped_cursor $_dodragdrop_default_action]
368
+ ## Grab the mouse pointer on a dedicated offscreen window rather than the
369
+ ## source widget itself: X automatically drops a grab when its window
370
+ ## becomes unviewable, which breaks the whole drag if the source widget
371
+ ## (or an ancestor) gets unmapped mid-drag, e.g. by switching virtual
372
+ ## desktops via a pager (issue #6).
373
+ set _dodragdrop_grab_window [_create_grab_window]
374
+ #DBG debug "xdnd::_dodragdrop: _grab_pointer $_dodragdrop_grab_window [_get_mapped_cursor $_dodragdrop_default_action]"
375
+ _grab_pointer $_dodragdrop_grab_window [_get_mapped_cursor $_dodragdrop_default_action]
376
+
377
+ ## If the source widget is destroyed mid-drag (e.g. its toplevel is closed
378
+ ## with Alt+F4), make sure we don't hang forever on tkwait below.
379
+ set _dodragdrop_source_destroy_binding [bind $source <Destroy>]
380
+ bind $source <Destroy> {+ set ::tkdnd::xdnd::_dragging 0}
361
381
 
362
382
  ## Register our generic event handler...
363
383
  # The generic event callback will report events by modifying variable
@@ -372,19 +392,41 @@ proc xdnd::_dodragdrop { source actions types data button { cursor_map {} } } {
372
392
  #DBG debug "xdnd::_dodragdrop: waiting drag action to finish..."
373
393
  tkwait variable ::tkdnd::xdnd::_dragging
374
394
  #DBG debug "xdnd::_dodragdrop: drag action finished!"
375
- _SendXdndLeave
395
+ catch {_SendXdndLeave}
376
396
 
377
397
  set _dragging 0
378
- #DBG debug "xdnd::_dodragdrop: _ungrab_pointer $source"
379
- _ungrab_pointer $source
398
+ catch {bind $source <Destroy> $_dodragdrop_source_destroy_binding}
399
+ #DBG debug "xdnd::_dodragdrop: _ungrab_pointer $_dodragdrop_grab_window"
400
+ _ungrab_pointer $_dodragdrop_grab_window
380
401
  #DBG debug "xdnd::_dodragdrop: _unregister_generic_event_handler"
381
402
  _unregister_generic_event_handler
382
403
  catch {selection clear -selection XdndSelection}
383
404
  #DBG debug "xdnd::_dodragdrop: unregisterSelectionHandler $source $types"
384
- unregisterSelectionHandler $source $types
405
+ catch {unregisterSelectionHandler $source $types}
385
406
  return $_dodragdrop_drop_target_accepts_action
386
407
  };# xdnd::_dodragdrop
387
408
 
409
+ # ----------------------------------------------------------------------------
410
+ # Command xdnd::_create_grab_window
411
+ #
412
+ # Returns a small, offscreen, override-redirect helper toplevel used solely
413
+ # as the target of the pointer grab during a drag. Created lazily once and
414
+ # reused for subsequent drags (only one drag can be in progress at a time).
415
+ # ----------------------------------------------------------------------------
416
+ proc xdnd::_create_grab_window { } {
417
+ set w .___tkdnd___grab___window___
418
+ if {![winfo exists $w]} {
419
+ toplevel $w -class TkDndGrab
420
+ wm overrideredirect $w 1
421
+ wm geometry $w 1x1+-32000+-32000
422
+ ## Force the toplevel to actually be mapped now: XGrabPointer requires
423
+ ## a viewable grab window, and the map request otherwise happens lazily
424
+ ## on the next idle pass.
425
+ update idletasks
426
+ }
427
+ return $w
428
+ };# xdnd::_create_grab_window
429
+
388
430
  # ----------------------------------------------------------------------------
389
431
  # Command xdnd::_process_drag_events
390
432
  # ----------------------------------------------------------------------------
@@ -727,7 +769,6 @@ proc xdnd::getFormatForType {type} {
727
769
  string -
728
770
  text -
729
771
  compound_text {set format STRING}
730
- text/uri-list* {set format UTF8_STRING}
731
772
  application/x-color {set format $type}
732
773
  default {set format $type}
733
774
  }
@@ -838,7 +879,7 @@ proc xdnd::_SendData {type offset bytes args} {
838
879
  }
839
880
  default {
840
881
  set format 32
841
- binary scan $typed_data c* _dodragdrop_transfer_data
882
+ binary scan [encoding convertto utf-8 $typed_data] c* _dodragdrop_transfer_data
842
883
  }
843
884
  }
844
885
  }
@@ -53,10 +53,10 @@ namespace eval ::tkdnd {
53
53
 
54
54
  }; # namespace ::tkdnd
55
55
 
56
- package ifneeded tkdnd 2.9.5 \
56
+ package ifneeded tkdnd 2.10.1 \
57
57
  "tkdnd::source \{$dir/tkdnd.tcl\} ; \
58
- tkdnd::initialise \{$dir\} libtcl9tkdnd2.9.5.dylib tkdnd"
58
+ tkdnd::initialise \{$dir\} libtkdnd2.10.1.so tkdnd"
59
59
 
60
- package ifneeded tkdnd::utils 2.9.5 \
60
+ package ifneeded tkdnd::utils 2.10.1 \
61
61
  "tkdnd::source \{$dir/tkdnd_utils.tcl\} ; \
62
- package provide tkdnd::utils 2.9.5"
62
+ package provide tkdnd::utils 2.10.1"