Tk Source Code

Artifact [7946ce7d]
Login

Artifact 7946ce7d12b742de5507462c9e012ca0ddffc71f5887899d5fcdbd4e0dc8aaa1:

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:
      *