1996-05-30 20:03:15 +00:00
|
|
|
/*
|
|
|
|
NSApplication.m
|
|
|
|
|
|
|
|
The one and only application class
|
|
|
|
|
|
|
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
|
|
|
|
|
|
|
Author: Scott Christley <scottc@net-community.com>
|
|
|
|
Date: 1996
|
|
|
|
|
|
|
|
This file is part of the GNUstep GUI Library.
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Library General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Library General Public License for more details.
|
|
|
|
|
|
|
|
If you are interested in a warranty or support for this source code,
|
|
|
|
contact Scott Christley <scottc@net-community.com> for more information.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
|
|
License along with this library; if not, write to the Free
|
|
|
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <gnustep/gui/NSApplication.h>
|
|
|
|
#include <gnustep/gui/NSPopUpButton.h>
|
|
|
|
#include <gnustep/gui/NSPanel.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
//
|
|
|
|
// Class variables
|
|
|
|
//
|
|
|
|
// The global application instance
|
|
|
|
extern id NSApp;
|
|
|
|
NSEvent *NullEvent;
|
1996-06-06 13:55:06 +00:00
|
|
|
BOOL gnustep_gui_app_is_in_dealloc;
|
1996-05-30 20:03:15 +00:00
|
|
|
|
|
|
|
// Global strings
|
|
|
|
NSString *NSModalPanelRunLoopMode = @"ModalPanelMode";
|
|
|
|
NSString *NSEventTrackingRunLoopMode = @"EventTrackingMode";
|
|
|
|
|
|
|
|
//
|
|
|
|
// Global Exception Strings
|
|
|
|
//
|
1996-10-03 18:45:41 +00:00
|
|
|
NSString *NSAbortModalException = @"AbortModal";
|
|
|
|
NSString *NSAbortPrintingException = @"AbortPrinting";
|
|
|
|
NSString *NSAppKitIgnoredException = @"AppKitIgnored";
|
|
|
|
NSString *NSAppKitVirtualMemoryException = @"AppKitVirtualMemory";
|
|
|
|
NSString *NSBadBitmapParametersException = @"BadBitmapParameters";
|
|
|
|
NSString *NSBadComparisonException = @"BadComparison";
|
|
|
|
NSString *NSBadRTFColorTableException = @"BadRTFColorTable";
|
|
|
|
NSString *NSBadRTFDirectiveException = @"BadRTFDirective";
|
|
|
|
NSString *NSBadRTFFontTableException = @"BadRTFFontTable";
|
|
|
|
NSString *NSBadRTFStyleSheetException = @"BadRTFStyleSheet";
|
|
|
|
NSString *NSBrowserIllegalDelegateException = @"BrowserIllegalDelegate";
|
|
|
|
NSString *NSColorListIOException = @"ColorListIO";
|
|
|
|
NSString *NSColorListNotEditableException = @"ColorListNotEditable";
|
|
|
|
NSString *NSDraggingException = @"Draggin";
|
|
|
|
NSString *NSFontUnavailableException = @"FontUnavailable";
|
|
|
|
NSString *NSIllegalSelectorException = @"IllegalSelector";
|
|
|
|
NSString *NSImageCacheException = @"ImageCache";
|
|
|
|
NSString *NSNibLoadingException = @"NibLoading";
|
|
|
|
NSString *NSPPDIncludeNotFoundException = @"PPDIncludeNotFound";
|
|
|
|
NSString *NSPPDIncludeStackOverflowException = @"PPDIncludeStackOverflow";
|
|
|
|
NSString *NSPPDIncludeStackUnderflowException = @"PPDIncludeStackUnderflow";
|
|
|
|
NSString *NSPPDParseException = @"PPDParse";
|
|
|
|
NSString *NSPasteboardCommunicationException = @"PasteboardCommunication";
|
|
|
|
NSString *NSPrintOperationExistsException = @"PrintOperationExists";
|
|
|
|
NSString *NSPrintPackageException = @"PrintPackage";
|
|
|
|
NSString *NSPrintingCommunicationException = @"PrintingCommunication";
|
|
|
|
NSString *NSRTFPropertyStackOverflowException = @"RTFPropertyStackOverflow";
|
|
|
|
NSString *NSTIFFException = @"TIFF";
|
|
|
|
NSString *NSTextLineTooLongException = @"TextLineTooLong";
|
|
|
|
NSString *NSTextNoSelectionException = @"TextNoSelection";
|
|
|
|
NSString *NSTextReadException = @"TextRead";
|
|
|
|
NSString *NSTextWriteException = @"TextWrite";
|
|
|
|
NSString *NSTypedStreamVersionException = @"TypedStreamVersion";
|
|
|
|
NSString *NSWindowServerCommunicationException = @"WindowServerCommunication";
|
|
|
|
NSString *NSWordTablesReadException = @"WordTablesRead";
|
|
|
|
NSString *NSWordTablesWriteException = @"WordTablesWrite";
|
1996-05-30 20:03:15 +00:00
|
|
|
|
|
|
|
// Application notifications
|
1996-10-03 18:45:41 +00:00
|
|
|
NSString *NSApplicationDidBecomeActiveNotification
|
|
|
|
= @"ApplicationDidBecomeActive";
|
|
|
|
NSString *NSApplicationDidFinishLaunchingNotification
|
|
|
|
= @"ApplicationDidFinishLaunching";
|
|
|
|
NSString *NSApplicationDidHideNotification = @"ApplicationDidHide";
|
|
|
|
NSString *NSApplicationDidResignActiveNotification
|
|
|
|
= @"ApplicationDidResignActive";
|
|
|
|
NSString *NSApplicationDidUnhideNotification = @"ApplicationDidUnhide";
|
|
|
|
NSString *NSApplicationDidUpdateNotification = @"ApplicationDidUpdate";
|
|
|
|
NSString *NSApplicationWillBecomeActiveNotification
|
|
|
|
= @"ApplicationWillBecomeActive";
|
|
|
|
NSString *NSApplicationWillFinishLaunchingNotification
|
|
|
|
= @"ApplicationWillFinishLaunching";
|
|
|
|
NSString *NSApplicationWillHideNotification = @"ApplicationWillHide";
|
|
|
|
NSString *NSApplicationWillResignActiveNotification
|
|
|
|
= @"ApplicationWillResignActive";
|
|
|
|
NSString *NSApplicationWillUnhideNotification = @"ApplicationWillUnhide";
|
|
|
|
NSString *NSApplicationWillUpdateNotification = @"ApplicationWillUpdate";
|
1996-05-30 20:03:15 +00:00
|
|
|
|
|
|
|
@implementation NSApplication
|
|
|
|
|
|
|
|
//
|
|
|
|
// Class methods
|
|
|
|
//
|
|
|
|
+ (void)initialize
|
|
|
|
{
|
|
|
|
if (self == [NSApplication class])
|
|
|
|
{
|
1996-07-11 00:59:30 +00:00
|
|
|
NSDebugLog(@"Initialize NSApplication class\n");
|
1996-05-30 20:03:15 +00:00
|
|
|
|
|
|
|
// Initial version
|
|
|
|
[self setVersion:1];
|
1996-06-06 13:55:06 +00:00
|
|
|
|
|
|
|
// So the application knows its within dealloc
|
|
|
|
// and can prevent -release loops.
|
|
|
|
gnustep_gui_app_is_in_dealloc = NO;
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+ (NSApplication *)sharedApplication
|
|
|
|
{
|
|
|
|
// If the global application does not exist yet then create it
|
|
|
|
if (!NSApp)
|
|
|
|
NSApp = [[self alloc] init];
|
|
|
|
return NSApp;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Instance methods
|
|
|
|
//
|
|
|
|
|
|
|
|
//
|
|
|
|
// Creating and initializing the NSApplication
|
|
|
|
//
|
|
|
|
- init
|
|
|
|
{
|
|
|
|
[super init];
|
|
|
|
|
1996-07-11 00:59:30 +00:00
|
|
|
NSDebugLog(@"Begin of NSApplication -init\n");
|
1996-05-30 20:03:15 +00:00
|
|
|
|
|
|
|
// allocate the window list
|
|
|
|
window_list = [NSMutableArray array];
|
|
|
|
window_count = 1;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Event handling setup
|
|
|
|
//
|
|
|
|
// allocate the event queue
|
|
|
|
event_queue = [[Queue alloc] init];
|
|
|
|
// No current event
|
|
|
|
current_event = nil;
|
|
|
|
// The NULL event
|
|
|
|
NullEvent = [[NSEvent alloc] init];
|
|
|
|
|
|
|
|
//
|
|
|
|
// We are the end of the responder chain
|
|
|
|
//
|
|
|
|
[self setNextResponder:NULL];
|
|
|
|
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)finishLaunching
|
|
|
|
{
|
1996-10-03 18:45:41 +00:00
|
|
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
|
|
|
|
1996-05-30 20:03:15 +00:00
|
|
|
// notify that we will finish the launching
|
1996-10-03 18:45:41 +00:00
|
|
|
[nc postNotificationName: NSApplicationWillFinishLaunchingNotification
|
|
|
|
object: self];
|
1996-05-30 20:03:15 +00:00
|
|
|
|
1996-10-03 18:45:41 +00:00
|
|
|
// finish the launching
|
1996-05-30 20:03:15 +00:00
|
|
|
|
1996-10-03 18:45:41 +00:00
|
|
|
// notify that the launching has finished
|
|
|
|
[nc postNotificationName: NSApplicationDidFinishLaunchingNotification
|
|
|
|
object: self];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void)dealloc
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
|
1996-07-11 00:59:30 +00:00
|
|
|
NSDebugLog(@"Freeing NSApplication\n");
|
1996-05-30 20:03:15 +00:00
|
|
|
|
1996-06-06 13:55:06 +00:00
|
|
|
// Let ourselves know we are within dealloc
|
|
|
|
gnustep_gui_app_is_in_dealloc = YES;
|
|
|
|
|
1996-05-30 20:03:15 +00:00
|
|
|
// Release the window list
|
|
|
|
// We retain all of the objects in our list
|
|
|
|
// so we need to release them
|
|
|
|
|
|
|
|
//NSArray doesn't know -removeAllObjects yet
|
1996-06-06 13:55:06 +00:00
|
|
|
[window_list removeAllObjects];
|
|
|
|
//j = [window_list count];
|
|
|
|
//for (i = 0;i < j; ++i)
|
|
|
|
// [[window_list objectAtIndex:i] release];
|
1996-05-30 20:03:15 +00:00
|
|
|
|
|
|
|
// no need -array is autoreleased
|
|
|
|
//[window_list release];
|
|
|
|
|
|
|
|
[event_queue release];
|
|
|
|
[current_event release];
|
|
|
|
[super dealloc];
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Changing the active application
|
|
|
|
//
|
|
|
|
- (void)activateIgnoringOtherApps:(BOOL)flag
|
|
|
|
{
|
|
|
|
app_is_active = YES;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)deactivate
|
|
|
|
{
|
|
|
|
app_is_active = NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)isActive
|
|
|
|
{
|
|
|
|
return app_is_active;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Running the event loop
|
|
|
|
//
|
|
|
|
- (void)abortModal
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSModalSession)beginModalSessionForWindow:(NSWindow *)theWindow
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)endModalSession:(NSModalSession)theSession
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)isRunning
|
|
|
|
{
|
|
|
|
return app_is_running;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)run
|
|
|
|
{
|
|
|
|
NSEvent *e;
|
|
|
|
|
1996-07-11 00:59:30 +00:00
|
|
|
NSDebugLog(@"NSApplication -run\n");
|
1996-05-30 20:03:15 +00:00
|
|
|
|
|
|
|
[self finishLaunching];
|
|
|
|
|
|
|
|
app_should_quit = NO;
|
|
|
|
app_is_running = YES;
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
e = [self nextEventMatchingMask:NSAnyEventMask untilDate:nil
|
|
|
|
inMode:nil dequeue:YES];
|
|
|
|
if (e)
|
|
|
|
[self postEvent:e atStart:YES];
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Null event
|
|
|
|
// Call the back-end method to handle it
|
|
|
|
[self handleNullEvent];
|
|
|
|
}
|
|
|
|
} while (!app_should_quit);
|
|
|
|
app_is_running = YES;
|
|
|
|
|
1996-07-11 00:59:30 +00:00
|
|
|
NSDebugLog(@"NSApplication end of run loop\n");
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (int)runModalForWindow:(NSWindow *)theWindow
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (int)runModalSession:(NSModalSession)theSession
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)sendEvent:(NSEvent *)theEvent
|
|
|
|
{
|
|
|
|
// Don't send the null event
|
|
|
|
if (theEvent == NullEvent)
|
|
|
|
{
|
1996-07-11 00:59:30 +00:00
|
|
|
NSDebugLog(@"Not sending the Null Event\n");
|
1996-05-30 20:03:15 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// What is the event type
|
|
|
|
switch ([theEvent type])
|
|
|
|
{
|
|
|
|
|
|
|
|
//
|
|
|
|
// NSApplication traps the periodic events
|
|
|
|
//
|
|
|
|
case NSPeriodic:
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NSKeyDown:
|
|
|
|
{
|
1996-07-11 00:59:30 +00:00
|
|
|
NSDebugLog(@"send key down event\n");
|
1996-05-30 20:03:15 +00:00
|
|
|
[[theEvent window] sendEvent:theEvent];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NSKeyUp:
|
|
|
|
{
|
|
|
|
NSDebugLog(@"send key up event\n");
|
|
|
|
[[theEvent window] sendEvent:theEvent];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
// All others get passed to the window
|
|
|
|
//
|
|
|
|
default:
|
|
|
|
{
|
1996-07-11 00:59:30 +00:00
|
|
|
if (!theEvent) NSDebugLog(@"NSEvent is nil!\n");
|
|
|
|
NSDebugLog(@"NSEvent type: %d\n", [theEvent type]);
|
|
|
|
NSDebugLog(@"send event to window\n");
|
|
|
|
NSDebugLog([[theEvent window] description]);
|
|
|
|
NSDebugLog(@"\n");
|
1996-05-30 20:03:15 +00:00
|
|
|
if (![theEvent window])
|
1996-07-11 00:59:30 +00:00
|
|
|
NSDebugLog(@"no window\n");
|
1996-05-30 20:03:15 +00:00
|
|
|
[[theEvent window] sendEvent:theEvent];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)stop:sender
|
|
|
|
{
|
|
|
|
app_is_running = NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)stopModal
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)stopModalWithCode:(int)returnCode
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Getting, removing, and posting events
|
|
|
|
//
|
|
|
|
- (BOOL)event:(NSEvent *)theEvent matchMask:(unsigned int)mask
|
|
|
|
{
|
|
|
|
NSEventType t;
|
|
|
|
|
|
|
|
// If mask is for any event then return success
|
|
|
|
if (mask == NSAnyEventMask)
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if (!theEvent) return NO;
|
|
|
|
|
1996-10-03 18:45:41 +00:00
|
|
|
// Don't check the null event
|
|
|
|
if (theEvent == NullEvent) return NO;
|
|
|
|
|
1996-05-30 20:03:15 +00:00
|
|
|
t = [theEvent type];
|
|
|
|
|
|
|
|
if ((t == NSLeftMouseDown) && (mask & NSLeftMouseDownMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSLeftMouseUp) && (mask & NSLeftMouseUpMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSRightMouseDown) && (mask & NSRightMouseDownMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSRightMouseUp) && (mask & NSRightMouseUpMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSMouseMoved) && (mask & NSMouseMovedMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSMouseEntered) && (mask & NSMouseEnteredMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSMouseExited) && (mask & NSMouseExitedMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSLeftMouseDragged) && (mask & NSLeftMouseDraggedMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSRightMouseDragged) && (mask & NSRightMouseDraggedMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSKeyDown) && (mask & NSKeyDownMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSKeyUp) && (mask & NSKeyUpMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSFlagsChanged) && (mask & NSFlagsChangedMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSPeriodic) && (mask & NSPeriodicMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
if ((t == NSCursorUpdate) && (mask & NSCursorUpdateMask))
|
|
|
|
return YES;
|
|
|
|
|
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setCurrentEvent:(NSEvent *)theEvent;
|
|
|
|
{
|
|
|
|
[theEvent retain];
|
|
|
|
[current_event release];
|
|
|
|
current_event = theEvent;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSEvent *)currentEvent;
|
|
|
|
{
|
|
|
|
return current_event;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)discardEventsMatchingMask:(unsigned int)mask
|
|
|
|
beforeEvent:(NSEvent *)lastEvent
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSEvent *)nextEventMatchingMask:(unsigned int)mask
|
|
|
|
untilDate:(NSDate *)expiration
|
|
|
|
inMode:(NSString *)mode
|
|
|
|
dequeue:(BOOL)flag
|
|
|
|
{
|
|
|
|
NSEvent *e;
|
|
|
|
BOOL done;
|
|
|
|
int i, j;
|
|
|
|
|
|
|
|
// If the queue isn't empty then check those messages
|
|
|
|
if (![event_queue isEmpty])
|
|
|
|
{
|
|
|
|
j = [event_queue count];
|
|
|
|
for (i = j-1;i > 0; --i)
|
|
|
|
{
|
|
|
|
e = [event_queue objectAtIndex: i];
|
|
|
|
if ([self event: e matchMask: mask])
|
|
|
|
{
|
|
|
|
[event_queue removeObjectAtIndex: i];
|
|
|
|
[self setCurrentEvent: e];
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Not in queue so wait for next event
|
|
|
|
done = NO;
|
|
|
|
while (!done)
|
|
|
|
{
|
|
|
|
e = [self getNextEvent];
|
|
|
|
|
|
|
|
// Check mask
|
|
|
|
if ([self event: e matchMask: mask])
|
|
|
|
{
|
|
|
|
if (e)
|
1996-10-03 18:45:41 +00:00
|
|
|
{
|
|
|
|
[event_queue removeObject: e];
|
|
|
|
}
|
1996-05-30 20:03:15 +00:00
|
|
|
done = YES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[self setCurrentEvent: e];
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)postEvent:(NSEvent *)event atStart:(BOOL)flag
|
|
|
|
{
|
|
|
|
[self sendEvent:event];
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Sending action messages
|
|
|
|
//
|
|
|
|
- (BOOL)sendAction:(SEL)aSelector
|
|
|
|
to:aTarget
|
|
|
|
from:sender
|
|
|
|
{
|
|
|
|
//
|
|
|
|
// If the target responds to the selector
|
|
|
|
// then have it perform it
|
|
|
|
//
|
|
|
|
if ([aTarget respondsToSelector:aSelector])
|
|
|
|
{
|
|
|
|
[aTarget perform:aSelector withObject:sender];
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Otherwise traverse the responder chain
|
|
|
|
//
|
|
|
|
|
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
- targetForAction:(SEL)aSelector
|
|
|
|
{
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)tryToPerform:(SEL)aSelector
|
|
|
|
with:anObject
|
|
|
|
{
|
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Setting the application's icon
|
|
|
|
- (void)setApplicationIconImage:(NSImage *)anImage
|
|
|
|
{
|
|
|
|
if (app_icon != nil)
|
|
|
|
{
|
|
|
|
[app_icon release];
|
|
|
|
}
|
|
|
|
|
|
|
|
app_icon = [anImage retain];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSImage *)applicationIconImage
|
|
|
|
{
|
|
|
|
return app_icon;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Hiding all windows
|
|
|
|
//
|
|
|
|
- (void)hide:sender
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
NSWindow *w;
|
|
|
|
|
|
|
|
j = [window_list count];
|
|
|
|
for (i = 0;i < j; ++i)
|
|
|
|
{
|
|
|
|
w = [window_list objectAtIndex:i];
|
|
|
|
// Do something to hide the window
|
|
|
|
}
|
|
|
|
app_is_hidden = YES;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)isHidden
|
|
|
|
{
|
|
|
|
return app_is_hidden;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)unhide:sender
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
NSWindow *w;
|
|
|
|
|
|
|
|
app_is_hidden = NO;
|
|
|
|
j = [window_list count];
|
|
|
|
for (i = 0;i < j; ++i)
|
|
|
|
{
|
|
|
|
w = [window_list objectAtIndex:i];
|
|
|
|
// Do something to unhide the window
|
|
|
|
}
|
|
|
|
|
|
|
|
[[self keyWindow] makeKeyAndOrderFront:self];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)unhideWithoutActivation
|
|
|
|
{
|
|
|
|
[self unhide: self];
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Managing windows
|
|
|
|
//
|
|
|
|
- (NSWindow *)keyWindow
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
id w;
|
|
|
|
|
|
|
|
j = [window_list count];
|
|
|
|
for (i = 0;i < j; ++i)
|
|
|
|
{
|
|
|
|
w = [window_list objectAtIndex:i];
|
|
|
|
if ([w isKeyWindow]) return w;
|
|
|
|
}
|
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSWindow *)mainWindow
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
id w;
|
|
|
|
|
|
|
|
j = [window_list count];
|
|
|
|
for (i = 0;i < j; ++i)
|
|
|
|
{
|
|
|
|
w = [window_list objectAtIndex:i];
|
|
|
|
if ([w isMainWindow]) return w;
|
|
|
|
}
|
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSWindow *)makeWindowsPerform:(SEL)aSelector
|
|
|
|
inOrder:(BOOL)flag
|
|
|
|
{
|
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)miniaturizeAll:sender
|
|
|
|
{
|
|
|
|
id e, obj;
|
|
|
|
|
|
|
|
e = [window_list objectEnumerator];
|
|
|
|
obj = [e nextObject];
|
|
|
|
while (obj)
|
|
|
|
{
|
|
|
|
[obj miniaturize: sender];
|
|
|
|
obj = [e nextObject];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)preventWindowOrdering
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setWindowsNeedUpdate:(BOOL)flag
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)updateWindows
|
|
|
|
{
|
|
|
|
id e, obj;
|
|
|
|
|
|
|
|
e = [window_list objectEnumerator];
|
|
|
|
obj = [e nextObject];
|
|
|
|
while (obj)
|
|
|
|
{
|
|
|
|
[obj update];
|
|
|
|
obj = [e nextObject];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSArray *)windows
|
|
|
|
{
|
|
|
|
return window_list;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSWindow *)windowWithWindowNumber:(int)windowNum
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
NSWindow *w;
|
|
|
|
|
|
|
|
j = [window_list count];
|
|
|
|
for (i = 0;i < j; ++i)
|
|
|
|
{
|
|
|
|
w = [window_list objectAtIndex:i];
|
|
|
|
if ([w windowNumber] == windowNum) return w;
|
|
|
|
}
|
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Showing Standard Panels
|
|
|
|
//
|
|
|
|
- (void)orderFrontColorPanel:sender
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)orderFrontDataLinkPanel:sender
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)orderFrontHelpPanel:sender
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)runPageLayout:sender
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Getting the main menu
|
|
|
|
//
|
|
|
|
- (NSMenu *)mainMenu
|
|
|
|
{
|
|
|
|
return main_menu;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setMainMenu:(NSMenu *)aMenu
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
NSMenuCell *mc;
|
|
|
|
NSArray *mi;
|
|
|
|
id w;
|
|
|
|
|
|
|
|
// Release old and retain new
|
|
|
|
[main_menu release];
|
|
|
|
main_menu = aMenu;
|
|
|
|
[main_menu retain];
|
|
|
|
|
|
|
|
// Search for a menucell with the name Windows
|
|
|
|
// This is the default windows menu
|
|
|
|
mi = [main_menu itemArray];
|
|
|
|
j = [mi count];
|
|
|
|
windows_menu = nil;
|
|
|
|
for (i = 0;i < j; ++i)
|
|
|
|
{
|
|
|
|
mc = [mi objectAtIndex:i];
|
|
|
|
if ([[mc stringValue] compare:@"Windows"] == NSOrderedSame)
|
|
|
|
{
|
|
|
|
// Found it!
|
|
|
|
windows_menu = mc;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Managing the Windows menu
|
|
|
|
//
|
|
|
|
- (void)addWindowsItem:aWindow
|
|
|
|
title:(NSString *)aString
|
|
|
|
filename:(BOOL)isFilename
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
// Not a subclass of window --forget it
|
|
|
|
if (![aWindow isKindOfClass:[NSWindow class]])
|
|
|
|
return;
|
|
|
|
|
1996-06-06 13:55:06 +00:00
|
|
|
// Add to our window list, the array retains it
|
1996-05-30 20:03:15 +00:00
|
|
|
i = [window_list count];
|
|
|
|
[window_list addObject:aWindow];
|
|
|
|
|
|
|
|
// set its window number
|
|
|
|
[aWindow setWindowNumber:window_count];
|
|
|
|
++window_count;
|
|
|
|
|
|
|
|
// If this was the first window then
|
|
|
|
// make it the main and key window
|
|
|
|
if (i == 0)
|
|
|
|
{
|
|
|
|
[aWindow becomeMainWindow];
|
|
|
|
[aWindow becomeKeyWindow];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)arrangeInFront:sender
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)changeWindowsItem:aWindow
|
|
|
|
title:(NSString *)aString
|
|
|
|
filename:(BOOL)isFilename
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)removeWindowsItem:aWindow
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
id w;
|
|
|
|
|
1996-06-06 13:55:06 +00:00
|
|
|
// +++ This should be different
|
1996-05-30 20:03:15 +00:00
|
|
|
if (aWindow == key_window)
|
|
|
|
key_window = nil;
|
|
|
|
if (aWindow == main_window)
|
|
|
|
main_window = nil;
|
|
|
|
|
1996-06-06 13:55:06 +00:00
|
|
|
// If we are within our dealloc then don't remove the window
|
|
|
|
// Most likely dealloc is removing windows from our window list
|
|
|
|
// and subsequently NSWindow is caling us to remove itself.
|
|
|
|
if (gnustep_gui_app_is_in_dealloc)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Remove it from the window list
|
|
|
|
[window_list removeObject: aWindow];
|
|
|
|
|
1996-05-30 20:03:15 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setWindowsMenu:aMenu
|
|
|
|
{
|
|
|
|
if (windows_menu)
|
|
|
|
[windows_menu setSubmenu:aMenu];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)updateWindowsItem:aWindow
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSMenu *)windowsMenu
|
|
|
|
{
|
|
|
|
return [windows_menu submenu];
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Managing the Service menu
|
|
|
|
//
|
|
|
|
- (void)registerServicesMenuSendTypes:(NSArray *)sendTypes
|
|
|
|
returnTypes:(NSArray *)returnTypes
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSMenu *)servicesMenu
|
|
|
|
{
|
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setServicesMenu:(NSMenu *)aMenu
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
- validRequestorForSendType:(NSString *)sendType
|
|
|
|
returnType:(NSString *)returnType
|
|
|
|
{
|
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Getting the display postscript context
|
1996-06-06 13:55:06 +00:00
|
|
|
- (NSDPSContext *)context
|
|
|
|
{
|
|
|
|
return [NSDPSContext currentContext];
|
|
|
|
}
|
1996-05-30 20:03:15 +00:00
|
|
|
|
|
|
|
// Reporting an exception
|
1996-08-22 18:51:08 +00:00
|
|
|
- (void)reportException:(NSException *)anException
|
|
|
|
{}
|
1996-05-30 20:03:15 +00:00
|
|
|
|
|
|
|
//
|
|
|
|
// Terminating the application
|
|
|
|
//
|
|
|
|
- (void)terminate:sender
|
|
|
|
{
|
|
|
|
if ([self applicationShouldTerminate:sender])
|
|
|
|
app_should_quit = YES;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Assigning a delegate
|
|
|
|
- delegate
|
|
|
|
{
|
|
|
|
return delegate;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setDelegate:anObject
|
|
|
|
{
|
|
|
|
delegate = anObject;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Implemented by the delegate
|
|
|
|
//
|
|
|
|
- (BOOL)application:sender openFileWithoutUI:(NSString *)filename
|
|
|
|
{
|
|
|
|
BOOL result = NO;
|
|
|
|
|
|
|
|
if ([delegate respondsTo:@selector(application:openFileWithoutUI:)])
|
|
|
|
result = [delegate application:sender openFileWithoutUI:filename];
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)application:(NSApplication *)app openFile:(NSString *)filename
|
|
|
|
{
|
|
|
|
BOOL result = NO;
|
|
|
|
|
|
|
|
if ([delegate respondsTo:@selector(application:openFile:)])
|
|
|
|
result = [delegate application:app openFile:filename];
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)application:(NSApplication *)app openTempFile:(NSString *)filename
|
|
|
|
{
|
|
|
|
BOOL result = NO;
|
|
|
|
|
|
|
|
if ([delegate respondsTo:@selector(application:openTempFile:)])
|
|
|
|
result = [delegate application:app openTempFile:filename];
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationDidBecomeActive:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationDidBecomeActive:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationDidBecomeActive:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationDidFinishLaunching:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationDidFinishLaunching:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationDidHide:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationDidHide:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationDidHide:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationDidResignActive:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationDidResignActive:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationDidResignActive:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationDidUnhide:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationDidUnhide:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationDidUnhide:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationDidUpdate:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationDidUpdate:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationDidUpdate:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)applicationOpenUntitledFile:(NSApplication *)app
|
|
|
|
{
|
|
|
|
BOOL result = NO;
|
|
|
|
|
|
|
|
if ([delegate respondsTo:@selector(applicationOpenUntitledFile:)])
|
|
|
|
result = [delegate applicationOpenUntitledFile:app];
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)applicationShouldTerminate:sender
|
|
|
|
{
|
|
|
|
BOOL result = YES;
|
|
|
|
|
|
|
|
if ([delegate respondsTo:@selector(applicationShouldTerminate:)])
|
|
|
|
result = [delegate applicationShouldTerminate:sender];
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationWillBecomeActive:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationWillBecomeActive:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationWillBecomeActive:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationWillFinishLaunching:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationWillFinishLaunching:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationWillFinishLaunching:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationWillHide:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationWillHide:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationWillHide:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationWillResignActive:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationWillResignActive:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationWillResignActive:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationWillUnhide:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationWillUnhide:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationWillUnhide:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
1996-09-12 19:24:32 +00:00
|
|
|
- (void)applicationWillUpdate:(NSNotification *)aNotification
|
1996-05-30 20:03:15 +00:00
|
|
|
{
|
|
|
|
if ([delegate respondsTo:@selector(applicationWillUpdate:)])
|
1996-09-12 19:24:32 +00:00
|
|
|
[delegate applicationWillUpdate:aNotification];
|
1996-05-30 20:03:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// NSCoding protocol
|
|
|
|
//
|
|
|
|
- (void)encodeWithCoder:aCoder
|
|
|
|
{
|
|
|
|
[super encodeWithCoder:aCoder];
|
|
|
|
|
|
|
|
[aCoder encodeObject: window_list];
|
|
|
|
// We don't want to code the event queue do we?
|
|
|
|
//[aCoder encodeObject: event_queue];
|
|
|
|
//[aCoder encodeObject: current_event];
|
|
|
|
[aCoder encodeObjectReference: key_window withName: @"Key window"];
|
|
|
|
[aCoder encodeObjectReference: main_window withName: @"Main window"];
|
|
|
|
[aCoder encodeObjectReference: delegate withName: @"Delegate"];
|
|
|
|
[aCoder encodeObject: main_menu];
|
|
|
|
[aCoder encodeObjectReference: windows_menu withName: @"Windows menu"];
|
|
|
|
}
|
|
|
|
|
|
|
|
- initWithCoder:aDecoder
|
|
|
|
{
|
|
|
|
[super initWithCoder:aDecoder];
|
|
|
|
|
|
|
|
window_list = [aDecoder decodeObject];
|
|
|
|
[aDecoder decodeObjectAt: &key_window withName: NULL];
|
|
|
|
[aDecoder decodeObjectAt: &main_window withName: NULL];
|
|
|
|
[aDecoder decodeObjectAt: &delegate withName: NULL];
|
|
|
|
main_menu = [aDecoder decodeObject];
|
|
|
|
[aDecoder decodeObjectAt: &windows_menu withName: NULL];
|
|
|
|
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
//
|
|
|
|
// Backend methods
|
|
|
|
// empty implementations
|
|
|
|
//
|
|
|
|
@implementation NSApplication (GNUstepBackend)
|
|
|
|
|
|
|
|
// Get next event
|
|
|
|
- (NSEvent *)getNextEvent
|
|
|
|
{
|
|
|
|
[event_queue enqueueObject: NullEvent];
|
|
|
|
return NullEvent;
|
|
|
|
}
|
|
|
|
|
|
|
|
// handle a non-translated event
|
|
|
|
- (void)handleNullEvent
|
|
|
|
{}
|
|
|
|
|
|
|
|
@end
|