Attachment "310c74ecf440.diff" to
ticket [310c74ec]
added by
chrstphrchvz
2022-09-22 21:20:36.
Also attachment "310c74ecf440.diff" to
ticket [310c74ec]
added by
chrstphrchvz
2022-09-22 21:20:00.
diff --git generic/ttk/ttkTheme.c generic/ttk/ttkTheme.c
index 711c4107f8..e13c5842f9 100644
--- generic/ttk/ttkTheme.c
+++ generic/ttk/ttkTheme.c
@@ -405,6 +405,29 @@ typedef struct
static void ThemeChangedProc(void *); /* Forward */
+/* Ttk_TkDestroyedHandler --
+ * See bug [310c74ecf440]: idle calls to ThemeChangedProc()
+ * need to be canceled when Tk is destroyed, since the interp
+ * may still be active afterward; canceling them from
+ * Ttk_StylePkgFree() would be too late.
+ */
+static void Ttk_TkDestroyedHandler(
+ ClientData clientData,
+ TCL_UNUSED(Tcl_Interp *),
+ TCL_UNUSED(const char *),
+ TCL_UNUSED(const char *),
+ TCL_UNUSED(int))
+{
+ StylePackageData *pkgPtr = (StylePackageData *)clientData;
+
+ /*
+ * Cancel any pending ThemeChanged calls:
+ */
+ if (pkgPtr->themeChangePending) {
+ Tcl_CancelIdleCall(ThemeChangedProc, pkgPtr);
+ }
+}
+
/* Ttk_StylePkgFree --
* Cleanup procedure for StylePackageData.
*/
@@ -417,13 +440,6 @@ static void Ttk_StylePkgFree(
Tcl_HashEntry *entryPtr;
Cleanup *cleanup;
- /*
- * Cancel any pending ThemeChanged calls:
- */
- if (pkgPtr->themeChangePending) {
- Tcl_CancelIdleCall(ThemeChangedProc, pkgPtr);
- }
-
/*
* Free themes.
*/
@@ -1728,6 +1744,8 @@ void Ttk_StylePkgInit(Tcl_Interp *interp)
Tcl_SetAssocData(interp, PKG_ASSOC_KEY, Ttk_StylePkgFree, pkgPtr);
+ Tcl_TraceCommand(interp, ".", TCL_TRACE_DELETE, Ttk_TkDestroyedHandler, pkgPtr);
+
/*
* Create the default system theme:
*