Browse Source

Use [NSApp run] instead of a custom run loop

pull/2929/head
Nikita Tsukanov 7 years ago
parent
commit
8cb5eedcda
  1. 2
      native/Avalonia.Native/inc/avalonia-native.h
  2. 24
      native/Avalonia.Native/src/OSX/app.mm
  3. 2
      native/Avalonia.Native/src/OSX/common.h
  4. 3
      native/Avalonia.Native/src/OSX/main.mm
  5. 59
      native/Avalonia.Native/src/OSX/platformthreading.mm

2
native/Avalonia.Native/inc/avalonia-native.h

@ -280,7 +280,7 @@ AVNCOM(IAvnPlatformThreadingInterface, 0b) : IUnknown
virtual bool GetCurrentThreadIsLoopThread() = 0; virtual bool GetCurrentThreadIsLoopThread() = 0;
virtual void SetSignaledCallback(IAvnSignaledCallback* cb) = 0; virtual void SetSignaledCallback(IAvnSignaledCallback* cb) = 0;
virtual IAvnLoopCancellation* CreateLoopCancellation() = 0; virtual IAvnLoopCancellation* CreateLoopCancellation() = 0;
virtual void RunLoop(IAvnLoopCancellation* cancel) = 0; virtual HRESULT RunLoop(IAvnLoopCancellation* cancel) = 0;
// Can't pass int* to sharpgentools for some reason // Can't pass int* to sharpgentools for some reason
virtual void Signal(int priority) = 0; virtual void Signal(int priority) = 0;
virtual IUnknown* StartTimer(int priority, int ms, IAvnActionCallback* callback) = 0; virtual IUnknown* StartTimer(int priority, int ms, IAvnActionCallback* callback) = 0;

24
native/Avalonia.Native/src/OSX/app.mm

@ -0,0 +1,24 @@
#include "common.h"
@interface AvnAppDelegate : NSObject<NSApplicationDelegate>
@end
@implementation AvnAppDelegate
- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
}
- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
[NSApp activateIgnoringOtherApps:true];
}
@end
extern void InitializeAvnApp()
{
NSApplication* app = [NSApplication sharedApplication];
id delegate = [AvnAppDelegate new];
[app setDelegate:delegate];
}

2
native/Avalonia.Native/src/OSX/common.h

@ -19,7 +19,7 @@ extern IAvnClipboard* CreateClipboard();
extern IAvnCursorFactory* CreateCursorFactory(); extern IAvnCursorFactory* CreateCursorFactory();
extern IAvnGlFeature* GetGlFeature(); extern IAvnGlFeature* GetGlFeature();
extern IAvnGlSurfaceRenderTarget* CreateGlRenderTarget(NSWindow* window, NSView* view); extern IAvnGlSurfaceRenderTarget* CreateGlRenderTarget(NSWindow* window, NSView* view);
extern void InitializeAvnApp();
extern NSPoint ToNSPoint (AvnPoint p); extern NSPoint ToNSPoint (AvnPoint p);
extern AvnPoint ToAvnPoint (NSPoint p); extern AvnPoint ToAvnPoint (NSPoint p);
extern AvnPoint ConvertPointY (AvnPoint p); extern AvnPoint ConvertPointY (AvnPoint p);

3
native/Avalonia.Native/src/OSX/main.mm

@ -64,8 +64,9 @@ public:
{ {
@autoreleasepool{ @autoreleasepool{
[[ThreadingInitializer new] do]; [[ThreadingInitializer new] do];
return S_OK;
} }
InitializeAvnApp();
return S_OK;
}; };
virtual IAvnMacOptions* GetMacOptions() override virtual IAvnMacOptions* GetMacOptions() override

59
native/Avalonia.Native/src/OSX/platformthreading.mm

@ -57,16 +57,36 @@ class PlatformThreadingInterface : public ComSingleObject<IAvnPlatformThreadingI
{ {
private: private:
Signaler* _signaler; Signaler* _signaler;
bool _wasRunningAtLeastOnce = false;
class LoopCancellation : public ComSingleObject<IAvnLoopCancellation, &IID_IAvnLoopCancellation> class LoopCancellation : public ComSingleObject<IAvnLoopCancellation, &IID_IAvnLoopCancellation>
{ {
public: public:
FORWARD_IUNKNOWN() FORWARD_IUNKNOWN()
bool Cancelled = 0; bool Running = false;
virtual void Cancel() override bool Cancelled = false;
virtual void Cancel()
{ {
Cancelled = 1; Cancelled = true;
if(Running)
{
Running = false;
dispatch_async(dispatch_get_main_queue(), ^{
[[NSApplication sharedApplication] stop:nil];
NSEvent* event = [NSEvent otherEventWithType:NSEventTypeApplicationDefined
location:NSMakePoint(0, 0)
modifierFlags:0
timestamp:0
windowNumber:0
context:nil
subtype:0
data1:0
data2:0];
[NSApp postEvent:event atStart:YES];
});
}
} }
}; };
public: public:
@ -99,30 +119,17 @@ public:
return new LoopCancellation(); return new LoopCancellation();
} }
virtual void RunLoop(IAvnLoopCancellation* cancel) override virtual HRESULT RunLoop(IAvnLoopCancellation* cancel) override
{ {
@autoreleasepool { auto can = dynamic_cast<LoopCancellation*>(cancel);
auto can = dynamic_cast<LoopCancellation*>(cancel); if(can->Cancelled)
[[NSApplication sharedApplication] activateIgnoringOtherApps:true]; return S_OK;
while(true) if(_wasRunningAtLeastOnce)
{ return E_FAIL;
@autoreleasepool can->Running = true;
{ _wasRunningAtLeastOnce = true;
if(can != NULL && can->Cancelled) [NSApp run];
return; return S_OK;
NSEvent* ev = [[NSApplication sharedApplication]
nextEventMatchingMask:NSEventMaskAny
untilDate: [NSDate dateWithTimeIntervalSinceNow:1]
inMode:NSDefaultRunLoopMode
dequeue:true];
if(can != NULL && can->Cancelled)
return;
if(ev != NULL)
[[NSApplication sharedApplication] sendEvent:ev];
}
}
NSDebugLog(@"RunLoop exited");
}
} }
virtual void Signal(int priority) override virtual void Signal(int priority) override

Loading…
Cancel
Save