diff options
author | petasis <petasis@f3661a36-4baa-549a-d6c7-40e0ffef350e> | 2010-06-16 18:05:55 (GMT) |
---|---|---|
committer | petasis <petasis@f3661a36-4baa-549a-d6c7-40e0ffef350e> | 2010-06-16 18:05:55 (GMT) |
commit | 2b59ebc5f1f4d4c88081cc8ed903b1794928bd2a (patch) | |
tree | 7f8b49df4b5a8ad9e4ad58ddabec661e9eb8c6b3 | |
parent | f598ee8f0d3475285df4d54b4f6e7dbcc73ff964 (diff) | |
download | tkdnd-2b59ebc5f1f4d4c88081cc8ed903b1794928bd2a.zip tkdnd-2b59ebc5f1f4d4c88081cc8ed903b1794928bd2a.tar.gz tkdnd-2b59ebc5f1f4d4c88081cc8ed903b1794928bd2a.tar.bz2 |
Linux fixes
-rw-r--r-- | CMakeLists.txt | 3 | ||||
-rw-r--r-- | library/tkdnd.tcl | 9 | ||||
-rw-r--r-- | library/tkdnd_unix.tcl | 26 | ||||
-rw-r--r-- | unix/TkDND_XDND.c | 41 |
4 files changed, 49 insertions, 30 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 02959d7..dfef014 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,6 +141,9 @@ ADD_DEFINITIONS ( -DPACKAGE_NAME_VERSION="${PKG_NAME_VERSION}" ) ADD_DEFINITIONS ( -DTKDND_PACKAGE="${PKG_NAME}" ) ADD_DEFINITIONS ( -DTKDND_VERSION="${PKG_VERSION}" ) +## Package debug definitions... +# ADD_DEFINITIONS ( -DDEBUG_CLIENTMESSAGE_HANDLER ) + ## =========================================================================== ## Declare the package shared library target... ## =========================================================================== diff --git a/library/tkdnd.tcl b/library/tkdnd.tcl index 61f10e6..cff7d61 100644 --- a/library/tkdnd.tcl +++ b/library/tkdnd.tcl @@ -199,8 +199,8 @@ proc tkdnd::drag_source { mode path { types {} } { event 1 } } { # ---------------------------------------------------------------------------- proc tkdnd::drop_target { mode path { types {} } } { variable _windowingsystem + set types [platform_specific_types $types] switch -- $mode { - set types [platform_specific_types $types] register { switch $_windowingsystem { x11 { @@ -219,10 +219,13 @@ proc tkdnd::drop_target { mode path { types {} } } { } } set old_types [bind $path <<DropTargetTypes>>] + set new_types {} foreach type $types { - if {[lsearch $old_types $type] < 0} {lappend old_types $type} + if {[lsearch -exact $old_types $type] < 0} {lappend new_types $type} + } + if {[llength $new_types]} { + bind $path <<DropTargetTypes>> [concat $old_types $new_types] } - bind $path <<DropTargetTypes>> $old_types } unregister { switch $_windowingsystem { diff --git a/library/tkdnd_unix.tcl b/library/tkdnd_unix.tcl index fcc7f27..3963c94 100644 --- a/library/tkdnd_unix.tcl +++ b/library/tkdnd_unix.tcl @@ -47,6 +47,10 @@ namespace eval xdnd { variable _common_drop_target_types {} variable _drag_source {} variable _drop_target {} + + proc debug {msg} { + puts $msg + };# debug };# namespace xdnd # ---------------------------------------------------------------------------- @@ -63,9 +67,10 @@ proc xdnd::_HandleXdndEnter { path drag_source typelist } { variable _drop_target; set _drop_target {} variable _actionlist; set _actionlist \ {copy move link ask private} - # puts "xdnd::_HandleXdndEnter: path=$path, drag_source=$drag_source,\ - # typelist=$typelist" - update + debug "\n===============================================================" + debug "xdnd::_HandleXdndEnter: path=$path, drag_source=$drag_source,\ + typelist=$typelist" + debug "xdnd::_HandleXdndEnter: ACTION: default" return default };# xdnd::_HandleXdndEnter @@ -82,14 +87,17 @@ proc xdnd::_HandleXdndPosition { drop_target rootX rootY } { variable _common_drop_target_types variable _drag_source variable _drop_target - # puts "xdnd::_HandleXdndPosition: drop_target=$drop_target,\ - # _drop_target=$_drop_target, rootX=$rootX, rootY=$rootY" + debug "xdnd::_HandleXdndPosition: drop_target=$drop_target,\ + _drop_target=$_drop_target, rootX=$rootX, rootY=$rootY" if {![info exists _drag_source] && ![string length $_drag_source]} { + debug "xdnd::_HandleXdndPosition: no or empty _drag_source:\ + return refuse_drop" return refuse_drop } ## Does the new drop target support any of our new types? set _types [bind $drop_target <<DropTargetTypes>>] + debug ">> Accepted types: $drop_target $_types" if {[llength $_types]} { ## Examine the drop target types, to find at least one match with the drag ## source types... @@ -103,10 +111,11 @@ proc xdnd::_HandleXdndPosition { drop_target rootX rootY } { } } - # puts "($_drop_target) -> ($drop_target)" + debug "\t($_drop_target) -> ($drop_target)" if {$drop_target != $_drop_target} { if {[string length $_drop_target]} { ## Call the <<DropLeave>> event. + debug "\t<<DropLeave>> on $_drop_target" set cmd [bind $_drop_target <<DropLeave>>] if {[string length $cmd]} { set _codelist $_typelist @@ -180,6 +189,7 @@ proc xdnd::_HandleXdndPosition { drop_target rootX rootY } { } } # Return values: copy, move, link, ask, private, refuse_drop, default + debug "xdnd::_HandleXdndPosition: ACTION: $_action" return $_action };# xdnd::_HandleXdndPosition @@ -196,8 +206,8 @@ proc xdnd::_HandleXdndLeave { } { variable _common_drop_target_types variable _drag_source variable _drop_target - - # puts "xdnd::_HandleXdndLeave! ($_drop_target)" + if {![info exists _drop_target]} {set _drop_target {}} + debug "xdnd::_HandleXdndLeave: _drop_target=$_drop_target" if {[info exists _drop_target] && [string length $_drop_target]} { set cmd [bind $_drop_target <<DropLeave>>] if {[string length $cmd]} { diff --git a/unix/TkDND_XDND.c b/unix/TkDND_XDND.c index e786211..5372cb4 100644 --- a/unix/TkDND_XDND.c +++ b/unix/TkDND_XDND.c @@ -95,7 +95,14 @@ int TkDND_RegisterTypesObjCmd(ClientData clientData, Tcl_Interp *interp, unsigned int nchildren_return; int status; Atom version = XDND_VERSION; - /* Tk_Window path = TkDND_TkWin(objv[1]); */ + Tk_Window path = TkDND_TkWin(objv[1]); + Tk_MakeWindowExist(path); + XChangeProperty(Tk_Display(path), Tk_WindowId(path), + Tk_InternAtom(path, "XdndAware"), + XA_ATOM, 32, PropModeReplace, + (unsigned char *) &version, 1); + return TCL_OK; +#if 0 Tk_Window toplevel = TkDND_TkWin(objv[2]); if (!Tk_IsTopLevel(toplevel)) { Tcl_ResetResult(interp); @@ -114,6 +121,7 @@ int TkDND_RegisterTypesObjCmd(ClientData clientData, Tcl_Interp *interp, XA_ATOM, 32, PropModeReplace, (unsigned char *) &version, 1); return TCL_OK; +#endif }; /* TkDND_RegisterTypesObjCmd */ int TkDND_HandleXdndEnter(Tk_Window tkwin, XClientMessageEvent cm) { @@ -349,38 +357,33 @@ static int TkDND_XDNDHandler(Tk_Window tkwin, XEvent *xevent) { if (xevent->type != ClientMessage) return False; XClientMessageEvent clientMessage = xevent->xclient; - if (clientMessage.message_type == - XInternAtom(clientMessage.display, "XdndEnter", False)) { + if (clientMessage.message_type == Tk_InternAtom(tkwin, "XdndPosition")) { +#ifdef DEBUG_CLIENTMESSAGE_HANDLER + printf("XDND_HandleClientMessage: Received XdndPosition\n"); +#endif /* DEBUG_CLIENTMESSAGE_HANDLER */ + return TkDND_HandleXdndPosition(tkwin, clientMessage); + } else if (clientMessage.message_type == Tk_InternAtom(tkwin, "XdndEnter")) { #ifdef DEBUG_CLIENTMESSAGE_HANDLER printf("XDND_HandleClientMessage: Received XdndEnter\n"); #endif /* DEBUG_CLIENTMESSAGE_HANDLER */ return TkDND_HandleXdndEnter(tkwin, clientMessage); - } else if (clientMessage.message_type == - XInternAtom(clientMessage.display, "XdndPosition", False)) { + } else if (clientMessage.message_type == Tk_InternAtom(tkwin, "XdndStatus")) { #ifdef DEBUG_CLIENTMESSAGE_HANDLER - printf("XDND_HandleClientMessage: Received XdndPosition\n"); + printf("XDND_HandleClientMessage: Received XdndStatus\n"); #endif /* DEBUG_CLIENTMESSAGE_HANDLER */ - return TkDND_HandleXdndPosition(tkwin, clientMessage); - } else if (clientMessage.message_type == - XInternAtom(clientMessage.display, "XdndLeave", False)) { + return TkDND_HandleXdndStatus(tkwin, clientMessage); + } else if (clientMessage.message_type == Tk_InternAtom(tkwin, "XdndLeave")) { #ifdef DEBUG_CLIENTMESSAGE_HANDLER printf("XDND_HandleClientMessage: Received XdndLeave\n"); #endif /* DEBUG_CLIENTMESSAGE_HANDLER */ return TkDND_HandleXdndLeave(tkwin, clientMessage); - } else if (clientMessage.message_type == - XInternAtom(clientMessage.display, "XdndDrop", False)) { + } else if (clientMessage.message_type == Tk_InternAtom(tkwin, "XdndDrop")) { #ifdef DEBUG_CLIENTMESSAGE_HANDLER printf("XDND_HandleClientMessage: Received XdndDrop\n"); #endif /* DEBUG_CLIENTMESSAGE_HANDLER */ return TkDND_HandleXdndDrop(tkwin, clientMessage); - } else if (clientMessage.message_type == - XInternAtom(clientMessage.display, "XdndStatus", False)) { -#ifdef DEBUG_CLIENTMESSAGE_HANDLER - printf("XDND_HandleClientMessage: Received XdndStatus\n"); -#endif /* DEBUG_CLIENTMESSAGE_HANDLER */ - return TkDND_HandleXdndStatus(tkwin, clientMessage); - } else if (clientMessage.message_type == - XInternAtom(clientMessage.display, "XdndFinished", False)) { + } else if (clientMessage.message_type == + Tk_InternAtom(tkwin, "XdndFinished")) { #ifdef DEBUG_CLIENTMESSAGE_HANDLER printf("XDND_HandleClientMessage: Received XdndFinished\n"); #endif /* DEBUG_CLIENTMESSAGE_HANDLER */ |