Compare commits
No commits in common. "8f379e97513a4416541960c95c6d97f34bc58ca5" and "a0e2ec7f57491aa7cc978ac7296f6c320168d450" have entirely different histories.
8f379e9751
...
a0e2ec7f57
2 changed files with 34 additions and 29 deletions
|
|
@ -156,7 +156,6 @@
|
|||
- (NSView *)getView;
|
||||
- (MilskoCocoaWindow *)getWindow;
|
||||
- (MilskoFakePointer *)getHandle;
|
||||
+ (void)eventCanceller:(MilskoCocoa *)this;
|
||||
|
||||
@end
|
||||
#define OBJC(x) x
|
||||
|
|
|
|||
|
|
@ -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]) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue