diff options
author | dgp <dgp@users.sourceforge.net> | 2019-05-11 20:53:22 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2019-05-11 20:53:22 (GMT) |
commit | 6721be522c279e1343d675072819bd1671b40fe8 (patch) | |
tree | 87f3c645f77c17b9962d374feae32daca271d2a9 /generic/tkButton.c | |
parent | 3a509540d384f5f707a39987642f1f111e4bf657 (diff) | |
download | tk-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.c | 29 |
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), |