diff options
author | dgp <dgp@noemail.net> | 2011-06-16 20:27:22 (GMT) |
---|---|---|
committer | dgp <dgp@noemail.net> | 2011-06-16 20:27:22 (GMT) |
commit | 6d5c0428c2138c16fea9e335729097a2e2d944c7 (patch) | |
tree | 5ae5eec341086dec67ad6bcd0cc66069518f6f46 | |
parent | 207513ab6fe015e2261a06ad5b44bdcb6f653afa (diff) | |
download | tk-6d5c0428c2138c16fea9e335729097a2e2d944c7.zip tk-6d5c0428c2138c16fea9e335729097a2e2d944c7.tar.gz tk-6d5c0428c2138c16fea9e335729097a2e2d944c7.tar.bz2 |
New attempt to fix Bug 3062331
FossilOrigin-Name: e1302383c5fd8b1ad53a696049c363d0f7595860
-rw-r--r-- | generic/ttk/ttkTrace.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/generic/ttk/ttkTrace.c b/generic/ttk/ttkTrace.c index 0128a1d..a469d0b 100644 --- a/generic/ttk/ttkTrace.c +++ b/generic/ttk/ttkTrace.c @@ -44,6 +44,11 @@ VarTraceProc( * If the variable is being unset, then re-establish the trace: */ if (flags & TCL_TRACE_DESTROYED) { + if (tracePtr->interp == NULL) { + Tcl_DecrRefCount(tracePtr->varnameObj); + ckfree((ClientData)tracePtr); + return NULL; + } Tcl_TraceVar(interp, name, TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS, VarTraceProc, clientData); @@ -104,6 +109,18 @@ Ttk_TraceHandle *Ttk_TraceVariable( void Ttk_UntraceVariable(Ttk_TraceHandle *h) { if (h) { + ClientData cd = NULL; + + while ((cd = Tcl_VarTraceInfo(h->interp, Tcl_GetString(h->varnameObj), + 0, VarTraceProc, cd)) != NULL) { + if (cd == (ClientData) h) { + break; + } + } + if (cd == NULL) { + h->interp = NULL; + return; + } Tcl_UntraceVar(h->interp, Tcl_GetString(h->varnameObj), TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS, VarTraceProc, (ClientData)h); |