From 2189aa34d7eb0ff5f80fca01d92ee28f091b4a22 Mon Sep 17 00:00:00 2001 From: Richard Frith-MacDonald Date: Fri, 25 Feb 2000 17:43:32 +0000 Subject: [PATCH] Window close/dealloc fixes git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@6115 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 7 +++++++ Headers/gnustep/gui/NSWindow.h | 1 + Source/NSApplication.m | 15 +++++++++------ Source/NSWindow.m | 26 +++++++++++++++++++++----- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6a9e175c6..80dfc4ec6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Fri Feb 25 16:20:00 2000 Richard Frith-Macdonald + + * Headers/AppKit/NSWindow.h: added has_closed flag + * Source/NSWindow.m: made close/deallocation sequence more robust + * Source/NSApplication.m: improve removal of windows from menus + on close. + 2000-02-25 Adam Fedor * Source/NSCursor.m ([NSCursor -setImage:]): Implement. diff --git a/Headers/gnustep/gui/NSWindow.h b/Headers/gnustep/gui/NSWindow.h index 1c184639b..d1030432f 100644 --- a/Headers/gnustep/gui/NSWindow.h +++ b/Headers/gnustep/gui/NSWindow.h @@ -143,6 +143,7 @@ extern NSSize NSTokenSize; unsigned hides_on_deactivate:1; unsigned accepts_mouse_moved:1; unsigned has_opened:1; + unsigned has_closed:1; } _f; /* Reserved for back-end use */ diff --git a/Source/NSApplication.m b/Source/NSApplication.m index bc98a6ed1..8e24c1e36 100644 --- a/Source/NSApplication.m +++ b/Source/NSApplication.m @@ -1833,22 +1833,25 @@ NSAssert([event retainCount] > 0, NSInternalInconsistencyException); { NSArray *itemArray; unsigned count; - unsigned i; + BOOL found = NO; itemArray = [menu itemArray]; count = [itemArray count]; - for (i = 0; i < count; i++) + while (count-- > 0) { - id item = [itemArray objectAtIndex: i]; + id item = [itemArray objectAtIndex: count]; if ([item target] == aWindow) { [menu removeItem: item]; - [menu sizeToFit]; - [menu update]; - break; + found = YES; } } + if (found == YES) + { + [menu sizeToFit]; + [menu update]; + } } } diff --git a/Source/NSWindow.m b/Source/NSWindow.m index 56965a883..231b5ba6c 100644 --- a/Source/NSWindow.m +++ b/Source/NSWindow.m @@ -218,6 +218,7 @@ static NSMapTable* windowmaps = NULL; cancelPerformSelector: @selector(_handleWindowNeedsDisplay:) target: self argument: nil]; + [NSApp removeWindowsItem: self]; [self setFrameAutosaveName: nil]; TEST_RELEASE(_wv); @@ -776,6 +777,10 @@ static NSMapTable* windowmaps = NULL; NSModalPanelRunLoopMode, NSEventTrackingRunLoopMode, nil]]; } + if (_f.has_closed == YES) + { + _f.has_closed = NO; /* A closed window has re-opened */ + } if (_f.has_opened == NO) { _f.has_opened = YES; @@ -1323,14 +1328,24 @@ resetCursorRectsForView(NSView *theView) [nc postNotificationName: NSWindowWillCloseNotification object: self]; _f.has_opened = NO; [[NSRunLoop currentRunLoop] - cancelPerformSelector: @selector(_handleWindowNeedsDisplay:) - target: self - argument: nil]; + cancelPerformSelector: @selector(_handleWindowNeedsDisplay:) + target: self + argument: nil]; [NSApp removeWindowsItem: self]; [self orderOut: self]; RELEASE(pool); - if (_f.is_released_when_closed) - RELEASE(self); + if (_f.has_closed == NO) + { + _f.has_closed = YES; + if (_f.is_released_when_closed) + { + RELEASE(self); + } + } + else + { + NSWarnMLog(@"closing window (%@) that's already closed.", self); + } } - (void) deminiaturize: sender @@ -2932,6 +2947,7 @@ resetCursorRectsForView(NSView *theView) _f.hides_on_deactivate = NO; _f.accepts_mouse_moved = NO; _f.has_opened = NO; + _f.has_closed = NO; } - (id) cleanInit