Compare commits
2 commits
a0e2ec7f57
...
8f379e9751
| Author | SHA1 | Date | |
|---|---|---|---|
| 8f379e9751 | |||
| 9f1b455341 |
2 changed files with 29 additions and 34 deletions
|
|
@ -156,6 +156,7 @@
|
||||||
- (NSView *)getView;
|
- (NSView *)getView;
|
||||||
- (MilskoCocoaWindow *)getWindow;
|
- (MilskoCocoaWindow *)getWindow;
|
||||||
- (MilskoFakePointer *)getHandle;
|
- (MilskoFakePointer *)getHandle;
|
||||||
|
+ (void)eventCanceller:(MilskoCocoa *)this;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
#define OBJC(x) x
|
#define OBJC(x) x
|
||||||
|
|
|
||||||
|
|
@ -142,9 +142,9 @@ static NSPoint pointFlip(NSPoint point) {
|
||||||
[c->application
|
[c->application
|
||||||
setActivationPolicy:0 /* NSApplicationActivationPolicyRegular */];
|
setActivationPolicy:0 /* NSApplicationActivationPolicyRegular */];
|
||||||
}
|
}
|
||||||
|
[c->window makeKeyAndOrderFront:nil];
|
||||||
[c->application activateIgnoringOtherApps:true];
|
[c->application activateIgnoringOtherApps:true];
|
||||||
[c->window makeFirstResponder:c->view];
|
[c->window makeFirstResponder:c->view];
|
||||||
[c->window makeKeyAndOrderFront:nil];
|
|
||||||
}
|
}
|
||||||
[c->application setDelegate:[[MilskoCocoaApplicationDelegate alloc]
|
[c->application setDelegate:[[MilskoCocoaApplicationDelegate alloc]
|
||||||
initWithAppl:c->application]];
|
initWithAppl:c->application]];
|
||||||
|
|
@ -172,6 +172,13 @@ static NSPoint pointFlip(NSPoint point) {
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
+ (void)eventCanceller:(MilskoCocoa *)this {
|
||||||
|
this->lastEvent = [this->application currentEvent];
|
||||||
|
[this eventProcess:this->lastEvent];
|
||||||
|
|
||||||
|
[[NSApplication sharedApplication] stop:nil];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)polygonWithPoints:(MwPoint *)points
|
- (void)polygonWithPoints:(MwPoint *)points
|
||||||
points_count:(int)points_count
|
points_count:(int)points_count
|
||||||
color:(MwLLColor)color {
|
color:(MwLLColor)color {
|
||||||
|
|
@ -269,42 +276,29 @@ static NSPoint pointFlip(NSPoint point) {
|
||||||
[self forceRender];
|
[self forceRender];
|
||||||
};
|
};
|
||||||
- (int)pending {
|
- (int)pending {
|
||||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
/*
|
||||||
MwBool isPending = MwFALSE;
|
ok so this is a crime against god but I did in fact try the better method
|
||||||
if (_forceRender) {
|
of using nextEventMatchingMask and then pumping events manually. However
|
||||||
_forceRender = MwFALSE;
|
this gives me something that only kind of works, with strange behavior such
|
||||||
[pool release];
|
as the window never becoming the main window (have to make it key in order
|
||||||
return 1;
|
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]".
|
||||||
self->lastEvent = [self->window nextEventMatchingMask:NSAnyEventMask
|
So we just to do that; of course, this is a blocking function, so we
|
||||||
untilDate:[NSDate distantPast]
|
register this function that instantly cancels it and pumps whatever event
|
||||||
inMode:NSDefaultRunLoopMode
|
MacOS has in store for us. We do this on loop and somehow the resulting CPU
|
||||||
dequeue:YES];
|
usage is managable.
|
||||||
|
|
||||||
isPending = self->lastEvent != NULL;
|
If some Apple developer with 20 years of experience in Objective C is here:
|
||||||
[pool release];
|
Pls god send PR if you know how to properly do this.
|
||||||
return isPending;
|
*/
|
||||||
|
[MilskoCocoa performSelectorOnMainThread:@selector(eventCanceller:)
|
||||||
|
withObject:self
|
||||||
|
waitUntilDone:NO];
|
||||||
|
[self->application run];
|
||||||
|
return 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
- (void)getNextEvent {
|
- (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];
|
[self sendClipboardEvent];
|
||||||
|
|
||||||
if (self->pointerLocked && [self->window isMainWindow]) {
|
if (self->pointerLocked && [self->window isMainWindow]) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue