tkinterdnd2 0.6.0__tar.gz → 0.6.2__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.
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/PKG-INFO +15 -4
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/README.md +14 -3
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/setup.py +2 -2
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tests/test_tkinterdnd2.py +0 -8
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-arm64/libtkdnd2.10.1.so +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-arm64/pkgIndex.tcl +4 -4
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-x64-tcl9 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_generic.tcl +48 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_unix.tcl +49 -8
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-arm64-tcl9/libtcl9tkdnd2.10.1.so +0 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-x64-tcl9 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-arm64-tcl9}/pkgIndex.tcl +4 -4
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_generic.tcl +48 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-x64-tcl9 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_unix.tcl +49 -8
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-x64/libtkdnd2.10.1.so +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-x64/pkgIndex.tcl +4 -4
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-x64/tkdnd_generic.tcl +635 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-x64}/tkdnd_unix.tcl +49 -8
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-x64-tcl9/libtcl9tkdnd2.10.1.so +0 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-arm64-tcl9 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-x64-tcl9}/pkgIndex.tcl +4 -4
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_generic.tcl +48 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-arm64-tcl9 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_unix.tcl +49 -8
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64/libtkdnd2.10.1.dylib +0 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64/pkgIndex.tcl +62 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64/tkdnd.tcl +554 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64/tkdnd_windows.tcl +167 -0
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-arm64/libtcl9tkdnd2.10.0.dylib → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64-tcl9/libtcl9tkdnd2.10.1.dylib +0 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64-tcl9/pkgIndex.tcl +62 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64-tcl9/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64-tcl9/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-x64/tkdnd_compat.tcl +160 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-x64/tkdnd_macosx.tcl +144 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-x64/tkdnd_utils.tcl +256 -0
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-arm64/libtkdnd2.10.0.dll → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-arm64/libtkdnd2.10.1.dll +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-arm64/pkgIndex.tcl +4 -4
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-arm64/tkdnd2.10.0.lib → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-arm64/tkdnd2.10.1.lib +0 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-arm64/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-arm64/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x64/libtkdnd2.10.1.dll +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64/pkgIndex.tcl +4 -4
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x64/tkdnd2.10.0.lib → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x64/tkdnd2.10.1.lib +0 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x64/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x64/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x64-tcl9/libtkdnd2.10.1.dll +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64-tcl9/pkgIndex.tcl +4 -4
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd2.10.0.lib → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd2.10.1.lib +0 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x86/libtkdnd2.10.0.dll → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x86/libtkdnd2.10.1.dll +0 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x86/pkgIndex.tcl +62 -0
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd2.10.0.lib → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x86/tkdnd2.10.1.lib +0 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x86/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x86/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x86-tcl9/libtkdnd2.10.0.dll → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x86-tcl9/libtkdnd2.10.1.dll +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x86-tcl9/pkgIndex.tcl +4 -4
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x86/tkdnd2.10.0.lib → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd2.10.1.lib +0 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_unix.tcl +924 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2.egg-info/PKG-INFO +15 -4
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2.egg-info/SOURCES.txt +24 -15
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-arm64/libtkdnd2.10.0.so +0 -0
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-arm64-tcl9/libtcl9tkdnd2.10.0.so +0 -0
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-x64/libtkdnd2.10.0.so +0 -0
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-x64-tcl9/libtcl9tkdnd2.10.0.so +0 -0
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-arm64/pkgIndex.tcl +0 -62
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-arm64/tkdnd_generic.tcl +0 -587
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-arm64/tkdnd_unix.tcl +0 -883
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-x64/tkdnd_generic.tcl +0 -587
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-arm64/tkdnd_generic.tcl +0 -587
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-arm64/tkdnd_unix.tcl +0 -883
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x64/libtkdnd2.10.0.dll +0 -0
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x64/tkdnd_generic.tcl +0 -587
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x64/tkdnd_unix.tcl +0 -883
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x64-tcl9/libtkdnd2.10.0.dll +0 -0
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_generic.tcl +0 -587
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_unix.tcl +0 -883
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x86/pkgIndex.tcl +0 -62
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x86/tkdnd_generic.tcl +0 -587
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x86/tkdnd_unix.tcl +0 -883
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_generic.tcl +0 -587
- tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_unix.tcl +0 -883
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/LICENSE +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/setup.cfg +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/TkinterDnD.py +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/__init__.py +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-arm64/tkdnd.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-arm64/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-arm64/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-arm64/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-arm64/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-arm64-tcl9/tkdnd.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-arm64-tcl9/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-arm64-tcl9/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-arm64-tcl9/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-arm64-tcl9/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-x64/tkdnd.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-x64/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-x64/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-x64/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-x64/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-x64-tcl9/tkdnd.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-x64-tcl9/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-x64-tcl9/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-x64-tcl9/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/linux-x64-tcl9/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-x64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64}/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-x64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64}/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-x64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64}/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64-tcl9}/tkdnd.tcl +0 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64-tcl9}/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64-tcl9}/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64-tcl9}/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-arm64-tcl9}/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/osx-x64/libtkdnd2.9.4.dylib +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/osx-x64/pkgIndex.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/osx-x64/tkdnd.tcl +0 -0
- {tkinterdnd2-0.6.0/tkinterdnd2/tkdnd/linux-arm64-tcl9 → tkinterdnd2-0.6.2/tkinterdnd2/tkdnd/osx-x64}/tkdnd_generic.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/osx-x64/tkdnd_unix.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/osx-x64/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-arm64/tkdnd.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-arm64/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-arm64/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-arm64/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-arm64/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64/tkdnd.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x86/tkdnd.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x86/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x86/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x86/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x86/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/tkinterdnd2.egg-info/dependency_links.txt +0 -0
- {tkinterdnd2-0.6.0 → tkinterdnd2-0.6.2}/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.6.
|
|
3
|
+
Version: 0.6.2
|
|
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
|
|
@@ -51,15 +51,22 @@ root = TkinterDnD.Tk() # notice - use this instead of tk.Tk()
|
|
|
51
51
|
lb = tk.Listbox(root)
|
|
52
52
|
lb.insert(1, "drag files to here")
|
|
53
53
|
|
|
54
|
+
def on_drop(event):
|
|
55
|
+
# event.data is a raw Tcl list string, not a Python list - see note below
|
|
56
|
+
for path in root.tk.splitlist(event.data):
|
|
57
|
+
lb.insert(tk.END, path)
|
|
58
|
+
|
|
54
59
|
# register the listbox as a drop target
|
|
55
60
|
lb.drop_target_register(DND_FILES)
|
|
56
|
-
lb.dnd_bind('<<Drop>>',
|
|
61
|
+
lb.dnd_bind('<<Drop>>', on_drop)
|
|
57
62
|
|
|
58
63
|
lb.pack()
|
|
59
64
|
root.mainloop()
|
|
60
65
|
```
|
|
61
66
|

|
|
62
67
|
|
|
68
|
+
> [!NOTE]
|
|
69
|
+
> `event.data` is a raw Tcl list, not a Python list or plain string. When multiple files are dropped, their paths come back space-separated in a single string, and any path containing a space is wrapped in `{braces}` so it can still be told apart from the others. Use `root.tk.splitlist(event.data)` (as above) to get a clean Python list of paths — don't split the string yourself, since that will break on braced/spaced paths.
|
|
63
70
|
|
|
64
71
|
see any of the [demos](./demos) for usage examples.
|
|
65
72
|
|
|
@@ -76,7 +83,9 @@ import PySimpleGUI as sg
|
|
|
76
83
|
from tkinterdnd2 import TkinterDnD, DND_FILES
|
|
77
84
|
|
|
78
85
|
def on_drop(event):
|
|
79
|
-
|
|
86
|
+
# event.data is a raw Tcl list; use splitlist to handle multiple/spaced paths, see note above
|
|
87
|
+
files = window.TKroot.tk.splitlist(event.data)
|
|
88
|
+
window["-FILE-"].update(files[0])
|
|
80
89
|
|
|
81
90
|
layout = [
|
|
82
91
|
[sg.Text("Drag & Drop a File Here")],
|
|
@@ -108,8 +117,10 @@ import customtkinter as ctk
|
|
|
108
117
|
from tkinterdnd2 import TkinterDnD, DND_FILES
|
|
109
118
|
|
|
110
119
|
def on_drop(event):
|
|
120
|
+
# event.data is a raw Tcl list; use splitlist to handle multiple/spaced paths, see note above
|
|
121
|
+
files = app.tk.splitlist(event.data)
|
|
111
122
|
entry.delete(0, "end")
|
|
112
|
-
entry.insert(0,
|
|
123
|
+
entry.insert(0, files[0])
|
|
113
124
|
|
|
114
125
|
app = ctk.CTk()
|
|
115
126
|
app.title("File Drop")
|
|
@@ -30,15 +30,22 @@ root = TkinterDnD.Tk() # notice - use this instead of tk.Tk()
|
|
|
30
30
|
lb = tk.Listbox(root)
|
|
31
31
|
lb.insert(1, "drag files to here")
|
|
32
32
|
|
|
33
|
+
def on_drop(event):
|
|
34
|
+
# event.data is a raw Tcl list string, not a Python list - see note below
|
|
35
|
+
for path in root.tk.splitlist(event.data):
|
|
36
|
+
lb.insert(tk.END, path)
|
|
37
|
+
|
|
33
38
|
# register the listbox as a drop target
|
|
34
39
|
lb.drop_target_register(DND_FILES)
|
|
35
|
-
lb.dnd_bind('<<Drop>>',
|
|
40
|
+
lb.dnd_bind('<<Drop>>', on_drop)
|
|
36
41
|
|
|
37
42
|
lb.pack()
|
|
38
43
|
root.mainloop()
|
|
39
44
|
```
|
|
40
45
|

|
|
41
46
|
|
|
47
|
+
> [!NOTE]
|
|
48
|
+
> `event.data` is a raw Tcl list, not a Python list or plain string. When multiple files are dropped, their paths come back space-separated in a single string, and any path containing a space is wrapped in `{braces}` so it can still be told apart from the others. Use `root.tk.splitlist(event.data)` (as above) to get a clean Python list of paths — don't split the string yourself, since that will break on braced/spaced paths.
|
|
42
49
|
|
|
43
50
|
see any of the [demos](./demos) for usage examples.
|
|
44
51
|
|
|
@@ -55,7 +62,9 @@ import PySimpleGUI as sg
|
|
|
55
62
|
from tkinterdnd2 import TkinterDnD, DND_FILES
|
|
56
63
|
|
|
57
64
|
def on_drop(event):
|
|
58
|
-
|
|
65
|
+
# event.data is a raw Tcl list; use splitlist to handle multiple/spaced paths, see note above
|
|
66
|
+
files = window.TKroot.tk.splitlist(event.data)
|
|
67
|
+
window["-FILE-"].update(files[0])
|
|
59
68
|
|
|
60
69
|
layout = [
|
|
61
70
|
[sg.Text("Drag & Drop a File Here")],
|
|
@@ -87,8 +96,10 @@ import customtkinter as ctk
|
|
|
87
96
|
from tkinterdnd2 import TkinterDnD, DND_FILES
|
|
88
97
|
|
|
89
98
|
def on_drop(event):
|
|
99
|
+
# event.data is a raw Tcl list; use splitlist to handle multiple/spaced paths, see note above
|
|
100
|
+
files = app.tk.splitlist(event.data)
|
|
90
101
|
entry.delete(0, "end")
|
|
91
|
-
entry.insert(0,
|
|
102
|
+
entry.insert(0, files[0])
|
|
92
103
|
|
|
93
104
|
app = ctk.CTk()
|
|
94
105
|
app.title("File Drop")
|
|
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
|
|
|
5
5
|
|
|
6
6
|
setuptools.setup(
|
|
7
7
|
name="tkinterdnd2",
|
|
8
|
-
version="0.6.
|
|
8
|
+
version="0.6.2",
|
|
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,
|
|
@@ -18,7 +18,7 @@ setuptools.setup(
|
|
|
18
18
|
"tkinterdnd2": [
|
|
19
19
|
"tkdnd/linux-x64/*.*", "tkdnd/linux-x64-tcl9/*.*",
|
|
20
20
|
"tkdnd/linux-arm64/*.*", "tkdnd/linux-arm64-tcl9/*.*",
|
|
21
|
-
"tkdnd/osx-x64/*.*", "tkdnd/osx-arm64/*.*",
|
|
21
|
+
"tkdnd/osx-x64/*.*", "tkdnd/osx-arm64/*.*", "tkdnd/osx-arm64-tcl9/*.*",
|
|
22
22
|
"tkdnd/win-x64/*.*", "tkdnd/win-x64-tcl9/*.*",
|
|
23
23
|
"tkdnd/win-x86/*.*", "tkdnd/win-x86-tcl9/*.*",
|
|
24
24
|
"tkdnd/win-arm64/*.*",
|
|
@@ -53,14 +53,6 @@ class TestTkinterDnD2(unittest.TestCase):
|
|
|
53
53
|
"""Binary loaded and TkdndVersion is populated."""
|
|
54
54
|
self.assertIsNotNone(tkinterdnd2.TkinterDnD.TkdndVersion)
|
|
55
55
|
|
|
56
|
-
def test_expected_version(self):
|
|
57
|
-
"""Loaded tkdnd version matches what is shipped for this platform."""
|
|
58
|
-
# osx-x64 still ships the old 2.9.4 binary; all others are 2.10.0
|
|
59
|
-
if self.base_dir == 'osx-x64':
|
|
60
|
-
self.assertEqual(tkinterdnd2.TkinterDnD.TkdndVersion, '2.9.4')
|
|
61
|
-
else:
|
|
62
|
-
self.assertEqual(tkinterdnd2.TkinterDnD.TkdndVersion, '2.10.0')
|
|
63
|
-
|
|
64
56
|
def test_binary_directory_exists(self):
|
|
65
57
|
"""The directory that was selected exists inside the installed package."""
|
|
66
58
|
path = os.path.join(self.tkdnd_root, self.chosen_dir)
|
|
Binary file
|
|
@@ -53,10 +53,10 @@ namespace eval ::tkdnd {
|
|
|
53
53
|
|
|
54
54
|
}; # namespace ::tkdnd
|
|
55
55
|
|
|
56
|
-
package ifneeded tkdnd 2.10.
|
|
56
|
+
package ifneeded tkdnd 2.10.1 \
|
|
57
57
|
"tkdnd::source \{$dir/tkdnd.tcl\} ; \
|
|
58
|
-
tkdnd::initialise \{$dir\} libtkdnd2.10.
|
|
58
|
+
tkdnd::initialise \{$dir\} libtkdnd2.10.1.so tkdnd"
|
|
59
59
|
|
|
60
|
-
package ifneeded tkdnd::utils 2.10.
|
|
60
|
+
package ifneeded tkdnd::utils 2.10.1 \
|
|
61
61
|
"tkdnd::source \{$dir/tkdnd_utils.tcl\} ; \
|
|
62
|
-
package provide tkdnd::utils 2.10.
|
|
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
|
|
@@ -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
|
-
|
|
360
|
-
|
|
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
|
-
|
|
379
|
-
_ungrab_pointer $
|
|
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
|
}
|
|
@@ -53,10 +53,10 @@ namespace eval ::tkdnd {
|
|
|
53
53
|
|
|
54
54
|
}; # namespace ::tkdnd
|
|
55
55
|
|
|
56
|
-
package ifneeded tkdnd 2.10.
|
|
56
|
+
package ifneeded tkdnd 2.10.1 \
|
|
57
57
|
"tkdnd::source \{$dir/tkdnd.tcl\} ; \
|
|
58
|
-
tkdnd::initialise \{$dir\} libtcl9tkdnd2.10.
|
|
58
|
+
tkdnd::initialise \{$dir\} libtcl9tkdnd2.10.1.so tkdnd"
|
|
59
59
|
|
|
60
|
-
package ifneeded tkdnd::utils 2.10.
|
|
60
|
+
package ifneeded tkdnd::utils 2.10.1 \
|
|
61
61
|
"tkdnd::source \{$dir/tkdnd_utils.tcl\} ; \
|
|
62
|
-
package provide tkdnd::utils 2.10.
|
|
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
|
|
@@ -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
|
-
|
|
360
|
-
|
|
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
|
-
|
|
379
|
-
_ungrab_pointer $
|
|
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
|
}
|
|
Binary file
|
|
@@ -53,10 +53,10 @@ namespace eval ::tkdnd {
|
|
|
53
53
|
|
|
54
54
|
}; # namespace ::tkdnd
|
|
55
55
|
|
|
56
|
-
package ifneeded tkdnd 2.10.
|
|
56
|
+
package ifneeded tkdnd 2.10.1 \
|
|
57
57
|
"tkdnd::source \{$dir/tkdnd.tcl\} ; \
|
|
58
|
-
tkdnd::initialise \{$dir\} libtkdnd2.10.
|
|
58
|
+
tkdnd::initialise \{$dir\} libtkdnd2.10.1.so tkdnd"
|
|
59
59
|
|
|
60
|
-
package ifneeded tkdnd::utils 2.10.
|
|
60
|
+
package ifneeded tkdnd::utils 2.10.1 \
|
|
61
61
|
"tkdnd::source \{$dir/tkdnd_utils.tcl\} ; \
|
|
62
|
-
package provide tkdnd::utils 2.10.
|
|
62
|
+
package provide tkdnd::utils 2.10.1"
|