Index: Source/UIApplication.m =================================================================== --- Source/UIApplication.m (revision 33949) +++ Source/UIApplication.m (working copy) @@ -1,8 +1,8 @@ -/**
Every graphical GNUstep application has exactly one instance of
- * NSApplication
(or a subclass) instantiated. Usually this is
+ *
Every graphical GNUstep UIKit application has exactly one instance of
+ * UIApplication
(or a subclass) instantiated. Usually this is
* created through the +sharedApplication method. Once created, this instance
- * is always accessible through the global variable 'NSApp
'.
The NSApplication instance manages the main run loop, dispatches + *
The UIApplication instance manages the main run loop, dispatches * events, and manages resources. It sets up the connection to the window - * server and provides special methods for putting up "modal" (always on top) - * windows.
+ * server. * - *Typically, -run is called by an application's main
method
- * after the NSApplication instance is created, which never returns. However,
- * applications needing to integrate other event loops may strategically call
- * the -stop: method, followed by -run later on.
To avoid most common needs for subclassing, NSApplication allows you to + *
To avoid most common needs for subclassing, UIApplication allows you to * specify a delegate that is messaged in particular situations. - * See -delegate , -setDelegate: , and [(GSAppDelegateProtocol)].
+ * See -delegate , -setDelegate: , and [(UIApplicationDelegate)]. * *Subclassing should be a last resort, and delegate * methods should be used in most cases. However, subclassing is most @@ -747,14 +134,14 @@ * -run when the method described above is not sufficient, or to intercept * events by overriding -sendEvent: .
*/ -@implementation NSApplication +@implementation UIApplication /* * Class methods */ + (void) initialize { - if (self == [NSApplication class]) + if (self == [UIApplication class]) { CREATE_AUTORELEASE_POOL(pool); /* @@ -783,27 +170,7 @@ [pool drain]; } -/** - * Calls [NSThread+detachNewThreadSelector:toTarget:withObject:] with the - * invocation wrapped by an autorelease pool. - */ -+ (void) detachDrawingThread: (SEL)selector - toTarget: (id)target - withObject: (id)argument -{ - NSInvocation *inv; - inv = [NSInvocation - invocationWithMethodSignature: - [target methodSignatureForSelector: selector]]; - [inv setTarget: target]; - [inv setSelector: selector]; - [inv setArgument: argument atIndex: 2]; - [NSThread detachNewThreadSelector: @selector(_invokeWithAutoreleasePool:) - toTarget: self - withObject: inv]; -} - /** *Return the shared application instance, creating one (of the
* receiver class) if needed. There is (and must always be) only a
@@ -813,21 +180,21 @@
* the shared application instance is created, it is also automatically
* initialized (that is, its init
method is called), which
* connects to the window server and prepares the gui library for actual
- * operation. For this reason, you must always call [NSApplication
+ * operation. For this reason, you must always call
[UIApplication
* sharedApplication]
before using any functionality of the gui
* library - so, normally, this should be one of the first commands in
- * your program (if you use NSApplicationMain()
, this is
+ * your program (if you use UIApplicationMain()
, this is
* automatically done).
The shared application instance is normally an instance of
- * NSApplication; but you can subclass NSApplication, and have an
+ * UIApplication; but you can subclass UIApplication, and have an
* instance of your own subclass be created and used as the shared
* application instance. If you want to get this result, you need to
* make sure the first time you call +sharedApplication is on your
- * custom NSApplication subclass (rather than on NSApplication).
+ * custom UIApplication subclass (rather than on UIApplication).
* Putting [MyApplicationClass sharedApplication]
; as the first
* command in your program is the recommended way. :-) If you use
- * NSApplicationMain()
, it automatically creates the appropriate
+ * UIApplicationMain()
, it automatically creates the appropriate
* instance (which you can control by editing the info dictionary of
* the application).
Activates the application, sets the application icon, loads the main
- * Nib file if NSMainNibFile
is set in the application
- * property list, posts an
- * NSApplicationWillFinishLaunchingNotification
, and takes care
+ *
Activates the application, and takes care * of a few other startup tasks. * If you override this method, be sure to call super.
* @@ -991,7 +350,6 @@ */ - (void) finishLaunching { - NSDocumentController *sdc; NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; NSString *filePath; NSArray *windows_list; @@ -1001,10 +359,8 @@ BOOL didAutoreopen = NO; NSArray *files = nil; - /* post notification that launch will finish */ - [nc postNotificationName: NSApplicationWillFinishLaunchingNotification - object: self]; - +#if 0 +// code disabled until it can be reviewed /* Register our listener to incoming services requests etc. */ [_listener registerAsServiceProvider]; @@ -1174,10 +530,11 @@ } } } +#endif } /* - * PostsNSApplicationDidFinishLaunchingNotification
.
+ * Posts UIApplicationDidFinishLaunchingNotification
.
*
* The -run method calls this the first time it is called, before starting * the event loop for the first time and after calling finishLaunching.
@@ -1185,9 +542,11 @@ - (void) _didFinishLaunching { /* finish the launching post notification that launching has finished */ - [nc postNotificationName: NSApplicationDidFinishLaunchingNotification + [nc postNotificationName: UIApplicationDidFinishLaunchingNotification object: self]; - +#if 0 +// Workspace/Springboard should be notified. +// Disabled until we have a Workspace/Springboard! NS_DURING { [[[NSWorkspace sharedWorkspace] notificationCenter] @@ -1202,6 +561,7 @@ [localException raise]; } NS_ENDHANDLER +#endif } - (void) dealloc @@ -1212,16 +572,22 @@ { srv = GSCurrentServer(); } +/* [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver: self]; +*/ [nc removeObserver: self]; - +/* RELEASE(_hidden); RELEASE(_inactive); RELEASE(_listener); +*/ RELEASE(null_event); RELEASE(_current_event); +#if 0 +// Disabled until we figure out if we really need modal sessions in UIKit +// Probably not! /* We may need to tidy up nested modal session structures. */ while (_session != 0) { @@ -1230,20 +596,14 @@ _session = tmp->previous; NSZoneFree(NSDefaultMallocZone(), tmp); } +#endif - /* Release the menus, then set them to nil so we don't try updating - them after they have been deallocated. */ - DESTROY(_main_menu); - DESTROY(_windows_menu); - - TEST_RELEASE(_app_icon); - TEST_RELEASE(_app_icon_window); - TEST_RELEASE(_infoPanel); - +#if 0 +// Did not yet figure out gfx. /* Destroy the default context */ [NSGraphicsContext setCurrentContext: nil]; DESTROY(_default_context); - +#endif /* Close the server */ [srv closeServer]; DESTROY(srv); @@ -1252,224 +612,13 @@ } /** - * Activate app unconditionally if flag is YES, otherwise only if no other app - * is active. (Note: this is currently not implemented - * under GNUstep. The app is always activated unconditionally.) Usually - * it is not necessary to manually call this method, except in some - * circumstances of interapplication communication. + * Returns whether this app is the currently active GNUstep UIKit application. */ -- (void) activateIgnoringOtherApps: (BOOL)flag -{ - // TODO: Currently the flag is ignored - if (_app_is_active == NO) - { - unsigned count; - unsigned i; - NSDictionary *info; - - /* - * Menus should observe this notification in order to make themselves - * visible when the application is active. - */ - [nc postNotificationName: NSApplicationWillBecomeActiveNotification - object: self]; - - _app_is_active = YES; - - if ([[NSUserDefaults standardUserDefaults] - boolForKey: @"GSSuppressAppIcon"]) - { - [_app_icon_window orderOut: self]; - } - - /* Make sure to calculate count after the notification, since - inactive status might be changed by a notifiee. */ - count = [_inactive count]; - for (i = 0; i < count; i++) - { - [[_inactive objectAtIndex: i] orderFrontRegardless]; - } - [_inactive removeAllObjects]; - - if (_unhide_on_activation) - { - [self unhide: nil]; - } - - if ([self keyWindow] == nil && _hidden_key != nil - && [[self windows] indexOfObjectIdenticalTo: _hidden_key] != NSNotFound) - { - [_hidden_key makeKeyWindow]; - _hidden_key = nil; - } - - if ([self mainWindow] == nil && _hidden_main != nil - && [[self windows] indexOfObjectIdenticalTo: _hidden_main] != NSNotFound) - { - [_hidden_main makeMainWindow]; - _hidden_main = nil; - } - - if ([self keyWindow] != nil) - { - [[self keyWindow] orderFront: self]; - } - else if ([self mainWindow] != nil) - { - [[self mainWindow] makeKeyAndOrderFront: self]; - } - else - { - /* We need give input focus to some window otherwise we'll never get - keyboard events. FIXME: doesn't work. */ - NSWindow *menu_window= [[self mainMenu] window]; - NSDebugLLog(@"Focus", @"No key on activation - make menu key"); - [GSServerForWindow(menu_window) setinputfocus: - [menu_window windowNumber]]; - } - - info = [self _notificationUserInfo]; - [nc postNotificationName: NSApplicationDidBecomeActiveNotification - object: self - userInfo: info]; - [[[NSWorkspace sharedWorkspace] notificationCenter] - postNotificationName: NSApplicationDidBecomeActiveNotification - object: [NSWorkspace sharedWorkspace] - userInfo: info]; - } -} - -/** - * Forcefully deactivate the app, without activating another. It is rarely - * necessary to use this method. - */ -- (void) deactivate -{ - if (_app_is_active == YES) - { - NSArray *windows_list; - NSDictionary *info; - NSWindow *win; - NSEnumerator *iter; - - [nc postNotificationName: NSApplicationWillResignActiveNotification - object: self]; - - _app_is_active = NO; - - if ([self keyWindow] != nil) - { - _hidden_key = [self keyWindow]; - [_hidden_key resignKeyWindow]; - } - // The main window is saved for when the app is activated again. - // This is necessary for menu in window. - if ([self mainWindow] != nil) - { - _hidden_main = [self mainWindow]; - [_hidden_main resignMainWindow]; - } - - windows_list = GSOrderedWindows(); - iter = [windows_list reverseObjectEnumerator]; - - while ((win = [iter nextObject])) - { - NSModalSession theSession; - - if ([win isVisible] == NO) - { - continue; /* Already invisible */ - } - if ([win canHide] == NO) - { - continue; /* Can't be hidden */ - } - if (win == _app_icon_window) - { - continue; /* can't hide the app icon. */ - } - /* Don't order out modal windows */ - theSession = _session; - while (theSession != 0) - { - if (win == theSession->window) - break; - theSession = theSession->previous; - } - if (theSession) - continue; - - if ([win hidesOnDeactivate] == YES) - { - /* NB Order is important here. When a hide on deactivate window - is ordered out while the application is inactive, it gets - removed from the _inactive list. Therefore, we must first - order out the window and then add it to the _inactive list. */ - [win orderOut: self]; - [_inactive addObject: win]; - } - } - - if (YES == [[NSUserDefaults standardUserDefaults] - boolForKey: @"GSSuppressAppIcon"]) - { -#if MINI_ICON - NSRect f = [[[self mainMenu] window] frame]; - NSPoint p = f.origin; - - p.y += f.size.height; - [_app_icon_window setFrameTopLeftPoint: p]; - [_app_icon_window orderFrontRegardless]; - [_app_icon_window miniaturize: self]; -#else - [_app_icon_window orderFrontRegardless]; -#endif - } - - info = [self _notificationUserInfo]; - [nc postNotificationName: NSApplicationDidResignActiveNotification - object: self - userInfo: info]; - [[[NSWorkspace sharedWorkspace] notificationCenter] - postNotificationName: NSApplicationDidResignActiveNotification - object: [NSWorkspace sharedWorkspace] - userInfo: info]; - } -} - -/** - * Returns whether this app is the currently active GNUstep application. - * Note that on a GNUstep system, unlike OS X, it is possible for NO GNUstep - * app to be active. - */ - (BOOL) isActive { return _app_is_active; } -/** - * Cause all other apps to hide themselves. - */ -- (void) hideOtherApplications: (id)sender -{ - [[[NSWorkspace sharedWorkspace] notificationCenter] - postNotificationName: GSHideOtherApplicationsNotification - object: [NSWorkspace sharedWorkspace] - userInfo: [self _notificationUserInfo]]; -} - -/** - * Cause all apps including this one to unhide themselves. - */ -- (void) unhideAllApplications: (id)sender -{ - [[[NSWorkspace sharedWorkspace] notificationCenter] - postNotificationName: GSUnhideAllApplicationsNotification - object: [NSWorkspace sharedWorkspace] - userInfo: [self _notificationUserInfo]]; -} - #define NSLogUncaughtExceptionMask 1 #define NSHandleUncaughtExceptionMask 2 #define NSLogUncaughtSystemExceptionMask 4 @@ -1540,8 +689,6 @@ [self finishLaunching]; [self _didFinishLaunching]; - [_listener updateServicesMenu]; - [_main_menu update]; DESTROY(_runLoopPool); } @@ -1597,333 +744,11 @@ return _app_is_running; } -/* - * Running modal event loops - */ - /** - * Halts a currently running modal event loop started by -runModalForWindow: - * or -runModalSession: . If you wish to halt the session in response to - * user interaction with the modal window, use -stopModalWithCode: or - * -stopModal instead; only use this to halt the loop from elsewhere, such as - * another thread. - */ -- (void) abortModal -{ -/* FIXME: The previous, now commented out, code here did only work from within the modal loop, - which is contrary to the purpose of this method. Calling stopModalWithCode: works a bit better, - but still relies on the modal loop to cooperate. Calling that method via performSelectorOnMainThread:... - and moving the exception into stopModalWithCode:, looks like another option. Still this would - rely on the loop getting executed. - - if (_session == 0) - { - [NSException raise: NSAbortModalException - format: @"abortModal called while not in a modal session"]; - } - [NSException raise: NSAbortModalException format: @"abortModal"]; -*/ - [self stopModalWithCode: NSRunAbortedResponse]; -} - -/** - * Set up modal session for theWindow, and, if it is not visible already, - * puts it up on screen, centering it if it is an NSPanel. It is then - * ordered front and made key or main window. - */ -- (NSModalSession) beginModalSessionForWindow: (NSWindow*)theWindow -{ - NSModalSession theSession; - - theSession = (NSModalSession)NSZoneMalloc(NSDefaultMallocZone(), - sizeof(struct _NSModalSession)); - theSession->runState = NSRunContinuesResponse; - theSession->entryLevel = [theWindow level]; - theSession->window = theWindow; - theSession->previous = _session; - _session = theSession; - - /* - * Displaying / raising window but centering panel only if not up - * seems to match the behavior on OS X (Panther). - */ - if ([theWindow isKindOfClass: [NSPanel class]]) - { - if ([theWindow isVisible] == NO) - [theWindow center]; - [theWindow setLevel: NSModalPanelWindowLevel]; - } - [theWindow orderFrontRegardless]; - if ([self isActive] == YES) - { - if ([theWindow canBecomeKeyWindow] == YES) - { - [theWindow makeKeyWindow]; - } - else if ([theWindow canBecomeMainWindow] == YES) - { - [theWindow makeMainWindow]; - } - } - - return theSession; -} - -/** - * Clean up after a modal session has been run. Called with theSession - * returned from a previous call to beginModalSessionForWindow: . - */ -- (void) endModalSession: (NSModalSession)theSession -{ - NSModalSession tmp = _session; - NSArray *windows = [self windows]; - - if (theSession == 0) - { - [NSException raise: NSInvalidArgumentException - format: @"null pointer passed to endModalSession:"]; - } - /* Remove this session from linked list of sessions. */ - while (tmp != 0 && tmp != theSession) - { - tmp = tmp->previous; - } - if (tmp == 0) - { - [NSException raise: NSInvalidArgumentException - format: @"unknown session passed to endModalSession:"]; - } - while (_session != theSession) - { - tmp = _session; - _session = tmp->previous; - if ([windows indexOfObjectIdenticalTo: tmp->window] != NSNotFound) - { - [tmp->window setLevel: tmp->entryLevel]; - } - NSZoneFree(NSDefaultMallocZone(), tmp); - } - _session = _session->previous; - if ([windows indexOfObjectIdenticalTo: theSession->window] != NSNotFound) - { - [theSession->window setLevel: theSession->entryLevel]; - } - NSZoneFree(NSDefaultMallocZone(), theSession); - - // Bring the next modal window to front - if ((_session != 0) && - ([windows indexOfObjectIdenticalTo: _session->window] != NSNotFound)) - { - NSWindow *theWindow = _session->window; - - // Same code as in beginModalSessionForWindow: - [theWindow orderFrontRegardless]; - if ([self isActive] == YES) - { - if ([theWindow canBecomeKeyWindow] == YES) - { - [theWindow makeKeyWindow]; - } - else if ([theWindow canBecomeMainWindow] == YES) - { - [theWindow makeMainWindow]; - } - } - } - else - { - [_main_menu update]; - } -} - -/** - * Starts modal event loop for given window, after calling - * -beginModalSessionForWindow:. Loop is broken only by -stopModal , - * -stopModalWithCode: , or -abortModal , at which time -endModalSession: - * is called automatically. - */ -- (int) runModalForWindow: (NSWindow*)theWindow -{ - NSModalSession theSession = 0; - int code = NSRunContinuesResponse; - - NS_DURING - { - NSDate *limit; - GSDisplayServer *srv; - - theSession = [self beginModalSessionForWindow: theWindow]; - limit = [NSDate distantFuture]; - srv = GSCurrentServer(); - - while (code == NSRunContinuesResponse) - { - /* - * Try to handle events for this session, discarding others. - */ - code = [self runModalSession: theSession]; - if (code == NSRunContinuesResponse) - { - /* - * Wait until there are more events to handle. - */ - DPSPeekEvent(srv, NSAnyEventMask, limit, NSModalPanelRunLoopMode); - } - } - - [self endModalSession: theSession]; - } - NS_HANDLER - { - if (theSession != 0) - { - NSWindow *win_to_close = theSession->window; - - [self endModalSession: theSession]; - [win_to_close close]; - } - if ([[localException name] isEqual: NSAbortModalException] == NO) - { - [localException raise]; - } - code = NSRunAbortedResponse; - } - NS_ENDHANDLER - - return code; -} - -/** --Processes any events for a modal session described by the theSession -variable. When finished, it returns the state of the session (i.e. -whether it is still running or has been stopped, etc) -
-If there are no pending events for the session, this method returns -immediately. -
-- Although Apple's docs state that, before processing the events, it makes the - session window key and orders the window front, this method does not attempt - to do this, because: 1) we don't want to interfere with use of other apps - during modal session for this app; 2) occasionally other windows are active - and should be usable during modal sessions (e.g., a popup dialog from a modal - window); 3) most of the time -beginModalSessionForWindow: will have been - called in advance. If the latter is not the case, you may need to order the - window front yourself in advance. -
--See Also: -runModalForWindow: -
-*/ -- (int) runModalSession: (NSModalSession)theSession -{ - NSAutoreleasePool *pool; - GSDisplayServer *srv; - BOOL done = NO; - NSEvent *event; - NSDate *limit; - - if (theSession != _session) - { - [NSException raise: NSInvalidArgumentException - format: @"runModalSession: with wrong session"]; - } - - // Use the default context for all events. - srv = GSCurrentServer(); - - // Only handle input which is already available. - limit = [NSDate distantPast]; - - /* - * Deal with the events in the queue. - */ - while (done == NO && theSession->runState == NSRunContinuesResponse) - { - IF_NO_GC(pool = [arpClass new]); - - event = DPSGetEvent(srv, NSAnyEventMask, limit, NSModalPanelRunLoopMode); - if (event != nil) - { - NSWindow *eventWindow = [event window]; - - /* - * We handle events for the session window, events for any - * window which works when modal, and any window management - * events. All others are ignored/discarded. - */ - if (eventWindow == theSession->window - || [eventWindow worksWhenModal] == YES - || [event type] == NSAppKitDefined) - { - ASSIGN(_current_event, event); - } - else - { - event = nil; // Ignore/discard this event. - } - } - else - { - done = YES; // No more events pending. - } - - if (event != nil) - { - NSEventType type = [_current_event type]; - - [self sendEvent: _current_event]; - - // update (en/disable) the services menu's items - if (type != NSPeriodic && type != NSMouseMoved) - { - [_listener updateServicesMenu]; - [_main_menu update]; - } - - /* - * Check to see if the window has gone away - if so, end session. - */ - if ([[self windows] indexOfObjectIdenticalTo: _session->window] - == NSNotFound - || ![_session->window isVisible]) - { - [self stopModal]; - } - } - [pool drain]; - } - - NSAssert(_session == theSession, @"Session was changed while running"); - - return theSession->runState; -} - -/** -- Returns the window that is part of the current modal session, if any. -
--See -runModalForWindow: -
-*/ -- (NSWindow *) modalWindow -{ - if (_session != 0) - return (_session->window); - else - return nil; -} - -/** * Stops the main run loop, as well as a modal session if it is running. */ - (void) stop: (id)sender { - if (_session != 0) - [self stopModal]; - else { _app_is_running = NO; /* @@ -1934,114 +759,7 @@ } } -/** Stops a running modal session causing -runModalForWindow: or
- * -runModalSession: to return NSRunStoppedResponse
. Use this
- * or -stopModalWithCode: to end a modal session in response to user input.
See Also: -stopModalWithCode:
- */ -- (void) stopModal -{ - [self stopModalWithCode: NSRunStoppedResponse]; -} -/** - * Stops a running modal session causing -runModalForWindow: or - * -runModalSession: to return the specified integer code. Use this - * or -stopModal to end a modal session in response to user input. - */ -- (void) stopModalWithCode: (int)returnCode -{ - /* According to the spec, there is no exception which is thrown - * if we are not currently in a modal session. While it is not - * good practice to call this when we're not, we shouldn't throw - * an exception. - */ - if (_session != 0 && _session->runState == NSRunContinuesResponse) - { - if (returnCode == NSRunContinuesResponse) - { - [NSException raise: NSInvalidArgumentException - format: @"stopModalWithCode: with NSRunContinuesResponse"]; - } - _session->runState = returnCode; - } -} - -/** - * Put up a modal window centered relative to docWindow. On OS X this is - * deprecated in favor of - * -beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo: . - * Not implemented under GNUstep. Currently just centers window on the - * screen. - */ -- (int) runModalForWindow: (NSWindow *)theWindow - relativeToWindow: (NSWindow *)docWindow -{ - // FIXME - [theWindow orderWindow: NSWindowAbove - relativeTo: [docWindow windowNumber]]; - return [self runModalForWindow: theWindow]; -} - -/** - * Put up a modal sheet sliding down from top of docWindow. If modalDelegate - * is non-nil and responds to didEndSelector (this is optional), it is invoked - * after the session ends. The selector should take three arguments: - * NSWindow *, int, void *. It is passed the sheet window, the return code, - * and the contextInfo passed in here. - - * Under GNUstep, the sheet aspect is not implemented (just centers - * window on the screen), but modalDelegate didEndSelector is called if - * both non-nil. - */ -- (void) beginSheet: (NSWindow *)sheet - modalForWindow: (NSWindow *)docWindow - modalDelegate: (id)modalDelegate - didEndSelector: (SEL)didEndSelector - contextInfo: (void *)contextInfo -{ - // FIXME - int ret; - - [sheet setParentWindow: docWindow]; - [docWindow setAttachedSheet: sheet]; - - ret = [self runModalForWindow: sheet - relativeToWindow: docWindow]; - - if (modalDelegate && [modalDelegate respondsToSelector: didEndSelector]) - { - void (*didEnd)(id, SEL, id, int, void*); - - didEnd = (void (*)(id, SEL, id, int, void*))[modalDelegate methodForSelector: - didEndSelector]; - didEnd(modalDelegate, didEndSelector, sheet, ret, contextInfo); - } - - [docWindow setAttachedSheet: nil]; - [sheet setParentWindow: nil]; -} - -/** - * Analogous to -stopModal for sheets. - */ -- (void) endSheet: (NSWindow *)sheet -{ - // FIXME - [self stopModal]; -} - -/** - * Analogous to -stopModalWithCode: for sheets. - */ -- (void) endSheet: (NSWindow *)sheet - returnCode: (int)returnCode -{ - // FIXME - [self stopModalWithCode: returnCode]; -} - - /* * Getting, removing, and posting events */ @@ -2058,9 +776,12 @@ * forwarding conventions. You rarely need to invoke this directly. If you * want to synthesize an event for processing, call -postEvent:atStart: . */ -- (void) sendEvent: (NSEvent *)theEvent +- (void) sendEvent: (UIEvent *)theEvent { - NSEventType type; +#if 0 +// None of these are types of UIEvent! +// Figure out what to do. + UIEventType type; type = [theEvent type]; switch (type) @@ -2109,6 +830,7 @@ [self rightMouseDown: theEvent]; } } +#endif } /** @@ -2119,12 +841,6 @@ return _current_event; } -/* Utility for pen-device input. See NSResponder. */ -- (BOOL) shouldBeTreatedAsInkEvent: (NSEvent *)theEvent -{ - return [[theEvent window] shouldBeTreatedAsInkEvent: theEvent]; -} - /** * Drop events matching mask from the queue, before but not including * lastEvent. The mask is a bitwise AND of event mask constants. @@ -2178,6 +894,7 @@ if (mode != NSEventTrackingRunLoopMode) { _windows_need_update = YES; +/* if ([NSCursor isHiddenUntilMouseMoves]) { NSEventType type = [event type]; @@ -2190,6 +907,7 @@ [NSCursor setHiddenUntilMouseMoves: NO]; } } + */ } if (flag) @@ -2221,6 +939,9 @@ */ - (BOOL) sendAction: (SEL)aSelector to: (id)aTarget from: (id)sender { +#if 0 +// targetForAction:to:from: is not used on the fruity implementation. +// We'll probably use it, but let's leave this commented out for now. id resp = [self targetForAction: aSelector to: aTarget from: sender]; if (resp != nil) @@ -2233,10 +954,14 @@ return YES; } } - +#endif return NO; } +#if 0 +// The fruity implementation does not have this. +// Commented out until it is studied. + /** * If theTarget responds to theAction it is returned, otherwise * the application searches for an object which will handle @@ -2291,8 +1016,10 @@ keyWindow: [self keyWindow] mainWindow: [self mainWindow]]; } +#endif - +#if 0 +// Not in fruity implementation, commented out for now. /** * Attempts to perform aSelector using [NSResponder-tryToPerform:with:] * and if that is not possible, attempts to get the application @@ -2316,296 +1043,8 @@ } return NO; } - -/**Sets the application's icon. Any windows that use the old application -icon image as their mini window image will be updated to use the new -image.
See Also: -applicationIconImage
-*/ -- (void) setApplicationIconImage: (NSImage*)anImage -{ - NSEnumerator *iterator; - NSWindow *current; - NSImage *old_app_icon = _app_icon; - NSSize miniWindowSize; - NSSize imageSize; - - // Ignore attempts to set nil as the icon image. - if (nil == anImage) - return; - - RETAIN(old_app_icon); - - // Use a copy as we change the name and size - ASSIGNCOPY(_app_icon, anImage); - - [_app_icon setScalesWhenResized: YES]; - - miniWindowSize = [GSCurrentServer() iconSize]; - if (miniWindowSize.width <= 0 || miniWindowSize.height <= 0) - { - miniWindowSize = NSMakeSize(48, 48); - } - - // restrict size when the icon is larger than the mini window. - imageSize = [_app_icon size]; - if (imageSize.width > miniWindowSize.width - || imageSize.height > miniWindowSize.height) - { - [_app_icon setSize: miniWindowSize]; - } - - // Let horizontal menu change icon - [_main_menu _organizeMenu]; - - if (_app_icon_window != nil) - { - [(NSAppIconView *)[_app_icon_window contentView] setImage: _app_icon]; - } - - // Swap the old image for the new one wherever it's used - iterator = [[self windows] objectEnumerator]; - while ((current = [iterator nextObject]) != nil) - { - if ([current miniwindowImage] == old_app_icon) - [current setMiniwindowImage: _app_icon]; - } - - DESTROY(old_app_icon); -} - -/**Returns the current icon be used for the application.
-See Also: -setApplicationIconImage:
- */ -- (NSImage*) applicationIconImage -{ - return _app_icon; -} - -/** - * Returns the actual window object being used to display the application - * icon (usually in the dock). - */ -- (NSWindow*) iconWindow -{ - return _app_icon_window; -} - -/* - * Hiding and arranging windows - */ - -/** Request this application to "hide" (unmap all windows from the screen
- * except the icon window). Posts
- * NSApplicationWillHideNotification
and
- * NSApplicationDidHideNotification
. On OS X this activates
- * the next app that is running, however on GNUstep this is up to the window
- * manager.
See Also: -unhide: -isHidden
- */ -- (void) hide: (id)sender -{ -#ifdef __MINGW32__ - [self miniaturizeAll: sender]; -#else - if (_app_is_hidden == NO) - { - if (![[NSUserDefaults standardUserDefaults] - boolForKey: @"GSSuppressAppIcon"]) - { - NSArray *windows_list; - NSDictionary *info; - NSWindow *win; - NSEnumerator *iter; - - [nc postNotificationName: NSApplicationWillHideNotification - object: self]; - - if ([self keyWindow] != nil) - { - _hidden_key = [self keyWindow]; - [_hidden_key resignKeyWindow]; - } - - // The main window is saved for when the app is activated again. - // This is necessary for menu in window. - if ([self mainWindow] != nil) - { - _hidden_main = [self mainWindow]; - [_hidden_main resignMainWindow]; - } - - windows_list = GSOrderedWindows(); - iter = [windows_list reverseObjectEnumerator]; - - while ((win = [iter nextObject])) - { - if ([win isVisible] == NO && ![win isMiniaturized]) - { - continue; /* Already invisible */ - } - if ([win canHide] == NO) - { - continue; /* Not hideable */ - } - if (win == _app_icon_window) - { - continue; /* can't hide the app icon. */ - } - if (_app_is_active == YES && [win hidesOnDeactivate] == YES) - { - continue; /* Will be hidden by deactivation */ - } - [_hidden addObject: win]; - [win orderOut: self]; - } - _app_is_hidden = YES; - - if (YES == [[NSUserDefaults standardUserDefaults] - boolForKey: @"GSSuppressAppIcon"]) - { -#if MINI_ICON - NSRect f = [[[self mainMenu] window] frame]; - NSPoint p = f.origin; - - p.y += f.size.height; - [_app_icon_window setFrameTopLeftPoint: p]; - [_app_icon_window orderFrontRegardless]; - [_app_icon_window miniaturize: self]; -#else - [_app_icon_window orderFrontRegardless]; #endif - } - else - { - [[_app_icon_window contentView] setNeedsDisplay: YES]; - } - - /* - * On hiding we also deactivate the application which will make the menus - * go away too. - */ - [self deactivate]; - _unhide_on_activation = YES; - - info = [self _notificationUserInfo]; - [nc postNotificationName: NSApplicationDidHideNotification - object: self - userInfo: info]; - [[[NSWorkspace sharedWorkspace] notificationCenter] - postNotificationName: NSApplicationDidHideNotification - object: [NSWorkspace sharedWorkspace] - userInfo: info]; - } - else - { - /*Minimize all windows if there isn't an AppIcon. This isn't the - most elegant solution, but avoids to loss the app if the user - hide it. */ - [self miniaturizeAll: sender]; - } - } -#endif -} -/**Returns whether app is currently in hidden state.
-See Also: -hide: -unhide:
- */ -- (BOOL) isHidden -{ - return _app_is_hidden; -} - -/**Unhides and activates this application.
-See Also: -unhideWithoutActivation -hide: -isHidden
- */ -- (void) unhide: (id)sender -{ - if (_app_is_hidden) - { - [self unhideWithoutActivation]; - _unhide_on_activation = NO; - } - if (_app_is_active == NO) - { - /* - * Activation should make the applications menus visible. - */ - [self activateIgnoringOtherApps: YES]; - } -} - -/** - * Unhides this app (displays its windows) but does not activate it. - */ -- (void) unhideWithoutActivation -{ - if (_app_is_hidden == YES) - { - NSDictionary *info; - unsigned count; - unsigned i; - - [nc postNotificationName: NSApplicationWillUnhideNotification - object: self]; - - /* Make sure we set this before ordering windows to avoid possible - recursive loops (some methods window/backend methods check if - the app is hidden before ordering a window). */ - _app_is_hidden = NO; - - count = [_hidden count]; - for (i = 0; i < count; i++) - { - NSWindow *win = [_hidden objectAtIndex: i]; - [win orderFrontRegardless]; - if ([win isMiniaturized]) - { - [GSServerForWindow(win) miniwindow: [win windowNumber]]; - } - } - [_hidden removeAllObjects]; - [[_app_icon_window contentView] setNeedsDisplay: YES]; - - info = [self _notificationUserInfo]; - [nc postNotificationName: NSApplicationDidUnhideNotification - object: self - userInfo: info]; - [[[NSWorkspace sharedWorkspace] notificationCenter] - postNotificationName: NSApplicationDidUnhideNotification - object: [NSWorkspace sharedWorkspace] - userInfo: info]; - } -} - -/** - * Arranges all non-miniaturized app's windows in front by successively calling - * [NSWindow-orderFront:] on each window in the app's Windows menu. - */ -- (void) arrangeInFront: (id)sender -{ - NSMenu *menu; - - menu = [self windowsMenu]; - if (menu) - { - NSArray *itemArray; - unsigned count; - unsigned i; - - itemArray = [menu itemArray]; - count = [itemArray count]; - for (i = 0; i < count; i++) - { - id win = [(NSMenuItem*)[itemArray objectAtIndex: i] target]; - - if ([win isKindOfClass: [NSWindow class]] && - [win isVisible] && ![win isMiniaturized]) - { - [win orderFront: sender]; - } - } - } -} - /* * Managing windows */ @@ -2615,669 +1054,24 @@ * key. If this app is not active, nil should be returned. The key window * is the one that will receive keyboard input. */ -- (NSWindow*) keyWindow +- (UIWindow*) keyWindow { return _key_window; } -/** - * Returns current main window of this application. There need not necessarily - * be a main window, even if app is active, and this should return nil if the - * app is inactive. - */ -- (NSWindow*) mainWindow -{ - return _main_window; -} /** - * Sends aSelector to each window, either in the app's internal window list - * (flag = NO) or their stacking order from front to back on the screen - * (flag = YES, currently not implemented under GNUstep). - */ -- (NSWindow*) makeWindowsPerform: (SEL)aSelector inOrder: (BOOL)flag -{ - NSArray *window_list; - unsigned i, c; - - // so i suppose when flag is YES it only runs on visible windows - if (flag) - { - window_list = GSOrderedWindows(); - } - else - { - window_list = [self windows]; - } - - for (i = 0, c = [window_list count]; i < c; i++) - { - NSWindow *window = [window_list objectAtIndex: i]; - - if ([window performSelector: aSelector] != nil) - { - return window; - } - } - return nil; -} - -/** - * Iconify all windows in the app. - */ -- (void) miniaturizeAll: sender -{ - NSArray *window_list = [self windows]; - unsigned i, count; - - for (i = 0, count = [window_list count]; i < count; i++) - [[window_list objectAtIndex: i] miniaturize: sender]; -} - -/** - * Prevent window reordering in response to most recent mouse down (useful to - * prevent raise-on-mouse-click). Not implemented under GNUstep. - */ -- (void) preventWindowOrdering -{ - //TODO -} - -/** - * Set whether the main run loop will request all visible windows update - * themselves after the current or next event is processed. (Update occurs - * after event dispatch in the loop.) - * This is needed when in NSEventTrackingRunLoopMode. When the application - * is using NSDefaultRunLoopMode or NSModalPanelRunLoopMode windows are updated - * after each loop iteration irrespective of this setting. - */ -- (void) setWindowsNeedUpdate: (BOOL)flag -{ - _windows_need_update = flag; -} - -/** - * Sends each of the app's visible windows an [NSWindow-update] message. - * This method is called automatically for every iteration of the run loop - * in NSDefaultRunLoopMode or NSModalPanelRunLoopMode, but is only called during - * NSEventTrackingRunLoopMode if -setWindowsNeedUpdate: is set to YES. - */ -- (void) updateWindows -{ - NSArray *window_list = [self windows]; - unsigned count = [window_list count]; - unsigned i; - - _windows_need_update = NO; - [nc postNotificationName: NSApplicationWillUpdateNotification object: self]; - - for (i = 0; i < count; i++) - { - NSWindow *win = [window_list objectAtIndex: i]; - if ([win isVisible]) - [win update]; - } - [nc postNotificationName: NSApplicationDidUpdateNotification object: self]; -} - -/** * Returns array of app's visible and invisible windows. */ - (NSArray*) windows { + // TODO we cannot use gnustep-gui method here +#if 0 return GSAllWindows(); +#endif } /** - * Returns window for windowNum. Note the window number can be obtained for - * a window from [NSWindow-windowNumber]. - */ -- (NSWindow *) windowWithWindowNumber: (int)windowNum -{ - return GSWindowWithNumber(windowNum); -} - -/* - * Showing Standard Panels - */ - -/** Calls -orderFrontStandardAboutPanelWithOptions: with nil passed as - the options dictionary. -*/ -- (void) orderFrontStandardAboutPanel: sender -{ - [self orderFrontStandardAboutPanelWithOptions: nil]; -} - -/** OS X compatibility: Calls -orderFrontStandardInfoPanelWithOptions: . -*/ -- (void) orderFrontStandardAboutPanelWithOptions: (NSDictionary *)dictionary -{ - [self orderFrontStandardInfoPanelWithOptions: dictionary]; -} - -/* infoPanel, GNUstep API */ -/** Calls -orderFrontStandardInfoPanelWithOptions: with nil passed as - the options dictionary. -*/ -- (void) orderFrontStandardInfoPanel: sender -{ - [self orderFrontStandardInfoPanelWithOptions: nil]; -} - -/** -
- Orders front the standard info panel for the application,
- taking the needed information from the dictionary
- argument. There is a single standard info panel per application;
- it is created the first time that this method is invoked, and then
- reused in all subsequent calls. The application standard info
- panel is immutable and can not be changed after creation. Useful
- keys for the dictionary
are:
-
Returns the services menu of the receiver.
-See Also: -setServicesMenu:
- */ -- (NSMenu *) servicesMenu -{ - return [_listener servicesMenu]; -} - -/**Returns the services provided previously registered using the - * -setServicesProvider: method.
See Also: -setServicesProvider:
- */ -- (id) servicesProvider -{ - return [_listener servicesProvider]; -} - -/**ets the services menu for the receiver. This should be called, otherwise - * warnings will be generated by the main event loop, which is in charge of - * updating all menus, including the Services menu.
- *See Also: -servicesMenu
- */ -- (void) setServicesMenu: (NSMenu *)aMenu -{ - [_listener setServicesMenu: aMenu]; -} - -/** - * Sets the object which provides services to other applications.NSTerminateNow
will termination be
- * carried out.NSTerminateNow
and NO is
- * equivalent to NSTerminateCancel
.
- */
-- (void) terminate: (id)sender
-{
- NSDocumentController *sdc;
- NSApplicationTerminateReply termination;
-
- /* First ask the shared document controller to save any unsaved changes */
- sdc = [NSDocumentController sharedDocumentController];
- if ([[sdc documentClassNames] count] > 0)
- {
- if ([sdc reviewUnsavedDocumentsWithAlertTitle: _(@"Quit")
- cancellable: YES] == NO)
- {
- return;
- }
- }
-
- /* Now ask the application delegate whether its okay to terminate */
- termination = NSTerminateNow;
- if ([_delegate respondsToSelector: @selector(applicationShouldTerminate:)])
- {
- /* The old API has applicationShouldTerminate: return a BOOL,
- * so if we are linked in to an application which used that
- * API, the delegate might return a BOOL rather than an
- * NSTerminateNow. That's fine as both NSTerminateNow
- * and BOOL are integral types (though potentially of different sizes),
- * and NSTerminateNow is defined as YES and NSTerminateCancel as NO.
- * So all we need to do is mask the low byte of the return value in
- * case there is uninitialised random data in the higher bytes.
- */
- termination = ([_delegate applicationShouldTerminate: self] & 0xff);
- }
-
- if (termination == NSTerminateNow)
- {
- [self replyToApplicationShouldTerminate: YES];
- }
- /*
- Don't need to do anything on NSTerminateLater, as long as user code
- follows the contract (to call replyTo... later).
- */
-}
-
-/**
- * Terminates the app if shouldTerminate is YES, otherwise does nothing.
- * This should be called by user code if a delegate has returned
- * NSTerminateLater
to an -applicationShouldTerminate: message.
- */
-- (void) replyToApplicationShouldTerminate: (BOOL)shouldTerminate
-{
- // Prevent cycles in terminate: call.
- if (shouldTerminate && _app_is_running)
- {
- [nc postNotificationName: NSApplicationWillTerminateNotification
- object: self];
-
- _app_is_running = NO;
-
- GSRemoveIcon(_app_icon_window);
- [[self windows] makeObjectsPerformSelector: @selector(close)];
- [NSCursor setHiddenUntilMouseMoves: NO];
-
- /* Store our user information. */
- [[NSUserDefaults standardUserDefaults] synchronize];
-
- /* Tell the Workspace that we really did terminate. */
- [[[NSWorkspace sharedWorkspace] notificationCenter]
- postNotificationName: NSWorkspaceDidTerminateApplicationNotification
- object: [NSWorkspace sharedWorkspace]
- userInfo: [self _notificationUserInfo]];
-
- /* Destroy the main run loop pool (this also destroys any nested
- pools which might have been created inside this one). */
- DESTROY (_runLoopPool);
-
- /* Now free the NSApplication object. Enclose the operation
- into an autorelease pool, in case some -dealloc method needs
- to use any temporary object. */
- {
- NSAutoreleasePool *pool;
-
- IF_NO_GC(pool = [arpClass new]);
-
- DESTROY(NSApp);
-
- DESTROY(pool);
- }
-
- /* And finally, stop the program. */
- exit(0);
- }
-}
-
-- (void) replyToOpenOrPrint: (NSApplicationDelegateReply)reply
-{
- // FIXME
-}
-
-/**
+ * NOTE: Documentation not updated for UIKit.
* Returns the application's delegate, as set by the -setDelegate: method.The application delegate will automatically be sent various
* notifications (as long as it implements the appropriate methods)
@@ -3599,221 +1185,24 @@
if ([_delegate respondsToSelector: @selector(application##notif_name:)]) \
[nc addObserver: _delegate \
selector: @selector(application##notif_name:) \
- name: NSApplication##notif_name##Notification object: self]
+ name: UIApplication##notif_name##Notification object: self]
- SET_DELEGATE_NOTIFICATION(DidBecomeActive);
+ SET_DELEGATE_NOTIFICATION(WillEnterForeground);
+ SET_DELEGATE_NOTIFICATION(DidEnterBackground);
SET_DELEGATE_NOTIFICATION(DidFinishLaunching);
- SET_DELEGATE_NOTIFICATION(DidHide);
- SET_DELEGATE_NOTIFICATION(DidResignActive);
- SET_DELEGATE_NOTIFICATION(DidUnhide);
- SET_DELEGATE_NOTIFICATION(DidUpdate);
- SET_DELEGATE_NOTIFICATION(WillBecomeActive);
- SET_DELEGATE_NOTIFICATION(WillFinishLaunching);
- SET_DELEGATE_NOTIFICATION(WillHide);
- SET_DELEGATE_NOTIFICATION(WillResignActive);
SET_DELEGATE_NOTIFICATION(WillTerminate);
- SET_DELEGATE_NOTIFICATION(WillUnhide);
- SET_DELEGATE_NOTIFICATION(WillUpdate);
}
/*
* Methods for scripting
*/
-/**
- * OS X scripting method to return document objects being handled by
- * application. Not implemented yet under GNUstep.
- */
-- (NSArray *) orderedDocuments
-{
- // FIXME
- return nil;
-}
-/**
- * OS X scripting method to return windows in front-to-back on-screen order
- * for scriptable windows.
- * The GNUstep implementation returns all the windows excluding NSPanels.
- * some backends may return an array in an unspecified order.
- */
-- (NSArray *) orderedWindows
-{
- NSArray *arr = GSOrderedWindows();
- NSMutableArray *ret = [[NSMutableArray alloc] initWithCapacity:[arr count]];
- NSEnumerator *iter = [arr objectEnumerator];
- id win;
- while ((win = [iter nextObject]))
- {
- if (![win isKindOfClass:[NSPanel class]])
- [ret addObject:win];
- }
-
- return AUTORELEASE(ret);
-}
+@end /* UIApplication */
-/*
- * Methods for user attention requests
- */
-/**
- * Cancels a request previously made through calling -requestUserAttention: .
- * Note that request is cancelled automatically if user activates the app.
- */
-- (void) cancelUserAttentionRequest: (int)request
-{
- // FIXME
-}
+@implementation UIApplication (Private)
-/**
- * Method that on OS X makes the icon jump in the doc. Mercifully, this is
- * unimplemented under GNUstep. If it were implemented, requestType
- * could be either NSCriticalRequest
(bounce endlessly) or
- * NSInformationalRequest
(bounce for one second).
- */
-- (int) requestUserAttention: (NSRequestUserAttentionType)requestType
-{
- // FIXME
- return 0;
-}
-
-/*
- * NSCoding protocol
- */
-- (void) encodeWithCoder: (NSCoder*)aCoder
-{
- [super encodeWithCoder: aCoder];
- if ([aCoder allowsKeyedCoding])
- {
- /*
- if (_delegate != nil)
- {
- [aCoder encodeObject: _delegate forKey: @"NSDelegate"];
- }
- [aCoder encodeObject: _main_menu forKey: @"NSMainMenu"]; // ???
- [aCoder encodeObject: _windows_menu forKey: @"NSWindowsMenu"]; // ???
- */
- }
- else
- {
- [aCoder encodeConditionalObject: _delegate];
- [aCoder encodeObject: _main_menu];
- [aCoder encodeConditionalObject: _windows_menu];
- }
-}
-
-- (id) initWithCoder: (NSCoder*)aDecoder
-{
- id obj;
-
- [super initWithCoder: aDecoder];
- if ([aDecoder allowsKeyedCoding])
- {
- /*
- if ([aDecoder containsValueForKey: @"NSDelegate"])
- {
- obj = [aDecoder decodeObjectForKey: @"NSDelegate"];
- [self setDelegate: obj];
- }
- obj = [aDecoder decodeObjectForKey: @"NSMainMenu"];
- [self setMainMenu: obj];
- obj = [aDecoder decodeObjectForKey: @"NSWindowsMenu"];
- [self setWindowsMenu: obj];
- */
- }
- else
- {
- obj = [aDecoder decodeObject];
- [self setDelegate: obj];
- obj = [aDecoder decodeObject];
- [self setMainMenu: obj];
- obj = [aDecoder decodeObject];
- [self setWindowsMenu: obj];
- }
- return self;
-}
-
-@end /* NSApplication */
-
-
-@implementation NSApplication (Private)
-
-- (void) _appIconInit
-{
- NSDictionary *infoDict;
- NSString *appIconFile;
- NSImage *image = nil;
- NSAppIconView *iv;
- unsigned mask = NSIconWindowMask;
- BOOL suppress;
-
- suppress = [[NSUserDefaults standardUserDefaults]
- boolForKey: @"GSSuppressAppIcon"];
-#if MINI_ICON
- if (suppress)
- {
- mask = NSMiniaturizableWindowMask;
- }
-#endif
-
- infoDict = [[NSBundle mainBundle] infoDictionary];
- appIconFile = [infoDict objectForKey: @"NSIcon"];
- if (appIconFile && ![appIconFile isEqual: @""])
- {
- image = [NSImage imageNamed: appIconFile];
- }
-
- // Try to look up the icns file.
- appIconFile = [infoDict objectForKey: @"CFBundleIconFile"];
- if (appIconFile && ![appIconFile isEqual: @""])
- {
- image = [NSImage imageNamed: appIconFile];
- }
-
- if (image == nil)
- {
- image = [NSImage imageNamed: @"GNUstep"];
- }
- else
- {
- /* Set the new image to be named 'NSApplicationIcon' ... to do that we
- * must first check that any existing image of the same name has its
- * name removed.
- */
- [(NSImage*)[NSImage imageNamed: @"NSApplicationIcon"] setName: nil];
- // We need to copy the image as we may have a proxy here
- image = AUTORELEASE([image copy]);
- [image setName: @"NSApplicationIcon"];
- }
- [self setApplicationIconImage: image];
-
- _app_icon_window = [[NSIconWindow alloc] initWithContentRect: NSZeroRect
- styleMask: mask
- backing: NSBackingStoreRetained
- defer: NO
- screen: nil];
-
-
-
- {
- NSRect iconContentRect = GSGetIconFrame(_app_icon_window);
- NSRect iconFrame = [_app_icon_window frameRectForContentRect: iconContentRect];
- NSRect iconViewFrame = NSMakeRect(0, 0, iconContentRect.size.width, iconContentRect.size.height);
- [_app_icon_window setFrame: iconFrame display: YES];
-
- iv = [[NSAppIconView alloc] initWithFrame: iconViewFrame];
- [iv setImage: _app_icon];
- [_app_icon_window setContentView: iv];
- RELEASE(iv);
- }
-
- if (NO == suppress)
- {
- /* The icon window is not suppressed ... display it.
- */
- [_app_icon_window orderFrontRegardless];
- }
-}
-
- (NSDictionary*) _notificationUserInfo
{
NSString *path;
@@ -3859,11 +1248,8 @@
return userInfo;
}
-- (void) _openDocument: (NSString*)filePath
-{
- [_listener application: self openFile: filePath];
-}
-
+#if 0
+/// TODO study what this is used for
- (id) _targetForAction: (SEL)aSelector
keyWindow: (NSWindow *)keyWindow
mainWindow: (NSWindow *)mainWindow
@@ -3971,15 +1357,17 @@
/* give up */
return nil;
}
-
+#endif
- (void) _windowDidBecomeKey: (NSNotification*) notification
{
id obj = [notification object];
- if (_key_window == nil && [obj isKindOfClass: [NSWindow class]])
+ if (_key_window == nil && [obj isKindOfClass: [UIWindow class]])
{
_key_window = obj;
+/*
[_main_menu update];
+*/
}
else if (_key_window != obj)
{
@@ -3987,21 +1375,6 @@
}
}
-- (void) _windowDidBecomeMain: (NSNotification*) notification
-{
- id obj = [notification object];
-
- if (_main_window == nil && [obj isKindOfClass: [NSWindow class]])
- {
- _main_window = obj;
- [_main_menu update];
- }
- else if (_main_window != obj)
- {
- NSLog(@"Bogus attempt to set main window");
- }
-}
-
- (void) _windowDidResignKey: (NSNotification*) notification
{
id obj = [notification object];
@@ -4009,7 +1382,9 @@
if (_key_window == obj)
{
_key_window = nil;
+/*
[NSCursor setHiddenUntilMouseMoves: NO];
+ */
}
else
{
@@ -4017,79 +1392,8 @@
}
}
-- (void) _windowDidResignMain: (NSNotification*) notification
-{
- id obj = [notification object];
-
- if (_main_window == obj)
- {
- _main_window = nil;
- }
- else
- {
- NSLog(@"Bogus attempt to resign key window");
- }
-}
-
-- (void) _lastWindowClosed
-{
- if ([_delegate respondsToSelector:
- @selector(applicationShouldTerminateAfterLastWindowClosed:)])
- {
- if ([_delegate
- applicationShouldTerminateAfterLastWindowClosed: self])
- {
- [self terminate: self];
- }
- }
- /* wlux 2009-10-17: If we use MS Windows style menus, terminate
- the application by default when the last window is closed. */
- else if (NSInterfaceStyleForKey(@"NSMenuInterfaceStyle", nil) ==
- NSWindows95InterfaceStyle)
- {
- [self terminate: self];
- }
-}
-
-- (void) _windowWillClose: (NSNotification*) notification
-{
- NSWindow *win = [notification object];
-
- if (_app_is_running)
- {
- /* FIXME Don't use GSOrderedWindows(), since it may not return all
- windows when the application is hidden. E.g., given a hidden
- application with a single window with canHide == NO, if the user
- closes this window it would appear as if the last window was closed. */
- NSArray *windows_list = GSOrderedWindows();
- NSEnumerator *iter = [windows_list objectEnumerator];
- BOOL wasLast = YES;
- NSWindow *tmp;
-
- while ((tmp = [iter nextObject]))
- {
- if (tmp != win && [tmp canBecomeMainWindow] == YES)
- {
- wasLast = NO;
- break;
- }
- }
-
- /* Perform _lastWindowDidClose at the end of the event loop cycle so
- that all interested objects are notified before we terminate the
- application. In particular, this means that a modified document
- associated with the closed window has been closed before -terminate:
- is called and therefore the user isn't asked twice whether she wants
- to save that document's unsaved changes. */
- if (wasLast)
- {
- [self performSelector: @selector(_lastWindowClosed)
- withObject: nil
- afterDelay: 0.1];
- }
- }
-}
-
+#if 0
+// Reenable when we have Springboard/Workspace
- (void) _workspaceNotification: (NSNotification*) notification
{
NSString *name = [notification name];
@@ -4112,109 +1416,18 @@
}
}
}
+#endif
-- (NSArray *) _openFiles
-{
- NSMutableArray *files = nil;
- NSArray *args = [[NSProcessInfo processInfo] arguments];
- NSEnumerator *en = [args objectEnumerator];
- NSString *file = nil;
- [en nextObject]; // skip the first element, which is always empty...
- while((file = [en nextObject]) != nil)
- {
- unichar c = [file characterAtIndex: 0];
- if(c != '-')
- {
- if(files == nil)
- {
- files = [NSMutableArray array];
- }
- [files addObject: file];
- }
- else
- {
- break;
- }
- }
+@end // UIApplication (Private)
- return files;
-}
-- (NSMenu *) _dockMenu
-{
- NSUInteger i, j, n;
- NSMenu *dockMenu, *windowsMenu;
+@implementation UIApplication (GSGUIInternal)
- // ask delegate for a dock menu, if none create a new one
- dockMenu = nil;
- if ([_delegate respondsToSelector: @selector(applicationDockMenu:)])
- {
- // NB we make a copy of the menu since we are going to modify it
- dockMenu = [[_delegate applicationDockMenu: self] copy];
- }
- if (dockMenu == nil)
- {
- dockMenu = [[NSMenu alloc] initWithTitle:@""];
- }
-
- // copy window menu entries to the top of the menu
- windowsMenu = [NSApp windowsMenu];
- for (i = j = 0, n = [windowsMenu numberOfItems]; i < n; i++)
- {
- NSMenuItem *item = [windowsMenu itemAtIndex: i];
- if ([[item target] isKindOfClass:[NSWindow class]] &&
- sel_isEqual([item action], @selector(makeKeyAndOrderFront:)))
- {
- [[dockMenu insertItemWithTitle: [item title]
- action: @selector(makeKeyAndOrderFront:)
- keyEquivalent: @""
- atIndex: j++]
- setTarget: [item target]];
- }
- }
- if (j > 0)
- {
- [dockMenu insertItem: [NSMenuItem separatorItem] atIndex: j++];
- }
-
- // insert standard entries to show or hide and to quit the application at
- // the bottom
- if (j < [dockMenu numberOfItems])
- {
- [dockMenu addItem: [NSMenuItem separatorItem]];
- }
- if ([self isHidden])
- {
- [dockMenu addItemWithTitle:_(@"Show")
- action:@selector(unhide:)
- keyEquivalent:@""];
- }
- else
- {
- [dockMenu addItemWithTitle:_(@"Hide")
- action:@selector(hide:)
- keyEquivalent:@""];
- }
- [dockMenu addItemWithTitle:_(@"Quit")
- action:@selector(terminate:)
- keyEquivalent:@""];
-
- // return the menu
- return dockMenu;
-}
-
-@end // NSApplication (Private)
-
-
-@implementation NSApplication (GSGUIInternal)
-
-- (void) _windowWillDealloc: (NSWindow *)window
+- (void) _windowWillDealloc: (UIWindow *)window
{
if (window == _key_window)
_key_window = nil;
- if (window == _main_window)
- _main_window = nil;
}
@end
Index: GNUmakefile
===================================================================
--- GNUmakefile (revision 33949)
+++ GNUmakefile (working copy)
@@ -1,10 +1,12 @@
-# The main makefile of the GNUstep Core Data framework.
-# Copyright (C) 2005 Free Software Foundation, Inc.
+# The main makefile of the GNUstep UIKit framework.
+# Copyright (C) 2005,2011 Free Software Foundation, Inc.
#
# Written by: Saso Kiselkov NSApp
to use default implementations in other cases.
+ * Invoked on notification that application has just been deactivated.
*/
-@protocol GSAppDelegateProtocol
-/**
- * Sender app (not necessarily this application) requests application to open
- * file without bringing up its normal UI, for programmatic manipulation.
- * YES should be returned on success, NO on failure.
- */
-- (BOOL) application: (NSApplication*)app
- openFileWithoutUI: (NSString*)filename;
+- (void) applicationDidEnterBackground: (NSNotification*)aNotification;
/**
- * Sender requests application to open filename.
- * YES should be returned on success, NO on failure.
- */
-- (BOOL) application: (NSApplication*)app
- openFile: (NSString*)filename;
-
-#if OS_API_VERSION(MAC_OS_X_VERSION_10_3, GS_API_LATEST)
-/**
- * Sender requests application to open filenames.
- * Not sent yet under GNUstep.
- */
-- (void) application: (NSApplication*)app openFiles: (NSArray*)filenames;
-#endif
-
-/**
- * Sender requests application to open a temporary file. Responsibility
- * for eventual deletion lies with this application.
- * YES should be returned on success, NO on failure.
- */
-- (BOOL) application: (NSApplication*)app
- openTempFile: (NSString*)filename;
-
-/**
- * Sender requests application to print filename. This should generally be
- * done without presenting a GUI to the user, unless default options are
- * likely to be changed.
- * YES should be returned on success, NO on failure.
- */
-- (BOOL) application: (NSApplication *)theApplication
- printFile:(NSString *)filename;
-
-#if OS_API_VERSION(MAC_OS_X_VERSION_10_3, GS_API_LATEST)
-/**
- * Not sent yet on GNUstep.
- */
-#if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
-- (NSApplicationPrintReply) application: (NSApplication*)app
- printFiles: (NSArray*)files
- withSettings: (NSDictionary*)settings
- showPrintPanels: (BOOL)flag;
-
-#else
-// Deprecated in 10.4
-- (void) application: (NSApplication*)app printFiles: (NSArray*)filenames;
-#endif
-#endif
-
-#if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
-/**
- * Ask delegate for an error replacement.
- */
-- (NSError*) application: (NSApplication*)app willPresentError: (NSError*)error;
-#endif
-
-/**
- * Sender requests application to open a fresh document.
- * YES should be returned on success, NO on failure.
- */
-- (BOOL) applicationOpenUntitledFile: (NSApplication*)app;
-
-/**
- * Sender will request application to open a fresh document, unless NO
- * is returned here.
- */
-- (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender;
-
-#if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST)
-/**
- * Sent from within the [NSApplication-terminate:]. If
- * NSTerminateNow
is returned, termination will proceed. If
- * NSTerminateCancel
is returned, termination will NOT proceed.
- * If NSTerminateLater
is returned, termination will be halted,
- * but the application should call
- * [NSApplication-replyToApplicationShouldTerminate:] with a YES or NO. (Used
- * if confirmation windows, etc. need to be put up.)
- */
-- (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication *)sender;
-#else
-/**
- * Sent from within the [NSApplication-terminate:]. If NO is returned
- * termination will not proceed.
- */
-- (BOOL) applicationShouldTerminate: (id)sender;
-#endif
-
-/**
- * Invoked when the last window is closed in an application. If YES is
- * returned, -applicationShouldTerminate: is invoked.
- */
-- (BOOL) applicationShouldTerminateAfterLastWindowClosed: (id)sender;
-
-/**
- * Invoked on notification that application has become active.
- */
-- (void) applicationDidBecomeActive: (NSNotification*)aNotification;
-
-/**
* Invoked on notification that application has finished launching
* ([NSApplication-finishLaunching] has completed, but no event dispatching
* has begun.
@@ -530,159 +176,23 @@
- (void) applicationDidFinishLaunching: (NSNotification*)aNotification;
/**
- * Invoked on notification that application has just been hidden.
- */
-- (void) applicationDidHide: (NSNotification*)aNotification;
-
-/**
- * Invoked on notification that application has just been deactivated.
- */
-- (void) applicationDidResignActive: (NSNotification*)aNotification;
-
-/**
- * Invoked on notification that application has just been unhidden.
- */
-- (void) applicationDidUnhide: (NSNotification*)aNotification;
-
-/**
- * Invoked on notification that application has updated its windows.
- */
-- (void) applicationDidUpdate: (NSNotification*)aNotification;
-
-/**
- * Invoked on notification that application will become active.
- */
-- (void) applicationWillBecomeActive: (NSNotification*)aNotification;
-
-/**
- * Invoked on notification that application will become active.
- */
-- (void) applicationWillFinishLaunching: (NSNotification*)aNotification;
-
-/**
- * Invoked on notification that application will be hidden.
- */
-- (void) applicationWillHide: (NSNotification*)aNotification;
-
-/**
- * Invoked on notification just before application resigns active status.
- */
-- (void) applicationWillResignActive: (NSNotification*)aNotification;
-
-/**
* Invoked on notification just before application terminates. (There is
* no opportunity to avert it now.)
*/
- (void) applicationWillTerminate:(NSNotification*)aNotification;
-/**
- * Invoked on notification that application will be unhidden.
- */
-- (void) applicationWillUnhide: (NSNotification*)aNotification;
-
-/**
- * Invoked on notification that application will now update its windows.
- * (See [NSApplication-updateWindows].
- */
-- (void) applicationWillUpdate: (NSNotification*)aNotification;
-
-#if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST)
-/**
- * Method called by scripting framework on OS X. Not implemented (sent)
- * yet on GNUstep.
- */
-- (BOOL) application: (NSApplication*)sender
- delegateHandlesKey: (NSString*)key;
-
-/**
- * Method used on OS X to allow an application to override the standard menu
- * obtained by right-clicking on the application's dock icon. Called
- * when the application uses Macintosh or Windows95 style menus.
- */
-- (NSMenu *) applicationDockMenu: (NSApplication*)sender;
-
-/**
- * Method used on OS X to allow delegate to handle event when user clicks on
- * dock icon of an already-open app. If YES is returned, a default
- * implementation executes (for example, to create a new untitled document);
- * if NO is returned nothing is done (and you can handle it here in this
- * method). Not sent yet under GNUstep.
- */
-- (BOOL) applicationShouldHandleReopen: (NSApplication*)theApplication
- hasVisibleWindows: (BOOL)flag;
-
-/**
- * Called on OS X when the resolution or other characteristics of the display
- * have changed (through control panel operation, connecting a new monitor,
- * etc.). Not implemented/sent yet under GNUstep.
- */
-- (void) applicationDidChangeScreenParameters: (NSNotification*)aNotification;
-#endif
@end
-#endif
/*
* Notifications
*/
-APPKIT_EXPORT NSString *NSApplicationDidBecomeActiveNotification;
-APPKIT_EXPORT NSString *NSApplicationDidChangeScreenParametersNotification;
-APPKIT_EXPORT NSString *NSApplicationDidFinishLaunchingNotification;
-APPKIT_EXPORT NSString *NSApplicationDidHideNotification;
-APPKIT_EXPORT NSString *NSApplicationDidResignActiveNotification;
-APPKIT_EXPORT NSString *NSApplicationDidUnhideNotification;
-APPKIT_EXPORT NSString *NSApplicationDidUpdateNotification;
-APPKIT_EXPORT NSString *NSApplicationWillBecomeActiveNotification;
-APPKIT_EXPORT NSString *NSApplicationWillFinishLaunchingNotification;
-APPKIT_EXPORT NSString *NSApplicationWillHideNotification;
-APPKIT_EXPORT NSString *NSApplicationWillResignActiveNotification;
-APPKIT_EXPORT NSString *NSApplicationWillTerminateNotification;
-APPKIT_EXPORT NSString *NSApplicationWillUnhideNotification;
-APPKIT_EXPORT NSString *NSApplicationWillUpdateNotification;
+UIKIT_EXPORT NSString *UIApplicationWillEnterForegroundNotification;
+UIKIT_EXPORT NSString *UIApplicationDidFinishLaunchingNotification;
+UIKIT_EXPORT NSString *NSApplicationDidEnterBackgroundNotification;
+UIKIT_EXPORT NSString *NSApplicationWillTerminateNotification;
-/*
- * Determine Whether an Item Is Included in Services Menus
- */
-APPKIT_EXPORT int
-NSSetShowsServicesMenuItem(NSString *name, BOOL enabled);
-APPKIT_EXPORT BOOL
-NSShowsServicesMenuItem(NSString *name);
+UIKIT_EXPORT int
+UIApplicationMain(int argc, const char **argv, NSString *principalClassName, NSString *delegateClassName);
-/*
- * Programmatically Invoke a Service
- */
-APPKIT_EXPORT BOOL
-NSPerformService(NSString *serviceItem, NSPasteboard *pboard);
-
-#if OS_API_VERSION(GS_API_NONE, GS_API_NONE)
-APPKIT_EXPORT id
-GSContactApplication(NSString *appName, NSString *port, NSDate *expire);
-#endif
-
-/*
- * Force Services Menu to Update Based on New Services
- */
-APPKIT_EXPORT void
-NSUpdateDynamicServices(void);
-
-/*
- * Register object to handle services requests.
- */
-APPKIT_EXPORT void
-NSRegisterServicesProvider(id provider, NSString *name);
-
-APPKIT_EXPORT void
-NSUnRegisterServicesProvider(NSString *name);
-
-APPKIT_EXPORT int
-NSApplicationMain(int argc, const char **argv);
-
-APPKIT_EXPORT void
-NSShowSystemInfoPanel(NSDictionary *options);
-
-/*
- * The NSApp global variable.
- */
-APPKIT_EXPORT NSApplication *NSApp;
-
-#endif // _GNUstep_H_NSApplication
+#endif // _GNUstep_UIKit_H_UIApplication
Index: GNUmakefile.preamble
===================================================================
--- GNUmakefile.preamble (revision 33949)
+++ GNUmakefile.preamble (working copy)
@@ -1,10 +1,12 @@
-# GNUmakefile.preamble of the GNUstep Core Data framework.
-# Copyright (C) 2005 Free Software Foundation, Inc.
+# GNUmakefile.preamble of the GNUstep UIKit framework.
+# Copyright (C) 2005,2011 Free Software Foundation, Inc.
#
# Written by: Saso Kiselkov