summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Walzer <kw@codebykevin.com>2015-03-21 01:31:02 (GMT)
committerKevin Walzer <kw@codebykevin.com>2015-03-21 01:31:02 (GMT)
commit6f271af3157483e82be0a839323490597eac5e04 (patch)
tree4968b67a528b6d9e86370951dc604bfa36b14ec8
parent50ec1ecb24801b023618048a6704fa12670671d9 (diff)
downloadtk-6f271af3157483e82be0a839323490597eac5e04.zip
tk-6f271af3157483e82be0a839323490597eac5e04.tar.gz
tk-6f271af3157483e82be0a839323490597eac5e04.tar.bz2
Improvement of memory management, removal of zombie windows from Tk-Cocoa; thanks to Marc Culler for patch
-rw-r--r--macosx/tkMacOSXKeyEvent.c17
-rw-r--r--macosx/tkMacOSXMenu.c9
-rw-r--r--macosx/tkMacOSXWm.c13
3 files changed, 33 insertions, 6 deletions
diff --git a/macosx/tkMacOSXKeyEvent.c b/macosx/tkMacOSXKeyEvent.c
index 09cdf94..7e7e8e4 100644
--- a/macosx/tkMacOSXKeyEvent.c
+++ b/macosx/tkMacOSXKeyEvent.c
@@ -27,7 +27,9 @@ static Tk_Window grabWinPtr = NULL;
/* Current grab window, NULL if no grab. */
static Tk_Window keyboardGrabWinPtr = NULL;
/* Current keyboard grab window. */
-static NSModalSession modalSession = NULL;
+static NSWindow *keyboardGrabNSWindow = nil;
+ /* NSWindow for the current keyboard grab window. */
+static NSModalSession modalSession = nil;
static BOOL processingCompose = NO;
static BOOL finishedCompose = NO;
@@ -476,7 +478,9 @@ XGrabKeyboard(
if (modalSession) {
Tcl_Panic("XGrabKeyboard: already grabbed");
}
- modalSession = [NSApp beginModalSessionForWindow:[w retain]];
+ keyboardGrabNSWindow = w;
+ [w retain];
+ modalSession = [NSApp beginModalSessionForWindow:w];
}
}
return GrabSuccess;
@@ -504,11 +508,12 @@ XUngrabKeyboard(
Time time)
{
if (modalSession) {
- NSWindow *w = keyboardGrabWinPtr ? TkMacOSXDrawableWindow(
- ((TkWindow *) keyboardGrabWinPtr)->window) : nil;
[NSApp endModalSession:modalSession];
- [w release];
- modalSession = NULL;
+ modalSession = nil;
+ }
+ if (keyboardGrabNSWindow) {
+ [keyboardGrabNSWindow release];
+ keyboardGrabNSWindow = nil;
}
keyboardGrabWinPtr = NULL;
}
diff --git a/macosx/tkMacOSXMenu.c b/macosx/tkMacOSXMenu.c
index 5ae38f8..49d1872 100644
--- a/macosx/tkMacOSXMenu.c
+++ b/macosx/tkMacOSXMenu.c
@@ -261,6 +261,7 @@ static int ModifierCharWidth(Tk_Font tkfont);
/*Add time for errors to fire if necessary. This is sub-optimal but avoids issues with Tcl/Cocoa event loop integration.*/
Tcl_Sleep(100);
+ NSAutoreleasePool *pool = [NSAutoreleasePool new];
Tcl_Preserve(interp);
Tcl_Preserve(menuPtr);
@@ -273,6 +274,7 @@ static int ModifierCharWidth(Tk_Font tkfont);
}
Tcl_Release(menuPtr);
Tcl_Release(interp);
+ [pool drain];
}
}
}
@@ -382,6 +384,13 @@ static int ModifierCharWidth(Tk_Font tkfont);
[pool drain];
}
+- (void) safeSetMainMenu: (NSMenu *) menu
+{
+ NSAutoreleasePool* pool = [NSAutoreleasePool new];
+ [self setMainMenu: menu];
+ [pool drain];
+}
+
- (void) menuBeginTracking: (NSNotification *) notification
{
#ifdef TK_MAC_DEBUG_NOTIFICATIONS
diff --git a/macosx/tkMacOSXWm.c b/macosx/tkMacOSXWm.c
index 8459bdd..5cec236 100644
--- a/macosx/tkMacOSXWm.c
+++ b/macosx/tkMacOSXWm.c
@@ -24,6 +24,8 @@
#define DEBUG_ZOMBIES 0
+#define DEBUG_ZOMBIES 0
+
/*
#ifdef TK_MAC_DEBUG
#define TK_MAC_DEBUG_WINDOWS
@@ -351,6 +353,17 @@ static void RemapWindows(TkWindow *winPtr,
#endif
return [super retain];
}
+
+- (id) retain
+{
+#if DEBUG_ZOMBIES
+ const char *title = [[self title] UTF8String];
+ if (title != NULL) {
+ printf("Retaining %s with count %lu\n", title, [self retainCount]);
+ }
+#endif
+ return [super retain];
+}
@end
@implementation TKWindow