diff --git a/darwin/OLD_uipriv_darwin.h b/darwin/OLD_uipriv_darwin.h index 09cfd900..e1e99dc0 100644 --- a/darwin/OLD_uipriv_darwin.h +++ b/darwin/OLD_uipriv_darwin.h @@ -1,23 +1,3 @@ - - -// main.m -@interface applicationClass : NSApplication -@end -// this is needed because NSApp is of type id, confusing clang -#define realNSApp() ((applicationClass *) NSApp) -@interface appDelegate : NSObject -@property (strong) uiprivMenuManager *menuManager; -@end -#define appDelegate() ((appDelegate *) [realNSApp() delegate]) -struct nextEventArgs { - NSEventMask mask; - NSDate *duration; - // LONGTERM no NSRunLoopMode? - NSString *mode; - BOOL dequeue; -}; -extern int mainStep(struct nextEventArgs *nea, BOOL (^interceptEvent)(NSEvent *)); - // util.m extern void disableAutocorrect(NSTextView *); diff --git a/darwin/main.m b/darwin/main.m index 96c2b32e..cb225255 100644 --- a/darwin/main.m +++ b/darwin/main.m @@ -4,13 +4,13 @@ static BOOL canQuit = NO; static NSAutoreleasePool *globalPool; -static applicationClass *app; -static appDelegate *delegate; +static uiprivApplicationClass *app; +static uiprivAppDelegate *delegate; static BOOL (^isRunning)(void); static BOOL stepsIsRunning; -@implementation applicationClass +@implementation uiprivApplicationClass - (void)sendEvent:(NSEvent *)e { @@ -59,7 +59,7 @@ static BOOL stepsIsRunning; if (!canQuit) uiprivImplBug("call to [NSApp terminate:] when not ready to terminate; definitely contact andlabs"); - [realNSApp() stop:realNSApp()]; + [uiprivNSApp() stop:uiprivNSApp()]; // stop: won't register until another event has passed; let's synthesize one e = [NSEvent otherEventWithType:NSApplicationDefined location:NSZeroPoint @@ -70,7 +70,7 @@ static BOOL stepsIsRunning; subtype:0 data1:0 data2:0]; - [realNSApp() postEvent:e atStart:NO]; // let pending events take priority (this is what PostQuitMessage() on Windows does so we have to do it here too for parity; thanks to mikeash in irc.freenode.net/#macdev for confirming that this parameter should indeed be NO) + [uiprivNSApp() postEvent:e atStart:NO]; // let pending events take priority (this is what PostQuitMessage() on Windows does so we have to do it here too for parity; thanks to mikeash in irc.freenode.net/#macdev for confirming that this parameter should indeed be NO) // and in case uiMainSteps() was called stepsIsRunning = NO; @@ -78,7 +78,7 @@ static BOOL stepsIsRunning; @end -@implementation appDelegate +@implementation uiprivAppDelegate - (void)dealloc { @@ -112,20 +112,20 @@ const char *uiInit(uiInitOptions *o) { @autoreleasepool { uiprivOptions = *o; - app = [[applicationClass sharedApplication] retain]; + app = [[uiprivApplicationClass sharedApplication] retain]; // 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 - [realNSApp() setActivationPolicy:NSApplicationActivationPolicyRegular]; - delegate = [appDelegate new]; - [realNSApp() setDelegate:delegate]; + [uiprivNSApp() setActivationPolicy:NSApplicationActivationPolicyRegular]; + delegate = [uiprivAppDelegate new]; + [uiprivNSApp() setDelegate:delegate]; initAlloc(); loadFutures(); loadUndocumented(); // always do this so we always have an application menu - appDelegate().menuManager = [[uiprivMenuManager new] autorelease]; - [realNSApp() setMainMenu:[appDelegate().menuManager makeMenubar]]; + uiprivAppDelegate().menuManager = [[uiprivMenuManager new] autorelease]; + [uiprivNSApp() setMainMenu:[uiprivAppDelegate().menuManager makeMenubar]]; uiprivSetupFontPanel(); @@ -146,7 +146,7 @@ void uiUninit(void) @autoreleasepool { uiprivUninitUnderlineColors(); [delegate release]; - [realNSApp() setDelegate:nil]; + [uiprivNSApp() setDelegate:nil]; [app release]; uninitAlloc(); } @@ -159,15 +159,15 @@ void uiFreeInitError(const char *err) void uiMain(void) { isRunning = ^{ - return [realNSApp() isRunning]; + return [uiprivNSApp() isRunning]; }; - [realNSApp() run]; + [uiprivNSApp() run]; } void uiMainSteps(void) { // SDL does this and it seems to be necessary for the menubar to work (see #182) - [realNSApp() finishLaunching]; + [uiprivNSApp() finishLaunching]; isRunning = ^{ return stepsIsRunning; }; @@ -176,7 +176,7 @@ void uiMainSteps(void) int uiMainStep(int wait) { - struct nextEventArgs nea; + uiprivNextEventArgs nea; nea.mask = NSAnyEventMask; @@ -189,7 +189,7 @@ int uiMainStep(int wait) nea.mode = NSDefaultRunLoopMode; nea.dequeue = YES; - return mainStep(&nea, ^(NSEvent *e) { + return uiprivMainStep(&nea, ^(NSEvent *e) { return NO; }); } @@ -197,7 +197,7 @@ int uiMainStep(int wait) // see also: // - http://www.cocoawithlove.com/2009/01/demystifying-nsapplication-by.html // - https://github.com/gnustep/gui/blob/master/Source/NSApplication.m -int mainStep(struct nextEventArgs *nea, BOOL (^interceptEvent)(NSEvent *e)) +int uiprivMainStep(uiprivNextEventArgs *nea, BOOL (^interceptEvent)(NSEvent *e)) { NSDate *expire; NSEvent *e; @@ -207,7 +207,7 @@ int mainStep(struct nextEventArgs *nea, BOOL (^interceptEvent)(NSEvent *e)) if (!isRunning()) return 0; - e = [realNSApp() nextEventMatchingMask:nea->mask + e = [uiprivNSApp() nextEventMatchingMask:nea->mask untilDate:nea->duration inMode:nea->mode dequeue:nea->dequeue]; @@ -216,13 +216,13 @@ int mainStep(struct nextEventArgs *nea, BOOL (^interceptEvent)(NSEvent *e)) type = [e type]; if (!interceptEvent(e)) - [realNSApp() sendEvent:e]; - [realNSApp() updateWindows]; + [uiprivNSApp() sendEvent:e]; + [uiprivNSApp() updateWindows]; // GNUstep does this // it also updates the Services menu but there doesn't seem to be a public API for that so if (type != NSPeriodic && type != NSMouseMoved) - [[realNSApp() mainMenu] update]; + [[uiprivNSApp() mainMenu] update]; return 1; } @@ -231,7 +231,7 @@ int mainStep(struct nextEventArgs *nea, BOOL (^interceptEvent)(NSEvent *e)) void uiQuit(void) { canQuit = YES; - [realNSApp() terminate:realNSApp()]; + [uiprivNSApp() terminate:uiprivNSApp()]; } // thanks to mikeash in irc.freenode.net/#macdev for suggesting the use of Grand Central Dispatch for this diff --git a/darwin/menu.m b/darwin/menu.m index 5b83e3b1..41d322d9 100644 --- a/darwin/menu.m +++ b/darwin/menu.m @@ -66,7 +66,7 @@ static void mapItemReleaser(void *key, void *value) if (item->type == typeCheckbox) uiMenuItemSetChecked(item, !uiMenuItemChecked(item)); // use the key window as the source of the menu event; it's the active window - (*(item->onClicked))(item, windowFromNSWindow([realNSApp() keyWindow]), item->onClickedData); + (*(item->onClicked))(item, windowFromNSWindow([uiprivNSApp() keyWindow]), item->onClickedData); } - (IBAction)onQuitClicked:(id)sender @@ -154,7 +154,7 @@ static void mapItemReleaser(void *key, void *value) item = [[[NSMenuItem alloc] initWithTitle:@"Services" action:NULL keyEquivalent:@""] autorelease]; servicesMenu = [[[NSMenu alloc] initWithTitle:@"Services"] autorelease]; [item setSubmenu:servicesMenu]; - [realNSApp() setServicesMenu:servicesMenu]; + [uiprivNSApp() setServicesMenu:servicesMenu]; [appMenu addItem:item]; [appMenu addItem:[NSMenuItem separatorItem]]; @@ -246,13 +246,13 @@ static uiMenuItem *newItem(uiMenu *m, int type, const char *name) item->type = type; switch (item->type) { case typeQuit: - item->item = [appDelegate().menuManager.quitItem retain]; + item->item = [uiprivAppDelegate().menuManager.quitItem retain]; break; case typePreferences: - item->item = [appDelegate().menuManager.preferencesItem retain]; + item->item = [uiprivAppDelegate().menuManager.preferencesItem retain]; break; case typeAbout: - item->item = [appDelegate().menuManager.aboutItem retain]; + item->item = [uiprivAppDelegate().menuManager.aboutItem retain]; break; case typeSeparator: item->item = [[NSMenuItem separatorItem] retain]; @@ -260,12 +260,12 @@ static uiMenuItem *newItem(uiMenu *m, int type, const char *name) break; default: item->item = [[NSMenuItem alloc] initWithTitle:uiprivToNSString(name) action:@selector(onClicked:) keyEquivalent:@""]; - [item->item setTarget:appDelegate().menuManager]; + [item->item setTarget:uiprivAppDelegate().menuManager]; [m->menu addItem:item->item]; break; } - [appDelegate().menuManager register:item->item to:item]; + [uiprivAppDelegate().menuManager register:item->item to:item]; item->onClicked = defaultOnClicked; [m->items addObject:[NSValue valueWithPointer:item]]; @@ -329,7 +329,7 @@ uiMenu *uiNewMenu(const char *name) m->items = [NSMutableArray new]; - [[realNSApp() mainMenu] addItem:m->item]; + [[uiprivNSApp() mainMenu] addItem:m->item]; [menus addObject:[NSValue valueWithPointer:m]]; diff --git a/darwin/stddialogs.m b/darwin/stddialogs.m index be7e2dd6..814456ab 100644 --- a/darwin/stddialogs.m +++ b/darwin/stddialogs.m @@ -24,9 +24,9 @@ static char *runSavePanel(NSWindow *parent, NSSavePanel *s) char *filename; [s beginSheetModalForWindow:parent completionHandler:^(NSInteger result) { - [realNSApp() stopModalWithCode:result]; + [uiprivNSApp() stopModalWithCode:result]; }]; - if ([realNSApp() runModalForWindow:s] != NSFileHandlingPanelOKButton) + if ([uiprivNSApp() runModalForWindow:s] != NSFileHandlingPanelOKButton) return NULL; filename = uiDarwinNSStringToText([[s URL] path]); return filename; @@ -84,12 +84,12 @@ char *uiSaveFile(uiWindow *parent) modalDelegate:self didEndSelector:@selector(panelEnded:result:data:) contextInfo:NULL]; - return [realNSApp() runModalForWindow:[self->panel window]]; + return [uiprivNSApp() runModalForWindow:[self->panel window]]; } - (void)panelEnded:(NSAlert *)panel result:(NSInteger)result data:(void *)data { - [realNSApp() stopModalWithCode:result]; + [uiprivNSApp() stopModalWithCode:result]; } @end diff --git a/darwin/uipriv_darwin.h b/darwin/uipriv_darwin.h index a507259f..b2032deb 100644 --- a/darwin/uipriv_darwin.h +++ b/darwin/uipriv_darwin.h @@ -49,4 +49,23 @@ extern void uiprivMapReset(uiprivMap *m); extern void uiprivFinalizeMenus(void); extern void uiprivUninitMenus(void); +// main.m +@interface uiprivApplicationClass : NSApplication +@end +// this is needed because NSApp is of type id, confusing clang +#define uiprivNSApp() ((uiprivApplicationClass *) NSApp) +@interface uiprivAppDelegate : NSObject +@property (strong) uiprivMenuManager *menuManager; +@end +#define uiprivAppDelegate() ((uiprivAppDelegate *) [uiprivNSApp() delegate]) +typedef struct uiprivNextEventArgs uiprivNextEventArgs; +struct uiprivNextEventArgs { + NSEventMask mask; + NSDate *duration; + // LONGTERM no NSRunLoopMode? + NSString *mode; + BOOL dequeue; +}; +extern int uiprivMainStep(uiprivNextEventArgs *nea, BOOL (^interceptEvent)(NSEvent *)); + #import "OLD_uipriv_darwin.h" diff --git a/darwin/winmoveresize.m b/darwin/winmoveresize.m index d43f3209..44d19a2c 100644 --- a/darwin/winmoveresize.m +++ b/darwin/winmoveresize.m @@ -46,7 +46,7 @@ void onMoveDrag(struct onMoveDragParams *p, NSEvent *e) void doManualMove(NSWindow *w, NSEvent *initialEvent) { __block struct onMoveDragParams mdp; - struct nextEventArgs nea; + uiprivNextEventArgs nea; BOOL (^handleEvent)(NSEvent *e); __block BOOL done; @@ -72,7 +72,7 @@ void doManualMove(NSWindow *w, NSEvent *initialEvent) return YES; // do not send }; done = NO; - while (mainStep(&nea, handleEvent)) + while (uiprivMainStep(&nea, handleEvent)) if (done) break; } @@ -223,7 +223,7 @@ static void onResizeDrag(struct onResizeDragParams *p, NSEvent *e) void doManualResize(NSWindow *w, NSEvent *initialEvent, uiWindowResizeEdge edge) { __block struct onResizeDragParams rdp; - struct nextEventArgs nea; + uiprivNextEventArgs nea; BOOL (^handleEvent)(NSEvent *e); __block BOOL done; @@ -247,7 +247,7 @@ void doManualResize(NSWindow *w, NSEvent *initialEvent, uiWindowResizeEdge edge) return YES; // do not send }; done = NO; - while (mainStep(&nea, handleEvent)) + while (uiprivMainStep(&nea, handleEvent)) if (done) break; }