diff --git a/include/Mw/LowLevel/Cocoa.h b/include/Mw/LowLevel/Cocoa.h index 445af0e5..5543d7e2 100644 --- a/include/Mw/LowLevel/Cocoa.h +++ b/include/Mw/LowLevel/Cocoa.h @@ -156,7 +156,6 @@ - (NSView *)getView; - (MilskoCocoaWindow *)getWindow; - (MilskoFakePointer *)getHandle; -+ (void)eventCanceller:(MilskoCocoa *)this; @end #define OBJC(x) x diff --git a/src/backend/cocoa.m b/src/backend/cocoa.m index eeae8567..fdf12c38 100644 --- a/src/backend/cocoa.m +++ b/src/backend/cocoa.m @@ -142,9 +142,9 @@ static NSPoint pointFlip(NSPoint point) { [c->application setActivationPolicy:0 /* NSApplicationActivationPolicyRegular */]; } - [c->window makeKeyAndOrderFront:nil]; [c->application activateIgnoringOtherApps:true]; [c->window makeFirstResponder:c->view]; + [c->window makeKeyAndOrderFront:nil]; } [c->application setDelegate:[[MilskoCocoaApplicationDelegate alloc] initWithAppl:c->application]]; @@ -172,13 +172,6 @@ static NSPoint pointFlip(NSPoint point) { return c; } -+ (void)eventCanceller:(MilskoCocoa *)this { - this->lastEvent = [this->application currentEvent]; - [this eventProcess:this->lastEvent]; - - [[NSApplication sharedApplication] stop:nil]; -} - - (void)polygonWithPoints:(MwPoint *)points points_count:(int)points_count color:(MwLLColor)color { @@ -276,29 +269,42 @@ static NSPoint pointFlip(NSPoint point) { [self forceRender]; }; - (int)pending { - /* - ok so this is a crime against god but I did in fact try the better method - of using nextEventMatchingMask and then pumping events manually. However - this gives me something that only kind of works, with strange behavior such - as the window never becoming the main window (have to make it key in order - for the menu to show up) occuring. Hours of research and digging led me down - a rabbit hole that, on all sides, pointed to "just use [NSApplication run]". - So we just to do that; of course, this is a blocking function, so we - register this function that instantly cancels it and pumps whatever event - MacOS has in store for us. We do this on loop and somehow the resulting CPU - usage is managable. + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MwBool isPending = MwFALSE; + if (_forceRender) { + _forceRender = MwFALSE; + [pool release]; + return 1; + } + self->lastEvent = [self->window nextEventMatchingMask:NSAnyEventMask + untilDate:[NSDate distantPast] + inMode:NSDefaultRunLoopMode + dequeue:YES]; - If some Apple developer with 20 years of experience in Objective C is here: - Pls god send PR if you know how to properly do this. -*/ - [MilskoCocoa performSelectorOnMainThread:@selector(eventCanceller:) - withObject:self - waitUntilDone:NO]; - [self->application run]; - return 1; + isPending = self->lastEvent != NULL; + [pool release]; + return isPending; }; - (void)getNextEvent { + [self eventProcess:self->lastEvent]; + while (true) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSEvent *ev = [self->window nextEventMatchingMask:NSAnyEventMask + untilDate:[NSDate distantPast] + inMode:NSDefaultRunLoopMode + dequeue:YES]; + if (!ev) { + [pool release]; + break; + } + /* run through the switch case on ev.type, before calling sendEvent on any + * events we handle */ + [self eventProcess:ev]; + [pool release]; + [self->application updateWindows]; + } + [self sendClipboardEvent]; if (self->pointerLocked && [self->window isMainWindow]) {