diff options
Diffstat (limited to 'redo/uitask_darwin.m')
| -rw-r--r-- | redo/uitask_darwin.m | 138 |
1 files changed, 0 insertions, 138 deletions
diff --git a/redo/uitask_darwin.m b/redo/uitask_darwin.m deleted file mode 100644 index e69882a..0000000 --- a/redo/uitask_darwin.m +++ /dev/null @@ -1,138 +0,0 @@ -// 8 july 2014 - -#import "objc_darwin.h" -#import "_cgo_export.h" -#import <Cocoa/Cocoa.h> - -#define toNSWindow(x) ((NSWindow *) (x)) - -static Class areaClass; - -@interface goApplication : NSApplication -@end - -@implementation goApplication - -// by default, NSApplication eats some key events -// this prevents that from happening with Area -// see http://stackoverflow.com/questions/24099063/how-do-i-detect-keyup-in-my-nsview-with-the-command-key-held and http://lists.apple.com/archives/cocoa-dev/2003/Oct/msg00442.html -- (void)sendEvent:(NSEvent *)e -{ - NSEventType type; - BOOL handled = NO; - - type = [e type]; - if (type == NSKeyDown || type == NSKeyUp || type == NSFlagsChanged) { - id focused; - - focused = [[e window] firstResponder]; - if (focused != nil && [focused isKindOfClass:areaClass]) - switch (type) { - case NSKeyDown: - handled = [focused doKeyDown:e]; - break; - case NSKeyUp: - handled = [focused doKeyUp:e]; - break; - case NSFlagsChanged: - handled = [focused doFlagsChanged:e]; - break; - } - } - if (!handled) - [super sendEvent:e]; -} - -// ok AppKit, wanna play hardball? let's play hardball. -// because I can neither break out of the special version of the NSModalPanelRunLoopMode that the regular terminate: puts us in nor avoid the exit(0); call included, I'm taking control -// note that this is called AFTER applicationShouldTerminate: -- (void)terminate:(id)sender -{ - // DO ABSOLUTELY NOTHING - // the magic is [NSApp run] will just... stop. -} - -@end - -@interface appDelegateClass : NSObject <NSApplicationDelegate> -@end - -@implementation appDelegateClass - -- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)app -{ - NSArray *windows; - NSUInteger i, n; - - windows = [NSApp windows]; - n = [windows count]; - for (i = 0; i < n; i++) { - NSWindow *w; - - w = toNSWindow([windows objectAtIndex:i]); - if (![[w delegate] windowShouldClose:w]) - // stop at the first rejection; thanks Lyle42 in irc.freenode.net/#macdev - return NSTerminateCancel; - } - // all windows closed; stop gracefully for Go - // note that this is designed for our special terminate: above - return NSTerminateNow; -} - -- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)app -{ - return NO; -} - -@end - -appDelegateClass *appDelegate; - -id getAppDelegate(void) -{ - return appDelegate; -} - -void uiinit(char **errmsg) -{ - areaClass = getAreaClass(); - appDelegate = [appDelegateClass new]; - [goApplication sharedApplication]; - // don't check for a NO return; something (launch services?) causes running from application bundles to always return NO when asking to change activation policy, even if the change is to the same activation policy! - // see https://github.com/andlabs/ui/issues/6 - [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; - [NSApp setDelegate:appDelegate]; -} - -void uimsgloop(void) -{ - [NSApp run]; -// NSLog(@"you shouldn't see this under normal circumstances, but screw the rules, I have SUBCLASSING"); -} - -// don't use [NSApp terminate:]; that quits the program -void uistop(void) -{ - NSEvent *e; - - [NSApp stop:NSApp]; - // stop: won't register until another event has passed; let's synthesize one - e = [NSEvent otherEventWithType:NSApplicationDefined - location:NSZeroPoint - modifierFlags:0 - timestamp:[[NSProcessInfo processInfo] systemUptime] - windowNumber:0 - context:[NSGraphicsContext currentContext] - subtype:0 - data1:0 - data2:0]; - [NSApp postEvent:e atStart:NO]; // let pending events take priority -} - -// thanks to mikeash in irc.freenode.net/#macdev for suggesting the use of Grand Central Dispatch and blocks for this -void issue(void *what) -{ - dispatch_async(dispatch_get_main_queue(), ^{ - doissue(what); - }); -} |
