summaryrefslogtreecommitdiffstats
path: root/generic/tkButton.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2019-05-11 20:53:22 (GMT)
committerdgp <dgp@users.sourceforge.net>2019-05-11 20:53:22 (GMT)
commit6721be522c279e1343d675072819bd1671b40fe8 (patch)
tree87f3c645f77c17b9962d374feae32daca271d2a9 /generic/tkButton.c
parent3a509540d384f5f707a39987642f1f111e4bf657 (diff)
downloadtk-6721be522c279e1343d675072819bd1671b40fe8.zip
tk-6721be522c279e1343d675072819bd1671b40fe8.tar.gz
tk-6721be522c279e1343d675072819bd1671b40fe8.tar.bz2
Fix for the [button ... -textvariable] parts of [5d991b822e].
Diffstat (limited to 'generic/tkButton.c')
-rw-r--r--generic/tkButton.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/generic/tkButton.c b/generic/tkButton.c
index b7e314e..0e1a4e9 100644
--- a/generic/tkButton.c
+++ b/generic/tkButton.c
@@ -1709,7 +1709,34 @@ ButtonTextVarProc(
*/
if (flags & TCL_TRACE_UNSETS) {
- if ((flags & TCL_TRACE_DESTROYED) && !(flags & TCL_INTERP_DESTROYED)) {
+ if (!Tcl_InterpDeleted(interp) && butPtr->textVarNamePtr != NULL) {
+
+ /*
+ * An unset trace on some variable brought us here, but is it
+ * the variable we have stored in butPtr->textVarNamePtr ?
+ */
+
+ ClientData probe = NULL;
+
+ do {
+ probe = Tcl_VarTraceInfo(interp,
+ Tcl_GetString(butPtr->textVarNamePtr),
+ TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+ ButtonTextVarProc, probe);
+ if (probe == (ClientData)butPtr) {
+ break;
+ }
+ } while (probe);
+ if (probe) {
+ /*
+ * We were able to fetch the unset trace for our
+ * textVarNamePtr, which means it is not unset and not
+ * the cause of this unset trace. Instead some outdated
+ * former textvariable must be, and we should ignore it.
+ */
+ return NULL;
+ }
+
Tcl_ObjSetVar2(interp, butPtr->textVarNamePtr, NULL,
butPtr->textPtr, TCL_GLOBAL_ONLY);
Tcl_TraceVar2(interp, Tcl_GetString(butPtr->textVarNamePtr),