Skip to content

Commit

Permalink
pythongh-110950: add upstream Tk fixes to macOS installer. (pythonGH-…
Browse files Browse the repository at this point in the history
…111041)

Add upstream Tk patches for three problems affecting tkinter users:

- Update macOS installer to include a fix accepted by upstream Tcl/Tk
for a crash encountered after the first :meth:`tkinter.Tk` instance
is destroyed. (pythongh-92603)

- Update macOS installer to include an upstream Tcl/Tk fix
for the ``ttk::ThemeChanged`` error encountered in Tkinter. (pythongh-71383)

- Update macOS installer to include an upstream Tcl/Tk fix for the
``Secure coding is not enabled for restorable state!`` warning
encountered in Tkinter on macOS 14 Sonoma. (pythongh-110950)

Co-authored-by: Ned Deily <[email protected]>
  • Loading branch information
2 people authored and Glyphack committed Jan 27, 2024
1 parent bfdbf72 commit 95cecbd
Show file tree
Hide file tree
Showing 7 changed files with 206 additions and 2 deletions.
25 changes: 25 additions & 0 deletions Mac/BuildScript/backport_gh110950_fix.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
From https://core.tcl-lang.org/tk/info/ed7cfbac8db11aa0

Note: the diff here is hand-tweaked so that it applies cleanly to both Tk 8.6.8 and 8.6.13.

diff --git a/macosx/tkMacOSXInit.c b/macosx/tkMacOSXInit.c
index 71d7c3385..e6a68356c 100644
--- a/macosx/tkMacOSXInit.c
+++ b/macosx/tkMacOSXInit.c
@@ -128,6 +128,16 @@ static int TkMacOSXGetAppPathCmd(ClientData cd, Tcl_Interp *ip,
observe(NSApplicationDidChangeScreenParametersNotification, displayChanged:);
observe(NSTextInputContextKeyboardSelectionDidChangeNotification, keyboardChanged:);
#undef observe
+}
+
+
+/*
+ * Fix for 10b38a7a7c.
+ */
+
+- (BOOL)applicationSupportsSecureRestorableState:(NSApplication *)app
+{
+ return YES;
}

-(void)applicationWillFinishLaunching:(NSNotification *)aNotification
89 changes: 89 additions & 0 deletions Mac/BuildScript/backport_gh71383_fix.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
Adapted from https://core.tcl-lang.org/tk/info/b1876b9ebc4b

Index: generic/tkInt.h
==================================================================
--- a/generic/tkInt.h.orig
+++ b/generic/tkInt.h
@@ -1094,10 +1094,11 @@
/*
* Themed widget set init function:
*/

MODULE_SCOPE int Ttk_Init(Tcl_Interp *interp);
+MODULE_SCOPE void Ttk_TkDestroyedHandler(Tcl_Interp *interp);

/*
* Internal functions shared among Tk modules but not exported to the outside
* world:
*/

Index: generic/tkWindow.c
==================================================================
--- a/generic/tkWindow.c.orig
+++ b/generic/tkWindow.c
@@ -1619,10 +1619,11 @@
TkBindFree(winPtr->mainPtr);
TkDeleteAllImages(winPtr->mainPtr);
TkFontPkgFree(winPtr->mainPtr);
TkFocusFree(winPtr->mainPtr);
TkStylePkgFree(winPtr->mainPtr);
+ Ttk_TkDestroyedHandler(winPtr->mainPtr->interp);

/*
* When embedding Tk into other applications, make sure that all
* destroy events reach the server. Otherwise the embedding
* application may also attempt to destroy the windows, resulting

Index: generic/ttk/ttkTheme.c
==================================================================
--- a/generic/ttk/ttkTheme.c.orig
+++ b/generic/ttk/ttkTheme.c
@@ -415,17 +415,10 @@
StylePackageData *pkgPtr = (StylePackageData *)clientData;
Tcl_HashSearch search;
Tcl_HashEntry *entryPtr;
Cleanup *cleanup;

- /*
- * Cancel any pending ThemeChanged calls:
- */
- if (pkgPtr->themeChangePending) {
- Tcl_CancelIdleCall(ThemeChangedProc, pkgPtr);
- }
-
/*
* Free themes.
*/
entryPtr = Tcl_FirstHashEntry(&pkgPtr->themeTable, &search);
while (entryPtr != NULL) {
@@ -528,10 +521,29 @@
if (!pkgPtr->themeChangePending) {
Tcl_DoWhenIdle(ThemeChangedProc, pkgPtr);
pkgPtr->themeChangePending = 1;
}
}
+
+/* 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.
+ */
+void Ttk_TkDestroyedHandler(
+ Tcl_Interp* interp)
+{
+ StylePackageData* pkgPtr = GetStylePackageData(interp);
+
+ /*
+ * Cancel any pending ThemeChanged calls:
+ */
+ if (pkgPtr->themeChangePending) {
+ Tcl_CancelIdleCall(ThemeChangedProc, pkgPtr);
+ }
+}

/*
* Ttk_CreateTheme --
* Create a new theme and register it in the global theme table.
*

82 changes: 82 additions & 0 deletions Mac/BuildScript/backport_gh92603_fix.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
Accepted upstream for release in Tk 8.6.14:
https://core.tcl-lang.org/tk/info/cf3830280b

--- tk8.6.13/macosx/tkMacOSXWindowEvent.c.orig
+++ tk8.6.13-patched/macosx/tkMacOSXWindowEvent.c
@@ -239,8 +239,8 @@ extern NSString *NSWindowDidOrderOffScreenNotification;
if (winPtr) {
TKContentView *view = [window contentView];

-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101500
- if (@available(macOS 10.15, *)) {
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101400
+ if (@available(macOS 10.14, *)) {
[view viewDidChangeEffectiveAppearance];
}
#endif
@@ -1237,29 +1237,8 @@ static const char *const accentNames[] = {
} else if (effectiveAppearanceName == NSAppearanceNameDarkAqua) {
TkSendVirtualEvent(tkwin, "DarkAqua", NULL);
}
- if ([NSApp macOSVersion] < 101500) {
-
- /*
- * Mojave cannot handle the KVO shenanigans that we need for the
- * highlight and accent color notifications.
- */
-
- return;
- }
if (!defaultColor) {
defaultColor = [NSApp macOSVersion] < 110000 ? "Blue" : "Multicolor";
- preferences = [[NSUserDefaults standardUserDefaults] retain];
-
- /*
- * AppKit calls this method when the user changes the Accent Color
- * but not when the user changes the Highlight Color. So we register
- * to receive KVO notifications for Highlight Color as well.
- */
-
- [preferences addObserver:self
- forKeyPath:@"AppleHighlightColor"
- options:NSKeyValueObservingOptionNew
- context:NULL];
}
NSString *accent = [preferences stringForKey:@"AppleAccentColor"];
NSArray *words = [[preferences stringForKey:@"AppleHighlightColor"]
--- tk8.6.13/macosx/tkMacOSXWm.c.orig
+++ tk8.6.13-patched/macosx/tkMacOSXWm.c
@@ -1289,6 +1289,11 @@ TkWmDeadWindow(
[NSApp _setMainWindow:nil];
}
[deadNSWindow close];
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101400
+ NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
+ [preferences removeObserver:deadNSWindow.contentView
+ forKeyPath:@"AppleHighlightColor"];
+#endif
[deadNSWindow release];

#if DEBUG_ZOMBIES > 1
@@ -6763,6 +6768,21 @@ TkMacOSXMakeRealWindowExist(
}
TKContentView *contentView = [[TKContentView alloc]
initWithFrame:NSZeroRect];
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101400
+ NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
+
+ /*
+ * AppKit calls the viewDidChangeEffectiveAppearance method when the
+ * user changes the Accent Color but not when the user changes the
+ * Highlight Color. So we register to receive KVO notifications for
+ * Highlight Color as well.
+ */
+
+ [preferences addObserver:contentView
+ forKeyPath:@"AppleHighlightColor"
+ options:NSKeyValueObservingOptionNew
+ context:NULL];
+#endif
[window setContentView:contentView];
[contentView release];
[window setDelegate:NSApp];
4 changes: 2 additions & 2 deletions Mac/BuildScript/build-installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,14 +261,14 @@ def library_recipes():
tcl_checksum='81656d3367af032e0ae6157eff134f89'

tk_checksum='5e0faecba458ee1386078fb228d008ba'
tk_patches = ['tk868_on_10_8_10_9.patch']
tk_patches = ['backport_gh71383_fix.patch', 'tk868_on_10_8_10_9.patch', 'backport_gh110950_fix.patch']

else:
tcl_tk_ver='8.6.13'
tcl_checksum='43a1fae7412f61ff11de2cfd05d28cfc3a73762f354a417c62370a54e2caf066'

tk_checksum='2e65fa069a23365440a3c56c556b8673b5e32a283800d8d9b257e3f584ce0675'
tk_patches = [ ]
tk_patches = ['backport_gh92603_fix.patch', 'backport_gh71383_fix.patch', 'backport_gh110950_fix.patch']


base_url = "https://prdownloads.sourceforge.net/tcl/{what}{version}-src.tar.gz"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Update macOS installer to include a fix accepted by upstream Tcl/Tk
for a crash encountered after the first :meth:`tkinter.Tk` instance
is destroyed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Update macOS installer to include an upstream Tcl/Tk fix
for the ``ttk::ThemeChanged`` error encountered in Tkinter.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Update macOS installer to include an upstream Tcl/Tk fix for the
``Secure coding is not enabled for restorable state!`` warning
encountered in Tkinter on macOS 14 Sonoma.

0 comments on commit 95cecbd

Please sign in to comment.