From 6a4cddb7754bfdc343eee0f6e8b0b782cc5e29f1 Mon Sep 17 00:00:00 2001 From: Anjok07 <68268275+Anjok07@users.noreply.github.com> Date: Wed, 7 Apr 2021 17:48:16 -0500 Subject: [PATCH] Delete tkinterdnd2 directory --- tkinterdnd2/TkinterDnD.py | 292 ------- tkinterdnd2/__init__.py | 25 - tkinterdnd2/tkdnd/linux64/libtkdnd2.9.2.so | Bin 55135 -> 0 bytes tkinterdnd2/tkdnd/linux64/pkgIndex.tcl | 10 - tkinterdnd2/tkdnd/linux64/tkdnd.tcl | 469 ------------ tkinterdnd2/tkdnd/linux64/tkdnd_compat.tcl | 160 ---- tkinterdnd2/tkdnd/linux64/tkdnd_generic.tcl | 520 ------------- tkinterdnd2/tkdnd/linux64/tkdnd_macosx.tcl | 144 ---- tkinterdnd2/tkdnd/linux64/tkdnd_unix.tcl | 810 -------------------- tkinterdnd2/tkdnd/linux64/tkdnd_utils.tcl | 252 ------ tkinterdnd2/tkdnd/linux64/tkdnd_windows.tcl | 167 ---- tkinterdnd2/tkdnd/osx64/libtkdnd2.9.2.dylib | Bin 40176 -> 0 bytes tkinterdnd2/tkdnd/osx64/pkgIndex.tcl | 10 - tkinterdnd2/tkdnd/osx64/tkdnd.tcl | 469 ------------ tkinterdnd2/tkdnd/osx64/tkdnd_compat.tcl | 160 ---- tkinterdnd2/tkdnd/osx64/tkdnd_generic.tcl | 520 ------------- tkinterdnd2/tkdnd/osx64/tkdnd_macosx.tcl | 144 ---- tkinterdnd2/tkdnd/osx64/tkdnd_unix.tcl | 810 -------------------- tkinterdnd2/tkdnd/osx64/tkdnd_utils.tcl | 252 ------ tkinterdnd2/tkdnd/osx64/tkdnd_windows.tcl | 167 ---- tkinterdnd2/tkdnd/win64/libtkdnd2.9.2.dll | Bin 153600 -> 0 bytes tkinterdnd2/tkdnd/win64/pkgIndex.tcl | 7 - tkinterdnd2/tkdnd/win64/tkdnd.tcl | 469 ------------ tkinterdnd2/tkdnd/win64/tkdnd2.9.2.lib | Bin 2064 -> 0 bytes tkinterdnd2/tkdnd/win64/tkdnd_compat.tcl | 160 ---- tkinterdnd2/tkdnd/win64/tkdnd_generic.tcl | 520 ------------- tkinterdnd2/tkdnd/win64/tkdnd_macosx.tcl | 144 ---- tkinterdnd2/tkdnd/win64/tkdnd_unix.tcl | 810 -------------------- tkinterdnd2/tkdnd/win64/tkdnd_utils.tcl | 252 ------ tkinterdnd2/tkdnd/win64/tkdnd_windows.tcl | 167 ---- 30 files changed, 7910 deletions(-) delete mode 100644 tkinterdnd2/TkinterDnD.py delete mode 100644 tkinterdnd2/__init__.py delete mode 100644 tkinterdnd2/tkdnd/linux64/libtkdnd2.9.2.so delete mode 100644 tkinterdnd2/tkdnd/linux64/pkgIndex.tcl delete mode 100644 tkinterdnd2/tkdnd/linux64/tkdnd.tcl delete mode 100644 tkinterdnd2/tkdnd/linux64/tkdnd_compat.tcl delete mode 100644 tkinterdnd2/tkdnd/linux64/tkdnd_generic.tcl delete mode 100644 tkinterdnd2/tkdnd/linux64/tkdnd_macosx.tcl delete mode 100644 tkinterdnd2/tkdnd/linux64/tkdnd_unix.tcl delete mode 100644 tkinterdnd2/tkdnd/linux64/tkdnd_utils.tcl delete mode 100644 tkinterdnd2/tkdnd/linux64/tkdnd_windows.tcl delete mode 100644 tkinterdnd2/tkdnd/osx64/libtkdnd2.9.2.dylib delete mode 100644 tkinterdnd2/tkdnd/osx64/pkgIndex.tcl delete mode 100644 tkinterdnd2/tkdnd/osx64/tkdnd.tcl delete mode 100644 tkinterdnd2/tkdnd/osx64/tkdnd_compat.tcl delete mode 100644 tkinterdnd2/tkdnd/osx64/tkdnd_generic.tcl delete mode 100644 tkinterdnd2/tkdnd/osx64/tkdnd_macosx.tcl delete mode 100644 tkinterdnd2/tkdnd/osx64/tkdnd_unix.tcl delete mode 100644 tkinterdnd2/tkdnd/osx64/tkdnd_utils.tcl delete mode 100644 tkinterdnd2/tkdnd/osx64/tkdnd_windows.tcl delete mode 100644 tkinterdnd2/tkdnd/win64/libtkdnd2.9.2.dll delete mode 100644 tkinterdnd2/tkdnd/win64/pkgIndex.tcl delete mode 100644 tkinterdnd2/tkdnd/win64/tkdnd.tcl delete mode 100644 tkinterdnd2/tkdnd/win64/tkdnd2.9.2.lib delete mode 100644 tkinterdnd2/tkdnd/win64/tkdnd_compat.tcl delete mode 100644 tkinterdnd2/tkdnd/win64/tkdnd_generic.tcl delete mode 100644 tkinterdnd2/tkdnd/win64/tkdnd_macosx.tcl delete mode 100644 tkinterdnd2/tkdnd/win64/tkdnd_unix.tcl delete mode 100644 tkinterdnd2/tkdnd/win64/tkdnd_utils.tcl delete mode 100644 tkinterdnd2/tkdnd/win64/tkdnd_windows.tcl diff --git a/tkinterdnd2/TkinterDnD.py b/tkinterdnd2/TkinterDnD.py deleted file mode 100644 index f7e2c1e..0000000 --- a/tkinterdnd2/TkinterDnD.py +++ /dev/null @@ -1,292 +0,0 @@ -'''Python wrapper for the tkdnd tk extension. - -The tkdnd extension provides an interface to native, platform specific -drag and drop mechanisms. Under Unix the drag & drop protocol in use is -the XDND protocol version 5 (also used by the Qt toolkit, and the KDE and -GNOME desktops). Under Windows, the OLE2 drag & drop interfaces are used. -Under Macintosh, the Cocoa drag and drop interfaces are used. - -Once the TkinterDnD2 package is installed, it is safe to do: - -from TkinterDnD2 import * - -This will add the classes TkinterDnD.Tk and TkinterDnD.TixTk to the global -namespace, plus the following constants: -PRIVATE, NONE, ASK, COPY, MOVE, LINK, REFUSE_DROP, -DND_TEXT, DND_FILES, DND_ALL, CF_UNICODETEXT, CF_TEXT, CF_HDROP, -FileGroupDescriptor, FileGroupDescriptorW - -Drag and drop for the application can then be enabled by using one of the -classes TkinterDnD.Tk() or (in case the tix extension shall be used) -TkinterDnD.TixTk() as application main window instead of a regular -tkinter.Tk() window. This will add the drag-and-drop specific methods to the -Tk window and all its descendants. -''' - -try: - import Tkinter as tkinter - import Tix as tix -except ImportError: - import tkinter - from tkinter import tix - -TkdndVersion = None - -def _require(tkroot): - '''Internal function.''' - global TkdndVersion - try: - import os.path - import platform - - if platform.system()=="Darwin": - tkdnd_platform_rep = "osx64" - elif platform.system()=="Linux": - tkdnd_platform_rep = "linux64" - elif platform.system()=="Windows": - tkdnd_platform_rep = "win64" - else: - raise RuntimeError('Plaform not supported.') - - module_path = os.path.join(os.path.dirname(__file__), 'tkdnd', tkdnd_platform_rep) - tkroot.tk.call('lappend', 'auto_path', module_path) - TkdndVersion = tkroot.tk.call('package', 'require', 'tkdnd') - except tkinter.TclError: - raise RuntimeError('Unable to load tkdnd library.') - return TkdndVersion - -class DnDEvent: - """Internal class. - Container for the properties of a drag-and-drop event, similar to a - normal tkinter.Event. - An instance of the DnDEvent class has the following attributes: - action (string) - actions (tuple) - button (int) - code (string) - codes (tuple) - commonsourcetypes (tuple) - commontargettypes (tuple) - data (string) - name (string) - types (tuple) - modifiers (tuple) - supportedsourcetypes (tuple) - sourcetypes (tuple) - type (string) - supportedtargettypes (tuple) - widget (widget instance) - x_root (int) - y_root (int) - Depending on the type of DnD event however, not all attributes may be set. - """ - pass - -class DnDWrapper: - '''Internal class.''' - # some of the percent substitutions need to be enclosed in braces - # so we can use splitlist() to convert them into tuples - _subst_format_dnd = ('%A', '%a', '%b', '%C', '%c', '{%CST}', - '{%CTT}', '%D', '%e', '{%L}', '{%m}', '{%ST}', - '%T', '{%t}', '{%TT}', '%W', '%X', '%Y') - _subst_format_str_dnd = " ".join(_subst_format_dnd) - tkinter.BaseWidget._subst_format_dnd = _subst_format_dnd - tkinter.BaseWidget._subst_format_str_dnd = _subst_format_str_dnd - - def _substitute_dnd(self, *args): - """Internal function.""" - if len(args) != len(self._subst_format_dnd): - return args - def getint_event(s): - try: - return int(s) - except ValueError: - return s - def splitlist_event(s): - try: - return self.tk.splitlist(s) - except ValueError: - return s - # valid percent substitutions for DnD event types - # (tested with tkdnd-2.8 on debian jessie): - # <> : %W, %X, %Y %e, %t - # <> : %A, %W, %e - # <> : all except : %D (always empty) - # <> : all except %D (always empty) - # <> :all except %D (always empty) - # <> : all - A, a, b, C, c, CST, CTT, D, e, L, m, ST, T, t, TT, W, X, Y = args - ev = DnDEvent() - ev.action = A - ev.actions = splitlist_event(a) - ev.button = getint_event(b) - ev.code = C - ev.codes = splitlist_event(c) - ev.commonsourcetypes = splitlist_event(CST) - ev.commontargettypes = splitlist_event(CTT) - ev.data = D - ev.name = e - ev.types = splitlist_event(L) - ev.modifiers = splitlist_event(m) - ev.supportedsourcetypes = splitlist_event(ST) - ev.sourcetypes = splitlist_event(t) - ev.type = T - ev.supportedtargettypes = splitlist_event(TT) - try: - ev.widget = self.nametowidget(W) - except KeyError: - ev.widget = W - ev.x_root = getint_event(X) - ev.y_root = getint_event(Y) - return (ev,) - tkinter.BaseWidget._substitute_dnd = _substitute_dnd - - def _dnd_bind(self, what, sequence, func, add, needcleanup=True): - """Internal function.""" - if isinstance(func, str): - self.tk.call(what + (sequence, func)) - elif func: - funcid = self._register(func, self._substitute_dnd, needcleanup) - # FIXME: why doesn't the "return 'break'" mechanism work here?? - #cmd = ('%sif {"[%s %s]" == "break"} break\n' % (add and '+' or '', - # funcid, self._subst_format_str_dnd)) - cmd = '%s%s %s' %(add and '+' or '', funcid, - self._subst_format_str_dnd) - self.tk.call(what + (sequence, cmd)) - return funcid - elif sequence: - return self.tk.call(what + (sequence,)) - else: - return self.tk.splitlist(self.tk.call(what)) - tkinter.BaseWidget._dnd_bind = _dnd_bind - - def dnd_bind(self, sequence=None, func=None, add=None): - '''Bind to this widget at drag and drop event SEQUENCE a call - to function FUNC. - SEQUENCE may be one of the following: - <>, <>, <>, <>, - <>, <>, <> . - The callbacks for the > events, with the exception of - <>, should always return an action (i.e. one of COPY, - MOVE, LINK, ASK or PRIVATE). - The callback for the <> event must return a tuple - containing three elements: the drop action(s) supported by the - drag source, the format type(s) that the data can be dropped as and - finally the data that shall be dropped. Each of these three elements - may be a tuple of strings or a single string.''' - return self._dnd_bind(('bind', self._w), sequence, func, add) - tkinter.BaseWidget.dnd_bind = dnd_bind - - def drag_source_register(self, button=None, *dndtypes): - '''This command will register SELF as a drag source. - A drag source is a widget than can start a drag action. This command - can be executed multiple times on a widget. - When SELF is registered as a drag source, optional DNDTYPES can be - provided. These DNDTYPES will be provided during a drag action, and - it can contain platform independent or platform specific types. - Platform independent are DND_Text for dropping text portions and - DND_Files for dropping a list of files (which can contain one or - multiple files) on SELF. However, these types are - indicative/informative. SELF can initiate a drag action with even a - different type list. Finally, button is the mouse button that will be - used for starting the drag action. It can have any of the values 1 - (left mouse button), 2 (middle mouse button - wheel) and 3 - (right mouse button). If button is not specified, it defaults to 1.''' - # hack to fix a design bug from the first version - if button is None: - button = 1 - else: - try: - button = int(button) - except ValueError: - # no button defined, button is actually - # something like DND_TEXT - dndtypes = (button,) + dndtypes - button = 1 - self.tk.call( - 'tkdnd::drag_source', 'register', self._w, dndtypes, button) - tkinter.BaseWidget.drag_source_register = drag_source_register - - def drag_source_unregister(self): - '''This command will stop SELF from being a drag source. Thus, window - will stop receiving events related to drag operations. It is an error - to use this command for a window that has not been registered as a - drag source with drag_source_register().''' - self.tk.call('tkdnd::drag_source', 'unregister', self._w) - tkinter.BaseWidget.drag_source_unregister = drag_source_unregister - - def drop_target_register(self, *dndtypes): - '''This command will register SELF as a drop target. A drop target is - a widget than can accept a drop action. This command can be executed - multiple times on a widget. When SELF is registered as a drop target, - optional DNDTYPES can be provided. These types list can contain one or - more types that SELF will accept during a drop action, and it can - contain platform independent or platform specific types. Platform - independent are DND_Text for dropping text portions and DND_Files for - dropping a list of files (which can contain one or multiple files) on - SELF.''' - self.tk.call('tkdnd::drop_target', 'register', self._w, dndtypes) - tkinter.BaseWidget.drop_target_register = drop_target_register - - def drop_target_unregister(self): - '''This command will stop SELF from being a drop target. Thus, SELF - will stop receiving events related to drop operations. It is an error - to use this command for a window that has not been registered as a - drop target with drop_target_register().''' - self.tk.call('tkdnd::drop_target', 'unregister', self._w) - tkinter.BaseWidget.drop_target_unregister = drop_target_unregister - - def platform_independent_types(self, *dndtypes): - '''This command will accept a list of types that can contain platform - independnent or platform specific types. A new list will be returned, - where each platform specific type in DNDTYPES will be substituted by - one or more platform independent types. Thus, the returned list may - have more elements than DNDTYPES.''' - return self.tk.split(self.tk.call( - 'tkdnd::platform_independent_types', dndtypes)) - tkinter.BaseWidget.platform_independent_types = platform_independent_types - - def platform_specific_types(self, *dndtypes): - '''This command will accept a list of types that can contain platform - independnent or platform specific types. A new list will be returned, - where each platform independent type in DNDTYPES will be substituted - by one or more platform specific types. Thus, the returned list may - have more elements than DNDTYPES.''' - return self.tk.split(self.tk.call( - 'tkdnd::platform_specific_types', dndtypes)) - tkinter.BaseWidget.platform_specific_types = platform_specific_types - - def get_dropfile_tempdir(self): - '''This command will return the temporary directory used by TkDND for - storing temporary files. When the package is loaded, this temporary - directory will be initialised to a proper directory according to the - operating system. This default initial value can be changed to be the - value of the following environmental variables: - TKDND_TEMP_DIR, TEMP, TMP.''' - return self.tk.call('tkdnd::GetDropFileTempDirectory') - tkinter.BaseWidget.get_dropfile_tempdir = get_dropfile_tempdir - - def set_dropfile_tempdir(self, tempdir): - '''This command will change the temporary directory used by TkDND for - storing temporary files to TEMPDIR.''' - self.tk.call('tkdnd::SetDropFileTempDirectory', tempdir) - tkinter.BaseWidget.set_dropfile_tempdir = set_dropfile_tempdir - -####################################################################### -#### The main window classes that enable Drag & Drop for #### -#### themselves and all their descendant widgets: #### -####################################################################### - -class Tk(tkinter.Tk, DnDWrapper): - '''Creates a new instance of a tkinter.Tk() window; all methods of the - DnDWrapper class apply to this window and all its descendants.''' - def __init__(self, *args, **kw): - tkinter.Tk.__init__(self, *args, **kw) - self.TkdndVersion = _require(self) - -class TixTk(tix.Tk, DnDWrapper): - '''Creates a new instance of a tix.Tk() window; all methods of the - DnDWrapper class apply to this window and all its descendants.''' - def __init__(self, *args, **kw): - tix.Tk.__init__(self, *args, **kw) - self.TkdndVersion = _require(self) diff --git a/tkinterdnd2/__init__.py b/tkinterdnd2/__init__.py deleted file mode 100644 index 17f037d..0000000 --- a/tkinterdnd2/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# dnd actions -PRIVATE = 'private' -NONE = 'none' -ASK = 'ask' -COPY = 'copy' -MOVE = 'move' -LINK = 'link' -REFUSE_DROP = 'refuse_drop' - -# dnd types -DND_TEXT = 'DND_Text' -DND_FILES = 'DND_Files' -DND_ALL = '*' -CF_UNICODETEXT = 'CF_UNICODETEXT' -CF_TEXT = 'CF_TEXT' -CF_HDROP = 'CF_HDROP' - -FileGroupDescriptor = 'FileGroupDescriptor - FileContents'# ?? -FileGroupDescriptorW = 'FileGroupDescriptorW - FileContents'# ?? - -from . import TkinterDnD -from .TkinterDnD import Tk -from .TkinterDnD import TixTk - - diff --git a/tkinterdnd2/tkdnd/linux64/libtkdnd2.9.2.so b/tkinterdnd2/tkdnd/linux64/libtkdnd2.9.2.so deleted file mode 100644 index 03dbd1bb1f3ed549879f17db070a3d3b6f42538c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55135 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 diff --git a/tkinterdnd2/tkdnd/linux64/pkgIndex.tcl b/tkinterdnd2/tkdnd/linux64/pkgIndex.tcl deleted file mode 100644 index 9edcc8f..0000000 --- a/tkinterdnd2/tkdnd/linux64/pkgIndex.tcl +++ /dev/null @@ -1,10 +0,0 @@ -# -# Tcl package index file -# -package ifneeded tkdnd 2.9.2 \ - "source \{$dir/tkdnd.tcl\} ; \ - tkdnd::initialise \{$dir\} libtkdnd2.9.2.so tkdnd" - -package ifneeded tkdnd::utils 2.9.2 \ - "source \{$dir/tkdnd_utils.tcl\} ; \ - package provide tkdnd::utils 2.9.2" diff --git a/tkinterdnd2/tkdnd/linux64/tkdnd.tcl b/tkinterdnd2/tkdnd/linux64/tkdnd.tcl deleted file mode 100644 index 12d1dd2..0000000 --- a/tkinterdnd2/tkdnd/linux64/tkdnd.tcl +++ /dev/null @@ -1,469 +0,0 @@ -# -# tkdnd.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -package require Tk - -namespace eval ::tkdnd { - variable _topw ".drag" - variable _tabops - variable _state - variable _x0 - variable _y0 - variable _platform_namespace - variable _drop_file_temp_dir - variable _auto_update 1 - variable _dx 3 ;# The difference in pixels before a drag is initiated. - variable _dy 3 ;# The difference in pixels before a drag is initiated. - - variable _windowingsystem - - bind TkDND_Drag1 {tkdnd::_begin_drag press 1 %W %s %X %Y %x %y} - bind TkDND_Drag1 {tkdnd::_begin_drag motion 1 %W %s %X %Y %x %y} - bind TkDND_Drag2 {tkdnd::_begin_drag press 2 %W %s %X %Y %x %y} - bind TkDND_Drag2 {tkdnd::_begin_drag motion 2 %W %s %X %Y %x %y} - bind TkDND_Drag3 {tkdnd::_begin_drag press 3 %W %s %X %Y %x %y} - bind TkDND_Drag3 {tkdnd::_begin_drag motion 3 %W %s %X %Y %x %y} - - # ---------------------------------------------------------------------------- - # Command tkdnd::initialise: Initialise the TkDND package. - # ---------------------------------------------------------------------------- - proc initialise { dir PKG_LIB_FILE PACKAGE_NAME} { - variable _platform_namespace - variable _drop_file_temp_dir - variable _windowingsystem - global env - - switch [tk windowingsystem] { - x11 { - set _windowingsystem x11 - } - win32 - - windows { - set _windowingsystem windows - } - aqua { - set _windowingsystem aqua - } - default { - error "unknown Tk windowing system" - } - } - - ## Get User's home directory: We try to locate the proper path from a set of - ## environmental variables... - foreach var {HOME HOMEPATH USERPROFILE ALLUSERSPROFILE APPDATA} { - if {[info exists env($var)]} { - if {[file isdirectory $env($var)]} { - set UserHomeDir $env($var) - break - } - } - } - - ## Should use [tk windowingsystem] instead of tcl platform array: - ## OS X returns "unix," but that's not useful because it has its own - ## windowing system, aqua - ## Under windows we have to also combine HOMEDRIVE & HOMEPATH... - if {![info exists UserHomeDir] && - [string equal $_windowingsystem windows] && - [info exists env(HOMEDRIVE)] && [info exists env(HOMEPATH)]} { - if {[file isdirectory $env(HOMEDRIVE)$env(HOMEPATH)]} { - set UserHomeDir $env(HOMEDRIVE)$env(HOMEPATH) - } - } - ## Have we located the needed path? - if {![info exists UserHomeDir]} { - set UserHomeDir [pwd] - } - set UserHomeDir [file normalize $UserHomeDir] - - ## Try to locate a temporary directory... - foreach var {TKDND_TEMP_DIR TEMP TMP} { - if {[info exists env($var)]} { - if {[file isdirectory $env($var)] && [file writable $env($var)]} { - set _drop_file_temp_dir $env($var) - break - } - } - } - if {![info exists _drop_file_temp_dir]} { - foreach _dir [list "$UserHomeDir/Local Settings/Temp" \ - "$UserHomeDir/AppData/Local/Temp" \ - /tmp \ - C:/WINDOWS/Temp C:/Temp C:/tmp \ - D:/WINDOWS/Temp D:/Temp D:/tmp] { - if {[file isdirectory $_dir] && [file writable $_dir]} { - set _drop_file_temp_dir $_dir - break - } - } - } - if {![info exists _drop_file_temp_dir]} { - set _drop_file_temp_dir $UserHomeDir - } - set _drop_file_temp_dir [file native $_drop_file_temp_dir] - - source $dir/tkdnd_generic.tcl - switch $_windowingsystem { - x11 { - source $dir/tkdnd_unix.tcl - set _platform_namespace xdnd - } - win32 - - windows { - source $dir/tkdnd_windows.tcl - set _platform_namespace olednd - } - aqua { - source $dir/tkdnd_macosx.tcl - set _platform_namespace macdnd - } - default { - error "unknown Tk windowing system" - } - } - load $dir/$PKG_LIB_FILE $PACKAGE_NAME - source $dir/tkdnd_compat.tcl - ${_platform_namespace}::initialise - };# initialise - - proc GetDropFileTempDirectory { } { - variable _drop_file_temp_dir - return $_drop_file_temp_dir - } - proc SetDropFileTempDirectory { dir } { - variable _drop_file_temp_dir - set _drop_file_temp_dir $dir - } - -};# namespace ::tkdnd - -# ---------------------------------------------------------------------------- -# Command tkdnd::drag_source -# ---------------------------------------------------------------------------- -proc ::tkdnd::drag_source { mode path { types {} } { event 1 } - { tagprefix TkDND_Drag } } { - set tags [bindtags $path] - set idx [lsearch $tags ${tagprefix}$event] - switch -- $mode { - register { - if { $idx != -1 } { - ## No need to do anything! - # bindtags $path [lreplace $tags $idx $idx ${tagprefix}$event] - } else { - bindtags $path [linsert $tags 1 ${tagprefix}$event] - } - _drag_source_update_types $path $types - } - unregister { - if { $idx != -1 } { - bindtags $path [lreplace $tags $idx $idx] - } - } - } -};# tkdnd::drag_source - -proc ::tkdnd::_drag_source_update_types { path types } { - set types [platform_specific_types $types] - set old_types [bind $path <>] - foreach type $types { - if {[lsearch $old_types $type] < 0} {lappend old_types $type} - } - bind $path <> $old_types -};# ::tkdnd::_drag_source_update_types - -# ---------------------------------------------------------------------------- -# Command tkdnd::drop_target -# ---------------------------------------------------------------------------- -proc ::tkdnd::drop_target { mode path { types {} } } { - variable _windowingsystem - set types [platform_specific_types $types] - switch -- $mode { - register { - switch $_windowingsystem { - x11 { - _register_types $path [winfo toplevel $path] $types - } - win32 - - windows { - _RegisterDragDrop $path - bind $path {+ tkdnd::_RevokeDragDrop %W} - } - aqua { - macdnd::registerdragwidget [winfo toplevel $path] $types - } - default { - error "unknown Tk windowing system" - } - } - set old_types [bind $path <>] - set new_types {} - foreach type $types { - if {[lsearch -exact $old_types $type] < 0} {lappend new_types $type} - } - if {[llength $new_types]} { - bind $path <> [concat $old_types $new_types] - } - } - unregister { - switch $_windowingsystem { - x11 { - } - win32 - - windows { - _RevokeDragDrop $path - } - aqua { - error todo - } - default { - error "unknown Tk windowing system" - } - } - bind $path <> {} - } - } -};# tkdnd::drop_target - -# ---------------------------------------------------------------------------- -# Command tkdnd::_begin_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::_begin_drag { event button source state X Y x y } { - variable _x0 - variable _y0 - variable _state - - switch -- $event { - press { - set _x0 $X - set _y0 $Y - set _state "press" - } - motion { - if { ![info exists _state] } { - # This is just extra protection. There seem to be - # rare cases where the motion comes before the press. - return - } - if { [string equal $_state "press"] } { - variable _dx - variable _dy - if { abs($_x0-$X) > ${_dx} || abs($_y0-$Y) > ${_dy} } { - set _state "done" - _init_drag $button $source $state $X $Y $x $y - } - } - } - } -};# tkdnd::_begin_drag - -# ---------------------------------------------------------------------------- -# Command tkdnd::_init_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::_init_drag { button source state rootX rootY X Y } { - # Call the <> binding. - set cmd [bind $source <>] - # puts "CMD: $cmd" - if {[string length $cmd]} { - set cmd [string map [list %W $source %X $rootX %Y $rootY %x $X %y $Y \ - %S $state %e <> %A \{\} %% % \ - %t [bind $source <>]] $cmd] - set code [catch {uplevel \#0 $cmd} info options] - # puts "CODE: $code ---- $info" - switch -exact -- $code { - 0 {} - 3 - 4 { - # FRINK: nocheck - return - } - default { - return -options $options $info - } - } - - set len [llength $info] - if {$len == 3} { - foreach { actions types _data } $info { break } - set types [platform_specific_types $types] - set data [list] - foreach type $types { - lappend data $_data - } - unset _data - } elseif {$len == 2} { - foreach { actions _data } $info { break } - set data [list]; set types [list] - foreach {t d} $_data { - foreach t [platform_specific_types $t] { - lappend types $t; lappend data $d - } - } - unset _data t d - } else { - if {$len == 1 && [string equal [lindex $actions 0] "refuse_drop"]} { - return - } - error "not enough items in the result of the <>\ - event binding. Either 2 or 3 items are expected. The command - executed was: \"$cmd\"\nResult was: \"$info\"" - } - set action refuse_drop - variable _windowingsystem - # puts "Source: \"$source\"" - # puts "Types: \"[join $types {", "}]\"" - # puts "Actions: \"[join $actions {", "}]\"" - # puts "Button: \"$button\"" - # puts "Data: \"[string range $data 0 100]\"" - switch $_windowingsystem { - x11 { - set action [xdnd::_dodragdrop $source $actions $types $data $button] - } - win32 - - windows { - set action [_DoDragDrop $source $actions $types $data $button] - } - aqua { - set action [macdnd::dodragdrop $source $actions $types $data $button] - } - default { - error "unknown Tk windowing system" - } - } - ## Call _end_drag to notify the widget of the result of the drag - ## operation... - _end_drag $button $source {} $action {} $data {} $state $rootX $rootY $X $Y - } -};# tkdnd::_init_drag - -# ---------------------------------------------------------------------------- -# Command tkdnd::_end_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::_end_drag { button source target action type data result - state rootX rootY X Y } { - set rootX 0 - set rootY 0 - # Call the <> binding. - set cmd [bind $source <>] - if {[string length $cmd]} { - set cmd [string map [list %W $source %X $rootX %Y $rootY %x $X %y $Y %% % \ - %S $state %e <> %A \{$action\}] $cmd] - set info [uplevel \#0 $cmd] - # if { $info != "" } { - # variable _windowingsystem - # foreach { actions types data } $info { break } - # set types [platform_specific_types $types] - # switch $_windowingsystem { - # x11 { - # error "dragging from Tk widgets not yet supported" - # } - # win32 - - # windows { - # set action [_DoDragDrop $source $actions $types $data $button] - # } - # aqua { - # macdnd::dodragdrop $source $actions $types $data - # } - # default { - # error "unknown Tk windowing system" - # } - # } - # ## Call _end_drag to notify the widget of the result of the drag - # ## operation... - # _end_drag $button $source {} $action {} $data {} $state $rootX $rootY - # } - } -};# tkdnd::_end_drag - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_specific_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_specific_types { types } { - variable _platform_namespace - ${_platform_namespace}::platform_specific_types $types -}; # tkdnd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - variable _platform_namespace - ${_platform_namespace}::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_specific_type -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_specific_type { type } { - variable _platform_namespace - ${_platform_namespace}::platform_specific_type $type -}; # tkdnd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_type -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_type { type } { - variable _platform_namespace - ${_platform_namespace}::platform_independent_type $type -}; # tkdnd::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::bytes_to_string -# ---------------------------------------------------------------------------- -proc ::tkdnd::bytes_to_string { bytes } { - set string {} - foreach byte $bytes { - append string [binary format c $byte] - } - return $string -};# tkdnd::bytes_to_string - -# ---------------------------------------------------------------------------- -# Command tkdnd::urn_unquote -# ---------------------------------------------------------------------------- -proc ::tkdnd::urn_unquote {url} { - set result "" - set start 0 - while {[regexp -start $start -indices {%[0-9a-fA-F]{2}} $url match]} { - foreach {first last} $match break - append result [string range $url $start [expr {$first - 1}]] - append result [format %c 0x[string range $url [incr first] $last]] - set start [incr last] - } - append result [string range $url $start end] - return [encoding convertfrom utf-8 $result] -};# tkdnd::urn_unquote diff --git a/tkinterdnd2/tkdnd/linux64/tkdnd_compat.tcl b/tkinterdnd2/tkdnd/linux64/tkdnd_compat.tcl deleted file mode 100644 index efc96f7..0000000 --- a/tkinterdnd2/tkdnd/linux64/tkdnd_compat.tcl +++ /dev/null @@ -1,160 +0,0 @@ -# -# tkdnd_compat.tcl -- -# -# This file implements some utility procedures, to support older versions -# of the TkDND package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval compat { - -};# namespace compat - -# ---------------------------------------------------------------------------- -# Command ::dnd -# ---------------------------------------------------------------------------- -proc ::dnd {method window args} { - switch $method { - bindtarget { - switch [llength $args] { - 0 {return [tkdnd::compat::bindtarget0 $window]} - 1 {return [tkdnd::compat::bindtarget1 $window [lindex $args 0]]} - 2 {return [tkdnd::compat::bindtarget2 $window [lindex $args 0] \ - [lindex $args 1]]} - 3 {return [tkdnd::compat::bindtarget3 $window [lindex $args 0] \ - [lindex $args 1] [lindex $args 2]]} - 4 {return [tkdnd::compat::bindtarget4 $window [lindex $args 0] \ - [lindex $args 1] [lindex $args 2] [lindex $args 3]]} - } - } - cleartarget { - return [tkdnd::compat::cleartarget $window] - } - bindsource { - switch [llength $args] { - 0 {return [tkdnd::compat::bindsource0 $window]} - 1 {return [tkdnd::compat::bindsource1 $window [lindex $args 0]]} - 2 {return [tkdnd::compat::bindsource2 $window [lindex $args 0] \ - [lindex $args 1]]} - 3 {return [tkdnd::compat::bindsource3 $window [lindex $args 0] \ - [lindex $args 1] [lindex $args 2]]} - } - } - clearsource { - return [tkdnd::compat::clearsource $window] - } - drag { - return [tkdnd::_init_drag 1 $window "press" 0 0 0 0] - } - } - error "invalid number of arguments!" -};# ::dnd - -# ---------------------------------------------------------------------------- -# Command compat::bindtarget -# ---------------------------------------------------------------------------- -proc compat::bindtarget0 {window} { - return [bind $window <>] -};# compat::bindtarget0 - -proc compat::bindtarget1 {window type} { - return [bindtarget2 $window $type ] -};# compat::bindtarget1 - -proc compat::bindtarget2 {window type event} { - switch $event { - {return [bind $window <>]} - {return [bind $window <>]} - {return [bind $window <>]} - {return [bind $window <>]} - } -};# compat::bindtarget2 - -proc compat::bindtarget3 {window type event script} { - set type [normalise_type $type] - ::tkdnd::drop_target register $window [list $type] - switch $event { - {return [bind $window <> $script]} - {return [bind $window <> $script]} - {return [bind $window <> $script]} - {return [bind $window <> $script]} - } -};# compat::bindtarget3 - -proc compat::bindtarget4 {window type event script priority} { - return [bindtarget3 $window $type $event $script] -};# compat::bindtarget4 - -proc compat::normalise_type { type } { - switch $type { - text/plain - - {text/plain;charset=UTF-8} - - Text {return DND_Text} - text/uri-list - - Files {return DND_Files} - default {return $type} - } -};# compat::normalise_type - -# ---------------------------------------------------------------------------- -# Command compat::bindsource -# ---------------------------------------------------------------------------- -proc compat::bindsource0 {window} { - return [bind $window <>] -};# compat::bindsource0 - -proc compat::bindsource1 {window type} { - return [bindsource2 $window $type ] -};# compat::bindsource1 - -proc compat::bindsource2 {window type script} { - set type [normalise_type $type] - ::tkdnd::drag_source register $window $type - bind $window <> "list {copy} {%t} \[$script\]" -};# compat::bindsource2 - -proc compat::bindsource3 {window type script priority} { - return [bindsource2 $window $type $script] -};# compat::bindsource3 - -# ---------------------------------------------------------------------------- -# Command compat::cleartarget -# ---------------------------------------------------------------------------- -proc compat::cleartarget {window} { -};# compat::cleartarget - -# ---------------------------------------------------------------------------- -# Command compat::clearsource -# ---------------------------------------------------------------------------- -proc compat::clearsource {window} { -};# compat::clearsource diff --git a/tkinterdnd2/tkdnd/linux64/tkdnd_generic.tcl b/tkinterdnd2/tkdnd/linux64/tkdnd_generic.tcl deleted file mode 100644 index 698b464..0000000 --- a/tkinterdnd2/tkdnd/linux64/tkdnd_generic.tcl +++ /dev/null @@ -1,520 +0,0 @@ -# -# tkdnd_generic.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval generic { - variable _types {} - variable _typelist {} - variable _codelist {} - variable _actionlist {} - variable _pressedkeys {} - variable _action {} - variable _common_drag_source_types {} - variable _common_drop_target_types {} - variable _drag_source {} - variable _drop_target {} - - variable _last_mouse_root_x 0 - variable _last_mouse_root_y 0 - - variable _tkdnd2platform - variable _platform2tkdnd - - proc debug {msg} { - puts $msg - };# debug - - proc initialise { } { - };# initialise - - proc initialise_platform_to_tkdnd_types { types } { - variable _platform2tkdnd - variable _tkdnd2platform - set _platform2tkdnd [dict create {*}$types] - set _tkdnd2platform [dict create] - foreach type [dict keys $_platform2tkdnd] { - dict lappend _tkdnd2platform [dict get $_platform2tkdnd $type] $type - } - };# initialise_platform_to_tkdnd_types - - proc initialise_tkdnd_to_platform_types { types } { - variable _tkdnd2platform - set _tkdnd2platform [dict create {*}$types] - };# initialise_tkdnd_to_platform_types - -};# namespace generic - -# ---------------------------------------------------------------------------- -# Command generic::HandleEnter -# ---------------------------------------------------------------------------- -proc generic::HandleEnter { drop_target drag_source typelist codelist - actionlist pressedkeys } { - variable _typelist; set _typelist $typelist - variable _pressedkeys; set _pressedkeys $pressedkeys - variable _action; set _action refuse_drop - variable _common_drag_source_types; set _common_drag_source_types {} - variable _common_drop_target_types; set _common_drop_target_types {} - variable _actionlist - variable _drag_source; set _drag_source $drag_source - variable _drop_target; set _drop_target {} - variable _actionlist; set _actionlist $actionlist - variable _codelist set _codelist $codelist - - variable _last_mouse_root_x; set _last_mouse_root_x 0 - variable _last_mouse_root_y; set _last_mouse_root_y 0 - # debug "\n===============================================================" - # debug "generic::HandleEnter: drop_target=$drop_target,\ - # drag_source=$drag_source,\ - # typelist=$typelist" - # debug "generic::HandleEnter: ACTION: default" - return default -};# generic::HandleEnter - -# ---------------------------------------------------------------------------- -# Command generic::HandlePosition -# ---------------------------------------------------------------------------- -proc generic::HandlePosition { drop_target drag_source pressedkeys - rootX rootY { time 0 } } { - variable _types - variable _typelist - variable _codelist - variable _actionlist - variable _pressedkeys - variable _action - variable _common_drag_source_types - variable _common_drop_target_types - variable _drag_source - variable _drop_target - - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - - # debug "generic::HandlePosition: drop_target=$drop_target,\ - # _drop_target=$_drop_target, rootX=$rootX, rootY=$rootY" - - if {![info exists _drag_source] && ![string length $_drag_source]} { - # debug "generic::HandlePosition: no or empty _drag_source:\ - # return refuse_drop" - return refuse_drop - } - - if {$drag_source ne "" && $drag_source ne $_drag_source} { - debug "generic position event from unexpected source: $_drag_source\ - != $drag_source" - return refuse_drop - } - - set _pressedkeys $pressedkeys - - ## Does the new drop target support any of our new types? - # foreach {common_drag_source_types common_drop_target_types} \ - # [GetWindowCommonTypes $drop_target $_typelist] {break} - foreach {drop_target common_drag_source_types common_drop_target_types} \ - [FindWindowWithCommonTypes $drop_target $_typelist] {break} - set data [GetDroppedData $time] - - # debug "\t($_drop_target) -> ($drop_target)" - if {$drop_target != $_drop_target} { - if {[string length $_drop_target]} { - ## Call the <> event. - # debug "\t<> on $_drop_target" - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A \{$_action\} %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D \{\} %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - uplevel \#0 $cmd - } - } - set _drop_target $drop_target - set _action refuse_drop - - if {[llength $common_drag_source_types]} { - set _action [lindex $_actionlist 0] - set _common_drag_source_types $common_drag_source_types - set _common_drop_target_types $common_drop_target_types - ## Drop target supports at least one type. Send a <>. - # puts "<> -> $drop_target" - set cmd [bind $drop_target <>] - if {[string length $cmd]} { - focus $drop_target - set cmd [string map [list %W $drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - } - } - } - - set _drop_target {} - if {[llength $common_drag_source_types]} { - set _common_drag_source_types $common_drag_source_types - set _common_drop_target_types $common_drop_target_types - set _drop_target $drop_target - ## Drop target supports at least one type. Send a <>. - set cmd [bind $drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - } - } - # Return values: copy, move, link, ask, private, refuse_drop, default - # debug "generic::HandlePosition: ACTION: $_action" - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - return $_action -};# generic::HandlePosition - -# ---------------------------------------------------------------------------- -# Command generic::HandleLeave -# ---------------------------------------------------------------------------- -proc generic::HandleLeave { } { - variable _types - variable _typelist - variable _codelist - variable _actionlist - variable _pressedkeys - variable _action - variable _common_drag_source_types - variable _common_drop_target_types - variable _drag_source - variable _drop_target - variable _last_mouse_root_x - variable _last_mouse_root_y - if {![info exists _drop_target]} {set _drop_target {}} - # debug "generic::HandleLeave: _drop_target=$_drop_target" - if {[info exists _drop_target] && [string length $_drop_target]} { - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target \ - %X $_last_mouse_root_x %Y $_last_mouse_root_y \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A \{$_action\} %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D \{\} %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - } - } - foreach var {_types _typelist _actionlist _pressedkeys _action - _common_drag_source_types _common_drop_target_types - _drag_source _drop_target} { - set $var {} - } -};# generic::HandleLeave - -# ---------------------------------------------------------------------------- -# Command generic::HandleDrop -# ---------------------------------------------------------------------------- -proc generic::HandleDrop {drop_target drag_source pressedkeys rootX rootY time } { - variable _types - variable _typelist - variable _codelist - variable _actionlist - variable _pressedkeys - variable _action - variable _common_drag_source_types - variable _common_drop_target_types - variable _drag_source - variable _drop_target - variable _last_mouse_root_x - variable _last_mouse_root_y - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - - set _pressedkeys $pressedkeys - - # puts "generic::HandleDrop: $time" - - if {![info exists _drag_source] && ![string length $_drag_source]} { - return refuse_drop - } - if {![info exists _drop_target] && ![string length $_drop_target]} { - return refuse_drop - } - if {![llength $_common_drag_source_types]} {return refuse_drop} - ## Get the dropped data. - set data [GetDroppedData $time] - ## Try to select the most specific <> event. - foreach type [concat $_common_drag_source_types $_common_drop_target_types] { - set type [platform_independent_type $type] - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - # Return values: copy, move, link, ask, private, refuse_drop - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - return $_action - } - } - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - } - # Return values: copy, move, link, ask, private, refuse_drop - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - return $_action -};# generic::HandleDrop - -# ---------------------------------------------------------------------------- -# Command generic::GetWindowCommonTypes -# ---------------------------------------------------------------------------- -proc generic::GetWindowCommonTypes { win typelist } { - set types [bind $win <>] - # debug ">> Accepted types: $win $_types" - set common_drag_source_types {} - set common_drop_target_types {} - if {[llength $types]} { - ## Examine the drop target types, to find at least one match with the drag - ## source types... - set supported_types [supported_types $typelist] - foreach type $types { - foreach matched [lsearch -glob -all -inline $supported_types $type] { - ## Drop target supports this type. - lappend common_drag_source_types $matched - lappend common_drop_target_types $type - } - } - } - list $common_drag_source_types $common_drop_target_types -};# generic::GetWindowCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::FindWindowWithCommonTypes -# ---------------------------------------------------------------------------- -proc generic::FindWindowWithCommonTypes { win typelist } { - set toplevel [winfo toplevel $win] - while {![string equal $win $toplevel]} { - foreach {common_drag_source_types common_drop_target_types} \ - [GetWindowCommonTypes $win $typelist] {break} - if {[llength $common_drag_source_types]} { - return [list $win $common_drag_source_types $common_drop_target_types] - } - set win [winfo parent $win] - } - ## We have reached the toplevel, which may be also a target (SF Bug #30) - foreach {common_drag_source_types common_drop_target_types} \ - [GetWindowCommonTypes $win $typelist] {break} - if {[llength $common_drag_source_types]} { - return [list $win $common_drag_source_types $common_drop_target_types] - } - return { {} {} {} } -};# generic::FindWindowWithCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::GetDroppedData -# ---------------------------------------------------------------------------- -proc generic::GetDroppedData { time } { - variable _dropped_data - return $_dropped_data -};# generic::GetDroppedData - -# ---------------------------------------------------------------------------- -# Command generic::SetDroppedData -# ---------------------------------------------------------------------------- -proc generic::SetDroppedData { data } { - variable _dropped_data - set _dropped_data $data -};# generic::SetDroppedData - -# ---------------------------------------------------------------------------- -# Command generic::GetDragSource -# ---------------------------------------------------------------------------- -proc generic::GetDragSource { } { - variable _drag_source - return $_drag_source -};# generic::GetDragSource - -# ---------------------------------------------------------------------------- -# Command generic::GetDropTarget -# ---------------------------------------------------------------------------- -proc generic::GetDropTarget { } { - variable _drop_target - return $_drop_target -};# generic::GetDropTarget - -# ---------------------------------------------------------------------------- -# Command generic::GetDragSourceCommonTypes -# ---------------------------------------------------------------------------- -proc generic::GetDragSourceCommonTypes { } { - variable _common_drag_source_types - return $_common_drag_source_types -};# generic::GetDragSourceCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::GetDropTargetCommonTypes -# ---------------------------------------------------------------------------- -proc generic::GetDropTargetCommonTypes { } { - variable _common_drag_source_types - return $_common_drag_source_types -};# generic::GetDropTargetCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::platform_specific_types -# ---------------------------------------------------------------------------- -proc generic::platform_specific_types { types } { - set new_types {} - foreach type $types { - set new_types [concat $new_types [platform_specific_type $type]] - } - return $new_types -}; # generic::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command generic::platform_specific_type -# ---------------------------------------------------------------------------- -proc generic::platform_specific_type { type } { - variable _tkdnd2platform - if {[dict exists $_tkdnd2platform $type]} { - return [dict get $_tkdnd2platform $type] - } - list $type -}; # generic::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - set new_types {} - foreach type $types { - set new_types [concat $new_types [platform_independent_type $type]] - } - return $new_types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command generic::platform_independent_type -# ---------------------------------------------------------------------------- -proc generic::platform_independent_type { type } { - variable _platform2tkdnd - if {[dict exists $_platform2tkdnd $type]} { - return [dict get $_platform2tkdnd $type] - } - return $type -}; # generic::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command generic::supported_types -# ---------------------------------------------------------------------------- -proc generic::supported_types { types } { - set new_types {} - foreach type $types { - if {[supported_type $type]} {lappend new_types $type} - } - return $new_types -}; # generic::supported_types - -# ---------------------------------------------------------------------------- -# Command generic::supported_type -# ---------------------------------------------------------------------------- -proc generic::supported_type { type } { - variable _platform2tkdnd - if {[dict exists $_platform2tkdnd $type]} { - return 1 - } - return 0 -}; # generic::supported_type diff --git a/tkinterdnd2/tkdnd/linux64/tkdnd_macosx.tcl b/tkinterdnd2/tkdnd/linux64/tkdnd_macosx.tcl deleted file mode 100644 index 307f6da..0000000 --- a/tkinterdnd2/tkdnd/linux64/tkdnd_macosx.tcl +++ /dev/null @@ -1,144 +0,0 @@ -# -# tkdnd_macosx.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. - -# This software is copyrighted by: -# Georgios Petasis, Athens, Greece. -# e-mail: petasisg@yahoo.gr, petasis@iit.demokritos.gr -# -# Mac portions (c) 2009 Kevin Walzer/WordTech Communications LLC, -# kw@codebykevin.com -# -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -#basic API for Mac Drag and Drop - -#two data types supported: strings and file paths - -#two commands at C level: ::tkdnd::macdnd::registerdragwidget, ::tkdnd::macdnd::unregisterdragwidget - -#data retrieval mechanism: text or file paths are copied from drag clipboard to system clipboard and retrieved via [clipboard get]; array of file paths is converted to single tab-separated string, can be split into Tcl list - -if {[tk windowingsystem] eq "aqua" && "AppKit" ni [winfo server .]} { - error {TkAqua Cocoa required} -} - -namespace eval macdnd { - - proc initialise { } { - ## Mapping from platform types to TkDND types... - ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \ - NSPasteboardTypeString DND_Text \ - NSFilenamesPboardType DND_Files \ - NSPasteboardTypeHTML DND_HTML \ - ] - };# initialise - -};# namespace macdnd - -# ---------------------------------------------------------------------------- -# Command macdnd::HandleEnter -# ---------------------------------------------------------------------------- -proc macdnd::HandleEnter { path drag_source typelist { data {} } } { - variable _pressedkeys - variable _actionlist - set _pressedkeys 1 - set _actionlist { copy move link ask private } - ::tkdnd::generic::SetDroppedData $data - ::tkdnd::generic::HandleEnter $path $drag_source $typelist $typelist \ - $_actionlist $_pressedkeys -};# macdnd::HandleEnter - -# ---------------------------------------------------------------------------- -# Command macdnd::HandlePosition -# ---------------------------------------------------------------------------- -proc macdnd::HandlePosition { drop_target rootX rootY {drag_source {}} } { - variable _pressedkeys - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - ::tkdnd::generic::HandlePosition $drop_target $drag_source \ - $_pressedkeys $rootX $rootY -};# macdnd::HandlePosition - -# ---------------------------------------------------------------------------- -# Command macdnd::HandleLeave -# ---------------------------------------------------------------------------- -proc macdnd::HandleLeave { args } { - ::tkdnd::generic::HandleLeave -};# macdnd::HandleLeave - -# ---------------------------------------------------------------------------- -# Command macdnd::HandleDrop -# ---------------------------------------------------------------------------- -proc macdnd::HandleDrop { drop_target data args } { - variable _pressedkeys - variable _last_mouse_root_x - variable _last_mouse_root_y - ## Get the dropped data... - ::tkdnd::generic::SetDroppedData $data - ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \ - $_last_mouse_root_x $_last_mouse_root_y 0 -};# macdnd::HandleDrop - -# ---------------------------------------------------------------------------- -# Command macdnd::GetDragSourceCommonTypes -# ---------------------------------------------------------------------------- -proc macdnd::GetDragSourceCommonTypes { } { - ::tkdnd::generic::GetDragSourceCommonTypes -};# macdnd::GetDragSourceCommonTypes - -# ---------------------------------------------------------------------------- -# Command macdnd::platform_specific_types -# ---------------------------------------------------------------------------- -proc macdnd::platform_specific_types { types } { - ::tkdnd::generic::platform_specific_types $types -}; # macdnd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command macdnd::platform_specific_type -# ---------------------------------------------------------------------------- -proc macdnd::platform_specific_type { type } { - ::tkdnd::generic::platform_specific_type $type -}; # macdnd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - ::tkdnd::generic::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command macdnd::platform_independent_type -# ---------------------------------------------------------------------------- -proc macdnd::platform_independent_type { type } { - ::tkdnd::generic::platform_independent_type $type -}; # macdnd::platform_independent_type diff --git a/tkinterdnd2/tkdnd/linux64/tkdnd_unix.tcl b/tkinterdnd2/tkdnd/linux64/tkdnd_unix.tcl deleted file mode 100644 index 56d17c4..0000000 --- a/tkinterdnd2/tkdnd/linux64/tkdnd_unix.tcl +++ /dev/null @@ -1,810 +0,0 @@ -# -# tkdnd_unix.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval xdnd { - variable _dragging 0 - - proc initialise { } { - ## Mapping from platform types to TkDND types... - ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \ - text/plain\;charset=utf-8 DND_Text \ - UTF8_STRING DND_Text \ - text/plain DND_Text \ - STRING DND_Text \ - TEXT DND_Text \ - COMPOUND_TEXT DND_Text \ - text/uri-list DND_Files \ - text/html\;charset=utf-8 DND_HTML \ - text/html DND_HTML \ - application/x-color DND_Color \ - ] - };# initialise - -};# namespace xdnd - -# ---------------------------------------------------------------------------- -# Command xdnd::HandleXdndEnter -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndEnter { path drag_source typelist time { data {} } } { - variable _pressedkeys - variable _actionlist - variable _typelist - set _pressedkeys 1 - set _actionlist { copy move link ask private } - set _typelist $typelist - # puts "xdnd::HandleXdndEnter: $time" - ::tkdnd::generic::SetDroppedData $data - ::tkdnd::generic::HandleEnter $path $drag_source $typelist $typelist \ - $_actionlist $_pressedkeys -};# xdnd::HandleXdndEnter - -# ---------------------------------------------------------------------------- -# Command xdnd::HandleXdndPosition -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndPosition { drop_target rootX rootY time {drag_source {}} } { - variable _pressedkeys - variable _typelist - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - # puts "xdnd::HandleXdndPosition: $time" - ## Get the dropped data... - catch { - ::tkdnd::generic::SetDroppedData [GetPositionData $drop_target $_typelist $time] - } - ::tkdnd::generic::HandlePosition $drop_target $drag_source \ - $_pressedkeys $rootX $rootY -};# xdnd::HandleXdndPosition - -# ---------------------------------------------------------------------------- -# Command xdnd::HandleXdndLeave -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndLeave { } { - ::tkdnd::generic::HandleLeave -};# xdnd::HandleXdndLeave - -# ---------------------------------------------------------------------------- -# Command xdnd::_HandleXdndDrop -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndDrop { time } { - variable _pressedkeys - variable _last_mouse_root_x - variable _last_mouse_root_y - ## Get the dropped data... - ::tkdnd::generic::SetDroppedData [GetDroppedData \ - [::tkdnd::generic::GetDragSource] [::tkdnd::generic::GetDropTarget] \ - [::tkdnd::generic::GetDragSourceCommonTypes] $time] - ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \ - $_last_mouse_root_x $_last_mouse_root_y $time -};# xdnd::HandleXdndDrop - -# ---------------------------------------------------------------------------- -# Command xdnd::GetPositionData -# ---------------------------------------------------------------------------- -proc xdnd::GetPositionData { drop_target typelist time } { - foreach {drop_target common_drag_source_types common_drop_target_types} \ - [::tkdnd::generic::FindWindowWithCommonTypes $drop_target $typelist] {break} - GetDroppedData [::tkdnd::generic::GetDragSource] $drop_target \ - $common_drag_source_types $time -};# xdnd::GetPositionData - -# ---------------------------------------------------------------------------- -# Command xdnd::GetDroppedData -# ---------------------------------------------------------------------------- -proc xdnd::GetDroppedData { _drag_source _drop_target _common_drag_source_types time } { - if {![llength $_common_drag_source_types]} { - error "no common data types between the drag source and drop target widgets" - } - ## Is drag source in this application? - if {[catch {winfo pathname -displayof $_drop_target $_drag_source} p]} { - set _use_tk_selection 0 - } else { - set _use_tk_selection 1 - } - foreach type $_common_drag_source_types { - # puts "TYPE: $type ($_drop_target)" - # _get_selection $_drop_target $time $type - if {$_use_tk_selection} { - if {![catch { - selection get -displayof $_drop_target -selection XdndSelection \ - -type $type - } result options]} { - return [normalise_data $type $result] - } - } else { - # puts "_selection_get -displayof $_drop_target -selection XdndSelection \ - # -type $type -time $time" - #after 100 [list focus -force $_drop_target] - #after 50 [list raise [winfo toplevel $_drop_target]] - if {![catch { - _selection_get -displayof $_drop_target -selection XdndSelection \ - -type $type -time $time - } result options]} { - return [normalise_data $type $result] - } - } - } - return -options $options $result -};# xdnd::GetDroppedData - -# ---------------------------------------------------------------------------- -# Command xdnd::platform_specific_types -# ---------------------------------------------------------------------------- -proc xdnd::platform_specific_types { types } { - ::tkdnd::generic::platform_specific_types $types -}; # xdnd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command xdnd::platform_specific_type -# ---------------------------------------------------------------------------- -proc xdnd::platform_specific_type { type } { - ::tkdnd::generic::platform_specific_type $type -}; # xdnd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - ::tkdnd::generic::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command xdnd::platform_independent_type -# ---------------------------------------------------------------------------- -proc xdnd::platform_independent_type { type } { - ::tkdnd::generic::platform_independent_type $type -}; # xdnd::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command xdnd::_normalise_data -# ---------------------------------------------------------------------------- -proc xdnd::normalise_data { type data } { - # Tk knows how to interpret the following types: - # STRING, TEXT, COMPOUND_TEXT - # UTF8_STRING - # Else, it returns a list of 8 or 32 bit numbers... - switch -glob $type { - STRING - UTF8_STRING - TEXT - COMPOUND_TEXT {return $data} - text/html { - if {[catch { - encoding convertfrom unicode $data - } string]} { - set string $data - } - return [string map {\r\n \n} $string] - } - text/html\;charset=utf-8 - - text/plain\;charset=utf-8 - - text/plain { - if {[catch { - encoding convertfrom utf-8 [tkdnd::bytes_to_string $data] - } string]} { - set string $data - } - return [string map {\r\n \n} $string] - } - text/uri-list* { - if {[catch { - encoding convertfrom utf-8 [tkdnd::bytes_to_string $data] - } string]} { - set string $data - } - ## Get rid of \r\n - set string [string trim [string map {\r\n \n} $string]] - set files {} - foreach quoted_file [split $string] { - set file [tkdnd::urn_unquote $quoted_file] - switch -glob $file { - \#* {} - file://* {lappend files [string range $file 7 end]} - ftp://* - - https://* - - http://* {lappend files $quoted_file} - default {lappend files $file} - } - } - return $files - } - application/x-color { - return $data - } - text/x-moz-url - - application/q-iconlist - - default {return $data} - } -}; # xdnd::normalise_data - -############################################################################# -## -## XDND drag implementation -## -############################################################################# - -# ---------------------------------------------------------------------------- -# Command xdnd::_selection_ownership_lost -# ---------------------------------------------------------------------------- -proc xdnd::_selection_ownership_lost {} { - variable _dragging - set _dragging 0 -};# _selection_ownership_lost - -# ---------------------------------------------------------------------------- -# Command xdnd::_dodragdrop -# ---------------------------------------------------------------------------- -proc xdnd::_dodragdrop { source actions types data button } { - variable _dragging - - # puts "xdnd::_dodragdrop: source: $source, actions: $actions, types: $types,\ - # data: \"$data\", button: $button" - if {$_dragging} { - ## We are in the middle of another drag operation... - error "another drag operation in progress" - } - - variable _dodragdrop_drag_source $source - variable _dodragdrop_drop_target 0 - variable _dodragdrop_drop_target_proxy 0 - variable _dodragdrop_actions $actions - variable _dodragdrop_action_descriptions $actions - variable _dodragdrop_actions_len [llength $actions] - variable _dodragdrop_types $types - variable _dodragdrop_types_len [llength $types] - variable _dodragdrop_data $data - variable _dodragdrop_transfer_data {} - variable _dodragdrop_button $button - variable _dodragdrop_time 0 - variable _dodragdrop_default_action refuse_drop - variable _dodragdrop_waiting_status 0 - variable _dodragdrop_drop_target_accepts_drop 0 - variable _dodragdrop_drop_target_accepts_action refuse_drop - variable _dodragdrop_current_cursor $_dodragdrop_default_action - variable _dodragdrop_drop_occured 0 - variable _dodragdrop_selection_requestor 0 - - ## - ## If we have more than 3 types, the property XdndTypeList must be set on - ## the drag source widget... - ## - if {$_dodragdrop_types_len > 3} { - _announce_type_list $_dodragdrop_drag_source $_dodragdrop_types - } - - ## - ## Announce the actions & their descriptions on the XdndActionList & - ## XdndActionDescription properties... - ## - _announce_action_list $_dodragdrop_drag_source $_dodragdrop_actions \ - $_dodragdrop_action_descriptions - - ## - ## Arrange selection handlers for our drag source, and all the supported types - ## - registerSelectionHandler $source $types - - ## - ## Step 1: When a drag begins, the source takes ownership of XdndSelection. - ## - selection own -command ::tkdnd::xdnd::_selection_ownership_lost \ - -selection XdndSelection $source - set _dragging 1 - - ## Grab the mouse pointer... - _grab_pointer $source $_dodragdrop_default_action - - ## Register our generic event handler... - # The generic event callback will report events by modifying variable - # ::xdnd::_dodragdrop_event: a dict with event information will be set as - # the value of the variable... - _register_generic_event_handler - - ## Set a timeout for debugging purposes... - # after 60000 {set ::tkdnd::xdnd::_dragging 0} - - tkwait variable ::tkdnd::xdnd::_dragging - _SendXdndLeave - - set _dragging 0 - _ungrab_pointer $source - _unregister_generic_event_handler - catch {selection clear -selection XdndSelection} - unregisterSelectionHandler $source $types - return $_dodragdrop_drop_target_accepts_action -};# xdnd::_dodragdrop - -# ---------------------------------------------------------------------------- -# Command xdnd::_process_drag_events -# ---------------------------------------------------------------------------- -proc xdnd::_process_drag_events {event} { - # The return value from proc is normally 0. A non-zero return value indicates - # that the event is not to be handled further; that is, proc has done all - # processing that is to be allowed for the event - variable _dragging - if {!$_dragging} {return 0} - # puts $event - - variable _dodragdrop_time - set time [dict get $event time] - set type [dict get $event type] - if {$time < $_dodragdrop_time && ![string equal $type SelectionRequest]} { - return 0 - } - set _dodragdrop_time $time - - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_default_action - switch $type { - MotionNotify { - set rootx [dict get $event x_root] - set rooty [dict get $event y_root] - set window [_find_drop_target_window $_dodragdrop_drag_source \ - $rootx $rooty] - if {[string length $window]} { - ## Examine the modifiers to suggest an action... - set _dodragdrop_default_action [_default_action $event] - ## Is it a Tk widget? - # set path [winfo containing $rootx $rooty] - # puts "Window under mouse: $window ($path)" - if {$_dodragdrop_drop_target != $window} { - ## Send XdndLeave to $_dodragdrop_drop_target - _SendXdndLeave - ## Is there a proxy? If not, _find_drop_target_proxy returns the - ## target window, so we always get a valid "proxy". - set proxy [_find_drop_target_proxy $_dodragdrop_drag_source $window] - ## Send XdndEnter to $window - _SendXdndEnter $window $proxy - ## Send XdndPosition to $_dodragdrop_drop_target - _SendXdndPosition $rootx $rooty $_dodragdrop_default_action - } else { - ## Send XdndPosition to $_dodragdrop_drop_target - _SendXdndPosition $rootx $rooty $_dodragdrop_default_action - } - } else { - ## No window under the mouse. Send XdndLeave to $_dodragdrop_drop_target - _SendXdndLeave - } - } - ButtonPress { - } - ButtonRelease { - variable _dodragdrop_button - set button [dict get $event button] - if {$button == $_dodragdrop_button} { - ## The button that initiated the drag was released. Trigger drop... - _SendXdndDrop - } - return 1 - } - KeyPress { - } - KeyRelease { - set keysym [dict get $event keysym] - switch $keysym { - Escape { - ## The user has pressed escape. Abort... - if {$_dragging} {set _dragging 0} - } - } - } - SelectionRequest { - variable _dodragdrop_selection_requestor - variable _dodragdrop_selection_property - variable _dodragdrop_selection_selection - variable _dodragdrop_selection_target - variable _dodragdrop_selection_time - set _dodragdrop_selection_requestor [dict get $event requestor] - set _dodragdrop_selection_property [dict get $event property] - set _dodragdrop_selection_selection [dict get $event selection] - set _dodragdrop_selection_target [dict get $event target] - set _dodragdrop_selection_time $time - return 0 - } - default { - return 0 - } - } - return 0 -};# _process_drag_events - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndEnter -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndEnter {window proxy} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_types - variable _dodragdrop_waiting_status - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_target > 0} _SendXdndLeave - if {$_dodragdrop_drop_occured} return - set _dodragdrop_drop_target $window - set _dodragdrop_drop_target_proxy $proxy - set _dodragdrop_waiting_status 0 - if {$_dodragdrop_drop_target < 1} return - # puts "XdndEnter: $_dodragdrop_drop_target $_dodragdrop_drop_target_proxy" - _send_XdndEnter $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy $_dodragdrop_types -};# xdnd::_SendXdndEnter - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndPosition -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndPosition {rootx rooty action} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - if {$_dodragdrop_drop_target < 1} return - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} return - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_waiting_status - ## Arrange a new XdndPosition, to be send periodically... - variable _dodragdrop_xdnd_position_heartbeat - catch {after cancel $_dodragdrop_xdnd_position_heartbeat} - set _dodragdrop_xdnd_position_heartbeat [after 200 \ - [list ::tkdnd::xdnd::_SendXdndPosition $rootx $rooty $action]] - if {$_dodragdrop_waiting_status} {return} - # puts "XdndPosition: $_dodragdrop_drop_target $rootx $rooty $action" - _send_XdndPosition $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy $rootx $rooty $action - set _dodragdrop_waiting_status 1 -};# xdnd::_SendXdndPosition - -# ---------------------------------------------------------------------------- -# Command xdnd::_HandleXdndStatus -# ---------------------------------------------------------------------------- -proc xdnd::_HandleXdndStatus {event} { - variable _dodragdrop_drop_target - variable _dodragdrop_waiting_status - - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - set _dodragdrop_waiting_status 0 - foreach key {target accept want_position action x y w h} { - set $key [dict get $event $key] - } - set _dodragdrop_drop_target_accepts_drop $accept - set _dodragdrop_drop_target_accepts_action $action - if {$_dodragdrop_drop_target < 1} return - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} return - _update_cursor - # puts "XdndStatus: $event" -};# xdnd::_HandleXdndStatus - -# ---------------------------------------------------------------------------- -# Command xdnd::_HandleXdndFinished -# ---------------------------------------------------------------------------- -proc xdnd::_HandleXdndFinished {event} { - variable _dodragdrop_xdnd_finished_event_after_id - catch {after cancel $_dodragdrop_xdnd_finished_event_after_id} - set _dodragdrop_xdnd_finished_event_after_id {} - variable _dodragdrop_drop_target - set _dodragdrop_drop_target 0 - variable _dragging - if {$_dragging} {set _dragging 0} - - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - if {[dict size $event]} { - foreach key {target accept action} { - set $key [dict get $event $key] - } - set _dodragdrop_drop_target_accepts_drop $accept - set _dodragdrop_drop_target_accepts_action $action - } else { - set _dodragdrop_drop_target_accepts_drop 0 - } - if {!$_dodragdrop_drop_target_accepts_drop} { - set _dodragdrop_drop_target_accepts_action refuse_drop - } - # puts "XdndFinished: $event" -};# xdnd::_HandleXdndFinished - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndLeave -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndLeave {} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - if {$_dodragdrop_drop_target < 1} return - variable _dodragdrop_drop_target_proxy - # puts "XdndLeave: $_dodragdrop_drop_target" - _send_XdndLeave $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy - set _dodragdrop_drop_target 0 - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - set _dodragdrop_drop_target_accepts_drop 0 - set _dodragdrop_drop_target_accepts_action refuse_drop - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} return - _update_cursor -};# xdnd::_SendXdndLeave - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndDrop -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndDrop {} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - if {$_dodragdrop_drop_target < 1} { - ## The mouse has been released over a widget that does not accept drops. - _HandleXdndFinished {} - return - } - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} {return} - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - - set _dodragdrop_drop_occured 1 - _update_cursor clock - - if {!$_dodragdrop_drop_target_accepts_drop} { - _SendXdndLeave - _HandleXdndFinished {} - return - } - # puts "XdndDrop: $_dodragdrop_drop_target" - variable _dodragdrop_drop_timestamp - set _dodragdrop_drop_timestamp [_send_XdndDrop \ - $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy] - set _dodragdrop_drop_target 0 - # puts "XdndDrop: $_dodragdrop_drop_target" - ## Arrange a timeout for receiving XdndFinished... - variable _dodragdrop_xdnd_finished_event_after_id - set _dodragdrop_xdnd_finished_event_after_id \ - [after 10000 [list ::tkdnd::xdnd::_HandleXdndFinished {}]] -};# xdnd::_SendXdndDrop - -# ---------------------------------------------------------------------------- -# Command xdnd::_update_cursor -# ---------------------------------------------------------------------------- -proc xdnd::_update_cursor { {cursor {}}} { - # puts "_update_cursor $cursor" - variable _dodragdrop_current_cursor - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - - if {![string length $cursor]} { - set cursor refuse_drop - if {$_dodragdrop_drop_target_accepts_drop} { - set cursor $_dodragdrop_drop_target_accepts_action - } - } - if {![string equal $cursor $_dodragdrop_current_cursor]} { - _set_pointer_cursor $_dodragdrop_drag_source $cursor - set _dodragdrop_current_cursor $cursor - } -};# xdnd::_update_cursor - -# ---------------------------------------------------------------------------- -# Command xdnd::_default_action -# ---------------------------------------------------------------------------- -proc xdnd::_default_action {event} { - variable _dodragdrop_actions - variable _dodragdrop_actions_len - if {$_dodragdrop_actions_len == 1} {return [lindex $_dodragdrop_actions 0]} - - set alt [dict get $event Alt] - set shift [dict get $event Shift] - set control [dict get $event Control] - - if {$shift && $control && [lsearch $_dodragdrop_actions link] != -1} { - return link - } elseif {$control && [lsearch $_dodragdrop_actions copy] != -1} { - return copy - } elseif {$shift && [lsearch $_dodragdrop_actions move] != -1} { - return move - } elseif {$alt && [lsearch $_dodragdrop_actions link] != -1} { - return link - } - return default -};# xdnd::_default_action - -# ---------------------------------------------------------------------------- -# Command xdnd::getFormatForType -# ---------------------------------------------------------------------------- -proc xdnd::getFormatForType {type} { - switch -glob [string tolower $type] { - text/plain\;charset=utf-8 - - text/html\;charset=utf-8 - - utf8_string {set format UTF8_STRING} - text/html - - text/plain - - string - - text - - compound_text {set format STRING} - text/uri-list* {set format UTF8_STRING} - application/x-color {set format $type} - default {set format $type} - } - return $format -};# xdnd::getFormatForType - -# ---------------------------------------------------------------------------- -# Command xdnd::registerSelectionHandler -# ---------------------------------------------------------------------------- -proc xdnd::registerSelectionHandler {source types} { - foreach type $types { - selection handle -selection XdndSelection \ - -type $type \ - -format [getFormatForType $type] \ - $source [list ::tkdnd::xdnd::_SendData $type] - } -};# xdnd::registerSelectionHandler - -# ---------------------------------------------------------------------------- -# Command xdnd::unregisterSelectionHandler -# ---------------------------------------------------------------------------- -proc xdnd::unregisterSelectionHandler {source types} { - foreach type $types { - catch { - selection handle -selection XdndSelection \ - -type $type \ - -format [getFormatForType $type] \ - $source {} - } - } -};# xdnd::unregisterSelectionHandler - -# ---------------------------------------------------------------------------- -# Command xdnd::_convert_to_unsigned -# ---------------------------------------------------------------------------- -proc xdnd::_convert_to_unsigned {data format} { - switch $format { - 8 { set mask 0xff } - 16 { set mask 0xffff } - 32 { set mask 0xffffff } - default {error "unsupported format $format"} - } - ## Convert signed integer into unsigned... - set d [list] - foreach num $data { - lappend d [expr { $num & $mask }] - } - return $d -};# xdnd::_convert_to_unsigned - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendData -# ---------------------------------------------------------------------------- -proc xdnd::_SendData {type offset bytes args} { - variable _dodragdrop_drag_source - variable _dodragdrop_types - variable _dodragdrop_data - variable _dodragdrop_transfer_data - - ## The variable _dodragdrop_data contains a list of data, one for each - ## type in the _dodragdrop_types variable. We have to search types, and find - ## the corresponding entry in the _dodragdrop_data list. - set index [lsearch $_dodragdrop_types $type] - if {$index < 0} { - error "unable to locate data suitable for type \"$type\"" - } - set typed_data [lindex $_dodragdrop_data $index] - set format 8 - if {$offset == 0} { - ## Prepare the data to be transferred... - switch -glob $type { - text/plain* - UTF8_STRING - STRING - TEXT - COMPOUND_TEXT { - binary scan [encoding convertto utf-8 $typed_data] \ - c* _dodragdrop_transfer_data - set _dodragdrop_transfer_data \ - [_convert_to_unsigned $_dodragdrop_transfer_data $format] - } - text/uri-list* { - set files [list] - foreach file $typed_data { - switch -glob $file { - *://* {lappend files $file} - default {lappend files file://$file} - } - } - binary scan [encoding convertto utf-8 "[join $files \r\n]\r\n"] \ - c* _dodragdrop_transfer_data - set _dodragdrop_transfer_data \ - [_convert_to_unsigned $_dodragdrop_transfer_data $format] - } - application/x-color { - set format 16 - ## Try to understand the provided data: we accept a standard Tk colour, - ## or a list of 3 values (red green blue) or a list of 4 values - ## (red green blue opacity). - switch [llength $typed_data] { - 1 { set color [winfo rgb $_dodragdrop_drag_source $typed_data] - lappend color 65535 } - 3 { set color $typed_data; lappend color 65535 } - 4 { set color $typed_data } - default {error "unknown color data: \"$typed_data\""} - } - ## Convert the 4 elements into 16 bit values... - set _dodragdrop_transfer_data [list] - foreach c $color { - lappend _dodragdrop_transfer_data [format 0x%04X $c] - } - } - default { - set format 32 - binary scan $typed_data c* _dodragdrop_transfer_data - } - } - } - - ## - ## Data has been split into bytes. Count the bytes requested, and return them - ## - set data [lrange $_dodragdrop_transfer_data $offset [expr {$offset+$bytes-1}]] - switch $format { - 8 { - set data [encoding convertfrom utf-8 [binary format c* $data]] - } - 16 { - variable _dodragdrop_selection_requestor - if {$_dodragdrop_selection_requestor} { - ## Tk selection cannot process this format (only 8 & 32 supported). - ## Call our XChangeProperty... - set numItems [llength $data] - variable _dodragdrop_selection_property - variable _dodragdrop_selection_selection - variable _dodragdrop_selection_target - variable _dodragdrop_selection_time - XChangeProperty $_dodragdrop_drag_source \ - $_dodragdrop_selection_requestor \ - $_dodragdrop_selection_property \ - $_dodragdrop_selection_target \ - $format \ - $_dodragdrop_selection_time \ - $data $numItems - return -code break - } - } - 32 { - } - default { - error "unsupported format $format" - } - } - # puts "SendData: $type $offset $bytes $args ($typed_data)" - # puts " $data" - return $data -};# xdnd::_SendData diff --git a/tkinterdnd2/tkdnd/linux64/tkdnd_utils.tcl b/tkinterdnd2/tkdnd/linux64/tkdnd_utils.tcl deleted file mode 100644 index ee961dd..0000000 --- a/tkinterdnd2/tkdnd/linux64/tkdnd_utils.tcl +++ /dev/null @@ -1,252 +0,0 @@ -# -# tkdnd_utils.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -package require tkdnd -namespace eval ::tkdnd { - namespace eval utils { - };# namespace ::tkdnd::utils - namespace eval text { - variable _drag_tag tkdnd::drag::selection::tag - variable _state {} - variable _drag_source_widget {} - variable _drop_target_widget {} - variable _now_dragging 0 - };# namespace ::tkdnd::text -};# namespace ::tkdnd - -bind TkDND_Drag_Text1 {tkdnd::text::_begin_drag clear 1 %W %s %X %Y %x %y} -bind TkDND_Drag_Text1 {tkdnd::text::_begin_drag motion 1 %W %s %X %Y %x %y} -bind TkDND_Drag_Text1 {tkdnd::text::_TextAutoScan %W %x %y} -bind TkDND_Drag_Text1 {tkdnd::text::_begin_drag reset 1 %W %s %X %Y %x %y} -bind TkDND_Drag_Text2 {tkdnd::text::_begin_drag clear 2 %W %s %X %Y %x %y} -bind TkDND_Drag_Text2 {tkdnd::text::_begin_drag motion 2 %W %s %X %Y %x %y} -bind TkDND_Drag_Text2 {tkdnd::text::_begin_drag reset 2 %W %s %X %Y %x %y} -bind TkDND_Drag_Text3 {tkdnd::text::_begin_drag clear 3 %W %s %X %Y %x %y} -bind TkDND_Drag_Text3 {tkdnd::text::_begin_drag motion 3 %W %s %X %Y %x %y} -bind TkDND_Drag_Text3 {tkdnd::text::_begin_drag reset 3 %W %s %X %Y %x %y} - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::drag_source -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::drag_source { mode path { types DND_Text } { event 1 } { tagprefix TkDND_Drag_Text } { tag sel } } { - switch -exact -- $mode { - register { - $path tag bind $tag \ - "tkdnd::text::_begin_drag press ${event} %W %s %X %Y %x %y" - ## Set a binding to the widget, to put selection as data... - bind $path <> "::tkdnd::text::DragInitCmd $path {%t} $tag" - ## Set a binding to the widget, to remove selection if action is move... - bind $path <> "::tkdnd::text::DragEndCmd $path %A $tag" - } - unregister { - $path tag bind $tag {} - bind $path <> {} - bind $path <> {} - } - } - ::tkdnd::drag_source $mode $path $types $event $tagprefix -};# ::tkdnd::text::drag_source - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::drop_target -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::drop_target { mode path { types DND_Text } } { - switch -exact -- $mode { - register { - bind $path <> "::tkdnd::text::DropPosition $path %X %Y %A %a %m" - bind $path <> "::tkdnd::text::Drop $path %D %X %Y %A %a %m" - } - unregister { - bind $path <> {} - bind $path <> {} - bind $path <> {} - bind $path <> {} - } - } - ::tkdnd::drop_target $mode $path $types -};# ::tkdnd::text::drop_target - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::DragInitCmd -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::DragInitCmd { path { types DND_Text } { tag sel } { actions { copy move } } } { - ## Save the selection indices... - variable _drag_source_widget - variable _drop_target_widget - set _drag_source_widget $path - set _drop_target_widget {} - _save_selection $path $tag - list $actions $types [$path get $tag.first $tag.last] -};# ::tkdnd::text::DragInitCmd - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::DragEndCmd -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::DragEndCmd { path action { tag sel } } { - variable _drag_source_widget - variable _drop_target_widget - set _drag_source_widget {} - set _drop_target_widget {} - _restore_selection $path $tag - switch -exact -- $action { - move { - ## Delete the original selected text... - variable _selection_first - variable _selection_last - $path delete $_selection_first $_selection_last - } - } -};# ::tkdnd::text::DragEndCmd - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::DropPosition -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::DropPosition { path X Y action actions keys} { - variable _drag_source_widget - variable _drop_target_widget - set _drop_target_widget $path - ## This check is primitive, a more accurate one is needed! - if {$path eq $_drag_source_widget} { - ## This is a drag within the same widget! Set action to move... - if {"move" in $actions} {set action move} - } - incr X -[winfo rootx $path] - incr Y -[winfo rooty $path] - $path mark set insert @$X,$Y; update - return $action -};# ::tkdnd::text::DropPosition - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::Drop -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::Drop { path data X Y action actions keys } { - incr X -[winfo rootx $path] - incr Y -[winfo rooty $path] - $path mark set insert @$X,$Y - $path insert [$path index insert] $data - return $action -};# ::tkdnd::text::Drop - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::_save_selection -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::_save_selection { path tag} { - variable _drag_tag - variable _selection_first - variable _selection_last - variable _selection_tag $tag - set _selection_first [$path index $tag.first] - set _selection_last [$path index $tag.last] - $path tag add $_drag_tag $_selection_first $_selection_last - $path tag configure $_drag_tag \ - -background [$path tag cget $tag -background] \ - -foreground [$path tag cget $tag -foreground] -};# tkdnd::text::_save_selection - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::_restore_selection -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::_restore_selection { path tag} { - variable _drag_tag - variable _selection_first - variable _selection_last - $path tag delete $_drag_tag - $path tag remove $tag 0.0 end - #$path tag add $tag $_selection_first $_selection_last -};# tkdnd::text::_restore_selection - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::_begin_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::_begin_drag { event button source state X Y x y } { - variable _drop_target_widget - variable _state - # puts "::tkdnd::text::_begin_drag $event $button $source $state $X $Y $x $y" - - switch -exact -- $event { - clear { - switch -exact -- $_state { - press { - ## Do not execute other bindings, as they will erase selection... - return -code break - } - } - set _state clear - } - motion { - variable _now_dragging - if {$_now_dragging} {return -code break} - if { [string equal $_state "press"] } { - variable _x0; variable _y0 - if { abs($_x0-$X) > ${::tkdnd::_dx} || abs($_y0-$Y) > ${::tkdnd::_dy} } { - set _state "done" - set _drop_target_widget {} - set _now_dragging 1 - set code [catch { - ::tkdnd::_init_drag $button $source $state $X $Y $x $y - } info options] - set _drop_target_widget {} - set _now_dragging 0 - if {$code != 0} { - ## Something strange occurred... - return -options $options $info - } - } - return -code break - } - set _state clear - } - press { - variable _x0; variable _y0 - set _x0 $X - set _y0 $Y - set _state "press" - } - reset { - set _state {} - } - } - if {$source eq $_drop_target_widget} {return -code break} - return -code continue -};# tkdnd::text::_begin_drag - -proc tkdnd::text::_TextAutoScan {w x y} { - variable _now_dragging - if {$_now_dragging} {return -code break} - return -code continue -};# tkdnd::text::_TextAutoScan diff --git a/tkinterdnd2/tkdnd/linux64/tkdnd_windows.tcl b/tkinterdnd2/tkdnd/linux64/tkdnd_windows.tcl deleted file mode 100644 index a1d01f3..0000000 --- a/tkinterdnd2/tkdnd/linux64/tkdnd_windows.tcl +++ /dev/null @@ -1,167 +0,0 @@ -# -# tkdnd_windows.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval olednd { - - proc initialise { } { - ## Mapping from platform types to TkDND types... - ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \ - CF_UNICODETEXT DND_Text \ - CF_TEXT DND_Text \ - CF_HDROP DND_Files \ - UniformResourceLocator DND_URL \ - CF_HTML DND_HTML \ - {HTML Format} DND_HTML \ - CF_RTF DND_RTF \ - CF_RTFTEXT DND_RTF \ - {Rich Text Format} DND_RTF \ - ] - # FileGroupDescriptorW DND_Files \ - # FileGroupDescriptor DND_Files \ - - ## Mapping from TkDND types to platform types... - ::tkdnd::generic::initialise_tkdnd_to_platform_types [list \ - DND_Text {CF_UNICODETEXT CF_TEXT} \ - DND_Files {CF_HDROP} \ - DND_URL {UniformResourceLocator UniformResourceLocatorW} \ - DND_HTML {CF_HTML {HTML Format}} \ - DND_RTF {CF_RTF CF_RTFTEXT {Rich Text Format}} \ - ] - };# initialise - -};# namespace olednd - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDragEnter -# ---------------------------------------------------------------------------- -proc olednd::HandleDragEnter { drop_target typelist actionlist pressedkeys - rootX rootY codelist { data {} } } { - ::tkdnd::generic::SetDroppedData $data - focus $drop_target - ::tkdnd::generic::HandleEnter $drop_target 0 $typelist \ - $codelist $actionlist $pressedkeys - set action [::tkdnd::generic::HandlePosition $drop_target {} \ - $pressedkeys $rootX $rootY] - if {$::tkdnd::_auto_update} {update idletasks} - return $action -};# olednd::HandleDragEnter - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDragOver -# ---------------------------------------------------------------------------- -proc olednd::HandleDragOver { drop_target pressedkeys rootX rootY } { - set action [::tkdnd::generic::HandlePosition $drop_target {} \ - $pressedkeys $rootX $rootY] - if {$::tkdnd::_auto_update} {update idletasks} - return $action -};# olednd::HandleDragOver - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDragLeave -# ---------------------------------------------------------------------------- -proc olednd::HandleDragLeave { drop_target } { - ::tkdnd::generic::HandleLeave - if {$::tkdnd::_auto_update} {update idletasks} -};# olednd::HandleDragLeave - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDrop -# ---------------------------------------------------------------------------- -proc olednd::HandleDrop { drop_target pressedkeys rootX rootY type data } { - ::tkdnd::generic::SetDroppedData [normalise_data $type $data] - set action [::tkdnd::generic::HandleDrop $drop_target {} \ - $pressedkeys $rootX $rootY 0] - if {$::tkdnd::_auto_update} {update idletasks} - return $action -};# olednd::HandleDrop - -# ---------------------------------------------------------------------------- -# Command olednd::GetDataType -# ---------------------------------------------------------------------------- -proc olednd::GetDataType { drop_target typelist } { - foreach {drop_target common_drag_source_types common_drop_target_types} \ - [::tkdnd::generic::FindWindowWithCommonTypes $drop_target $typelist] {break} - lindex $common_drag_source_types 0 -};# olednd::GetDataType - -# ---------------------------------------------------------------------------- -# Command olednd::GetDragSourceCommonTypes -# ---------------------------------------------------------------------------- -proc olednd::GetDragSourceCommonTypes { drop_target } { - ::tkdnd::generic::GetDragSourceCommonTypes -};# olednd::GetDragSourceCommonTypes - -# ---------------------------------------------------------------------------- -# Command olednd::platform_specific_types -# ---------------------------------------------------------------------------- -proc olednd::platform_specific_types { types } { - ::tkdnd::generic::platform_specific_types $types -}; # olednd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command olednd::platform_specific_type -# ---------------------------------------------------------------------------- -proc olednd::platform_specific_type { type } { - ::tkdnd::generic::platform_specific_type $type -}; # olednd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - ::tkdnd::generic::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command olednd::platform_independent_type -# ---------------------------------------------------------------------------- -proc olednd::platform_independent_type { type } { - ::tkdnd::generic::platform_independent_type $type -}; # olednd::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command olednd::normalise_data -# ---------------------------------------------------------------------------- -proc olednd::normalise_data { type data } { - switch [lindex [::tkdnd::generic::platform_independent_type $type] 0] { - DND_Text {return $data} - DND_Files {return $data} - DND_HTML {return [encoding convertfrom utf-8 $data]} - default {return $data} - } -}; # olednd::normalise_data diff --git a/tkinterdnd2/tkdnd/osx64/libtkdnd2.9.2.dylib b/tkinterdnd2/tkdnd/osx64/libtkdnd2.9.2.dylib deleted file mode 100644 index 2f511c423e109f80e7511c768cfb81d16a1cd65a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40176 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 a#5j! {tkdnd::_begin_drag press 1 %W %s %X %Y %x %y} - bind TkDND_Drag1 {tkdnd::_begin_drag motion 1 %W %s %X %Y %x %y} - bind TkDND_Drag2 {tkdnd::_begin_drag press 2 %W %s %X %Y %x %y} - bind TkDND_Drag2 {tkdnd::_begin_drag motion 2 %W %s %X %Y %x %y} - bind TkDND_Drag3 {tkdnd::_begin_drag press 3 %W %s %X %Y %x %y} - bind TkDND_Drag3 {tkdnd::_begin_drag motion 3 %W %s %X %Y %x %y} - - # ---------------------------------------------------------------------------- - # Command tkdnd::initialise: Initialise the TkDND package. - # ---------------------------------------------------------------------------- - proc initialise { dir PKG_LIB_FILE PACKAGE_NAME} { - variable _platform_namespace - variable _drop_file_temp_dir - variable _windowingsystem - global env - - switch [tk windowingsystem] { - x11 { - set _windowingsystem x11 - } - win32 - - windows { - set _windowingsystem windows - } - aqua { - set _windowingsystem aqua - } - default { - error "unknown Tk windowing system" - } - } - - ## Get User's home directory: We try to locate the proper path from a set of - ## environmental variables... - foreach var {HOME HOMEPATH USERPROFILE ALLUSERSPROFILE APPDATA} { - if {[info exists env($var)]} { - if {[file isdirectory $env($var)]} { - set UserHomeDir $env($var) - break - } - } - } - - ## Should use [tk windowingsystem] instead of tcl platform array: - ## OS X returns "unix," but that's not useful because it has its own - ## windowing system, aqua - ## Under windows we have to also combine HOMEDRIVE & HOMEPATH... - if {![info exists UserHomeDir] && - [string equal $_windowingsystem windows] && - [info exists env(HOMEDRIVE)] && [info exists env(HOMEPATH)]} { - if {[file isdirectory $env(HOMEDRIVE)$env(HOMEPATH)]} { - set UserHomeDir $env(HOMEDRIVE)$env(HOMEPATH) - } - } - ## Have we located the needed path? - if {![info exists UserHomeDir]} { - set UserHomeDir [pwd] - } - set UserHomeDir [file normalize $UserHomeDir] - - ## Try to locate a temporary directory... - foreach var {TKDND_TEMP_DIR TEMP TMP} { - if {[info exists env($var)]} { - if {[file isdirectory $env($var)] && [file writable $env($var)]} { - set _drop_file_temp_dir $env($var) - break - } - } - } - if {![info exists _drop_file_temp_dir]} { - foreach _dir [list "$UserHomeDir/Local Settings/Temp" \ - "$UserHomeDir/AppData/Local/Temp" \ - /tmp \ - C:/WINDOWS/Temp C:/Temp C:/tmp \ - D:/WINDOWS/Temp D:/Temp D:/tmp] { - if {[file isdirectory $_dir] && [file writable $_dir]} { - set _drop_file_temp_dir $_dir - break - } - } - } - if {![info exists _drop_file_temp_dir]} { - set _drop_file_temp_dir $UserHomeDir - } - set _drop_file_temp_dir [file native $_drop_file_temp_dir] - - source $dir/tkdnd_generic.tcl - switch $_windowingsystem { - x11 { - source $dir/tkdnd_unix.tcl - set _platform_namespace xdnd - } - win32 - - windows { - source $dir/tkdnd_windows.tcl - set _platform_namespace olednd - } - aqua { - source $dir/tkdnd_macosx.tcl - set _platform_namespace macdnd - } - default { - error "unknown Tk windowing system" - } - } - load $dir/$PKG_LIB_FILE $PACKAGE_NAME - source $dir/tkdnd_compat.tcl - ${_platform_namespace}::initialise - };# initialise - - proc GetDropFileTempDirectory { } { - variable _drop_file_temp_dir - return $_drop_file_temp_dir - } - proc SetDropFileTempDirectory { dir } { - variable _drop_file_temp_dir - set _drop_file_temp_dir $dir - } - -};# namespace ::tkdnd - -# ---------------------------------------------------------------------------- -# Command tkdnd::drag_source -# ---------------------------------------------------------------------------- -proc ::tkdnd::drag_source { mode path { types {} } { event 1 } - { tagprefix TkDND_Drag } } { - set tags [bindtags $path] - set idx [lsearch $tags ${tagprefix}$event] - switch -- $mode { - register { - if { $idx != -1 } { - ## No need to do anything! - # bindtags $path [lreplace $tags $idx $idx ${tagprefix}$event] - } else { - bindtags $path [linsert $tags 1 ${tagprefix}$event] - } - _drag_source_update_types $path $types - } - unregister { - if { $idx != -1 } { - bindtags $path [lreplace $tags $idx $idx] - } - } - } -};# tkdnd::drag_source - -proc ::tkdnd::_drag_source_update_types { path types } { - set types [platform_specific_types $types] - set old_types [bind $path <>] - foreach type $types { - if {[lsearch $old_types $type] < 0} {lappend old_types $type} - } - bind $path <> $old_types -};# ::tkdnd::_drag_source_update_types - -# ---------------------------------------------------------------------------- -# Command tkdnd::drop_target -# ---------------------------------------------------------------------------- -proc ::tkdnd::drop_target { mode path { types {} } } { - variable _windowingsystem - set types [platform_specific_types $types] - switch -- $mode { - register { - switch $_windowingsystem { - x11 { - _register_types $path [winfo toplevel $path] $types - } - win32 - - windows { - _RegisterDragDrop $path - bind $path {+ tkdnd::_RevokeDragDrop %W} - } - aqua { - macdnd::registerdragwidget [winfo toplevel $path] $types - } - default { - error "unknown Tk windowing system" - } - } - set old_types [bind $path <>] - set new_types {} - foreach type $types { - if {[lsearch -exact $old_types $type] < 0} {lappend new_types $type} - } - if {[llength $new_types]} { - bind $path <> [concat $old_types $new_types] - } - } - unregister { - switch $_windowingsystem { - x11 { - } - win32 - - windows { - _RevokeDragDrop $path - } - aqua { - error todo - } - default { - error "unknown Tk windowing system" - } - } - bind $path <> {} - } - } -};# tkdnd::drop_target - -# ---------------------------------------------------------------------------- -# Command tkdnd::_begin_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::_begin_drag { event button source state X Y x y } { - variable _x0 - variable _y0 - variable _state - - switch -- $event { - press { - set _x0 $X - set _y0 $Y - set _state "press" - } - motion { - if { ![info exists _state] } { - # This is just extra protection. There seem to be - # rare cases where the motion comes before the press. - return - } - if { [string equal $_state "press"] } { - variable _dx - variable _dy - if { abs($_x0-$X) > ${_dx} || abs($_y0-$Y) > ${_dy} } { - set _state "done" - _init_drag $button $source $state $X $Y $x $y - } - } - } - } -};# tkdnd::_begin_drag - -# ---------------------------------------------------------------------------- -# Command tkdnd::_init_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::_init_drag { button source state rootX rootY X Y } { - # Call the <> binding. - set cmd [bind $source <>] - # puts "CMD: $cmd" - if {[string length $cmd]} { - set cmd [string map [list %W $source %X $rootX %Y $rootY %x $X %y $Y \ - %S $state %e <> %A \{\} %% % \ - %t [bind $source <>]] $cmd] - set code [catch {uplevel \#0 $cmd} info options] - # puts "CODE: $code ---- $info" - switch -exact -- $code { - 0 {} - 3 - 4 { - # FRINK: nocheck - return - } - default { - return -options $options $info - } - } - - set len [llength $info] - if {$len == 3} { - foreach { actions types _data } $info { break } - set types [platform_specific_types $types] - set data [list] - foreach type $types { - lappend data $_data - } - unset _data - } elseif {$len == 2} { - foreach { actions _data } $info { break } - set data [list]; set types [list] - foreach {t d} $_data { - foreach t [platform_specific_types $t] { - lappend types $t; lappend data $d - } - } - unset _data t d - } else { - if {$len == 1 && [string equal [lindex $actions 0] "refuse_drop"]} { - return - } - error "not enough items in the result of the <>\ - event binding. Either 2 or 3 items are expected. The command - executed was: \"$cmd\"\nResult was: \"$info\"" - } - set action refuse_drop - variable _windowingsystem - # puts "Source: \"$source\"" - # puts "Types: \"[join $types {", "}]\"" - # puts "Actions: \"[join $actions {", "}]\"" - # puts "Button: \"$button\"" - # puts "Data: \"[string range $data 0 100]\"" - switch $_windowingsystem { - x11 { - set action [xdnd::_dodragdrop $source $actions $types $data $button] - } - win32 - - windows { - set action [_DoDragDrop $source $actions $types $data $button] - } - aqua { - set action [macdnd::dodragdrop $source $actions $types $data $button] - } - default { - error "unknown Tk windowing system" - } - } - ## Call _end_drag to notify the widget of the result of the drag - ## operation... - _end_drag $button $source {} $action {} $data {} $state $rootX $rootY $X $Y - } -};# tkdnd::_init_drag - -# ---------------------------------------------------------------------------- -# Command tkdnd::_end_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::_end_drag { button source target action type data result - state rootX rootY X Y } { - set rootX 0 - set rootY 0 - # Call the <> binding. - set cmd [bind $source <>] - if {[string length $cmd]} { - set cmd [string map [list %W $source %X $rootX %Y $rootY %x $X %y $Y %% % \ - %S $state %e <> %A \{$action\}] $cmd] - set info [uplevel \#0 $cmd] - # if { $info != "" } { - # variable _windowingsystem - # foreach { actions types data } $info { break } - # set types [platform_specific_types $types] - # switch $_windowingsystem { - # x11 { - # error "dragging from Tk widgets not yet supported" - # } - # win32 - - # windows { - # set action [_DoDragDrop $source $actions $types $data $button] - # } - # aqua { - # macdnd::dodragdrop $source $actions $types $data - # } - # default { - # error "unknown Tk windowing system" - # } - # } - # ## Call _end_drag to notify the widget of the result of the drag - # ## operation... - # _end_drag $button $source {} $action {} $data {} $state $rootX $rootY - # } - } -};# tkdnd::_end_drag - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_specific_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_specific_types { types } { - variable _platform_namespace - ${_platform_namespace}::platform_specific_types $types -}; # tkdnd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - variable _platform_namespace - ${_platform_namespace}::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_specific_type -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_specific_type { type } { - variable _platform_namespace - ${_platform_namespace}::platform_specific_type $type -}; # tkdnd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_type -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_type { type } { - variable _platform_namespace - ${_platform_namespace}::platform_independent_type $type -}; # tkdnd::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::bytes_to_string -# ---------------------------------------------------------------------------- -proc ::tkdnd::bytes_to_string { bytes } { - set string {} - foreach byte $bytes { - append string [binary format c $byte] - } - return $string -};# tkdnd::bytes_to_string - -# ---------------------------------------------------------------------------- -# Command tkdnd::urn_unquote -# ---------------------------------------------------------------------------- -proc ::tkdnd::urn_unquote {url} { - set result "" - set start 0 - while {[regexp -start $start -indices {%[0-9a-fA-F]{2}} $url match]} { - foreach {first last} $match break - append result [string range $url $start [expr {$first - 1}]] - append result [format %c 0x[string range $url [incr first] $last]] - set start [incr last] - } - append result [string range $url $start end] - return [encoding convertfrom utf-8 $result] -};# tkdnd::urn_unquote diff --git a/tkinterdnd2/tkdnd/osx64/tkdnd_compat.tcl b/tkinterdnd2/tkdnd/osx64/tkdnd_compat.tcl deleted file mode 100644 index efc96f7..0000000 --- a/tkinterdnd2/tkdnd/osx64/tkdnd_compat.tcl +++ /dev/null @@ -1,160 +0,0 @@ -# -# tkdnd_compat.tcl -- -# -# This file implements some utility procedures, to support older versions -# of the TkDND package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval compat { - -};# namespace compat - -# ---------------------------------------------------------------------------- -# Command ::dnd -# ---------------------------------------------------------------------------- -proc ::dnd {method window args} { - switch $method { - bindtarget { - switch [llength $args] { - 0 {return [tkdnd::compat::bindtarget0 $window]} - 1 {return [tkdnd::compat::bindtarget1 $window [lindex $args 0]]} - 2 {return [tkdnd::compat::bindtarget2 $window [lindex $args 0] \ - [lindex $args 1]]} - 3 {return [tkdnd::compat::bindtarget3 $window [lindex $args 0] \ - [lindex $args 1] [lindex $args 2]]} - 4 {return [tkdnd::compat::bindtarget4 $window [lindex $args 0] \ - [lindex $args 1] [lindex $args 2] [lindex $args 3]]} - } - } - cleartarget { - return [tkdnd::compat::cleartarget $window] - } - bindsource { - switch [llength $args] { - 0 {return [tkdnd::compat::bindsource0 $window]} - 1 {return [tkdnd::compat::bindsource1 $window [lindex $args 0]]} - 2 {return [tkdnd::compat::bindsource2 $window [lindex $args 0] \ - [lindex $args 1]]} - 3 {return [tkdnd::compat::bindsource3 $window [lindex $args 0] \ - [lindex $args 1] [lindex $args 2]]} - } - } - clearsource { - return [tkdnd::compat::clearsource $window] - } - drag { - return [tkdnd::_init_drag 1 $window "press" 0 0 0 0] - } - } - error "invalid number of arguments!" -};# ::dnd - -# ---------------------------------------------------------------------------- -# Command compat::bindtarget -# ---------------------------------------------------------------------------- -proc compat::bindtarget0 {window} { - return [bind $window <>] -};# compat::bindtarget0 - -proc compat::bindtarget1 {window type} { - return [bindtarget2 $window $type ] -};# compat::bindtarget1 - -proc compat::bindtarget2 {window type event} { - switch $event { - {return [bind $window <>]} - {return [bind $window <>]} - {return [bind $window <>]} - {return [bind $window <>]} - } -};# compat::bindtarget2 - -proc compat::bindtarget3 {window type event script} { - set type [normalise_type $type] - ::tkdnd::drop_target register $window [list $type] - switch $event { - {return [bind $window <> $script]} - {return [bind $window <> $script]} - {return [bind $window <> $script]} - {return [bind $window <> $script]} - } -};# compat::bindtarget3 - -proc compat::bindtarget4 {window type event script priority} { - return [bindtarget3 $window $type $event $script] -};# compat::bindtarget4 - -proc compat::normalise_type { type } { - switch $type { - text/plain - - {text/plain;charset=UTF-8} - - Text {return DND_Text} - text/uri-list - - Files {return DND_Files} - default {return $type} - } -};# compat::normalise_type - -# ---------------------------------------------------------------------------- -# Command compat::bindsource -# ---------------------------------------------------------------------------- -proc compat::bindsource0 {window} { - return [bind $window <>] -};# compat::bindsource0 - -proc compat::bindsource1 {window type} { - return [bindsource2 $window $type ] -};# compat::bindsource1 - -proc compat::bindsource2 {window type script} { - set type [normalise_type $type] - ::tkdnd::drag_source register $window $type - bind $window <> "list {copy} {%t} \[$script\]" -};# compat::bindsource2 - -proc compat::bindsource3 {window type script priority} { - return [bindsource2 $window $type $script] -};# compat::bindsource3 - -# ---------------------------------------------------------------------------- -# Command compat::cleartarget -# ---------------------------------------------------------------------------- -proc compat::cleartarget {window} { -};# compat::cleartarget - -# ---------------------------------------------------------------------------- -# Command compat::clearsource -# ---------------------------------------------------------------------------- -proc compat::clearsource {window} { -};# compat::clearsource diff --git a/tkinterdnd2/tkdnd/osx64/tkdnd_generic.tcl b/tkinterdnd2/tkdnd/osx64/tkdnd_generic.tcl deleted file mode 100644 index 698b464..0000000 --- a/tkinterdnd2/tkdnd/osx64/tkdnd_generic.tcl +++ /dev/null @@ -1,520 +0,0 @@ -# -# tkdnd_generic.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval generic { - variable _types {} - variable _typelist {} - variable _codelist {} - variable _actionlist {} - variable _pressedkeys {} - variable _action {} - variable _common_drag_source_types {} - variable _common_drop_target_types {} - variable _drag_source {} - variable _drop_target {} - - variable _last_mouse_root_x 0 - variable _last_mouse_root_y 0 - - variable _tkdnd2platform - variable _platform2tkdnd - - proc debug {msg} { - puts $msg - };# debug - - proc initialise { } { - };# initialise - - proc initialise_platform_to_tkdnd_types { types } { - variable _platform2tkdnd - variable _tkdnd2platform - set _platform2tkdnd [dict create {*}$types] - set _tkdnd2platform [dict create] - foreach type [dict keys $_platform2tkdnd] { - dict lappend _tkdnd2platform [dict get $_platform2tkdnd $type] $type - } - };# initialise_platform_to_tkdnd_types - - proc initialise_tkdnd_to_platform_types { types } { - variable _tkdnd2platform - set _tkdnd2platform [dict create {*}$types] - };# initialise_tkdnd_to_platform_types - -};# namespace generic - -# ---------------------------------------------------------------------------- -# Command generic::HandleEnter -# ---------------------------------------------------------------------------- -proc generic::HandleEnter { drop_target drag_source typelist codelist - actionlist pressedkeys } { - variable _typelist; set _typelist $typelist - variable _pressedkeys; set _pressedkeys $pressedkeys - variable _action; set _action refuse_drop - variable _common_drag_source_types; set _common_drag_source_types {} - variable _common_drop_target_types; set _common_drop_target_types {} - variable _actionlist - variable _drag_source; set _drag_source $drag_source - variable _drop_target; set _drop_target {} - variable _actionlist; set _actionlist $actionlist - variable _codelist set _codelist $codelist - - variable _last_mouse_root_x; set _last_mouse_root_x 0 - variable _last_mouse_root_y; set _last_mouse_root_y 0 - # debug "\n===============================================================" - # debug "generic::HandleEnter: drop_target=$drop_target,\ - # drag_source=$drag_source,\ - # typelist=$typelist" - # debug "generic::HandleEnter: ACTION: default" - return default -};# generic::HandleEnter - -# ---------------------------------------------------------------------------- -# Command generic::HandlePosition -# ---------------------------------------------------------------------------- -proc generic::HandlePosition { drop_target drag_source pressedkeys - rootX rootY { time 0 } } { - variable _types - variable _typelist - variable _codelist - variable _actionlist - variable _pressedkeys - variable _action - variable _common_drag_source_types - variable _common_drop_target_types - variable _drag_source - variable _drop_target - - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - - # debug "generic::HandlePosition: drop_target=$drop_target,\ - # _drop_target=$_drop_target, rootX=$rootX, rootY=$rootY" - - if {![info exists _drag_source] && ![string length $_drag_source]} { - # debug "generic::HandlePosition: no or empty _drag_source:\ - # return refuse_drop" - return refuse_drop - } - - if {$drag_source ne "" && $drag_source ne $_drag_source} { - debug "generic position event from unexpected source: $_drag_source\ - != $drag_source" - return refuse_drop - } - - set _pressedkeys $pressedkeys - - ## Does the new drop target support any of our new types? - # foreach {common_drag_source_types common_drop_target_types} \ - # [GetWindowCommonTypes $drop_target $_typelist] {break} - foreach {drop_target common_drag_source_types common_drop_target_types} \ - [FindWindowWithCommonTypes $drop_target $_typelist] {break} - set data [GetDroppedData $time] - - # debug "\t($_drop_target) -> ($drop_target)" - if {$drop_target != $_drop_target} { - if {[string length $_drop_target]} { - ## Call the <> event. - # debug "\t<> on $_drop_target" - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A \{$_action\} %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D \{\} %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - uplevel \#0 $cmd - } - } - set _drop_target $drop_target - set _action refuse_drop - - if {[llength $common_drag_source_types]} { - set _action [lindex $_actionlist 0] - set _common_drag_source_types $common_drag_source_types - set _common_drop_target_types $common_drop_target_types - ## Drop target supports at least one type. Send a <>. - # puts "<> -> $drop_target" - set cmd [bind $drop_target <>] - if {[string length $cmd]} { - focus $drop_target - set cmd [string map [list %W $drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - } - } - } - - set _drop_target {} - if {[llength $common_drag_source_types]} { - set _common_drag_source_types $common_drag_source_types - set _common_drop_target_types $common_drop_target_types - set _drop_target $drop_target - ## Drop target supports at least one type. Send a <>. - set cmd [bind $drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - } - } - # Return values: copy, move, link, ask, private, refuse_drop, default - # debug "generic::HandlePosition: ACTION: $_action" - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - return $_action -};# generic::HandlePosition - -# ---------------------------------------------------------------------------- -# Command generic::HandleLeave -# ---------------------------------------------------------------------------- -proc generic::HandleLeave { } { - variable _types - variable _typelist - variable _codelist - variable _actionlist - variable _pressedkeys - variable _action - variable _common_drag_source_types - variable _common_drop_target_types - variable _drag_source - variable _drop_target - variable _last_mouse_root_x - variable _last_mouse_root_y - if {![info exists _drop_target]} {set _drop_target {}} - # debug "generic::HandleLeave: _drop_target=$_drop_target" - if {[info exists _drop_target] && [string length $_drop_target]} { - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target \ - %X $_last_mouse_root_x %Y $_last_mouse_root_y \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A \{$_action\} %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D \{\} %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - } - } - foreach var {_types _typelist _actionlist _pressedkeys _action - _common_drag_source_types _common_drop_target_types - _drag_source _drop_target} { - set $var {} - } -};# generic::HandleLeave - -# ---------------------------------------------------------------------------- -# Command generic::HandleDrop -# ---------------------------------------------------------------------------- -proc generic::HandleDrop {drop_target drag_source pressedkeys rootX rootY time } { - variable _types - variable _typelist - variable _codelist - variable _actionlist - variable _pressedkeys - variable _action - variable _common_drag_source_types - variable _common_drop_target_types - variable _drag_source - variable _drop_target - variable _last_mouse_root_x - variable _last_mouse_root_y - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - - set _pressedkeys $pressedkeys - - # puts "generic::HandleDrop: $time" - - if {![info exists _drag_source] && ![string length $_drag_source]} { - return refuse_drop - } - if {![info exists _drop_target] && ![string length $_drop_target]} { - return refuse_drop - } - if {![llength $_common_drag_source_types]} {return refuse_drop} - ## Get the dropped data. - set data [GetDroppedData $time] - ## Try to select the most specific <> event. - foreach type [concat $_common_drag_source_types $_common_drop_target_types] { - set type [platform_independent_type $type] - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - # Return values: copy, move, link, ask, private, refuse_drop - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - return $_action - } - } - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - } - # Return values: copy, move, link, ask, private, refuse_drop - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - return $_action -};# generic::HandleDrop - -# ---------------------------------------------------------------------------- -# Command generic::GetWindowCommonTypes -# ---------------------------------------------------------------------------- -proc generic::GetWindowCommonTypes { win typelist } { - set types [bind $win <>] - # debug ">> Accepted types: $win $_types" - set common_drag_source_types {} - set common_drop_target_types {} - if {[llength $types]} { - ## Examine the drop target types, to find at least one match with the drag - ## source types... - set supported_types [supported_types $typelist] - foreach type $types { - foreach matched [lsearch -glob -all -inline $supported_types $type] { - ## Drop target supports this type. - lappend common_drag_source_types $matched - lappend common_drop_target_types $type - } - } - } - list $common_drag_source_types $common_drop_target_types -};# generic::GetWindowCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::FindWindowWithCommonTypes -# ---------------------------------------------------------------------------- -proc generic::FindWindowWithCommonTypes { win typelist } { - set toplevel [winfo toplevel $win] - while {![string equal $win $toplevel]} { - foreach {common_drag_source_types common_drop_target_types} \ - [GetWindowCommonTypes $win $typelist] {break} - if {[llength $common_drag_source_types]} { - return [list $win $common_drag_source_types $common_drop_target_types] - } - set win [winfo parent $win] - } - ## We have reached the toplevel, which may be also a target (SF Bug #30) - foreach {common_drag_source_types common_drop_target_types} \ - [GetWindowCommonTypes $win $typelist] {break} - if {[llength $common_drag_source_types]} { - return [list $win $common_drag_source_types $common_drop_target_types] - } - return { {} {} {} } -};# generic::FindWindowWithCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::GetDroppedData -# ---------------------------------------------------------------------------- -proc generic::GetDroppedData { time } { - variable _dropped_data - return $_dropped_data -};# generic::GetDroppedData - -# ---------------------------------------------------------------------------- -# Command generic::SetDroppedData -# ---------------------------------------------------------------------------- -proc generic::SetDroppedData { data } { - variable _dropped_data - set _dropped_data $data -};# generic::SetDroppedData - -# ---------------------------------------------------------------------------- -# Command generic::GetDragSource -# ---------------------------------------------------------------------------- -proc generic::GetDragSource { } { - variable _drag_source - return $_drag_source -};# generic::GetDragSource - -# ---------------------------------------------------------------------------- -# Command generic::GetDropTarget -# ---------------------------------------------------------------------------- -proc generic::GetDropTarget { } { - variable _drop_target - return $_drop_target -};# generic::GetDropTarget - -# ---------------------------------------------------------------------------- -# Command generic::GetDragSourceCommonTypes -# ---------------------------------------------------------------------------- -proc generic::GetDragSourceCommonTypes { } { - variable _common_drag_source_types - return $_common_drag_source_types -};# generic::GetDragSourceCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::GetDropTargetCommonTypes -# ---------------------------------------------------------------------------- -proc generic::GetDropTargetCommonTypes { } { - variable _common_drag_source_types - return $_common_drag_source_types -};# generic::GetDropTargetCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::platform_specific_types -# ---------------------------------------------------------------------------- -proc generic::platform_specific_types { types } { - set new_types {} - foreach type $types { - set new_types [concat $new_types [platform_specific_type $type]] - } - return $new_types -}; # generic::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command generic::platform_specific_type -# ---------------------------------------------------------------------------- -proc generic::platform_specific_type { type } { - variable _tkdnd2platform - if {[dict exists $_tkdnd2platform $type]} { - return [dict get $_tkdnd2platform $type] - } - list $type -}; # generic::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - set new_types {} - foreach type $types { - set new_types [concat $new_types [platform_independent_type $type]] - } - return $new_types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command generic::platform_independent_type -# ---------------------------------------------------------------------------- -proc generic::platform_independent_type { type } { - variable _platform2tkdnd - if {[dict exists $_platform2tkdnd $type]} { - return [dict get $_platform2tkdnd $type] - } - return $type -}; # generic::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command generic::supported_types -# ---------------------------------------------------------------------------- -proc generic::supported_types { types } { - set new_types {} - foreach type $types { - if {[supported_type $type]} {lappend new_types $type} - } - return $new_types -}; # generic::supported_types - -# ---------------------------------------------------------------------------- -# Command generic::supported_type -# ---------------------------------------------------------------------------- -proc generic::supported_type { type } { - variable _platform2tkdnd - if {[dict exists $_platform2tkdnd $type]} { - return 1 - } - return 0 -}; # generic::supported_type diff --git a/tkinterdnd2/tkdnd/osx64/tkdnd_macosx.tcl b/tkinterdnd2/tkdnd/osx64/tkdnd_macosx.tcl deleted file mode 100644 index 307f6da..0000000 --- a/tkinterdnd2/tkdnd/osx64/tkdnd_macosx.tcl +++ /dev/null @@ -1,144 +0,0 @@ -# -# tkdnd_macosx.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. - -# This software is copyrighted by: -# Georgios Petasis, Athens, Greece. -# e-mail: petasisg@yahoo.gr, petasis@iit.demokritos.gr -# -# Mac portions (c) 2009 Kevin Walzer/WordTech Communications LLC, -# kw@codebykevin.com -# -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -#basic API for Mac Drag and Drop - -#two data types supported: strings and file paths - -#two commands at C level: ::tkdnd::macdnd::registerdragwidget, ::tkdnd::macdnd::unregisterdragwidget - -#data retrieval mechanism: text or file paths are copied from drag clipboard to system clipboard and retrieved via [clipboard get]; array of file paths is converted to single tab-separated string, can be split into Tcl list - -if {[tk windowingsystem] eq "aqua" && "AppKit" ni [winfo server .]} { - error {TkAqua Cocoa required} -} - -namespace eval macdnd { - - proc initialise { } { - ## Mapping from platform types to TkDND types... - ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \ - NSPasteboardTypeString DND_Text \ - NSFilenamesPboardType DND_Files \ - NSPasteboardTypeHTML DND_HTML \ - ] - };# initialise - -};# namespace macdnd - -# ---------------------------------------------------------------------------- -# Command macdnd::HandleEnter -# ---------------------------------------------------------------------------- -proc macdnd::HandleEnter { path drag_source typelist { data {} } } { - variable _pressedkeys - variable _actionlist - set _pressedkeys 1 - set _actionlist { copy move link ask private } - ::tkdnd::generic::SetDroppedData $data - ::tkdnd::generic::HandleEnter $path $drag_source $typelist $typelist \ - $_actionlist $_pressedkeys -};# macdnd::HandleEnter - -# ---------------------------------------------------------------------------- -# Command macdnd::HandlePosition -# ---------------------------------------------------------------------------- -proc macdnd::HandlePosition { drop_target rootX rootY {drag_source {}} } { - variable _pressedkeys - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - ::tkdnd::generic::HandlePosition $drop_target $drag_source \ - $_pressedkeys $rootX $rootY -};# macdnd::HandlePosition - -# ---------------------------------------------------------------------------- -# Command macdnd::HandleLeave -# ---------------------------------------------------------------------------- -proc macdnd::HandleLeave { args } { - ::tkdnd::generic::HandleLeave -};# macdnd::HandleLeave - -# ---------------------------------------------------------------------------- -# Command macdnd::HandleDrop -# ---------------------------------------------------------------------------- -proc macdnd::HandleDrop { drop_target data args } { - variable _pressedkeys - variable _last_mouse_root_x - variable _last_mouse_root_y - ## Get the dropped data... - ::tkdnd::generic::SetDroppedData $data - ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \ - $_last_mouse_root_x $_last_mouse_root_y 0 -};# macdnd::HandleDrop - -# ---------------------------------------------------------------------------- -# Command macdnd::GetDragSourceCommonTypes -# ---------------------------------------------------------------------------- -proc macdnd::GetDragSourceCommonTypes { } { - ::tkdnd::generic::GetDragSourceCommonTypes -};# macdnd::GetDragSourceCommonTypes - -# ---------------------------------------------------------------------------- -# Command macdnd::platform_specific_types -# ---------------------------------------------------------------------------- -proc macdnd::platform_specific_types { types } { - ::tkdnd::generic::platform_specific_types $types -}; # macdnd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command macdnd::platform_specific_type -# ---------------------------------------------------------------------------- -proc macdnd::platform_specific_type { type } { - ::tkdnd::generic::platform_specific_type $type -}; # macdnd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - ::tkdnd::generic::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command macdnd::platform_independent_type -# ---------------------------------------------------------------------------- -proc macdnd::platform_independent_type { type } { - ::tkdnd::generic::platform_independent_type $type -}; # macdnd::platform_independent_type diff --git a/tkinterdnd2/tkdnd/osx64/tkdnd_unix.tcl b/tkinterdnd2/tkdnd/osx64/tkdnd_unix.tcl deleted file mode 100644 index 56d17c4..0000000 --- a/tkinterdnd2/tkdnd/osx64/tkdnd_unix.tcl +++ /dev/null @@ -1,810 +0,0 @@ -# -# tkdnd_unix.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval xdnd { - variable _dragging 0 - - proc initialise { } { - ## Mapping from platform types to TkDND types... - ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \ - text/plain\;charset=utf-8 DND_Text \ - UTF8_STRING DND_Text \ - text/plain DND_Text \ - STRING DND_Text \ - TEXT DND_Text \ - COMPOUND_TEXT DND_Text \ - text/uri-list DND_Files \ - text/html\;charset=utf-8 DND_HTML \ - text/html DND_HTML \ - application/x-color DND_Color \ - ] - };# initialise - -};# namespace xdnd - -# ---------------------------------------------------------------------------- -# Command xdnd::HandleXdndEnter -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndEnter { path drag_source typelist time { data {} } } { - variable _pressedkeys - variable _actionlist - variable _typelist - set _pressedkeys 1 - set _actionlist { copy move link ask private } - set _typelist $typelist - # puts "xdnd::HandleXdndEnter: $time" - ::tkdnd::generic::SetDroppedData $data - ::tkdnd::generic::HandleEnter $path $drag_source $typelist $typelist \ - $_actionlist $_pressedkeys -};# xdnd::HandleXdndEnter - -# ---------------------------------------------------------------------------- -# Command xdnd::HandleXdndPosition -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndPosition { drop_target rootX rootY time {drag_source {}} } { - variable _pressedkeys - variable _typelist - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - # puts "xdnd::HandleXdndPosition: $time" - ## Get the dropped data... - catch { - ::tkdnd::generic::SetDroppedData [GetPositionData $drop_target $_typelist $time] - } - ::tkdnd::generic::HandlePosition $drop_target $drag_source \ - $_pressedkeys $rootX $rootY -};# xdnd::HandleXdndPosition - -# ---------------------------------------------------------------------------- -# Command xdnd::HandleXdndLeave -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndLeave { } { - ::tkdnd::generic::HandleLeave -};# xdnd::HandleXdndLeave - -# ---------------------------------------------------------------------------- -# Command xdnd::_HandleXdndDrop -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndDrop { time } { - variable _pressedkeys - variable _last_mouse_root_x - variable _last_mouse_root_y - ## Get the dropped data... - ::tkdnd::generic::SetDroppedData [GetDroppedData \ - [::tkdnd::generic::GetDragSource] [::tkdnd::generic::GetDropTarget] \ - [::tkdnd::generic::GetDragSourceCommonTypes] $time] - ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \ - $_last_mouse_root_x $_last_mouse_root_y $time -};# xdnd::HandleXdndDrop - -# ---------------------------------------------------------------------------- -# Command xdnd::GetPositionData -# ---------------------------------------------------------------------------- -proc xdnd::GetPositionData { drop_target typelist time } { - foreach {drop_target common_drag_source_types common_drop_target_types} \ - [::tkdnd::generic::FindWindowWithCommonTypes $drop_target $typelist] {break} - GetDroppedData [::tkdnd::generic::GetDragSource] $drop_target \ - $common_drag_source_types $time -};# xdnd::GetPositionData - -# ---------------------------------------------------------------------------- -# Command xdnd::GetDroppedData -# ---------------------------------------------------------------------------- -proc xdnd::GetDroppedData { _drag_source _drop_target _common_drag_source_types time } { - if {![llength $_common_drag_source_types]} { - error "no common data types between the drag source and drop target widgets" - } - ## Is drag source in this application? - if {[catch {winfo pathname -displayof $_drop_target $_drag_source} p]} { - set _use_tk_selection 0 - } else { - set _use_tk_selection 1 - } - foreach type $_common_drag_source_types { - # puts "TYPE: $type ($_drop_target)" - # _get_selection $_drop_target $time $type - if {$_use_tk_selection} { - if {![catch { - selection get -displayof $_drop_target -selection XdndSelection \ - -type $type - } result options]} { - return [normalise_data $type $result] - } - } else { - # puts "_selection_get -displayof $_drop_target -selection XdndSelection \ - # -type $type -time $time" - #after 100 [list focus -force $_drop_target] - #after 50 [list raise [winfo toplevel $_drop_target]] - if {![catch { - _selection_get -displayof $_drop_target -selection XdndSelection \ - -type $type -time $time - } result options]} { - return [normalise_data $type $result] - } - } - } - return -options $options $result -};# xdnd::GetDroppedData - -# ---------------------------------------------------------------------------- -# Command xdnd::platform_specific_types -# ---------------------------------------------------------------------------- -proc xdnd::platform_specific_types { types } { - ::tkdnd::generic::platform_specific_types $types -}; # xdnd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command xdnd::platform_specific_type -# ---------------------------------------------------------------------------- -proc xdnd::platform_specific_type { type } { - ::tkdnd::generic::platform_specific_type $type -}; # xdnd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - ::tkdnd::generic::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command xdnd::platform_independent_type -# ---------------------------------------------------------------------------- -proc xdnd::platform_independent_type { type } { - ::tkdnd::generic::platform_independent_type $type -}; # xdnd::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command xdnd::_normalise_data -# ---------------------------------------------------------------------------- -proc xdnd::normalise_data { type data } { - # Tk knows how to interpret the following types: - # STRING, TEXT, COMPOUND_TEXT - # UTF8_STRING - # Else, it returns a list of 8 or 32 bit numbers... - switch -glob $type { - STRING - UTF8_STRING - TEXT - COMPOUND_TEXT {return $data} - text/html { - if {[catch { - encoding convertfrom unicode $data - } string]} { - set string $data - } - return [string map {\r\n \n} $string] - } - text/html\;charset=utf-8 - - text/plain\;charset=utf-8 - - text/plain { - if {[catch { - encoding convertfrom utf-8 [tkdnd::bytes_to_string $data] - } string]} { - set string $data - } - return [string map {\r\n \n} $string] - } - text/uri-list* { - if {[catch { - encoding convertfrom utf-8 [tkdnd::bytes_to_string $data] - } string]} { - set string $data - } - ## Get rid of \r\n - set string [string trim [string map {\r\n \n} $string]] - set files {} - foreach quoted_file [split $string] { - set file [tkdnd::urn_unquote $quoted_file] - switch -glob $file { - \#* {} - file://* {lappend files [string range $file 7 end]} - ftp://* - - https://* - - http://* {lappend files $quoted_file} - default {lappend files $file} - } - } - return $files - } - application/x-color { - return $data - } - text/x-moz-url - - application/q-iconlist - - default {return $data} - } -}; # xdnd::normalise_data - -############################################################################# -## -## XDND drag implementation -## -############################################################################# - -# ---------------------------------------------------------------------------- -# Command xdnd::_selection_ownership_lost -# ---------------------------------------------------------------------------- -proc xdnd::_selection_ownership_lost {} { - variable _dragging - set _dragging 0 -};# _selection_ownership_lost - -# ---------------------------------------------------------------------------- -# Command xdnd::_dodragdrop -# ---------------------------------------------------------------------------- -proc xdnd::_dodragdrop { source actions types data button } { - variable _dragging - - # puts "xdnd::_dodragdrop: source: $source, actions: $actions, types: $types,\ - # data: \"$data\", button: $button" - if {$_dragging} { - ## We are in the middle of another drag operation... - error "another drag operation in progress" - } - - variable _dodragdrop_drag_source $source - variable _dodragdrop_drop_target 0 - variable _dodragdrop_drop_target_proxy 0 - variable _dodragdrop_actions $actions - variable _dodragdrop_action_descriptions $actions - variable _dodragdrop_actions_len [llength $actions] - variable _dodragdrop_types $types - variable _dodragdrop_types_len [llength $types] - variable _dodragdrop_data $data - variable _dodragdrop_transfer_data {} - variable _dodragdrop_button $button - variable _dodragdrop_time 0 - variable _dodragdrop_default_action refuse_drop - variable _dodragdrop_waiting_status 0 - variable _dodragdrop_drop_target_accepts_drop 0 - variable _dodragdrop_drop_target_accepts_action refuse_drop - variable _dodragdrop_current_cursor $_dodragdrop_default_action - variable _dodragdrop_drop_occured 0 - variable _dodragdrop_selection_requestor 0 - - ## - ## If we have more than 3 types, the property XdndTypeList must be set on - ## the drag source widget... - ## - if {$_dodragdrop_types_len > 3} { - _announce_type_list $_dodragdrop_drag_source $_dodragdrop_types - } - - ## - ## Announce the actions & their descriptions on the XdndActionList & - ## XdndActionDescription properties... - ## - _announce_action_list $_dodragdrop_drag_source $_dodragdrop_actions \ - $_dodragdrop_action_descriptions - - ## - ## Arrange selection handlers for our drag source, and all the supported types - ## - registerSelectionHandler $source $types - - ## - ## Step 1: When a drag begins, the source takes ownership of XdndSelection. - ## - selection own -command ::tkdnd::xdnd::_selection_ownership_lost \ - -selection XdndSelection $source - set _dragging 1 - - ## Grab the mouse pointer... - _grab_pointer $source $_dodragdrop_default_action - - ## Register our generic event handler... - # The generic event callback will report events by modifying variable - # ::xdnd::_dodragdrop_event: a dict with event information will be set as - # the value of the variable... - _register_generic_event_handler - - ## Set a timeout for debugging purposes... - # after 60000 {set ::tkdnd::xdnd::_dragging 0} - - tkwait variable ::tkdnd::xdnd::_dragging - _SendXdndLeave - - set _dragging 0 - _ungrab_pointer $source - _unregister_generic_event_handler - catch {selection clear -selection XdndSelection} - unregisterSelectionHandler $source $types - return $_dodragdrop_drop_target_accepts_action -};# xdnd::_dodragdrop - -# ---------------------------------------------------------------------------- -# Command xdnd::_process_drag_events -# ---------------------------------------------------------------------------- -proc xdnd::_process_drag_events {event} { - # The return value from proc is normally 0. A non-zero return value indicates - # that the event is not to be handled further; that is, proc has done all - # processing that is to be allowed for the event - variable _dragging - if {!$_dragging} {return 0} - # puts $event - - variable _dodragdrop_time - set time [dict get $event time] - set type [dict get $event type] - if {$time < $_dodragdrop_time && ![string equal $type SelectionRequest]} { - return 0 - } - set _dodragdrop_time $time - - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_default_action - switch $type { - MotionNotify { - set rootx [dict get $event x_root] - set rooty [dict get $event y_root] - set window [_find_drop_target_window $_dodragdrop_drag_source \ - $rootx $rooty] - if {[string length $window]} { - ## Examine the modifiers to suggest an action... - set _dodragdrop_default_action [_default_action $event] - ## Is it a Tk widget? - # set path [winfo containing $rootx $rooty] - # puts "Window under mouse: $window ($path)" - if {$_dodragdrop_drop_target != $window} { - ## Send XdndLeave to $_dodragdrop_drop_target - _SendXdndLeave - ## Is there a proxy? If not, _find_drop_target_proxy returns the - ## target window, so we always get a valid "proxy". - set proxy [_find_drop_target_proxy $_dodragdrop_drag_source $window] - ## Send XdndEnter to $window - _SendXdndEnter $window $proxy - ## Send XdndPosition to $_dodragdrop_drop_target - _SendXdndPosition $rootx $rooty $_dodragdrop_default_action - } else { - ## Send XdndPosition to $_dodragdrop_drop_target - _SendXdndPosition $rootx $rooty $_dodragdrop_default_action - } - } else { - ## No window under the mouse. Send XdndLeave to $_dodragdrop_drop_target - _SendXdndLeave - } - } - ButtonPress { - } - ButtonRelease { - variable _dodragdrop_button - set button [dict get $event button] - if {$button == $_dodragdrop_button} { - ## The button that initiated the drag was released. Trigger drop... - _SendXdndDrop - } - return 1 - } - KeyPress { - } - KeyRelease { - set keysym [dict get $event keysym] - switch $keysym { - Escape { - ## The user has pressed escape. Abort... - if {$_dragging} {set _dragging 0} - } - } - } - SelectionRequest { - variable _dodragdrop_selection_requestor - variable _dodragdrop_selection_property - variable _dodragdrop_selection_selection - variable _dodragdrop_selection_target - variable _dodragdrop_selection_time - set _dodragdrop_selection_requestor [dict get $event requestor] - set _dodragdrop_selection_property [dict get $event property] - set _dodragdrop_selection_selection [dict get $event selection] - set _dodragdrop_selection_target [dict get $event target] - set _dodragdrop_selection_time $time - return 0 - } - default { - return 0 - } - } - return 0 -};# _process_drag_events - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndEnter -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndEnter {window proxy} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_types - variable _dodragdrop_waiting_status - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_target > 0} _SendXdndLeave - if {$_dodragdrop_drop_occured} return - set _dodragdrop_drop_target $window - set _dodragdrop_drop_target_proxy $proxy - set _dodragdrop_waiting_status 0 - if {$_dodragdrop_drop_target < 1} return - # puts "XdndEnter: $_dodragdrop_drop_target $_dodragdrop_drop_target_proxy" - _send_XdndEnter $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy $_dodragdrop_types -};# xdnd::_SendXdndEnter - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndPosition -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndPosition {rootx rooty action} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - if {$_dodragdrop_drop_target < 1} return - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} return - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_waiting_status - ## Arrange a new XdndPosition, to be send periodically... - variable _dodragdrop_xdnd_position_heartbeat - catch {after cancel $_dodragdrop_xdnd_position_heartbeat} - set _dodragdrop_xdnd_position_heartbeat [after 200 \ - [list ::tkdnd::xdnd::_SendXdndPosition $rootx $rooty $action]] - if {$_dodragdrop_waiting_status} {return} - # puts "XdndPosition: $_dodragdrop_drop_target $rootx $rooty $action" - _send_XdndPosition $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy $rootx $rooty $action - set _dodragdrop_waiting_status 1 -};# xdnd::_SendXdndPosition - -# ---------------------------------------------------------------------------- -# Command xdnd::_HandleXdndStatus -# ---------------------------------------------------------------------------- -proc xdnd::_HandleXdndStatus {event} { - variable _dodragdrop_drop_target - variable _dodragdrop_waiting_status - - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - set _dodragdrop_waiting_status 0 - foreach key {target accept want_position action x y w h} { - set $key [dict get $event $key] - } - set _dodragdrop_drop_target_accepts_drop $accept - set _dodragdrop_drop_target_accepts_action $action - if {$_dodragdrop_drop_target < 1} return - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} return - _update_cursor - # puts "XdndStatus: $event" -};# xdnd::_HandleXdndStatus - -# ---------------------------------------------------------------------------- -# Command xdnd::_HandleXdndFinished -# ---------------------------------------------------------------------------- -proc xdnd::_HandleXdndFinished {event} { - variable _dodragdrop_xdnd_finished_event_after_id - catch {after cancel $_dodragdrop_xdnd_finished_event_after_id} - set _dodragdrop_xdnd_finished_event_after_id {} - variable _dodragdrop_drop_target - set _dodragdrop_drop_target 0 - variable _dragging - if {$_dragging} {set _dragging 0} - - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - if {[dict size $event]} { - foreach key {target accept action} { - set $key [dict get $event $key] - } - set _dodragdrop_drop_target_accepts_drop $accept - set _dodragdrop_drop_target_accepts_action $action - } else { - set _dodragdrop_drop_target_accepts_drop 0 - } - if {!$_dodragdrop_drop_target_accepts_drop} { - set _dodragdrop_drop_target_accepts_action refuse_drop - } - # puts "XdndFinished: $event" -};# xdnd::_HandleXdndFinished - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndLeave -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndLeave {} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - if {$_dodragdrop_drop_target < 1} return - variable _dodragdrop_drop_target_proxy - # puts "XdndLeave: $_dodragdrop_drop_target" - _send_XdndLeave $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy - set _dodragdrop_drop_target 0 - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - set _dodragdrop_drop_target_accepts_drop 0 - set _dodragdrop_drop_target_accepts_action refuse_drop - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} return - _update_cursor -};# xdnd::_SendXdndLeave - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndDrop -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndDrop {} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - if {$_dodragdrop_drop_target < 1} { - ## The mouse has been released over a widget that does not accept drops. - _HandleXdndFinished {} - return - } - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} {return} - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - - set _dodragdrop_drop_occured 1 - _update_cursor clock - - if {!$_dodragdrop_drop_target_accepts_drop} { - _SendXdndLeave - _HandleXdndFinished {} - return - } - # puts "XdndDrop: $_dodragdrop_drop_target" - variable _dodragdrop_drop_timestamp - set _dodragdrop_drop_timestamp [_send_XdndDrop \ - $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy] - set _dodragdrop_drop_target 0 - # puts "XdndDrop: $_dodragdrop_drop_target" - ## Arrange a timeout for receiving XdndFinished... - variable _dodragdrop_xdnd_finished_event_after_id - set _dodragdrop_xdnd_finished_event_after_id \ - [after 10000 [list ::tkdnd::xdnd::_HandleXdndFinished {}]] -};# xdnd::_SendXdndDrop - -# ---------------------------------------------------------------------------- -# Command xdnd::_update_cursor -# ---------------------------------------------------------------------------- -proc xdnd::_update_cursor { {cursor {}}} { - # puts "_update_cursor $cursor" - variable _dodragdrop_current_cursor - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - - if {![string length $cursor]} { - set cursor refuse_drop - if {$_dodragdrop_drop_target_accepts_drop} { - set cursor $_dodragdrop_drop_target_accepts_action - } - } - if {![string equal $cursor $_dodragdrop_current_cursor]} { - _set_pointer_cursor $_dodragdrop_drag_source $cursor - set _dodragdrop_current_cursor $cursor - } -};# xdnd::_update_cursor - -# ---------------------------------------------------------------------------- -# Command xdnd::_default_action -# ---------------------------------------------------------------------------- -proc xdnd::_default_action {event} { - variable _dodragdrop_actions - variable _dodragdrop_actions_len - if {$_dodragdrop_actions_len == 1} {return [lindex $_dodragdrop_actions 0]} - - set alt [dict get $event Alt] - set shift [dict get $event Shift] - set control [dict get $event Control] - - if {$shift && $control && [lsearch $_dodragdrop_actions link] != -1} { - return link - } elseif {$control && [lsearch $_dodragdrop_actions copy] != -1} { - return copy - } elseif {$shift && [lsearch $_dodragdrop_actions move] != -1} { - return move - } elseif {$alt && [lsearch $_dodragdrop_actions link] != -1} { - return link - } - return default -};# xdnd::_default_action - -# ---------------------------------------------------------------------------- -# Command xdnd::getFormatForType -# ---------------------------------------------------------------------------- -proc xdnd::getFormatForType {type} { - switch -glob [string tolower $type] { - text/plain\;charset=utf-8 - - text/html\;charset=utf-8 - - utf8_string {set format UTF8_STRING} - text/html - - text/plain - - string - - text - - compound_text {set format STRING} - text/uri-list* {set format UTF8_STRING} - application/x-color {set format $type} - default {set format $type} - } - return $format -};# xdnd::getFormatForType - -# ---------------------------------------------------------------------------- -# Command xdnd::registerSelectionHandler -# ---------------------------------------------------------------------------- -proc xdnd::registerSelectionHandler {source types} { - foreach type $types { - selection handle -selection XdndSelection \ - -type $type \ - -format [getFormatForType $type] \ - $source [list ::tkdnd::xdnd::_SendData $type] - } -};# xdnd::registerSelectionHandler - -# ---------------------------------------------------------------------------- -# Command xdnd::unregisterSelectionHandler -# ---------------------------------------------------------------------------- -proc xdnd::unregisterSelectionHandler {source types} { - foreach type $types { - catch { - selection handle -selection XdndSelection \ - -type $type \ - -format [getFormatForType $type] \ - $source {} - } - } -};# xdnd::unregisterSelectionHandler - -# ---------------------------------------------------------------------------- -# Command xdnd::_convert_to_unsigned -# ---------------------------------------------------------------------------- -proc xdnd::_convert_to_unsigned {data format} { - switch $format { - 8 { set mask 0xff } - 16 { set mask 0xffff } - 32 { set mask 0xffffff } - default {error "unsupported format $format"} - } - ## Convert signed integer into unsigned... - set d [list] - foreach num $data { - lappend d [expr { $num & $mask }] - } - return $d -};# xdnd::_convert_to_unsigned - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendData -# ---------------------------------------------------------------------------- -proc xdnd::_SendData {type offset bytes args} { - variable _dodragdrop_drag_source - variable _dodragdrop_types - variable _dodragdrop_data - variable _dodragdrop_transfer_data - - ## The variable _dodragdrop_data contains a list of data, one for each - ## type in the _dodragdrop_types variable. We have to search types, and find - ## the corresponding entry in the _dodragdrop_data list. - set index [lsearch $_dodragdrop_types $type] - if {$index < 0} { - error "unable to locate data suitable for type \"$type\"" - } - set typed_data [lindex $_dodragdrop_data $index] - set format 8 - if {$offset == 0} { - ## Prepare the data to be transferred... - switch -glob $type { - text/plain* - UTF8_STRING - STRING - TEXT - COMPOUND_TEXT { - binary scan [encoding convertto utf-8 $typed_data] \ - c* _dodragdrop_transfer_data - set _dodragdrop_transfer_data \ - [_convert_to_unsigned $_dodragdrop_transfer_data $format] - } - text/uri-list* { - set files [list] - foreach file $typed_data { - switch -glob $file { - *://* {lappend files $file} - default {lappend files file://$file} - } - } - binary scan [encoding convertto utf-8 "[join $files \r\n]\r\n"] \ - c* _dodragdrop_transfer_data - set _dodragdrop_transfer_data \ - [_convert_to_unsigned $_dodragdrop_transfer_data $format] - } - application/x-color { - set format 16 - ## Try to understand the provided data: we accept a standard Tk colour, - ## or a list of 3 values (red green blue) or a list of 4 values - ## (red green blue opacity). - switch [llength $typed_data] { - 1 { set color [winfo rgb $_dodragdrop_drag_source $typed_data] - lappend color 65535 } - 3 { set color $typed_data; lappend color 65535 } - 4 { set color $typed_data } - default {error "unknown color data: \"$typed_data\""} - } - ## Convert the 4 elements into 16 bit values... - set _dodragdrop_transfer_data [list] - foreach c $color { - lappend _dodragdrop_transfer_data [format 0x%04X $c] - } - } - default { - set format 32 - binary scan $typed_data c* _dodragdrop_transfer_data - } - } - } - - ## - ## Data has been split into bytes. Count the bytes requested, and return them - ## - set data [lrange $_dodragdrop_transfer_data $offset [expr {$offset+$bytes-1}]] - switch $format { - 8 { - set data [encoding convertfrom utf-8 [binary format c* $data]] - } - 16 { - variable _dodragdrop_selection_requestor - if {$_dodragdrop_selection_requestor} { - ## Tk selection cannot process this format (only 8 & 32 supported). - ## Call our XChangeProperty... - set numItems [llength $data] - variable _dodragdrop_selection_property - variable _dodragdrop_selection_selection - variable _dodragdrop_selection_target - variable _dodragdrop_selection_time - XChangeProperty $_dodragdrop_drag_source \ - $_dodragdrop_selection_requestor \ - $_dodragdrop_selection_property \ - $_dodragdrop_selection_target \ - $format \ - $_dodragdrop_selection_time \ - $data $numItems - return -code break - } - } - 32 { - } - default { - error "unsupported format $format" - } - } - # puts "SendData: $type $offset $bytes $args ($typed_data)" - # puts " $data" - return $data -};# xdnd::_SendData diff --git a/tkinterdnd2/tkdnd/osx64/tkdnd_utils.tcl b/tkinterdnd2/tkdnd/osx64/tkdnd_utils.tcl deleted file mode 100644 index ee961dd..0000000 --- a/tkinterdnd2/tkdnd/osx64/tkdnd_utils.tcl +++ /dev/null @@ -1,252 +0,0 @@ -# -# tkdnd_utils.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -package require tkdnd -namespace eval ::tkdnd { - namespace eval utils { - };# namespace ::tkdnd::utils - namespace eval text { - variable _drag_tag tkdnd::drag::selection::tag - variable _state {} - variable _drag_source_widget {} - variable _drop_target_widget {} - variable _now_dragging 0 - };# namespace ::tkdnd::text -};# namespace ::tkdnd - -bind TkDND_Drag_Text1 {tkdnd::text::_begin_drag clear 1 %W %s %X %Y %x %y} -bind TkDND_Drag_Text1 {tkdnd::text::_begin_drag motion 1 %W %s %X %Y %x %y} -bind TkDND_Drag_Text1 {tkdnd::text::_TextAutoScan %W %x %y} -bind TkDND_Drag_Text1 {tkdnd::text::_begin_drag reset 1 %W %s %X %Y %x %y} -bind TkDND_Drag_Text2 {tkdnd::text::_begin_drag clear 2 %W %s %X %Y %x %y} -bind TkDND_Drag_Text2 {tkdnd::text::_begin_drag motion 2 %W %s %X %Y %x %y} -bind TkDND_Drag_Text2 {tkdnd::text::_begin_drag reset 2 %W %s %X %Y %x %y} -bind TkDND_Drag_Text3 {tkdnd::text::_begin_drag clear 3 %W %s %X %Y %x %y} -bind TkDND_Drag_Text3 {tkdnd::text::_begin_drag motion 3 %W %s %X %Y %x %y} -bind TkDND_Drag_Text3 {tkdnd::text::_begin_drag reset 3 %W %s %X %Y %x %y} - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::drag_source -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::drag_source { mode path { types DND_Text } { event 1 } { tagprefix TkDND_Drag_Text } { tag sel } } { - switch -exact -- $mode { - register { - $path tag bind $tag \ - "tkdnd::text::_begin_drag press ${event} %W %s %X %Y %x %y" - ## Set a binding to the widget, to put selection as data... - bind $path <> "::tkdnd::text::DragInitCmd $path {%t} $tag" - ## Set a binding to the widget, to remove selection if action is move... - bind $path <> "::tkdnd::text::DragEndCmd $path %A $tag" - } - unregister { - $path tag bind $tag {} - bind $path <> {} - bind $path <> {} - } - } - ::tkdnd::drag_source $mode $path $types $event $tagprefix -};# ::tkdnd::text::drag_source - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::drop_target -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::drop_target { mode path { types DND_Text } } { - switch -exact -- $mode { - register { - bind $path <> "::tkdnd::text::DropPosition $path %X %Y %A %a %m" - bind $path <> "::tkdnd::text::Drop $path %D %X %Y %A %a %m" - } - unregister { - bind $path <> {} - bind $path <> {} - bind $path <> {} - bind $path <> {} - } - } - ::tkdnd::drop_target $mode $path $types -};# ::tkdnd::text::drop_target - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::DragInitCmd -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::DragInitCmd { path { types DND_Text } { tag sel } { actions { copy move } } } { - ## Save the selection indices... - variable _drag_source_widget - variable _drop_target_widget - set _drag_source_widget $path - set _drop_target_widget {} - _save_selection $path $tag - list $actions $types [$path get $tag.first $tag.last] -};# ::tkdnd::text::DragInitCmd - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::DragEndCmd -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::DragEndCmd { path action { tag sel } } { - variable _drag_source_widget - variable _drop_target_widget - set _drag_source_widget {} - set _drop_target_widget {} - _restore_selection $path $tag - switch -exact -- $action { - move { - ## Delete the original selected text... - variable _selection_first - variable _selection_last - $path delete $_selection_first $_selection_last - } - } -};# ::tkdnd::text::DragEndCmd - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::DropPosition -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::DropPosition { path X Y action actions keys} { - variable _drag_source_widget - variable _drop_target_widget - set _drop_target_widget $path - ## This check is primitive, a more accurate one is needed! - if {$path eq $_drag_source_widget} { - ## This is a drag within the same widget! Set action to move... - if {"move" in $actions} {set action move} - } - incr X -[winfo rootx $path] - incr Y -[winfo rooty $path] - $path mark set insert @$X,$Y; update - return $action -};# ::tkdnd::text::DropPosition - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::Drop -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::Drop { path data X Y action actions keys } { - incr X -[winfo rootx $path] - incr Y -[winfo rooty $path] - $path mark set insert @$X,$Y - $path insert [$path index insert] $data - return $action -};# ::tkdnd::text::Drop - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::_save_selection -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::_save_selection { path tag} { - variable _drag_tag - variable _selection_first - variable _selection_last - variable _selection_tag $tag - set _selection_first [$path index $tag.first] - set _selection_last [$path index $tag.last] - $path tag add $_drag_tag $_selection_first $_selection_last - $path tag configure $_drag_tag \ - -background [$path tag cget $tag -background] \ - -foreground [$path tag cget $tag -foreground] -};# tkdnd::text::_save_selection - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::_restore_selection -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::_restore_selection { path tag} { - variable _drag_tag - variable _selection_first - variable _selection_last - $path tag delete $_drag_tag - $path tag remove $tag 0.0 end - #$path tag add $tag $_selection_first $_selection_last -};# tkdnd::text::_restore_selection - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::_begin_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::_begin_drag { event button source state X Y x y } { - variable _drop_target_widget - variable _state - # puts "::tkdnd::text::_begin_drag $event $button $source $state $X $Y $x $y" - - switch -exact -- $event { - clear { - switch -exact -- $_state { - press { - ## Do not execute other bindings, as they will erase selection... - return -code break - } - } - set _state clear - } - motion { - variable _now_dragging - if {$_now_dragging} {return -code break} - if { [string equal $_state "press"] } { - variable _x0; variable _y0 - if { abs($_x0-$X) > ${::tkdnd::_dx} || abs($_y0-$Y) > ${::tkdnd::_dy} } { - set _state "done" - set _drop_target_widget {} - set _now_dragging 1 - set code [catch { - ::tkdnd::_init_drag $button $source $state $X $Y $x $y - } info options] - set _drop_target_widget {} - set _now_dragging 0 - if {$code != 0} { - ## Something strange occurred... - return -options $options $info - } - } - return -code break - } - set _state clear - } - press { - variable _x0; variable _y0 - set _x0 $X - set _y0 $Y - set _state "press" - } - reset { - set _state {} - } - } - if {$source eq $_drop_target_widget} {return -code break} - return -code continue -};# tkdnd::text::_begin_drag - -proc tkdnd::text::_TextAutoScan {w x y} { - variable _now_dragging - if {$_now_dragging} {return -code break} - return -code continue -};# tkdnd::text::_TextAutoScan diff --git a/tkinterdnd2/tkdnd/osx64/tkdnd_windows.tcl b/tkinterdnd2/tkdnd/osx64/tkdnd_windows.tcl deleted file mode 100644 index a1d01f3..0000000 --- a/tkinterdnd2/tkdnd/osx64/tkdnd_windows.tcl +++ /dev/null @@ -1,167 +0,0 @@ -# -# tkdnd_windows.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval olednd { - - proc initialise { } { - ## Mapping from platform types to TkDND types... - ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \ - CF_UNICODETEXT DND_Text \ - CF_TEXT DND_Text \ - CF_HDROP DND_Files \ - UniformResourceLocator DND_URL \ - CF_HTML DND_HTML \ - {HTML Format} DND_HTML \ - CF_RTF DND_RTF \ - CF_RTFTEXT DND_RTF \ - {Rich Text Format} DND_RTF \ - ] - # FileGroupDescriptorW DND_Files \ - # FileGroupDescriptor DND_Files \ - - ## Mapping from TkDND types to platform types... - ::tkdnd::generic::initialise_tkdnd_to_platform_types [list \ - DND_Text {CF_UNICODETEXT CF_TEXT} \ - DND_Files {CF_HDROP} \ - DND_URL {UniformResourceLocator UniformResourceLocatorW} \ - DND_HTML {CF_HTML {HTML Format}} \ - DND_RTF {CF_RTF CF_RTFTEXT {Rich Text Format}} \ - ] - };# initialise - -};# namespace olednd - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDragEnter -# ---------------------------------------------------------------------------- -proc olednd::HandleDragEnter { drop_target typelist actionlist pressedkeys - rootX rootY codelist { data {} } } { - ::tkdnd::generic::SetDroppedData $data - focus $drop_target - ::tkdnd::generic::HandleEnter $drop_target 0 $typelist \ - $codelist $actionlist $pressedkeys - set action [::tkdnd::generic::HandlePosition $drop_target {} \ - $pressedkeys $rootX $rootY] - if {$::tkdnd::_auto_update} {update idletasks} - return $action -};# olednd::HandleDragEnter - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDragOver -# ---------------------------------------------------------------------------- -proc olednd::HandleDragOver { drop_target pressedkeys rootX rootY } { - set action [::tkdnd::generic::HandlePosition $drop_target {} \ - $pressedkeys $rootX $rootY] - if {$::tkdnd::_auto_update} {update idletasks} - return $action -};# olednd::HandleDragOver - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDragLeave -# ---------------------------------------------------------------------------- -proc olednd::HandleDragLeave { drop_target } { - ::tkdnd::generic::HandleLeave - if {$::tkdnd::_auto_update} {update idletasks} -};# olednd::HandleDragLeave - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDrop -# ---------------------------------------------------------------------------- -proc olednd::HandleDrop { drop_target pressedkeys rootX rootY type data } { - ::tkdnd::generic::SetDroppedData [normalise_data $type $data] - set action [::tkdnd::generic::HandleDrop $drop_target {} \ - $pressedkeys $rootX $rootY 0] - if {$::tkdnd::_auto_update} {update idletasks} - return $action -};# olednd::HandleDrop - -# ---------------------------------------------------------------------------- -# Command olednd::GetDataType -# ---------------------------------------------------------------------------- -proc olednd::GetDataType { drop_target typelist } { - foreach {drop_target common_drag_source_types common_drop_target_types} \ - [::tkdnd::generic::FindWindowWithCommonTypes $drop_target $typelist] {break} - lindex $common_drag_source_types 0 -};# olednd::GetDataType - -# ---------------------------------------------------------------------------- -# Command olednd::GetDragSourceCommonTypes -# ---------------------------------------------------------------------------- -proc olednd::GetDragSourceCommonTypes { drop_target } { - ::tkdnd::generic::GetDragSourceCommonTypes -};# olednd::GetDragSourceCommonTypes - -# ---------------------------------------------------------------------------- -# Command olednd::platform_specific_types -# ---------------------------------------------------------------------------- -proc olednd::platform_specific_types { types } { - ::tkdnd::generic::platform_specific_types $types -}; # olednd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command olednd::platform_specific_type -# ---------------------------------------------------------------------------- -proc olednd::platform_specific_type { type } { - ::tkdnd::generic::platform_specific_type $type -}; # olednd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - ::tkdnd::generic::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command olednd::platform_independent_type -# ---------------------------------------------------------------------------- -proc olednd::platform_independent_type { type } { - ::tkdnd::generic::platform_independent_type $type -}; # olednd::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command olednd::normalise_data -# ---------------------------------------------------------------------------- -proc olednd::normalise_data { type data } { - switch [lindex [::tkdnd::generic::platform_independent_type $type] 0] { - DND_Text {return $data} - DND_Files {return $data} - DND_HTML {return [encoding convertfrom utf-8 $data]} - default {return $data} - } -}; # olednd::normalise_data diff --git a/tkinterdnd2/tkdnd/win64/libtkdnd2.9.2.dll b/tkinterdnd2/tkdnd/win64/libtkdnd2.9.2.dll deleted file mode 100644 index c9cc5abbed923f273a5d22ca7590e45e771b11b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153600 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Ξ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 {tkdnd::_begin_drag press 1 %W %s %X %Y %x %y} - bind TkDND_Drag1 {tkdnd::_begin_drag motion 1 %W %s %X %Y %x %y} - bind TkDND_Drag2 {tkdnd::_begin_drag press 2 %W %s %X %Y %x %y} - bind TkDND_Drag2 {tkdnd::_begin_drag motion 2 %W %s %X %Y %x %y} - bind TkDND_Drag3 {tkdnd::_begin_drag press 3 %W %s %X %Y %x %y} - bind TkDND_Drag3 {tkdnd::_begin_drag motion 3 %W %s %X %Y %x %y} - - # ---------------------------------------------------------------------------- - # Command tkdnd::initialise: Initialise the TkDND package. - # ---------------------------------------------------------------------------- - proc initialise { dir PKG_LIB_FILE PACKAGE_NAME} { - variable _platform_namespace - variable _drop_file_temp_dir - variable _windowingsystem - global env - - switch [tk windowingsystem] { - x11 { - set _windowingsystem x11 - } - win32 - - windows { - set _windowingsystem windows - } - aqua { - set _windowingsystem aqua - } - default { - error "unknown Tk windowing system" - } - } - - ## Get User's home directory: We try to locate the proper path from a set of - ## environmental variables... - foreach var {HOME HOMEPATH USERPROFILE ALLUSERSPROFILE APPDATA} { - if {[info exists env($var)]} { - if {[file isdirectory $env($var)]} { - set UserHomeDir $env($var) - break - } - } - } - - ## Should use [tk windowingsystem] instead of tcl platform array: - ## OS X returns "unix," but that's not useful because it has its own - ## windowing system, aqua - ## Under windows we have to also combine HOMEDRIVE & HOMEPATH... - if {![info exists UserHomeDir] && - [string equal $_windowingsystem windows] && - [info exists env(HOMEDRIVE)] && [info exists env(HOMEPATH)]} { - if {[file isdirectory $env(HOMEDRIVE)$env(HOMEPATH)]} { - set UserHomeDir $env(HOMEDRIVE)$env(HOMEPATH) - } - } - ## Have we located the needed path? - if {![info exists UserHomeDir]} { - set UserHomeDir [pwd] - } - set UserHomeDir [file normalize $UserHomeDir] - - ## Try to locate a temporary directory... - foreach var {TKDND_TEMP_DIR TEMP TMP} { - if {[info exists env($var)]} { - if {[file isdirectory $env($var)] && [file writable $env($var)]} { - set _drop_file_temp_dir $env($var) - break - } - } - } - if {![info exists _drop_file_temp_dir]} { - foreach _dir [list "$UserHomeDir/Local Settings/Temp" \ - "$UserHomeDir/AppData/Local/Temp" \ - /tmp \ - C:/WINDOWS/Temp C:/Temp C:/tmp \ - D:/WINDOWS/Temp D:/Temp D:/tmp] { - if {[file isdirectory $_dir] && [file writable $_dir]} { - set _drop_file_temp_dir $_dir - break - } - } - } - if {![info exists _drop_file_temp_dir]} { - set _drop_file_temp_dir $UserHomeDir - } - set _drop_file_temp_dir [file native $_drop_file_temp_dir] - - source $dir/tkdnd_generic.tcl - switch $_windowingsystem { - x11 { - source $dir/tkdnd_unix.tcl - set _platform_namespace xdnd - } - win32 - - windows { - source $dir/tkdnd_windows.tcl - set _platform_namespace olednd - } - aqua { - source $dir/tkdnd_macosx.tcl - set _platform_namespace macdnd - } - default { - error "unknown Tk windowing system" - } - } - load $dir/$PKG_LIB_FILE $PACKAGE_NAME - source $dir/tkdnd_compat.tcl - ${_platform_namespace}::initialise - };# initialise - - proc GetDropFileTempDirectory { } { - variable _drop_file_temp_dir - return $_drop_file_temp_dir - } - proc SetDropFileTempDirectory { dir } { - variable _drop_file_temp_dir - set _drop_file_temp_dir $dir - } - -};# namespace ::tkdnd - -# ---------------------------------------------------------------------------- -# Command tkdnd::drag_source -# ---------------------------------------------------------------------------- -proc ::tkdnd::drag_source { mode path { types {} } { event 1 } - { tagprefix TkDND_Drag } } { - set tags [bindtags $path] - set idx [lsearch $tags ${tagprefix}$event] - switch -- $mode { - register { - if { $idx != -1 } { - ## No need to do anything! - # bindtags $path [lreplace $tags $idx $idx ${tagprefix}$event] - } else { - bindtags $path [linsert $tags 1 ${tagprefix}$event] - } - _drag_source_update_types $path $types - } - unregister { - if { $idx != -1 } { - bindtags $path [lreplace $tags $idx $idx] - } - } - } -};# tkdnd::drag_source - -proc ::tkdnd::_drag_source_update_types { path types } { - set types [platform_specific_types $types] - set old_types [bind $path <>] - foreach type $types { - if {[lsearch $old_types $type] < 0} {lappend old_types $type} - } - bind $path <> $old_types -};# ::tkdnd::_drag_source_update_types - -# ---------------------------------------------------------------------------- -# Command tkdnd::drop_target -# ---------------------------------------------------------------------------- -proc ::tkdnd::drop_target { mode path { types {} } } { - variable _windowingsystem - set types [platform_specific_types $types] - switch -- $mode { - register { - switch $_windowingsystem { - x11 { - _register_types $path [winfo toplevel $path] $types - } - win32 - - windows { - _RegisterDragDrop $path - bind $path {+ tkdnd::_RevokeDragDrop %W} - } - aqua { - macdnd::registerdragwidget [winfo toplevel $path] $types - } - default { - error "unknown Tk windowing system" - } - } - set old_types [bind $path <>] - set new_types {} - foreach type $types { - if {[lsearch -exact $old_types $type] < 0} {lappend new_types $type} - } - if {[llength $new_types]} { - bind $path <> [concat $old_types $new_types] - } - } - unregister { - switch $_windowingsystem { - x11 { - } - win32 - - windows { - _RevokeDragDrop $path - } - aqua { - error todo - } - default { - error "unknown Tk windowing system" - } - } - bind $path <> {} - } - } -};# tkdnd::drop_target - -# ---------------------------------------------------------------------------- -# Command tkdnd::_begin_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::_begin_drag { event button source state X Y x y } { - variable _x0 - variable _y0 - variable _state - - switch -- $event { - press { - set _x0 $X - set _y0 $Y - set _state "press" - } - motion { - if { ![info exists _state] } { - # This is just extra protection. There seem to be - # rare cases where the motion comes before the press. - return - } - if { [string equal $_state "press"] } { - variable _dx - variable _dy - if { abs($_x0-$X) > ${_dx} || abs($_y0-$Y) > ${_dy} } { - set _state "done" - _init_drag $button $source $state $X $Y $x $y - } - } - } - } -};# tkdnd::_begin_drag - -# ---------------------------------------------------------------------------- -# Command tkdnd::_init_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::_init_drag { button source state rootX rootY X Y } { - # Call the <> binding. - set cmd [bind $source <>] - # puts "CMD: $cmd" - if {[string length $cmd]} { - set cmd [string map [list %W $source %X $rootX %Y $rootY %x $X %y $Y \ - %S $state %e <> %A \{\} %% % \ - %t [bind $source <>]] $cmd] - set code [catch {uplevel \#0 $cmd} info options] - # puts "CODE: $code ---- $info" - switch -exact -- $code { - 0 {} - 3 - 4 { - # FRINK: nocheck - return - } - default { - return -options $options $info - } - } - - set len [llength $info] - if {$len == 3} { - foreach { actions types _data } $info { break } - set types [platform_specific_types $types] - set data [list] - foreach type $types { - lappend data $_data - } - unset _data - } elseif {$len == 2} { - foreach { actions _data } $info { break } - set data [list]; set types [list] - foreach {t d} $_data { - foreach t [platform_specific_types $t] { - lappend types $t; lappend data $d - } - } - unset _data t d - } else { - if {$len == 1 && [string equal [lindex $actions 0] "refuse_drop"]} { - return - } - error "not enough items in the result of the <>\ - event binding. Either 2 or 3 items are expected. The command - executed was: \"$cmd\"\nResult was: \"$info\"" - } - set action refuse_drop - variable _windowingsystem - # puts "Source: \"$source\"" - # puts "Types: \"[join $types {", "}]\"" - # puts "Actions: \"[join $actions {", "}]\"" - # puts "Button: \"$button\"" - # puts "Data: \"[string range $data 0 100]\"" - switch $_windowingsystem { - x11 { - set action [xdnd::_dodragdrop $source $actions $types $data $button] - } - win32 - - windows { - set action [_DoDragDrop $source $actions $types $data $button] - } - aqua { - set action [macdnd::dodragdrop $source $actions $types $data $button] - } - default { - error "unknown Tk windowing system" - } - } - ## Call _end_drag to notify the widget of the result of the drag - ## operation... - _end_drag $button $source {} $action {} $data {} $state $rootX $rootY $X $Y - } -};# tkdnd::_init_drag - -# ---------------------------------------------------------------------------- -# Command tkdnd::_end_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::_end_drag { button source target action type data result - state rootX rootY X Y } { - set rootX 0 - set rootY 0 - # Call the <> binding. - set cmd [bind $source <>] - if {[string length $cmd]} { - set cmd [string map [list %W $source %X $rootX %Y $rootY %x $X %y $Y %% % \ - %S $state %e <> %A \{$action\}] $cmd] - set info [uplevel \#0 $cmd] - # if { $info != "" } { - # variable _windowingsystem - # foreach { actions types data } $info { break } - # set types [platform_specific_types $types] - # switch $_windowingsystem { - # x11 { - # error "dragging from Tk widgets not yet supported" - # } - # win32 - - # windows { - # set action [_DoDragDrop $source $actions $types $data $button] - # } - # aqua { - # macdnd::dodragdrop $source $actions $types $data - # } - # default { - # error "unknown Tk windowing system" - # } - # } - # ## Call _end_drag to notify the widget of the result of the drag - # ## operation... - # _end_drag $button $source {} $action {} $data {} $state $rootX $rootY - # } - } -};# tkdnd::_end_drag - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_specific_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_specific_types { types } { - variable _platform_namespace - ${_platform_namespace}::platform_specific_types $types -}; # tkdnd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - variable _platform_namespace - ${_platform_namespace}::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_specific_type -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_specific_type { type } { - variable _platform_namespace - ${_platform_namespace}::platform_specific_type $type -}; # tkdnd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_type -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_type { type } { - variable _platform_namespace - ${_platform_namespace}::platform_independent_type $type -}; # tkdnd::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::bytes_to_string -# ---------------------------------------------------------------------------- -proc ::tkdnd::bytes_to_string { bytes } { - set string {} - foreach byte $bytes { - append string [binary format c $byte] - } - return $string -};# tkdnd::bytes_to_string - -# ---------------------------------------------------------------------------- -# Command tkdnd::urn_unquote -# ---------------------------------------------------------------------------- -proc ::tkdnd::urn_unquote {url} { - set result "" - set start 0 - while {[regexp -start $start -indices {%[0-9a-fA-F]{2}} $url match]} { - foreach {first last} $match break - append result [string range $url $start [expr {$first - 1}]] - append result [format %c 0x[string range $url [incr first] $last]] - set start [incr last] - } - append result [string range $url $start end] - return [encoding convertfrom utf-8 $result] -};# tkdnd::urn_unquote diff --git a/tkinterdnd2/tkdnd/win64/tkdnd2.9.2.lib b/tkinterdnd2/tkdnd/win64/tkdnd2.9.2.lib deleted file mode 100644 index c5a956bfdf01319ce0574a1ae86e13454ce22a5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2064 zcmcIl&2G~`5dQ2W0wRP$L82F=R8;&NaDE!MjZ}dPMG)0ZtHiz5P2-kYq)k=Axwo89 z4}E~V01rXWJt1-A$brWQGxn}y<3MVptg<^hv*Vq=Z#Hu)t<(15i)4!8jP@sA=74|ab)PH9t7H?P(1UMmog+CH7x#|)JyV*!(G^f)+ zL4rdlO}b4lEd>~I`Y8-)JWzm}ltCVvv%mN0{e08sfVZ^yEEz!!vp^p&g=pzZsAM+vx-wwPK91|5gv`(*`vq=$D)<^y5^i>Z* zUp+_J-SG%={G(tEA!tDg89`qpBPb(iipaQ5r5}%O04z%Tpw-2J2b zbeS&hUhcl|Fkr~;t4KNP{g8~HtT&|`Unjqh$c;%aX2LhFQXRdRAbbK&pWityB|iY6 aKdgB7C+-J*VZ60DvZVypf`5lG7Jmcz8jGp` diff --git a/tkinterdnd2/tkdnd/win64/tkdnd_compat.tcl b/tkinterdnd2/tkdnd/win64/tkdnd_compat.tcl deleted file mode 100644 index efc96f7..0000000 --- a/tkinterdnd2/tkdnd/win64/tkdnd_compat.tcl +++ /dev/null @@ -1,160 +0,0 @@ -# -# tkdnd_compat.tcl -- -# -# This file implements some utility procedures, to support older versions -# of the TkDND package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval compat { - -};# namespace compat - -# ---------------------------------------------------------------------------- -# Command ::dnd -# ---------------------------------------------------------------------------- -proc ::dnd {method window args} { - switch $method { - bindtarget { - switch [llength $args] { - 0 {return [tkdnd::compat::bindtarget0 $window]} - 1 {return [tkdnd::compat::bindtarget1 $window [lindex $args 0]]} - 2 {return [tkdnd::compat::bindtarget2 $window [lindex $args 0] \ - [lindex $args 1]]} - 3 {return [tkdnd::compat::bindtarget3 $window [lindex $args 0] \ - [lindex $args 1] [lindex $args 2]]} - 4 {return [tkdnd::compat::bindtarget4 $window [lindex $args 0] \ - [lindex $args 1] [lindex $args 2] [lindex $args 3]]} - } - } - cleartarget { - return [tkdnd::compat::cleartarget $window] - } - bindsource { - switch [llength $args] { - 0 {return [tkdnd::compat::bindsource0 $window]} - 1 {return [tkdnd::compat::bindsource1 $window [lindex $args 0]]} - 2 {return [tkdnd::compat::bindsource2 $window [lindex $args 0] \ - [lindex $args 1]]} - 3 {return [tkdnd::compat::bindsource3 $window [lindex $args 0] \ - [lindex $args 1] [lindex $args 2]]} - } - } - clearsource { - return [tkdnd::compat::clearsource $window] - } - drag { - return [tkdnd::_init_drag 1 $window "press" 0 0 0 0] - } - } - error "invalid number of arguments!" -};# ::dnd - -# ---------------------------------------------------------------------------- -# Command compat::bindtarget -# ---------------------------------------------------------------------------- -proc compat::bindtarget0 {window} { - return [bind $window <>] -};# compat::bindtarget0 - -proc compat::bindtarget1 {window type} { - return [bindtarget2 $window $type ] -};# compat::bindtarget1 - -proc compat::bindtarget2 {window type event} { - switch $event { - {return [bind $window <>]} - {return [bind $window <>]} - {return [bind $window <>]} - {return [bind $window <>]} - } -};# compat::bindtarget2 - -proc compat::bindtarget3 {window type event script} { - set type [normalise_type $type] - ::tkdnd::drop_target register $window [list $type] - switch $event { - {return [bind $window <> $script]} - {return [bind $window <> $script]} - {return [bind $window <> $script]} - {return [bind $window <> $script]} - } -};# compat::bindtarget3 - -proc compat::bindtarget4 {window type event script priority} { - return [bindtarget3 $window $type $event $script] -};# compat::bindtarget4 - -proc compat::normalise_type { type } { - switch $type { - text/plain - - {text/plain;charset=UTF-8} - - Text {return DND_Text} - text/uri-list - - Files {return DND_Files} - default {return $type} - } -};# compat::normalise_type - -# ---------------------------------------------------------------------------- -# Command compat::bindsource -# ---------------------------------------------------------------------------- -proc compat::bindsource0 {window} { - return [bind $window <>] -};# compat::bindsource0 - -proc compat::bindsource1 {window type} { - return [bindsource2 $window $type ] -};# compat::bindsource1 - -proc compat::bindsource2 {window type script} { - set type [normalise_type $type] - ::tkdnd::drag_source register $window $type - bind $window <> "list {copy} {%t} \[$script\]" -};# compat::bindsource2 - -proc compat::bindsource3 {window type script priority} { - return [bindsource2 $window $type $script] -};# compat::bindsource3 - -# ---------------------------------------------------------------------------- -# Command compat::cleartarget -# ---------------------------------------------------------------------------- -proc compat::cleartarget {window} { -};# compat::cleartarget - -# ---------------------------------------------------------------------------- -# Command compat::clearsource -# ---------------------------------------------------------------------------- -proc compat::clearsource {window} { -};# compat::clearsource diff --git a/tkinterdnd2/tkdnd/win64/tkdnd_generic.tcl b/tkinterdnd2/tkdnd/win64/tkdnd_generic.tcl deleted file mode 100644 index 698b464..0000000 --- a/tkinterdnd2/tkdnd/win64/tkdnd_generic.tcl +++ /dev/null @@ -1,520 +0,0 @@ -# -# tkdnd_generic.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval generic { - variable _types {} - variable _typelist {} - variable _codelist {} - variable _actionlist {} - variable _pressedkeys {} - variable _action {} - variable _common_drag_source_types {} - variable _common_drop_target_types {} - variable _drag_source {} - variable _drop_target {} - - variable _last_mouse_root_x 0 - variable _last_mouse_root_y 0 - - variable _tkdnd2platform - variable _platform2tkdnd - - proc debug {msg} { - puts $msg - };# debug - - proc initialise { } { - };# initialise - - proc initialise_platform_to_tkdnd_types { types } { - variable _platform2tkdnd - variable _tkdnd2platform - set _platform2tkdnd [dict create {*}$types] - set _tkdnd2platform [dict create] - foreach type [dict keys $_platform2tkdnd] { - dict lappend _tkdnd2platform [dict get $_platform2tkdnd $type] $type - } - };# initialise_platform_to_tkdnd_types - - proc initialise_tkdnd_to_platform_types { types } { - variable _tkdnd2platform - set _tkdnd2platform [dict create {*}$types] - };# initialise_tkdnd_to_platform_types - -};# namespace generic - -# ---------------------------------------------------------------------------- -# Command generic::HandleEnter -# ---------------------------------------------------------------------------- -proc generic::HandleEnter { drop_target drag_source typelist codelist - actionlist pressedkeys } { - variable _typelist; set _typelist $typelist - variable _pressedkeys; set _pressedkeys $pressedkeys - variable _action; set _action refuse_drop - variable _common_drag_source_types; set _common_drag_source_types {} - variable _common_drop_target_types; set _common_drop_target_types {} - variable _actionlist - variable _drag_source; set _drag_source $drag_source - variable _drop_target; set _drop_target {} - variable _actionlist; set _actionlist $actionlist - variable _codelist set _codelist $codelist - - variable _last_mouse_root_x; set _last_mouse_root_x 0 - variable _last_mouse_root_y; set _last_mouse_root_y 0 - # debug "\n===============================================================" - # debug "generic::HandleEnter: drop_target=$drop_target,\ - # drag_source=$drag_source,\ - # typelist=$typelist" - # debug "generic::HandleEnter: ACTION: default" - return default -};# generic::HandleEnter - -# ---------------------------------------------------------------------------- -# Command generic::HandlePosition -# ---------------------------------------------------------------------------- -proc generic::HandlePosition { drop_target drag_source pressedkeys - rootX rootY { time 0 } } { - variable _types - variable _typelist - variable _codelist - variable _actionlist - variable _pressedkeys - variable _action - variable _common_drag_source_types - variable _common_drop_target_types - variable _drag_source - variable _drop_target - - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - - # debug "generic::HandlePosition: drop_target=$drop_target,\ - # _drop_target=$_drop_target, rootX=$rootX, rootY=$rootY" - - if {![info exists _drag_source] && ![string length $_drag_source]} { - # debug "generic::HandlePosition: no or empty _drag_source:\ - # return refuse_drop" - return refuse_drop - } - - if {$drag_source ne "" && $drag_source ne $_drag_source} { - debug "generic position event from unexpected source: $_drag_source\ - != $drag_source" - return refuse_drop - } - - set _pressedkeys $pressedkeys - - ## Does the new drop target support any of our new types? - # foreach {common_drag_source_types common_drop_target_types} \ - # [GetWindowCommonTypes $drop_target $_typelist] {break} - foreach {drop_target common_drag_source_types common_drop_target_types} \ - [FindWindowWithCommonTypes $drop_target $_typelist] {break} - set data [GetDroppedData $time] - - # debug "\t($_drop_target) -> ($drop_target)" - if {$drop_target != $_drop_target} { - if {[string length $_drop_target]} { - ## Call the <> event. - # debug "\t<> on $_drop_target" - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A \{$_action\} %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D \{\} %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - uplevel \#0 $cmd - } - } - set _drop_target $drop_target - set _action refuse_drop - - if {[llength $common_drag_source_types]} { - set _action [lindex $_actionlist 0] - set _common_drag_source_types $common_drag_source_types - set _common_drop_target_types $common_drop_target_types - ## Drop target supports at least one type. Send a <>. - # puts "<> -> $drop_target" - set cmd [bind $drop_target <>] - if {[string length $cmd]} { - focus $drop_target - set cmd [string map [list %W $drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - } - } - } - - set _drop_target {} - if {[llength $common_drag_source_types]} { - set _common_drag_source_types $common_drag_source_types - set _common_drop_target_types $common_drop_target_types - set _drop_target $drop_target - ## Drop target supports at least one type. Send a <>. - set cmd [bind $drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - } - } - # Return values: copy, move, link, ask, private, refuse_drop, default - # debug "generic::HandlePosition: ACTION: $_action" - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - return $_action -};# generic::HandlePosition - -# ---------------------------------------------------------------------------- -# Command generic::HandleLeave -# ---------------------------------------------------------------------------- -proc generic::HandleLeave { } { - variable _types - variable _typelist - variable _codelist - variable _actionlist - variable _pressedkeys - variable _action - variable _common_drag_source_types - variable _common_drop_target_types - variable _drag_source - variable _drop_target - variable _last_mouse_root_x - variable _last_mouse_root_y - if {![info exists _drop_target]} {set _drop_target {}} - # debug "generic::HandleLeave: _drop_target=$_drop_target" - if {[info exists _drop_target] && [string length $_drop_target]} { - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target \ - %X $_last_mouse_root_x %Y $_last_mouse_root_y \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A \{$_action\} %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D \{\} %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - } - } - foreach var {_types _typelist _actionlist _pressedkeys _action - _common_drag_source_types _common_drop_target_types - _drag_source _drop_target} { - set $var {} - } -};# generic::HandleLeave - -# ---------------------------------------------------------------------------- -# Command generic::HandleDrop -# ---------------------------------------------------------------------------- -proc generic::HandleDrop {drop_target drag_source pressedkeys rootX rootY time } { - variable _types - variable _typelist - variable _codelist - variable _actionlist - variable _pressedkeys - variable _action - variable _common_drag_source_types - variable _common_drop_target_types - variable _drag_source - variable _drop_target - variable _last_mouse_root_x - variable _last_mouse_root_y - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - - set _pressedkeys $pressedkeys - - # puts "generic::HandleDrop: $time" - - if {![info exists _drag_source] && ![string length $_drag_source]} { - return refuse_drop - } - if {![info exists _drop_target] && ![string length $_drop_target]} { - return refuse_drop - } - if {![llength $_common_drag_source_types]} {return refuse_drop} - ## Get the dropped data. - set data [GetDroppedData $time] - ## Try to select the most specific <> event. - foreach type [concat $_common_drag_source_types $_common_drop_target_types] { - set type [platform_independent_type $type] - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - # Return values: copy, move, link, ask, private, refuse_drop - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - return $_action - } - } - set cmd [bind $_drop_target <>] - if {[string length $cmd]} { - set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \ - %CST \{$_common_drag_source_types\} \ - %CTT \{$_common_drop_target_types\} \ - %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \ - %ST \{$_typelist\} %TT \{$_types\} \ - %A $_action %a \{$_actionlist\} \ - %b \{$_pressedkeys\} %m \{$_pressedkeys\} \ - %D [list $data] %e <> \ - %L \{$_typelist\} %% % \ - %t \{$_typelist\} %T \{[lindex $_common_drag_source_types 0]\} \ - %c \{$_codelist\} %C \{[lindex $_codelist 0]\} \ - ] $cmd] - set _action [uplevel \#0 $cmd] - } - # Return values: copy, move, link, ask, private, refuse_drop - switch -exact -- $_action { - copy - move - link - ask - private - refuse_drop - default {} - default {set _action copy} - } - return $_action -};# generic::HandleDrop - -# ---------------------------------------------------------------------------- -# Command generic::GetWindowCommonTypes -# ---------------------------------------------------------------------------- -proc generic::GetWindowCommonTypes { win typelist } { - set types [bind $win <>] - # debug ">> Accepted types: $win $_types" - set common_drag_source_types {} - set common_drop_target_types {} - if {[llength $types]} { - ## Examine the drop target types, to find at least one match with the drag - ## source types... - set supported_types [supported_types $typelist] - foreach type $types { - foreach matched [lsearch -glob -all -inline $supported_types $type] { - ## Drop target supports this type. - lappend common_drag_source_types $matched - lappend common_drop_target_types $type - } - } - } - list $common_drag_source_types $common_drop_target_types -};# generic::GetWindowCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::FindWindowWithCommonTypes -# ---------------------------------------------------------------------------- -proc generic::FindWindowWithCommonTypes { win typelist } { - set toplevel [winfo toplevel $win] - while {![string equal $win $toplevel]} { - foreach {common_drag_source_types common_drop_target_types} \ - [GetWindowCommonTypes $win $typelist] {break} - if {[llength $common_drag_source_types]} { - return [list $win $common_drag_source_types $common_drop_target_types] - } - set win [winfo parent $win] - } - ## We have reached the toplevel, which may be also a target (SF Bug #30) - foreach {common_drag_source_types common_drop_target_types} \ - [GetWindowCommonTypes $win $typelist] {break} - if {[llength $common_drag_source_types]} { - return [list $win $common_drag_source_types $common_drop_target_types] - } - return { {} {} {} } -};# generic::FindWindowWithCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::GetDroppedData -# ---------------------------------------------------------------------------- -proc generic::GetDroppedData { time } { - variable _dropped_data - return $_dropped_data -};# generic::GetDroppedData - -# ---------------------------------------------------------------------------- -# Command generic::SetDroppedData -# ---------------------------------------------------------------------------- -proc generic::SetDroppedData { data } { - variable _dropped_data - set _dropped_data $data -};# generic::SetDroppedData - -# ---------------------------------------------------------------------------- -# Command generic::GetDragSource -# ---------------------------------------------------------------------------- -proc generic::GetDragSource { } { - variable _drag_source - return $_drag_source -};# generic::GetDragSource - -# ---------------------------------------------------------------------------- -# Command generic::GetDropTarget -# ---------------------------------------------------------------------------- -proc generic::GetDropTarget { } { - variable _drop_target - return $_drop_target -};# generic::GetDropTarget - -# ---------------------------------------------------------------------------- -# Command generic::GetDragSourceCommonTypes -# ---------------------------------------------------------------------------- -proc generic::GetDragSourceCommonTypes { } { - variable _common_drag_source_types - return $_common_drag_source_types -};# generic::GetDragSourceCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::GetDropTargetCommonTypes -# ---------------------------------------------------------------------------- -proc generic::GetDropTargetCommonTypes { } { - variable _common_drag_source_types - return $_common_drag_source_types -};# generic::GetDropTargetCommonTypes - -# ---------------------------------------------------------------------------- -# Command generic::platform_specific_types -# ---------------------------------------------------------------------------- -proc generic::platform_specific_types { types } { - set new_types {} - foreach type $types { - set new_types [concat $new_types [platform_specific_type $type]] - } - return $new_types -}; # generic::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command generic::platform_specific_type -# ---------------------------------------------------------------------------- -proc generic::platform_specific_type { type } { - variable _tkdnd2platform - if {[dict exists $_tkdnd2platform $type]} { - return [dict get $_tkdnd2platform $type] - } - list $type -}; # generic::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - set new_types {} - foreach type $types { - set new_types [concat $new_types [platform_independent_type $type]] - } - return $new_types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command generic::platform_independent_type -# ---------------------------------------------------------------------------- -proc generic::platform_independent_type { type } { - variable _platform2tkdnd - if {[dict exists $_platform2tkdnd $type]} { - return [dict get $_platform2tkdnd $type] - } - return $type -}; # generic::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command generic::supported_types -# ---------------------------------------------------------------------------- -proc generic::supported_types { types } { - set new_types {} - foreach type $types { - if {[supported_type $type]} {lappend new_types $type} - } - return $new_types -}; # generic::supported_types - -# ---------------------------------------------------------------------------- -# Command generic::supported_type -# ---------------------------------------------------------------------------- -proc generic::supported_type { type } { - variable _platform2tkdnd - if {[dict exists $_platform2tkdnd $type]} { - return 1 - } - return 0 -}; # generic::supported_type diff --git a/tkinterdnd2/tkdnd/win64/tkdnd_macosx.tcl b/tkinterdnd2/tkdnd/win64/tkdnd_macosx.tcl deleted file mode 100644 index 307f6da..0000000 --- a/tkinterdnd2/tkdnd/win64/tkdnd_macosx.tcl +++ /dev/null @@ -1,144 +0,0 @@ -# -# tkdnd_macosx.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. - -# This software is copyrighted by: -# Georgios Petasis, Athens, Greece. -# e-mail: petasisg@yahoo.gr, petasis@iit.demokritos.gr -# -# Mac portions (c) 2009 Kevin Walzer/WordTech Communications LLC, -# kw@codebykevin.com -# -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -#basic API for Mac Drag and Drop - -#two data types supported: strings and file paths - -#two commands at C level: ::tkdnd::macdnd::registerdragwidget, ::tkdnd::macdnd::unregisterdragwidget - -#data retrieval mechanism: text or file paths are copied from drag clipboard to system clipboard and retrieved via [clipboard get]; array of file paths is converted to single tab-separated string, can be split into Tcl list - -if {[tk windowingsystem] eq "aqua" && "AppKit" ni [winfo server .]} { - error {TkAqua Cocoa required} -} - -namespace eval macdnd { - - proc initialise { } { - ## Mapping from platform types to TkDND types... - ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \ - NSPasteboardTypeString DND_Text \ - NSFilenamesPboardType DND_Files \ - NSPasteboardTypeHTML DND_HTML \ - ] - };# initialise - -};# namespace macdnd - -# ---------------------------------------------------------------------------- -# Command macdnd::HandleEnter -# ---------------------------------------------------------------------------- -proc macdnd::HandleEnter { path drag_source typelist { data {} } } { - variable _pressedkeys - variable _actionlist - set _pressedkeys 1 - set _actionlist { copy move link ask private } - ::tkdnd::generic::SetDroppedData $data - ::tkdnd::generic::HandleEnter $path $drag_source $typelist $typelist \ - $_actionlist $_pressedkeys -};# macdnd::HandleEnter - -# ---------------------------------------------------------------------------- -# Command macdnd::HandlePosition -# ---------------------------------------------------------------------------- -proc macdnd::HandlePosition { drop_target rootX rootY {drag_source {}} } { - variable _pressedkeys - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - ::tkdnd::generic::HandlePosition $drop_target $drag_source \ - $_pressedkeys $rootX $rootY -};# macdnd::HandlePosition - -# ---------------------------------------------------------------------------- -# Command macdnd::HandleLeave -# ---------------------------------------------------------------------------- -proc macdnd::HandleLeave { args } { - ::tkdnd::generic::HandleLeave -};# macdnd::HandleLeave - -# ---------------------------------------------------------------------------- -# Command macdnd::HandleDrop -# ---------------------------------------------------------------------------- -proc macdnd::HandleDrop { drop_target data args } { - variable _pressedkeys - variable _last_mouse_root_x - variable _last_mouse_root_y - ## Get the dropped data... - ::tkdnd::generic::SetDroppedData $data - ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \ - $_last_mouse_root_x $_last_mouse_root_y 0 -};# macdnd::HandleDrop - -# ---------------------------------------------------------------------------- -# Command macdnd::GetDragSourceCommonTypes -# ---------------------------------------------------------------------------- -proc macdnd::GetDragSourceCommonTypes { } { - ::tkdnd::generic::GetDragSourceCommonTypes -};# macdnd::GetDragSourceCommonTypes - -# ---------------------------------------------------------------------------- -# Command macdnd::platform_specific_types -# ---------------------------------------------------------------------------- -proc macdnd::platform_specific_types { types } { - ::tkdnd::generic::platform_specific_types $types -}; # macdnd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command macdnd::platform_specific_type -# ---------------------------------------------------------------------------- -proc macdnd::platform_specific_type { type } { - ::tkdnd::generic::platform_specific_type $type -}; # macdnd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - ::tkdnd::generic::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command macdnd::platform_independent_type -# ---------------------------------------------------------------------------- -proc macdnd::platform_independent_type { type } { - ::tkdnd::generic::platform_independent_type $type -}; # macdnd::platform_independent_type diff --git a/tkinterdnd2/tkdnd/win64/tkdnd_unix.tcl b/tkinterdnd2/tkdnd/win64/tkdnd_unix.tcl deleted file mode 100644 index 56d17c4..0000000 --- a/tkinterdnd2/tkdnd/win64/tkdnd_unix.tcl +++ /dev/null @@ -1,810 +0,0 @@ -# -# tkdnd_unix.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval xdnd { - variable _dragging 0 - - proc initialise { } { - ## Mapping from platform types to TkDND types... - ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \ - text/plain\;charset=utf-8 DND_Text \ - UTF8_STRING DND_Text \ - text/plain DND_Text \ - STRING DND_Text \ - TEXT DND_Text \ - COMPOUND_TEXT DND_Text \ - text/uri-list DND_Files \ - text/html\;charset=utf-8 DND_HTML \ - text/html DND_HTML \ - application/x-color DND_Color \ - ] - };# initialise - -};# namespace xdnd - -# ---------------------------------------------------------------------------- -# Command xdnd::HandleXdndEnter -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndEnter { path drag_source typelist time { data {} } } { - variable _pressedkeys - variable _actionlist - variable _typelist - set _pressedkeys 1 - set _actionlist { copy move link ask private } - set _typelist $typelist - # puts "xdnd::HandleXdndEnter: $time" - ::tkdnd::generic::SetDroppedData $data - ::tkdnd::generic::HandleEnter $path $drag_source $typelist $typelist \ - $_actionlist $_pressedkeys -};# xdnd::HandleXdndEnter - -# ---------------------------------------------------------------------------- -# Command xdnd::HandleXdndPosition -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndPosition { drop_target rootX rootY time {drag_source {}} } { - variable _pressedkeys - variable _typelist - variable _last_mouse_root_x; set _last_mouse_root_x $rootX - variable _last_mouse_root_y; set _last_mouse_root_y $rootY - # puts "xdnd::HandleXdndPosition: $time" - ## Get the dropped data... - catch { - ::tkdnd::generic::SetDroppedData [GetPositionData $drop_target $_typelist $time] - } - ::tkdnd::generic::HandlePosition $drop_target $drag_source \ - $_pressedkeys $rootX $rootY -};# xdnd::HandleXdndPosition - -# ---------------------------------------------------------------------------- -# Command xdnd::HandleXdndLeave -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndLeave { } { - ::tkdnd::generic::HandleLeave -};# xdnd::HandleXdndLeave - -# ---------------------------------------------------------------------------- -# Command xdnd::_HandleXdndDrop -# ---------------------------------------------------------------------------- -proc xdnd::HandleXdndDrop { time } { - variable _pressedkeys - variable _last_mouse_root_x - variable _last_mouse_root_y - ## Get the dropped data... - ::tkdnd::generic::SetDroppedData [GetDroppedData \ - [::tkdnd::generic::GetDragSource] [::tkdnd::generic::GetDropTarget] \ - [::tkdnd::generic::GetDragSourceCommonTypes] $time] - ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \ - $_last_mouse_root_x $_last_mouse_root_y $time -};# xdnd::HandleXdndDrop - -# ---------------------------------------------------------------------------- -# Command xdnd::GetPositionData -# ---------------------------------------------------------------------------- -proc xdnd::GetPositionData { drop_target typelist time } { - foreach {drop_target common_drag_source_types common_drop_target_types} \ - [::tkdnd::generic::FindWindowWithCommonTypes $drop_target $typelist] {break} - GetDroppedData [::tkdnd::generic::GetDragSource] $drop_target \ - $common_drag_source_types $time -};# xdnd::GetPositionData - -# ---------------------------------------------------------------------------- -# Command xdnd::GetDroppedData -# ---------------------------------------------------------------------------- -proc xdnd::GetDroppedData { _drag_source _drop_target _common_drag_source_types time } { - if {![llength $_common_drag_source_types]} { - error "no common data types between the drag source and drop target widgets" - } - ## Is drag source in this application? - if {[catch {winfo pathname -displayof $_drop_target $_drag_source} p]} { - set _use_tk_selection 0 - } else { - set _use_tk_selection 1 - } - foreach type $_common_drag_source_types { - # puts "TYPE: $type ($_drop_target)" - # _get_selection $_drop_target $time $type - if {$_use_tk_selection} { - if {![catch { - selection get -displayof $_drop_target -selection XdndSelection \ - -type $type - } result options]} { - return [normalise_data $type $result] - } - } else { - # puts "_selection_get -displayof $_drop_target -selection XdndSelection \ - # -type $type -time $time" - #after 100 [list focus -force $_drop_target] - #after 50 [list raise [winfo toplevel $_drop_target]] - if {![catch { - _selection_get -displayof $_drop_target -selection XdndSelection \ - -type $type -time $time - } result options]} { - return [normalise_data $type $result] - } - } - } - return -options $options $result -};# xdnd::GetDroppedData - -# ---------------------------------------------------------------------------- -# Command xdnd::platform_specific_types -# ---------------------------------------------------------------------------- -proc xdnd::platform_specific_types { types } { - ::tkdnd::generic::platform_specific_types $types -}; # xdnd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command xdnd::platform_specific_type -# ---------------------------------------------------------------------------- -proc xdnd::platform_specific_type { type } { - ::tkdnd::generic::platform_specific_type $type -}; # xdnd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - ::tkdnd::generic::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command xdnd::platform_independent_type -# ---------------------------------------------------------------------------- -proc xdnd::platform_independent_type { type } { - ::tkdnd::generic::platform_independent_type $type -}; # xdnd::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command xdnd::_normalise_data -# ---------------------------------------------------------------------------- -proc xdnd::normalise_data { type data } { - # Tk knows how to interpret the following types: - # STRING, TEXT, COMPOUND_TEXT - # UTF8_STRING - # Else, it returns a list of 8 or 32 bit numbers... - switch -glob $type { - STRING - UTF8_STRING - TEXT - COMPOUND_TEXT {return $data} - text/html { - if {[catch { - encoding convertfrom unicode $data - } string]} { - set string $data - } - return [string map {\r\n \n} $string] - } - text/html\;charset=utf-8 - - text/plain\;charset=utf-8 - - text/plain { - if {[catch { - encoding convertfrom utf-8 [tkdnd::bytes_to_string $data] - } string]} { - set string $data - } - return [string map {\r\n \n} $string] - } - text/uri-list* { - if {[catch { - encoding convertfrom utf-8 [tkdnd::bytes_to_string $data] - } string]} { - set string $data - } - ## Get rid of \r\n - set string [string trim [string map {\r\n \n} $string]] - set files {} - foreach quoted_file [split $string] { - set file [tkdnd::urn_unquote $quoted_file] - switch -glob $file { - \#* {} - file://* {lappend files [string range $file 7 end]} - ftp://* - - https://* - - http://* {lappend files $quoted_file} - default {lappend files $file} - } - } - return $files - } - application/x-color { - return $data - } - text/x-moz-url - - application/q-iconlist - - default {return $data} - } -}; # xdnd::normalise_data - -############################################################################# -## -## XDND drag implementation -## -############################################################################# - -# ---------------------------------------------------------------------------- -# Command xdnd::_selection_ownership_lost -# ---------------------------------------------------------------------------- -proc xdnd::_selection_ownership_lost {} { - variable _dragging - set _dragging 0 -};# _selection_ownership_lost - -# ---------------------------------------------------------------------------- -# Command xdnd::_dodragdrop -# ---------------------------------------------------------------------------- -proc xdnd::_dodragdrop { source actions types data button } { - variable _dragging - - # puts "xdnd::_dodragdrop: source: $source, actions: $actions, types: $types,\ - # data: \"$data\", button: $button" - if {$_dragging} { - ## We are in the middle of another drag operation... - error "another drag operation in progress" - } - - variable _dodragdrop_drag_source $source - variable _dodragdrop_drop_target 0 - variable _dodragdrop_drop_target_proxy 0 - variable _dodragdrop_actions $actions - variable _dodragdrop_action_descriptions $actions - variable _dodragdrop_actions_len [llength $actions] - variable _dodragdrop_types $types - variable _dodragdrop_types_len [llength $types] - variable _dodragdrop_data $data - variable _dodragdrop_transfer_data {} - variable _dodragdrop_button $button - variable _dodragdrop_time 0 - variable _dodragdrop_default_action refuse_drop - variable _dodragdrop_waiting_status 0 - variable _dodragdrop_drop_target_accepts_drop 0 - variable _dodragdrop_drop_target_accepts_action refuse_drop - variable _dodragdrop_current_cursor $_dodragdrop_default_action - variable _dodragdrop_drop_occured 0 - variable _dodragdrop_selection_requestor 0 - - ## - ## If we have more than 3 types, the property XdndTypeList must be set on - ## the drag source widget... - ## - if {$_dodragdrop_types_len > 3} { - _announce_type_list $_dodragdrop_drag_source $_dodragdrop_types - } - - ## - ## Announce the actions & their descriptions on the XdndActionList & - ## XdndActionDescription properties... - ## - _announce_action_list $_dodragdrop_drag_source $_dodragdrop_actions \ - $_dodragdrop_action_descriptions - - ## - ## Arrange selection handlers for our drag source, and all the supported types - ## - registerSelectionHandler $source $types - - ## - ## Step 1: When a drag begins, the source takes ownership of XdndSelection. - ## - selection own -command ::tkdnd::xdnd::_selection_ownership_lost \ - -selection XdndSelection $source - set _dragging 1 - - ## Grab the mouse pointer... - _grab_pointer $source $_dodragdrop_default_action - - ## Register our generic event handler... - # The generic event callback will report events by modifying variable - # ::xdnd::_dodragdrop_event: a dict with event information will be set as - # the value of the variable... - _register_generic_event_handler - - ## Set a timeout for debugging purposes... - # after 60000 {set ::tkdnd::xdnd::_dragging 0} - - tkwait variable ::tkdnd::xdnd::_dragging - _SendXdndLeave - - set _dragging 0 - _ungrab_pointer $source - _unregister_generic_event_handler - catch {selection clear -selection XdndSelection} - unregisterSelectionHandler $source $types - return $_dodragdrop_drop_target_accepts_action -};# xdnd::_dodragdrop - -# ---------------------------------------------------------------------------- -# Command xdnd::_process_drag_events -# ---------------------------------------------------------------------------- -proc xdnd::_process_drag_events {event} { - # The return value from proc is normally 0. A non-zero return value indicates - # that the event is not to be handled further; that is, proc has done all - # processing that is to be allowed for the event - variable _dragging - if {!$_dragging} {return 0} - # puts $event - - variable _dodragdrop_time - set time [dict get $event time] - set type [dict get $event type] - if {$time < $_dodragdrop_time && ![string equal $type SelectionRequest]} { - return 0 - } - set _dodragdrop_time $time - - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_default_action - switch $type { - MotionNotify { - set rootx [dict get $event x_root] - set rooty [dict get $event y_root] - set window [_find_drop_target_window $_dodragdrop_drag_source \ - $rootx $rooty] - if {[string length $window]} { - ## Examine the modifiers to suggest an action... - set _dodragdrop_default_action [_default_action $event] - ## Is it a Tk widget? - # set path [winfo containing $rootx $rooty] - # puts "Window under mouse: $window ($path)" - if {$_dodragdrop_drop_target != $window} { - ## Send XdndLeave to $_dodragdrop_drop_target - _SendXdndLeave - ## Is there a proxy? If not, _find_drop_target_proxy returns the - ## target window, so we always get a valid "proxy". - set proxy [_find_drop_target_proxy $_dodragdrop_drag_source $window] - ## Send XdndEnter to $window - _SendXdndEnter $window $proxy - ## Send XdndPosition to $_dodragdrop_drop_target - _SendXdndPosition $rootx $rooty $_dodragdrop_default_action - } else { - ## Send XdndPosition to $_dodragdrop_drop_target - _SendXdndPosition $rootx $rooty $_dodragdrop_default_action - } - } else { - ## No window under the mouse. Send XdndLeave to $_dodragdrop_drop_target - _SendXdndLeave - } - } - ButtonPress { - } - ButtonRelease { - variable _dodragdrop_button - set button [dict get $event button] - if {$button == $_dodragdrop_button} { - ## The button that initiated the drag was released. Trigger drop... - _SendXdndDrop - } - return 1 - } - KeyPress { - } - KeyRelease { - set keysym [dict get $event keysym] - switch $keysym { - Escape { - ## The user has pressed escape. Abort... - if {$_dragging} {set _dragging 0} - } - } - } - SelectionRequest { - variable _dodragdrop_selection_requestor - variable _dodragdrop_selection_property - variable _dodragdrop_selection_selection - variable _dodragdrop_selection_target - variable _dodragdrop_selection_time - set _dodragdrop_selection_requestor [dict get $event requestor] - set _dodragdrop_selection_property [dict get $event property] - set _dodragdrop_selection_selection [dict get $event selection] - set _dodragdrop_selection_target [dict get $event target] - set _dodragdrop_selection_time $time - return 0 - } - default { - return 0 - } - } - return 0 -};# _process_drag_events - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndEnter -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndEnter {window proxy} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_types - variable _dodragdrop_waiting_status - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_target > 0} _SendXdndLeave - if {$_dodragdrop_drop_occured} return - set _dodragdrop_drop_target $window - set _dodragdrop_drop_target_proxy $proxy - set _dodragdrop_waiting_status 0 - if {$_dodragdrop_drop_target < 1} return - # puts "XdndEnter: $_dodragdrop_drop_target $_dodragdrop_drop_target_proxy" - _send_XdndEnter $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy $_dodragdrop_types -};# xdnd::_SendXdndEnter - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndPosition -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndPosition {rootx rooty action} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - if {$_dodragdrop_drop_target < 1} return - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} return - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_waiting_status - ## Arrange a new XdndPosition, to be send periodically... - variable _dodragdrop_xdnd_position_heartbeat - catch {after cancel $_dodragdrop_xdnd_position_heartbeat} - set _dodragdrop_xdnd_position_heartbeat [after 200 \ - [list ::tkdnd::xdnd::_SendXdndPosition $rootx $rooty $action]] - if {$_dodragdrop_waiting_status} {return} - # puts "XdndPosition: $_dodragdrop_drop_target $rootx $rooty $action" - _send_XdndPosition $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy $rootx $rooty $action - set _dodragdrop_waiting_status 1 -};# xdnd::_SendXdndPosition - -# ---------------------------------------------------------------------------- -# Command xdnd::_HandleXdndStatus -# ---------------------------------------------------------------------------- -proc xdnd::_HandleXdndStatus {event} { - variable _dodragdrop_drop_target - variable _dodragdrop_waiting_status - - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - set _dodragdrop_waiting_status 0 - foreach key {target accept want_position action x y w h} { - set $key [dict get $event $key] - } - set _dodragdrop_drop_target_accepts_drop $accept - set _dodragdrop_drop_target_accepts_action $action - if {$_dodragdrop_drop_target < 1} return - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} return - _update_cursor - # puts "XdndStatus: $event" -};# xdnd::_HandleXdndStatus - -# ---------------------------------------------------------------------------- -# Command xdnd::_HandleXdndFinished -# ---------------------------------------------------------------------------- -proc xdnd::_HandleXdndFinished {event} { - variable _dodragdrop_xdnd_finished_event_after_id - catch {after cancel $_dodragdrop_xdnd_finished_event_after_id} - set _dodragdrop_xdnd_finished_event_after_id {} - variable _dodragdrop_drop_target - set _dodragdrop_drop_target 0 - variable _dragging - if {$_dragging} {set _dragging 0} - - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - if {[dict size $event]} { - foreach key {target accept action} { - set $key [dict get $event $key] - } - set _dodragdrop_drop_target_accepts_drop $accept - set _dodragdrop_drop_target_accepts_action $action - } else { - set _dodragdrop_drop_target_accepts_drop 0 - } - if {!$_dodragdrop_drop_target_accepts_drop} { - set _dodragdrop_drop_target_accepts_action refuse_drop - } - # puts "XdndFinished: $event" -};# xdnd::_HandleXdndFinished - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndLeave -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndLeave {} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - if {$_dodragdrop_drop_target < 1} return - variable _dodragdrop_drop_target_proxy - # puts "XdndLeave: $_dodragdrop_drop_target" - _send_XdndLeave $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy - set _dodragdrop_drop_target 0 - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - set _dodragdrop_drop_target_accepts_drop 0 - set _dodragdrop_drop_target_accepts_action refuse_drop - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} return - _update_cursor -};# xdnd::_SendXdndLeave - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendXdndDrop -# ---------------------------------------------------------------------------- -proc xdnd::_SendXdndDrop {} { - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target - if {$_dodragdrop_drop_target < 1} { - ## The mouse has been released over a widget that does not accept drops. - _HandleXdndFinished {} - return - } - variable _dodragdrop_drop_occured - if {$_dodragdrop_drop_occured} {return} - variable _dodragdrop_drop_target_proxy - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - - set _dodragdrop_drop_occured 1 - _update_cursor clock - - if {!$_dodragdrop_drop_target_accepts_drop} { - _SendXdndLeave - _HandleXdndFinished {} - return - } - # puts "XdndDrop: $_dodragdrop_drop_target" - variable _dodragdrop_drop_timestamp - set _dodragdrop_drop_timestamp [_send_XdndDrop \ - $_dodragdrop_drag_source $_dodragdrop_drop_target \ - $_dodragdrop_drop_target_proxy] - set _dodragdrop_drop_target 0 - # puts "XdndDrop: $_dodragdrop_drop_target" - ## Arrange a timeout for receiving XdndFinished... - variable _dodragdrop_xdnd_finished_event_after_id - set _dodragdrop_xdnd_finished_event_after_id \ - [after 10000 [list ::tkdnd::xdnd::_HandleXdndFinished {}]] -};# xdnd::_SendXdndDrop - -# ---------------------------------------------------------------------------- -# Command xdnd::_update_cursor -# ---------------------------------------------------------------------------- -proc xdnd::_update_cursor { {cursor {}}} { - # puts "_update_cursor $cursor" - variable _dodragdrop_current_cursor - variable _dodragdrop_drag_source - variable _dodragdrop_drop_target_accepts_drop - variable _dodragdrop_drop_target_accepts_action - - if {![string length $cursor]} { - set cursor refuse_drop - if {$_dodragdrop_drop_target_accepts_drop} { - set cursor $_dodragdrop_drop_target_accepts_action - } - } - if {![string equal $cursor $_dodragdrop_current_cursor]} { - _set_pointer_cursor $_dodragdrop_drag_source $cursor - set _dodragdrop_current_cursor $cursor - } -};# xdnd::_update_cursor - -# ---------------------------------------------------------------------------- -# Command xdnd::_default_action -# ---------------------------------------------------------------------------- -proc xdnd::_default_action {event} { - variable _dodragdrop_actions - variable _dodragdrop_actions_len - if {$_dodragdrop_actions_len == 1} {return [lindex $_dodragdrop_actions 0]} - - set alt [dict get $event Alt] - set shift [dict get $event Shift] - set control [dict get $event Control] - - if {$shift && $control && [lsearch $_dodragdrop_actions link] != -1} { - return link - } elseif {$control && [lsearch $_dodragdrop_actions copy] != -1} { - return copy - } elseif {$shift && [lsearch $_dodragdrop_actions move] != -1} { - return move - } elseif {$alt && [lsearch $_dodragdrop_actions link] != -1} { - return link - } - return default -};# xdnd::_default_action - -# ---------------------------------------------------------------------------- -# Command xdnd::getFormatForType -# ---------------------------------------------------------------------------- -proc xdnd::getFormatForType {type} { - switch -glob [string tolower $type] { - text/plain\;charset=utf-8 - - text/html\;charset=utf-8 - - utf8_string {set format UTF8_STRING} - text/html - - text/plain - - string - - text - - compound_text {set format STRING} - text/uri-list* {set format UTF8_STRING} - application/x-color {set format $type} - default {set format $type} - } - return $format -};# xdnd::getFormatForType - -# ---------------------------------------------------------------------------- -# Command xdnd::registerSelectionHandler -# ---------------------------------------------------------------------------- -proc xdnd::registerSelectionHandler {source types} { - foreach type $types { - selection handle -selection XdndSelection \ - -type $type \ - -format [getFormatForType $type] \ - $source [list ::tkdnd::xdnd::_SendData $type] - } -};# xdnd::registerSelectionHandler - -# ---------------------------------------------------------------------------- -# Command xdnd::unregisterSelectionHandler -# ---------------------------------------------------------------------------- -proc xdnd::unregisterSelectionHandler {source types} { - foreach type $types { - catch { - selection handle -selection XdndSelection \ - -type $type \ - -format [getFormatForType $type] \ - $source {} - } - } -};# xdnd::unregisterSelectionHandler - -# ---------------------------------------------------------------------------- -# Command xdnd::_convert_to_unsigned -# ---------------------------------------------------------------------------- -proc xdnd::_convert_to_unsigned {data format} { - switch $format { - 8 { set mask 0xff } - 16 { set mask 0xffff } - 32 { set mask 0xffffff } - default {error "unsupported format $format"} - } - ## Convert signed integer into unsigned... - set d [list] - foreach num $data { - lappend d [expr { $num & $mask }] - } - return $d -};# xdnd::_convert_to_unsigned - -# ---------------------------------------------------------------------------- -# Command xdnd::_SendData -# ---------------------------------------------------------------------------- -proc xdnd::_SendData {type offset bytes args} { - variable _dodragdrop_drag_source - variable _dodragdrop_types - variable _dodragdrop_data - variable _dodragdrop_transfer_data - - ## The variable _dodragdrop_data contains a list of data, one for each - ## type in the _dodragdrop_types variable. We have to search types, and find - ## the corresponding entry in the _dodragdrop_data list. - set index [lsearch $_dodragdrop_types $type] - if {$index < 0} { - error "unable to locate data suitable for type \"$type\"" - } - set typed_data [lindex $_dodragdrop_data $index] - set format 8 - if {$offset == 0} { - ## Prepare the data to be transferred... - switch -glob $type { - text/plain* - UTF8_STRING - STRING - TEXT - COMPOUND_TEXT { - binary scan [encoding convertto utf-8 $typed_data] \ - c* _dodragdrop_transfer_data - set _dodragdrop_transfer_data \ - [_convert_to_unsigned $_dodragdrop_transfer_data $format] - } - text/uri-list* { - set files [list] - foreach file $typed_data { - switch -glob $file { - *://* {lappend files $file} - default {lappend files file://$file} - } - } - binary scan [encoding convertto utf-8 "[join $files \r\n]\r\n"] \ - c* _dodragdrop_transfer_data - set _dodragdrop_transfer_data \ - [_convert_to_unsigned $_dodragdrop_transfer_data $format] - } - application/x-color { - set format 16 - ## Try to understand the provided data: we accept a standard Tk colour, - ## or a list of 3 values (red green blue) or a list of 4 values - ## (red green blue opacity). - switch [llength $typed_data] { - 1 { set color [winfo rgb $_dodragdrop_drag_source $typed_data] - lappend color 65535 } - 3 { set color $typed_data; lappend color 65535 } - 4 { set color $typed_data } - default {error "unknown color data: \"$typed_data\""} - } - ## Convert the 4 elements into 16 bit values... - set _dodragdrop_transfer_data [list] - foreach c $color { - lappend _dodragdrop_transfer_data [format 0x%04X $c] - } - } - default { - set format 32 - binary scan $typed_data c* _dodragdrop_transfer_data - } - } - } - - ## - ## Data has been split into bytes. Count the bytes requested, and return them - ## - set data [lrange $_dodragdrop_transfer_data $offset [expr {$offset+$bytes-1}]] - switch $format { - 8 { - set data [encoding convertfrom utf-8 [binary format c* $data]] - } - 16 { - variable _dodragdrop_selection_requestor - if {$_dodragdrop_selection_requestor} { - ## Tk selection cannot process this format (only 8 & 32 supported). - ## Call our XChangeProperty... - set numItems [llength $data] - variable _dodragdrop_selection_property - variable _dodragdrop_selection_selection - variable _dodragdrop_selection_target - variable _dodragdrop_selection_time - XChangeProperty $_dodragdrop_drag_source \ - $_dodragdrop_selection_requestor \ - $_dodragdrop_selection_property \ - $_dodragdrop_selection_target \ - $format \ - $_dodragdrop_selection_time \ - $data $numItems - return -code break - } - } - 32 { - } - default { - error "unsupported format $format" - } - } - # puts "SendData: $type $offset $bytes $args ($typed_data)" - # puts " $data" - return $data -};# xdnd::_SendData diff --git a/tkinterdnd2/tkdnd/win64/tkdnd_utils.tcl b/tkinterdnd2/tkdnd/win64/tkdnd_utils.tcl deleted file mode 100644 index ee961dd..0000000 --- a/tkinterdnd2/tkdnd/win64/tkdnd_utils.tcl +++ /dev/null @@ -1,252 +0,0 @@ -# -# tkdnd_utils.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -package require tkdnd -namespace eval ::tkdnd { - namespace eval utils { - };# namespace ::tkdnd::utils - namespace eval text { - variable _drag_tag tkdnd::drag::selection::tag - variable _state {} - variable _drag_source_widget {} - variable _drop_target_widget {} - variable _now_dragging 0 - };# namespace ::tkdnd::text -};# namespace ::tkdnd - -bind TkDND_Drag_Text1 {tkdnd::text::_begin_drag clear 1 %W %s %X %Y %x %y} -bind TkDND_Drag_Text1 {tkdnd::text::_begin_drag motion 1 %W %s %X %Y %x %y} -bind TkDND_Drag_Text1 {tkdnd::text::_TextAutoScan %W %x %y} -bind TkDND_Drag_Text1 {tkdnd::text::_begin_drag reset 1 %W %s %X %Y %x %y} -bind TkDND_Drag_Text2 {tkdnd::text::_begin_drag clear 2 %W %s %X %Y %x %y} -bind TkDND_Drag_Text2 {tkdnd::text::_begin_drag motion 2 %W %s %X %Y %x %y} -bind TkDND_Drag_Text2 {tkdnd::text::_begin_drag reset 2 %W %s %X %Y %x %y} -bind TkDND_Drag_Text3 {tkdnd::text::_begin_drag clear 3 %W %s %X %Y %x %y} -bind TkDND_Drag_Text3 {tkdnd::text::_begin_drag motion 3 %W %s %X %Y %x %y} -bind TkDND_Drag_Text3 {tkdnd::text::_begin_drag reset 3 %W %s %X %Y %x %y} - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::drag_source -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::drag_source { mode path { types DND_Text } { event 1 } { tagprefix TkDND_Drag_Text } { tag sel } } { - switch -exact -- $mode { - register { - $path tag bind $tag \ - "tkdnd::text::_begin_drag press ${event} %W %s %X %Y %x %y" - ## Set a binding to the widget, to put selection as data... - bind $path <> "::tkdnd::text::DragInitCmd $path {%t} $tag" - ## Set a binding to the widget, to remove selection if action is move... - bind $path <> "::tkdnd::text::DragEndCmd $path %A $tag" - } - unregister { - $path tag bind $tag {} - bind $path <> {} - bind $path <> {} - } - } - ::tkdnd::drag_source $mode $path $types $event $tagprefix -};# ::tkdnd::text::drag_source - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::drop_target -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::drop_target { mode path { types DND_Text } } { - switch -exact -- $mode { - register { - bind $path <> "::tkdnd::text::DropPosition $path %X %Y %A %a %m" - bind $path <> "::tkdnd::text::Drop $path %D %X %Y %A %a %m" - } - unregister { - bind $path <> {} - bind $path <> {} - bind $path <> {} - bind $path <> {} - } - } - ::tkdnd::drop_target $mode $path $types -};# ::tkdnd::text::drop_target - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::DragInitCmd -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::DragInitCmd { path { types DND_Text } { tag sel } { actions { copy move } } } { - ## Save the selection indices... - variable _drag_source_widget - variable _drop_target_widget - set _drag_source_widget $path - set _drop_target_widget {} - _save_selection $path $tag - list $actions $types [$path get $tag.first $tag.last] -};# ::tkdnd::text::DragInitCmd - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::DragEndCmd -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::DragEndCmd { path action { tag sel } } { - variable _drag_source_widget - variable _drop_target_widget - set _drag_source_widget {} - set _drop_target_widget {} - _restore_selection $path $tag - switch -exact -- $action { - move { - ## Delete the original selected text... - variable _selection_first - variable _selection_last - $path delete $_selection_first $_selection_last - } - } -};# ::tkdnd::text::DragEndCmd - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::DropPosition -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::DropPosition { path X Y action actions keys} { - variable _drag_source_widget - variable _drop_target_widget - set _drop_target_widget $path - ## This check is primitive, a more accurate one is needed! - if {$path eq $_drag_source_widget} { - ## This is a drag within the same widget! Set action to move... - if {"move" in $actions} {set action move} - } - incr X -[winfo rootx $path] - incr Y -[winfo rooty $path] - $path mark set insert @$X,$Y; update - return $action -};# ::tkdnd::text::DropPosition - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::Drop -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::Drop { path data X Y action actions keys } { - incr X -[winfo rootx $path] - incr Y -[winfo rooty $path] - $path mark set insert @$X,$Y - $path insert [$path index insert] $data - return $action -};# ::tkdnd::text::Drop - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::_save_selection -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::_save_selection { path tag} { - variable _drag_tag - variable _selection_first - variable _selection_last - variable _selection_tag $tag - set _selection_first [$path index $tag.first] - set _selection_last [$path index $tag.last] - $path tag add $_drag_tag $_selection_first $_selection_last - $path tag configure $_drag_tag \ - -background [$path tag cget $tag -background] \ - -foreground [$path tag cget $tag -foreground] -};# tkdnd::text::_save_selection - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::_restore_selection -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::_restore_selection { path tag} { - variable _drag_tag - variable _selection_first - variable _selection_last - $path tag delete $_drag_tag - $path tag remove $tag 0.0 end - #$path tag add $tag $_selection_first $_selection_last -};# tkdnd::text::_restore_selection - -# ---------------------------------------------------------------------------- -# Command tkdnd::text::_begin_drag -# ---------------------------------------------------------------------------- -proc ::tkdnd::text::_begin_drag { event button source state X Y x y } { - variable _drop_target_widget - variable _state - # puts "::tkdnd::text::_begin_drag $event $button $source $state $X $Y $x $y" - - switch -exact -- $event { - clear { - switch -exact -- $_state { - press { - ## Do not execute other bindings, as they will erase selection... - return -code break - } - } - set _state clear - } - motion { - variable _now_dragging - if {$_now_dragging} {return -code break} - if { [string equal $_state "press"] } { - variable _x0; variable _y0 - if { abs($_x0-$X) > ${::tkdnd::_dx} || abs($_y0-$Y) > ${::tkdnd::_dy} } { - set _state "done" - set _drop_target_widget {} - set _now_dragging 1 - set code [catch { - ::tkdnd::_init_drag $button $source $state $X $Y $x $y - } info options] - set _drop_target_widget {} - set _now_dragging 0 - if {$code != 0} { - ## Something strange occurred... - return -options $options $info - } - } - return -code break - } - set _state clear - } - press { - variable _x0; variable _y0 - set _x0 $X - set _y0 $Y - set _state "press" - } - reset { - set _state {} - } - } - if {$source eq $_drop_target_widget} {return -code break} - return -code continue -};# tkdnd::text::_begin_drag - -proc tkdnd::text::_TextAutoScan {w x y} { - variable _now_dragging - if {$_now_dragging} {return -code break} - return -code continue -};# tkdnd::text::_TextAutoScan diff --git a/tkinterdnd2/tkdnd/win64/tkdnd_windows.tcl b/tkinterdnd2/tkdnd/win64/tkdnd_windows.tcl deleted file mode 100644 index a1d01f3..0000000 --- a/tkinterdnd2/tkdnd/win64/tkdnd_windows.tcl +++ /dev/null @@ -1,167 +0,0 @@ -# -# tkdnd_windows.tcl -- -# -# This file implements some utility procedures that are used by the TkDND -# package. -# -# This software is copyrighted by: -# George Petasis, National Centre for Scientific Research "Demokritos", -# Aghia Paraskevi, Athens, Greece. -# e-mail: petasis@iit.demokritos.gr -# -# The following terms apply to all files associated -# with the software unless explicitly disclaimed in individual files. -# -# The authors hereby grant permission to use, copy, modify, distribute, -# and license this software and its documentation for any purpose, provided -# that existing copyright notices are retained in all copies and that this -# notice is included verbatim in any distributions. No written agreement, -# license, or royalty fee is required for any of the authorized uses. -# Modifications to this software may be copyrighted by their authors -# and need not follow the licensing terms described here, provided that -# the new terms are clearly indicated on the first page of each file where -# they apply. -# -# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -# MODIFICATIONS. -# - -namespace eval olednd { - - proc initialise { } { - ## Mapping from platform types to TkDND types... - ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \ - CF_UNICODETEXT DND_Text \ - CF_TEXT DND_Text \ - CF_HDROP DND_Files \ - UniformResourceLocator DND_URL \ - CF_HTML DND_HTML \ - {HTML Format} DND_HTML \ - CF_RTF DND_RTF \ - CF_RTFTEXT DND_RTF \ - {Rich Text Format} DND_RTF \ - ] - # FileGroupDescriptorW DND_Files \ - # FileGroupDescriptor DND_Files \ - - ## Mapping from TkDND types to platform types... - ::tkdnd::generic::initialise_tkdnd_to_platform_types [list \ - DND_Text {CF_UNICODETEXT CF_TEXT} \ - DND_Files {CF_HDROP} \ - DND_URL {UniformResourceLocator UniformResourceLocatorW} \ - DND_HTML {CF_HTML {HTML Format}} \ - DND_RTF {CF_RTF CF_RTFTEXT {Rich Text Format}} \ - ] - };# initialise - -};# namespace olednd - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDragEnter -# ---------------------------------------------------------------------------- -proc olednd::HandleDragEnter { drop_target typelist actionlist pressedkeys - rootX rootY codelist { data {} } } { - ::tkdnd::generic::SetDroppedData $data - focus $drop_target - ::tkdnd::generic::HandleEnter $drop_target 0 $typelist \ - $codelist $actionlist $pressedkeys - set action [::tkdnd::generic::HandlePosition $drop_target {} \ - $pressedkeys $rootX $rootY] - if {$::tkdnd::_auto_update} {update idletasks} - return $action -};# olednd::HandleDragEnter - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDragOver -# ---------------------------------------------------------------------------- -proc olednd::HandleDragOver { drop_target pressedkeys rootX rootY } { - set action [::tkdnd::generic::HandlePosition $drop_target {} \ - $pressedkeys $rootX $rootY] - if {$::tkdnd::_auto_update} {update idletasks} - return $action -};# olednd::HandleDragOver - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDragLeave -# ---------------------------------------------------------------------------- -proc olednd::HandleDragLeave { drop_target } { - ::tkdnd::generic::HandleLeave - if {$::tkdnd::_auto_update} {update idletasks} -};# olednd::HandleDragLeave - -# ---------------------------------------------------------------------------- -# Command olednd::HandleDrop -# ---------------------------------------------------------------------------- -proc olednd::HandleDrop { drop_target pressedkeys rootX rootY type data } { - ::tkdnd::generic::SetDroppedData [normalise_data $type $data] - set action [::tkdnd::generic::HandleDrop $drop_target {} \ - $pressedkeys $rootX $rootY 0] - if {$::tkdnd::_auto_update} {update idletasks} - return $action -};# olednd::HandleDrop - -# ---------------------------------------------------------------------------- -# Command olednd::GetDataType -# ---------------------------------------------------------------------------- -proc olednd::GetDataType { drop_target typelist } { - foreach {drop_target common_drag_source_types common_drop_target_types} \ - [::tkdnd::generic::FindWindowWithCommonTypes $drop_target $typelist] {break} - lindex $common_drag_source_types 0 -};# olednd::GetDataType - -# ---------------------------------------------------------------------------- -# Command olednd::GetDragSourceCommonTypes -# ---------------------------------------------------------------------------- -proc olednd::GetDragSourceCommonTypes { drop_target } { - ::tkdnd::generic::GetDragSourceCommonTypes -};# olednd::GetDragSourceCommonTypes - -# ---------------------------------------------------------------------------- -# Command olednd::platform_specific_types -# ---------------------------------------------------------------------------- -proc olednd::platform_specific_types { types } { - ::tkdnd::generic::platform_specific_types $types -}; # olednd::platform_specific_types - -# ---------------------------------------------------------------------------- -# Command olednd::platform_specific_type -# ---------------------------------------------------------------------------- -proc olednd::platform_specific_type { type } { - ::tkdnd::generic::platform_specific_type $type -}; # olednd::platform_specific_type - -# ---------------------------------------------------------------------------- -# Command tkdnd::platform_independent_types -# ---------------------------------------------------------------------------- -proc ::tkdnd::platform_independent_types { types } { - ::tkdnd::generic::platform_independent_types $types -}; # tkdnd::platform_independent_types - -# ---------------------------------------------------------------------------- -# Command olednd::platform_independent_type -# ---------------------------------------------------------------------------- -proc olednd::platform_independent_type { type } { - ::tkdnd::generic::platform_independent_type $type -}; # olednd::platform_independent_type - -# ---------------------------------------------------------------------------- -# Command olednd::normalise_data -# ---------------------------------------------------------------------------- -proc olednd::normalise_data { type data } { - switch [lindex [::tkdnd::generic::platform_independent_type $type] 0] { - DND_Text {return $data} - DND_Files {return $data} - DND_HTML {return [encoding convertfrom utf-8 $data]} - default {return $data} - } -}; # olednd::normalise_data