mirror of
https://github.com/gnustep/apps-gorm.git
synced 2025-02-23 19:51:00 +00:00
Some memory leak fixes and some minor improvements.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/apps/gorm/trunk@19754 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
8e0f12bbeb
commit
47d5d55cc6
13 changed files with 202 additions and 60 deletions
19
ChangeLog
19
ChangeLog
|
@ -1,3 +1,22 @@
|
|||
2004-07-17 17:54 Gregory John Casamento <greg_casamento@yahoo.com>
|
||||
|
||||
* GormDocument.m: Leak fixes and general clean up.
|
||||
* GormGenericEditor.m: Same.
|
||||
* GormImageEditor.m: Same.
|
||||
* GormViewEditor.h: Same.
|
||||
* GormWindowEditor.m: Same.
|
||||
* Palettes/0Menus/GormMenuEditor.m: Same.
|
||||
* Palettes/0Menus/GormNSMenu.m: Same.
|
||||
* Palettes/1Windows/GormNSPanel.h: Added new method so that the
|
||||
window setting "is released when closed" is saved, but doesn't
|
||||
effect the window displayed in Gorm. This presents some tricky
|
||||
memory management problems.
|
||||
* Palettes/1Windows/GormNSPanel.m: Same.
|
||||
* Palettes/1Windows/GormNSWindow.h: Same.
|
||||
* Palettes/1Windows/GormNSWindow.m: Same.
|
||||
* Palettes/1Windows/main.m: Added code necessary in the
|
||||
inspector to use the new method.
|
||||
|
||||
2004-07-17 17:54 Gregory John Casamento <greg_casamento@yahoo.com>
|
||||
|
||||
* GormFilePrefsManager.m: Removed reference to math.h and values.h
|
||||
|
|
|
@ -425,7 +425,8 @@ static NSImage *fileImage = nil;
|
|||
toolbar = [[NSToolbar alloc] initWithIdentifier: @"GormToolbar"];
|
||||
[toolbar setAllowsUserCustomization: NO];
|
||||
[toolbar setDelegate: self];
|
||||
[window setToolbar: toolbar];
|
||||
[window setToolbar: toolbar];
|
||||
RELEASE(toolbar);
|
||||
[toolbar setUsesStandardBackgroundColor: YES];
|
||||
}
|
||||
|
||||
|
@ -1052,25 +1053,42 @@ static NSImage *fileImage = nil;
|
|||
- (void) dealloc
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver: self];
|
||||
|
||||
// close the window...
|
||||
[window close];
|
||||
// [toolbar setDelegate: nil];
|
||||
|
||||
// Get rid of the selection box.
|
||||
[selectionBox removeFromSuperviewWithoutNeedingDisplay];
|
||||
|
||||
// release the managers...
|
||||
RELEASE(classManager);
|
||||
RELEASE(filePrefsManager);
|
||||
|
||||
// release editors...
|
||||
RELEASE(classEditor);
|
||||
RELEASE(savedEditors);
|
||||
RELEASE(openEditors);
|
||||
|
||||
// hidden objects...
|
||||
RELEASE(hidden);
|
||||
RELEASE(filesOwner);
|
||||
RELEASE(firstResponder);
|
||||
RELEASE(fontManager);
|
||||
|
||||
// release special objects...
|
||||
// RELEASE(filesOwner);
|
||||
// RELEASE(firstResponder);
|
||||
// RELEASE(fontManager);
|
||||
|
||||
if (objToName != 0)
|
||||
{
|
||||
NSFreeMapTable(objToName);
|
||||
}
|
||||
|
||||
RELEASE(documentPath);
|
||||
RELEASE(savedEditors);
|
||||
RELEASE(scrollView);
|
||||
RELEASE(classesScrollView);
|
||||
RELEASE(toolbar);
|
||||
RELEASE(filePrefsManager);
|
||||
RELEASE(openEditors);
|
||||
RELEASE(soundsScrollView);
|
||||
RELEASE(imagesScrollView);
|
||||
|
||||
// NSLog(@"window = %@",window);
|
||||
RELEASE(window);
|
||||
[super dealloc];
|
||||
}
|
||||
|
@ -1553,6 +1571,7 @@ static NSImage *fileImage = nil;
|
|||
[editors addObjectsFromArray: openEditors];
|
||||
[editors makeObjectsPerformSelector: @selector(close)];
|
||||
[openEditors removeAllObjects];
|
||||
// [editors makeObjectsPerformSelector: @selector(release)];
|
||||
[editors removeAllObjects];
|
||||
|
||||
// Close the editors in the document window...
|
||||
|
@ -1577,35 +1596,29 @@ static NSImage *fileImage = nil;
|
|||
enumerator = [nameTable objectEnumerator];
|
||||
while ((obj = [enumerator nextObject]) != nil)
|
||||
{
|
||||
/*
|
||||
if ([obj isKindOfClass: [NSMenu class]] == YES)
|
||||
{
|
||||
if ([[obj window] isVisible] == YES)
|
||||
{
|
||||
[hidden addObject: obj];
|
||||
[obj close];
|
||||
}
|
||||
}
|
||||
else if ([obj isKindOfClass: [NSWindow class]] == YES)
|
||||
else
|
||||
*/
|
||||
if ([obj isKindOfClass: [NSWindow class]] == YES)
|
||||
{
|
||||
[obj setReleasedWhenClosed: NO];
|
||||
if ([obj isVisible] == YES)
|
||||
{
|
||||
[hidden addObject: obj];
|
||||
[obj orderOut: self];
|
||||
}
|
||||
[obj setReleasedWhenClosed: YES];
|
||||
[obj close];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// deactivate the document...
|
||||
[self setDocumentActive: NO];
|
||||
[self setSelectionFromEditor: nil];
|
||||
[self closeAllEditors]; // shut down all of the editors..
|
||||
[nc postNotificationName: IBWillCloseDocumentNotification
|
||||
object: self];
|
||||
[nc postNotificationName: IBWillCloseDocumentNotification object: self];
|
||||
[nc removeObserver: self]; // stop listening to all notifications.
|
||||
// [window setToolbar: nil]; // close the toolbar
|
||||
// [toolbar setDelegate: nil]; // unset the delegate...
|
||||
// RELEASE(self);
|
||||
}
|
||||
else if ([name isEqual: NSWindowDidBecomeKeyNotification] == YES)
|
||||
{
|
||||
|
@ -2437,7 +2450,6 @@ static NSImage *fileImage = nil;
|
|||
[self setName: @"My Window" forObject: aWindow];
|
||||
[self attachObject: aWindow toParent: nil];
|
||||
[self setObject: aWindow isVisibleAtLaunch: YES];
|
||||
RELEASE(aWindow);
|
||||
|
||||
[aMenu setTitle: _(@"Main Menu")];
|
||||
[aMenu addItemWithTitle: _(@"Hide")
|
||||
|
@ -2449,9 +2461,8 @@ static NSImage *fileImage = nil;
|
|||
|
||||
// the first menu attached becomes the main menu.
|
||||
[self attachObject: aMenu toParent: nil];
|
||||
[objectsView addObject: aMenu];
|
||||
[[aMenu window] setFrameTopLeftPoint: origin];
|
||||
RELEASE(aMenu);
|
||||
// RETAIN(aMenu);
|
||||
}
|
||||
else if ([type isEqual: @"Inspector"] == YES)
|
||||
{
|
||||
|
@ -2481,7 +2492,7 @@ static NSImage *fileImage = nil;
|
|||
[aWindow setTitle: _(@"Inspector Window")];
|
||||
[self setName: @"InspectorWin" forObject: aWindow];
|
||||
[self attachObject: aWindow toParent: nil];
|
||||
RELEASE(aWindow);
|
||||
// RELEASE(aWindow);
|
||||
}
|
||||
else if ([type isEqual: @"Palette"] == YES)
|
||||
{
|
||||
|
@ -2511,7 +2522,7 @@ static NSImage *fileImage = nil;
|
|||
[aWindow setTitle: _(@"Palette Window")];
|
||||
[self setName: @"PaletteWin" forObject: aWindow];
|
||||
[self attachObject: aWindow toParent: nil];
|
||||
RELEASE(aWindow);
|
||||
// RELEASE(aWindow);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2528,6 +2539,7 @@ static NSImage *fileImage = nil;
|
|||
NSDebugLog(@"Attempt to set name for nil object");
|
||||
return;
|
||||
}
|
||||
|
||||
if (aName == nil)
|
||||
{
|
||||
/*
|
||||
|
@ -2588,7 +2600,7 @@ static NSImage *fileImage = nil;
|
|||
}
|
||||
nameCopy = [aName copy]; /* Make sure it's immutable */
|
||||
[nameTable setObject: object forKey: nameCopy];
|
||||
AUTORELEASE(object); // make sure that when it's removed from the table, it's released.
|
||||
RELEASE(object); // make sure that when it's removed from the table, it's released.
|
||||
NSMapInsert(objToName, (void*)object, (void*)nameCopy);
|
||||
if (oldName != nil)
|
||||
{
|
||||
|
|
|
@ -143,7 +143,7 @@
|
|||
if(closed == NO)
|
||||
[self close];
|
||||
|
||||
// RELEASE(objects); // FIXME: This will leak...
|
||||
RELEASE(objects); //
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
|
|
@ -244,6 +244,7 @@ static int handled_mask= NSDragOperationCopy|NSDragOperationGeneric|NSDragOperat
|
|||
GormImage *image = [[GormImage alloc] initWithName: name path: obj];
|
||||
[image setSystemImage: YES];
|
||||
[self addObject: image];
|
||||
RELEASE(image);
|
||||
}
|
||||
|
||||
// set up the notification...
|
||||
|
@ -469,9 +470,16 @@ static int handled_mask= NSDragOperationCopy|NSDragOperationGeneric|NSDragOperat
|
|||
[self setNeedsDisplay: YES];
|
||||
}
|
||||
|
||||
/*
|
||||
- (void) dealloc
|
||||
{
|
||||
NSLog(@"deallocing..");
|
||||
[super dealloc];
|
||||
}
|
||||
*/
|
||||
@end
|
||||
|
||||
// sound proxy object...
|
||||
// image proxy object...
|
||||
@implementation GormImage
|
||||
- (id) initWithName: (NSString *)aName
|
||||
path: (NSString *)aPath
|
||||
|
@ -520,6 +528,7 @@ static int handled_mask= NSDragOperationCopy|NSDragOperationGeneric|NSDragOperat
|
|||
RELEASE(name);
|
||||
RELEASE(path);
|
||||
RELEASE(image);
|
||||
RELEASE(smallImage);
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
|
|
@ -32,10 +32,10 @@
|
|||
|
||||
@interface GormViewEditor : NSView <IBEditors>
|
||||
{
|
||||
id<IBDocuments> document;
|
||||
NSView *_editedObject;
|
||||
BOOL activated;
|
||||
BOOL closed;
|
||||
id<IBDocuments> document;
|
||||
id _editedObject;
|
||||
BOOL activated;
|
||||
BOOL closed;
|
||||
GormViewWithSubviewsEditor *parent;
|
||||
}
|
||||
- (BOOL) activate;
|
||||
|
|
|
@ -46,12 +46,27 @@
|
|||
{
|
||||
NSBundle *bundle = [NSBundle mainBundle];
|
||||
NSString *path = [bundle pathForImageResource: @"GormWindow"];
|
||||
|
||||
image = [[NSImage alloc] initWithContentsOfFile: path];
|
||||
}
|
||||
return image;
|
||||
}
|
||||
@end
|
||||
|
||||
@interface NSWindow (GormWindowEditorAdditions)
|
||||
- (void) unsetInitialFirstResponder;
|
||||
@end
|
||||
|
||||
@implementation NSWindow (GormWindowEditorAdditions)
|
||||
/*
|
||||
* The setFirstResponder method is used in this editor to allow it to
|
||||
* respond to messages forwarded to the window appropriately.
|
||||
* Unfortunately, once it's set to something, it cannot be set to nil.
|
||||
* This method allows us to set it to nil, thus preventing a memory leak.
|
||||
*/
|
||||
- (void) unsetInitialFirstResponder
|
||||
{
|
||||
ASSIGN(_initialFirstResponder, nil);
|
||||
}
|
||||
@end
|
||||
|
||||
/*
|
||||
|
@ -99,7 +114,6 @@
|
|||
|
||||
@interface GormWindowEditor : GormViewWithContentViewEditor
|
||||
{
|
||||
NSWindow *edited;
|
||||
NSView *edit_view;
|
||||
NSMutableArray *subeditors;
|
||||
BOOL isLinkSource;
|
||||
|
@ -112,7 +126,6 @@
|
|||
- (void) changeFont: (id) sender;
|
||||
- (void) close;
|
||||
- (void) closeSubeditors;
|
||||
// - (void) copySelection;
|
||||
- (void) deactivate;
|
||||
- (void) deleteSelection;
|
||||
- (id<IBDocuments>) document;
|
||||
|
@ -123,10 +136,6 @@
|
|||
- (void) orderFront;
|
||||
- (void) pasteInSelection;
|
||||
- (void) resetObject: (id)anObject;
|
||||
// - (void) selectObjects: (NSArray*)objects;
|
||||
// - (void) validateEditing;
|
||||
// - (BOOL) wantsSelection;
|
||||
// - (NSWindow*) window;
|
||||
@end
|
||||
|
||||
@implementation GormWindowEditor
|
||||
|
@ -165,7 +174,7 @@
|
|||
contentViewEditor = (GormInternalViewEditor *)[document editorForObject: contentView
|
||||
inEditor: self
|
||||
create: YES];
|
||||
[(NSWindow *)_editedObject setInitialFirstResponder: self];
|
||||
[_EO setInitialFirstResponder: self];
|
||||
[self setOpened: YES];
|
||||
activated = YES;
|
||||
return YES;
|
||||
|
@ -192,10 +201,8 @@
|
|||
}
|
||||
|
||||
[self closeSubeditors];
|
||||
|
||||
[self deactivate];
|
||||
|
||||
[document editor: self didCloseForObject: edited];
|
||||
[document editor: self didCloseForObject: _EO];
|
||||
}
|
||||
|
||||
- (void) closeSubeditors
|
||||
|
@ -219,6 +226,7 @@
|
|||
if (activated == YES)
|
||||
{
|
||||
[contentViewEditor deactivate];
|
||||
[_EO unsetInitialFirstResponder];
|
||||
activated = NO;
|
||||
}
|
||||
return;
|
||||
|
@ -229,10 +237,9 @@
|
|||
if (closed == NO)
|
||||
[self close];
|
||||
|
||||
// RELEASE(edited);
|
||||
RELEASE(selection);
|
||||
RELEASE(subeditors);
|
||||
// RELEASE(document);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
@ -240,6 +247,20 @@
|
|||
{
|
||||
}
|
||||
|
||||
/*
|
||||
- (id) retain
|
||||
{
|
||||
NSLog(@"Being retained... %d: %@", [self retainCount], self);
|
||||
return [super retain];
|
||||
}
|
||||
|
||||
- (oneway void) release
|
||||
{
|
||||
NSLog(@"Being released... %d: %@", [self retainCount], self);
|
||||
[super release];
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
* Dragging source protocol implementation
|
||||
*/
|
||||
|
@ -292,9 +313,8 @@
|
|||
object: aDocument];
|
||||
|
||||
_displaySelection = YES;
|
||||
_editedObject = (NSView*)anObject;
|
||||
ASSIGN(edited, anObject);
|
||||
RETAIN(edited);
|
||||
ASSIGN(_editedObject, anObject);
|
||||
|
||||
// we don't retain the document...
|
||||
document = aDocument;
|
||||
|
||||
|
@ -304,8 +324,6 @@
|
|||
selection = [NSMutableArray new];
|
||||
subeditors = [NSMutableArray new];
|
||||
|
||||
[(NSWindow *)_editedObject setInitialFirstResponder: self];
|
||||
|
||||
activated = NO;
|
||||
closed = NO;
|
||||
|
||||
|
@ -349,7 +367,7 @@
|
|||
|
||||
- (void) orderFront
|
||||
{
|
||||
[edited orderFront: self];
|
||||
[_EO orderFront: self];
|
||||
}
|
||||
|
||||
- (void) pasteInSelection
|
||||
|
|
|
@ -513,6 +513,7 @@
|
|||
[self close];
|
||||
}
|
||||
|
||||
RELEASE(edited);
|
||||
RELEASE(selection);
|
||||
RELEASE(subeditor);
|
||||
[super dealloc];
|
||||
|
@ -678,7 +679,6 @@ void _attachAll(NSMenu *menu, id document)
|
|||
{
|
||||
document = aDocument;
|
||||
ASSIGN(edited, anObject);
|
||||
RETAIN(edited);
|
||||
selection = [NSMutableArray new];
|
||||
rep = [edited menuRepresentation];
|
||||
|
||||
|
@ -1076,8 +1076,6 @@ static BOOL done_editing;
|
|||
didDrawBackground = [editField drawsBackground];
|
||||
[editField setDrawsBackground: YES];
|
||||
|
||||
// [editField display];
|
||||
|
||||
[nc addObserver: self
|
||||
selector: @selector(handleNotification:)
|
||||
name: NSControlTextDidEndEditingNotification
|
||||
|
|
|
@ -107,6 +107,13 @@
|
|||
|
||||
[super sendEvent: theEvent];
|
||||
}
|
||||
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
// FIXME: This prevents a leak and a crash.
|
||||
[self _setMenu: nil];
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation GormNSMenu
|
||||
|
@ -136,12 +143,32 @@
|
|||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
// This method is purely for debugging purposes...
|
||||
// These methods are purely for debugging purposes...
|
||||
/*
|
||||
- (void) display
|
||||
{
|
||||
NSDebugLog(@"In GormNSMenu display...");
|
||||
[super display];
|
||||
}
|
||||
|
||||
- (id) retain
|
||||
{
|
||||
NSLog(@"Being retained... %d: %@", [self retainCount], self);
|
||||
return [super retain];
|
||||
}
|
||||
|
||||
- (oneway void) release
|
||||
{
|
||||
NSLog(@"Being released... %d: %@", [self retainCount], self);
|
||||
[super release];
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
NSLog(@"Deallocing %@",self);
|
||||
[super dealloc];
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
@end
|
||||
|
||||
|
|
|
@ -30,9 +30,12 @@
|
|||
@interface GormNSPanel : NSPanel
|
||||
{
|
||||
unsigned _gormStyleMask;
|
||||
BOOL _gormReleasedWhenClosed;
|
||||
}
|
||||
- (void) setStyleMask: (unsigned)newStyleMask;
|
||||
- (unsigned) styleMask;
|
||||
- (void) _setReleasedWhenClosed: (BOOL) flag;
|
||||
- (BOOL) _isReleasedWhenClosed;
|
||||
@end
|
||||
|
||||
#endif
|
||||
|
|
|
@ -31,10 +31,16 @@
|
|||
- (void)encodeWithCoder: (NSCoder*) aCoder
|
||||
{
|
||||
unsigned oldStyleMask;
|
||||
|
||||
// save the old values...
|
||||
oldStyleMask = _styleMask;
|
||||
|
||||
// set the values we wish to save.. after save restore.
|
||||
_styleMask = _gormStyleMask;
|
||||
[self setReleasedWhenClosed: _gormReleasedWhenClosed];
|
||||
[super encodeWithCoder: aCoder];
|
||||
_styleMask = oldStyleMask;
|
||||
[self setReleasedWhenClosed: NO];
|
||||
}
|
||||
|
||||
- (id) initWithContentRect: (NSRect)contentRect
|
||||
|
@ -65,4 +71,14 @@
|
|||
{
|
||||
return @"NSPanel";
|
||||
}
|
||||
|
||||
- (void) _setReleasedWhenClosed: (BOOL) flag
|
||||
{
|
||||
_gormReleasedWhenClosed = flag;
|
||||
}
|
||||
|
||||
- (BOOL) _isReleasedWhenClosed
|
||||
{
|
||||
return _gormReleasedWhenClosed;
|
||||
}
|
||||
@end
|
||||
|
|
|
@ -29,9 +29,12 @@
|
|||
@interface GormNSWindow : NSWindow
|
||||
{
|
||||
unsigned _gormStyleMask;
|
||||
BOOL _gormReleasedWhenClosed;
|
||||
}
|
||||
- (void) setStyleMask: (unsigned)newStyleMask;
|
||||
- (unsigned) styleMask;
|
||||
- (void) _setReleasedWhenClosed: (BOOL) flag;
|
||||
- (BOOL) _isReleasedWhenClosed;
|
||||
@end
|
||||
|
||||
#endif
|
||||
|
|
|
@ -28,10 +28,16 @@
|
|||
- (void) encodeWithCoder: (NSCoder*)aCoder
|
||||
{
|
||||
unsigned oldStyleMask;
|
||||
|
||||
// save the old values...
|
||||
oldStyleMask = _styleMask;
|
||||
|
||||
// set the values we wish to save.. after save restore.
|
||||
_styleMask = _gormStyleMask;
|
||||
[self setReleasedWhenClosed: _gormReleasedWhenClosed];
|
||||
[super encodeWithCoder: aCoder];
|
||||
_styleMask = oldStyleMask;
|
||||
[self setReleasedWhenClosed: NO];
|
||||
}
|
||||
|
||||
- (id) initWithContentRect: (NSRect)contentRect
|
||||
|
@ -68,4 +74,35 @@
|
|||
{
|
||||
return @"NSWindow";
|
||||
}
|
||||
|
||||
- (void) _setReleasedWhenClosed: (BOOL) flag
|
||||
{
|
||||
_gormReleasedWhenClosed = flag;
|
||||
}
|
||||
|
||||
- (BOOL) _isReleasedWhenClosed
|
||||
{
|
||||
return _gormReleasedWhenClosed;
|
||||
}
|
||||
|
||||
// for testing...
|
||||
/*
|
||||
- (id) retain
|
||||
{
|
||||
NSLog(@"Being retained... %d: %@", [self retainCount], self);
|
||||
return [super retain];
|
||||
}
|
||||
|
||||
- (oneway void) release
|
||||
{
|
||||
NSLog(@"Being released... %d: %@", [self retainCount], self);
|
||||
[super release];
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
NSLog(@"Deallocing %@",self);
|
||||
[super dealloc];
|
||||
}
|
||||
*/
|
||||
@end
|
||||
|
|
|
@ -252,7 +252,7 @@ NSwindow inspector
|
|||
|
||||
// Release When Closed
|
||||
flag = ([[control cellAtRow: 0 column: 0] state] == NSOnState) ? YES : NO;
|
||||
[object setReleasedWhenClosed: flag];
|
||||
[object _setReleasedWhenClosed: flag];
|
||||
|
||||
// Hide on deactivate
|
||||
flag = ([[control cellAtRow: 1 column: 0] state] == NSOnState) ? YES : NO;
|
||||
|
@ -307,7 +307,7 @@ NSwindow inspector
|
|||
[controlMatrix selectCellAtRow: 2 column: 0];
|
||||
|
||||
[optionMatrix deselectAllCells];
|
||||
if ([anObject isReleasedWhenClosed])
|
||||
if ([anObject _isReleasedWhenClosed])
|
||||
[optionMatrix selectCellAtRow: 0 column: 0];
|
||||
if ([anObject hidesOnDeactivate])
|
||||
[optionMatrix selectCellAtRow: 1 column: 0];
|
||||
|
|
Loading…
Reference in a new issue