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.
- {tkinterdnd2-0.5.0/tkinterdnd2.egg-info → tkinterdnd2-0.6.1}/PKG-INFO +3 -9
- {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/README.md +2 -8
- {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/setup.py +9 -2
- tkinterdnd2-0.6.1/tests/test_tkinterdnd2.py +81 -0
- {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2/TkinterDnD.py +6 -1
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64/libtkdnd2.10.1.so +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/pkgIndex.tcl +4 -4
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_generic.tcl +48 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_unix.tcl +51 -10
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9/libtcl9tkdnd2.10.1.so +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/pkgIndex.tcl +4 -4
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_generic.tcl +48 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_unix.tcl +51 -10
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64/libtkdnd2.10.1.so +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/pkgIndex.tcl +4 -4
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64/tkdnd_generic.tcl +635 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd_unix.tcl +51 -10
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9/libtcl9tkdnd2.10.1.so +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9/pkgIndex.tcl +62 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_generic.tcl +48 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_unix.tcl +51 -10
- 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
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/pkgIndex.tcl +62 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/tkdnd.tcl +554 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/tkdnd_macosx.tcl +144 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64/tkdnd_windows.tcl +167 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/libtcl9tkdnd2.10.1.dylib +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/pkgIndex.tcl +62 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/tkdnd.tcl +554 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9/tkdnd_windows.tcl +167 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64/tkdnd_macosx.tcl +144 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/libtkdnd2.10.1.dll +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/pkgIndex.tcl +62 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd.tcl +554 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd2.10.1.lib +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_compat.tcl +160 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_macosx.tcl +144 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_utils.tcl +256 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-arm64/tkdnd_windows.tcl +167 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/libtkdnd2.10.1.dll +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/pkgIndex.tcl +62 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd.tcl +554 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd2.10.1.lib +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_compat.tcl +160 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_macosx.tcl +144 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_utils.tcl +256 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64/tkdnd_windows.tcl +167 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/libtkdnd2.10.1.dll +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/pkgIndex.tcl +62 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd.tcl +554 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd2.10.1.lib +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_compat.tcl +160 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_macosx.tcl +144 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_utils.tcl +256 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x64-tcl9/tkdnd_windows.tcl +167 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/libtkdnd2.10.1.dll +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/pkgIndex.tcl +62 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd.tcl +554 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd2.10.1.lib +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_compat.tcl +160 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_macosx.tcl +144 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_utils.tcl +256 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86/tkdnd_windows.tcl +167 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/libtkdnd2.10.1.dll +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/pkgIndex.tcl +62 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd.tcl +554 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd2.10.1.lib +0 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_compat.tcl +160 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_generic.tcl +635 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_macosx.tcl +144 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_unix.tcl +924 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_utils.tcl +256 -0
- tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/win-x86-tcl9/tkdnd_windows.tcl +167 -0
- {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1/tkinterdnd2.egg-info}/PKG-INFO +3 -9
- tkinterdnd2-0.6.1/tkinterdnd2.egg-info/SOURCES.txt +123 -0
- tkinterdnd2-0.5.0/tests/test_tkinterdnd2.py +0 -14
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64/libtkdnd2.9.3.so +0 -0
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64/tkdnd.tcl +0 -539
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64/tkdnd_generic.tcl +0 -587
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64/tkdnd_macosx.tcl +0 -144
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64/libtkdnd2.9.5.so +0 -0
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64/tkdnd_unix.tcl +0 -883
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64/tkdnd_windows.tcl +0 -167
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/libtkdnd2.9.3.dll +0 -0
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/pkgIndex.tcl +0 -62
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd.tcl +0 -539
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd2.9.3.lib +0 -0
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd_generic.tcl +0 -587
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd_macosx.tcl +0 -144
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd_unix.tcl +0 -883
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64/tkdnd_windows.tcl +0 -167
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64/libtkdnd2.9.5.dll +0 -0
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64/pkgIndex.tcl +0 -62
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64/tkdnd2.9.5.lib +0 -0
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86/libtkdnd2.9.5.dll +0 -0
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86/pkgIndex.tcl +0 -62
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86/tkdnd2.9.5.lib +0 -0
- tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86/tkdnd_generic.tcl +0 -587
- tkinterdnd2-0.5.0/tkinterdnd2.egg-info/SOURCES.txt +0 -76
- {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/LICENSE +0 -0
- {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/setup.cfg +0 -0
- {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2/__init__.py +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64}/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-arm64-tcl9}/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64}/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/osx-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/linux-x64-tcl9}/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64}/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64}/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9}/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9}/tkdnd_macosx.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-arm64-tcl9}/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2/tkdnd/osx-x64/libtkdnd2.9.4.dylib +0 -0
- {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2/tkdnd/osx-x64/pkgIndex.tcl +0 -0
- {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2/tkdnd/osx-x64/tkdnd.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64}/tkdnd_compat.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-x64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64}/tkdnd_generic.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64}/tkdnd_unix.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/win-x86 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64}/tkdnd_utils.tcl +0 -0
- {tkinterdnd2-0.5.0/tkinterdnd2/tkdnd/linux-arm64 → tkinterdnd2-0.6.1/tkinterdnd2/tkdnd/osx-x64}/tkdnd_windows.tcl +0 -0
- {tkinterdnd2-0.5.0 → tkinterdnd2-0.6.1}/tkinterdnd2.egg-info/dependency_links.txt +0 -0
- {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.
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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": [
|
|
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
|
-
|
|
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:
|
|
Binary file
|
|
@@ -53,10 +53,10 @@ namespace eval ::tkdnd {
|
|
|
53
53
|
|
|
54
54
|
}; # namespace ::tkdnd
|
|
55
55
|
|
|
56
|
-
package ifneeded tkdnd 2.
|
|
56
|
+
package ifneeded tkdnd 2.10.1 \
|
|
57
57
|
"tkdnd::source \{$dir/tkdnd.tcl\} ; \
|
|
58
|
-
tkdnd::initialise \{$dir\} libtkdnd2.
|
|
58
|
+
tkdnd::initialise \{$dir\} libtkdnd2.10.1.so tkdnd"
|
|
59
59
|
|
|
60
|
-
package ifneeded tkdnd::utils 2.
|
|
60
|
+
package ifneeded tkdnd::utils 2.10.1 \
|
|
61
61
|
"tkdnd::source \{$dir/tkdnd_utils.tcl\} ; \
|
|
62
|
-
package provide tkdnd::utils 2.
|
|
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
|
|
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
|
-
|
|
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
|
}
|
|
@@ -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.
|
|
56
|
+
package ifneeded tkdnd 2.10.1 \
|
|
57
57
|
"tkdnd::source \{$dir/tkdnd.tcl\} ; \
|
|
58
|
-
tkdnd::initialise \{$dir\}
|
|
58
|
+
tkdnd::initialise \{$dir\} libtcl9tkdnd2.10.1.so tkdnd"
|
|
59
59
|
|
|
60
|
-
package ifneeded tkdnd::utils 2.
|
|
60
|
+
package ifneeded tkdnd::utils 2.10.1 \
|
|
61
61
|
"tkdnd::source \{$dir/tkdnd_utils.tcl\} ; \
|
|
62
|
-
package provide tkdnd::utils 2.
|
|
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
|
|
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
|
-
|
|
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
|
}
|
|
@@ -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
|
}
|
|
Binary file
|
|
@@ -53,10 +53,10 @@ namespace eval ::tkdnd {
|
|
|
53
53
|
|
|
54
54
|
}; # namespace ::tkdnd
|
|
55
55
|
|
|
56
|
-
package ifneeded tkdnd 2.
|
|
56
|
+
package ifneeded tkdnd 2.10.1 \
|
|
57
57
|
"tkdnd::source \{$dir/tkdnd.tcl\} ; \
|
|
58
|
-
tkdnd::initialise \{$dir\}
|
|
58
|
+
tkdnd::initialise \{$dir\} libtkdnd2.10.1.so tkdnd"
|
|
59
59
|
|
|
60
|
-
package ifneeded tkdnd::utils 2.
|
|
60
|
+
package ifneeded tkdnd::utils 2.10.1 \
|
|
61
61
|
"tkdnd::source \{$dir/tkdnd_utils.tcl\} ; \
|
|
62
|
-
package provide tkdnd::utils 2.
|
|
62
|
+
package provide tkdnd::utils 2.10.1"
|