summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpetasis <petasis@f3661a36-4baa-549a-d6c7-40e0ffef350e>2010-06-16 18:05:55 (GMT)
committerpetasis <petasis@f3661a36-4baa-549a-d6c7-40e0ffef350e>2010-06-16 18:05:55 (GMT)
commit2b59ebc5f1f4d4c88081cc8ed903b1794928bd2a (patch)
tree7f8b49df4b5a8ad9e4ad58ddabec661e9eb8c6b3
parentf598ee8f0d3475285df4d54b4f6e7dbcc73ff964 (diff)
downloadtkdnd-2b59ebc5f1f4d4c88081cc8ed903b1794928bd2a.zip
tkdnd-2b59ebc5f1f4d4c88081cc8ed903b1794928bd2a.tar.gz
tkdnd-2b59ebc5f1f4d4c88081cc8ed903b1794928bd2a.tar.bz2
Linux fixes
-rw-r--r--CMakeLists.txt3
-rw-r--r--library/tkdnd.tcl9
-rw-r--r--library/tkdnd_unix.tcl26
-rw-r--r--unix/TkDND_XDND.c41
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 */