Compare commits

..

2 commits

Author SHA1 Message Date
8f379e9751 add comment clarifying pending
All checks were successful
pyrite-dev/milsko/pipeline/head This commit looks good
2026-03-10 15:46:46 -07:00
9f1b455341 mac: new event pumping architecture that sucks and i hate it but apple is happy with it so we're happy with it 2026-03-10 15:33:20 -07:00
2 changed files with 29 additions and 34 deletions

View file

@ -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

View file

@ -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]) {