Browse Source

Merge branch 'master' into fixes/filter-snap-dir-linux

Jumar Macato 6 years ago
parent
commit
769a27ecb1

+ 16 - 8
native/Avalonia.Native/src/OSX/gl.mm

@@ -1,6 +1,7 @@
 #include "common.h"
 #include <OpenGL/gl.h>
 #include <dlfcn.h>
+#include "window.h"
 
 template <typename T, size_t N> char (&ArrayCounter(T (&a)[N]))[N];
 #define ARRAY_COUNT(a) (sizeof(ArrayCounter(a)))
@@ -181,12 +182,12 @@ extern IAvnGlFeature* GetGlFeature()
 
 class AvnGlRenderingSession : public ComSingleObject<IAvnGlSurfaceRenderingSession, &IID_IAvnGlSurfaceRenderingSession>
 {
-    NSView* _view;
-    NSWindow* _window;
+    AvnView* _view;
+    AvnWindow* _window;
     NSOpenGLContext* _context;
 public:
     FORWARD_IUNKNOWN()
-    AvnGlRenderingSession(NSWindow*window, NSView* view, NSOpenGLContext* context)
+    AvnGlRenderingSession(AvnWindow*window, AvnView* view, NSOpenGLContext* context)
     {
         _context = context;
         _window = window;
@@ -195,14 +196,12 @@ public:
     
     virtual HRESULT GetPixelSize(AvnPixelSize* ret)  override
     {
-        auto fsize = [_view convertSizeToBacking: [_view frame].size];
-        ret->Width = (int)fsize.width;
-        ret->Height = (int)fsize.height;
+        *ret = [_view getPixelSize];
         return S_OK;
     }
     virtual HRESULT GetScaling(double* ret)  override
     {
-        *ret = [_window backingScaleFactor];
+        *ret = [_window getScaling];
         return S_OK;
     }
     
@@ -234,8 +233,17 @@ public:
         auto f = GetFeature();
         if(f == NULL)
             return E_FAIL;
-        if(![_view lockFocusIfCanDraw])
+        
+        @try
+        {
+            if(![_view lockFocusIfCanDraw])
+                return E_ABORT;
+        }
+        @catch(NSException* exception)
+        {
             return E_ABORT;
+        }
+        
         
         auto gl = _context;
         CGLLockContext([_context CGLContextObj]);

+ 2 - 0
native/Avalonia.Native/src/OSX/window.h

@@ -12,6 +12,7 @@ class WindowBaseImpl;
 -(AvnPoint) translateLocalPoint:(AvnPoint)pt;
 -(void) setSwRenderedFrame: (AvnFramebuffer* _Nonnull) fb dispose: (IUnknown* _Nonnull) dispose;
 -(void) onClosed;
+-(AvnPixelSize) getPixelSize;
 @end
 
 @interface AvnWindow : NSWindow <NSWindowDelegate>
@@ -22,6 +23,7 @@ class WindowBaseImpl;
 -(void) restoreParentWindow;
 -(bool) shouldTryToHandleEvents;
 -(void) applyMenu:(NSMenu *)menu;
+-(double) getScaling;
 @end
 
 struct INSWindowHolder

+ 65 - 24
native/Avalonia.Native/src/OSX/window.mm

@@ -195,7 +195,11 @@ public:
     {
         @autoreleasepool
         {
-            [Window close];
+            if (Window != nullptr)
+            {
+                [Window close];
+            }
+            
             return S_OK;
         }
     }
@@ -291,7 +295,14 @@ public:
     {
         @autoreleasepool
         {
-            return [View lockFocusIfCanDraw] == YES;
+            @try
+            {
+                return [View lockFocusIfCanDraw] == YES;
+            }
+            @catch (NSException*)
+            {
+                return NO;
+            }
         }
     }
     
@@ -719,15 +730,33 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
     bool _isLeftPressed, _isMiddlePressed, _isRightPressed, _isXButton1Pressed, _isXButton2Pressed, _isMouseOver;
     NSEvent* _lastMouseDownEvent;
     bool _lastKeyHandled;
+    AvnPixelSize _lastPixelSize;
 }
 
-- (void)dealloc
+- (void)onClosed
 {
+    @synchronized (self)
+    {
+        _parent = nullptr;
+    }
 }
 
-- (void)onClosed
+- (BOOL)lockFocusIfCanDraw
+{
+    @synchronized (self)
+    {
+        if(_parent == nullptr)
+        {
+            return NO;
+        }
+    }
+    
+    return [super lockFocusIfCanDraw];
+}
+
+-(AvnPixelSize) getPixelSize
 {
-    _parent = NULL;
+    return _lastPixelSize;
 }
 
 - (NSEvent*) lastMouseDownEvent
@@ -742,6 +771,8 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
     [self setWantsLayer:YES];
     _parent = parent;
     _area = nullptr;
+    _lastPixelSize.Height = 100;
+    _lastPixelSize.Width = 100;
     return self;
 }
 
@@ -783,6 +814,10 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
     [self addTrackingArea:_area];
     
     _parent->UpdateCursor();
+    
+    auto fsize = [self convertSizeToBacking: [self frame].size];
+    _lastPixelSize.Width = (int)fsize.width;
+    _lastPixelSize.Height = (int)fsize.height;
 
     _parent->BaseEvents->Resized(AvnSize{newSize.width, newSize.height});
 }
@@ -812,7 +847,13 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
 
 - (void)drawRect:(NSRect)dirtyRect
 {
+    if (_parent == nullptr)
+    {
+        return;
+    }
+        
     _parent->BaseEvents->RunRenderPriorityJobs();
+    
     @synchronized (self) {
         if(_swRenderedFrame != NULL)
         {
@@ -879,7 +920,12 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
 
 - (void) viewDidChangeBackingProperties
 {
+    auto fsize = [self convertSizeToBacking: [self frame].size];
+    _lastPixelSize.Width = (int)fsize.width;
+    _lastPixelSize.Height = (int)fsize.height;
+    
     _parent->BaseEvents->ScalingChanged([_parent->Window backingScaleFactor]);
+    
     [super viewDidChangeBackingProperties];
 }
 
@@ -1161,6 +1207,12 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
     bool _closed;
     NSMenu* _menu;
     bool _isAppMenuApplied;
+    double _lastScaling;
+}
+
+-(double) getScaling
+{
+    return _lastScaling;
 }
 
 +(void)closeAll
@@ -1174,10 +1226,6 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
     }
 }
 
-- (void)dealloc
-{
-}
-
 - (void)pollModalSession:(nonnull NSModalSession)session
 {
     auto response = [NSApp runModalSession:session];
@@ -1232,6 +1280,9 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
     [self setReleasedWhenClosed:false];
     _parent = parent;
     [self setDelegate:self];
+    _closed = false;
+    
+    _lastScaling = [self backingScaleFactor];
     return self;
 }
 
@@ -1247,6 +1298,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
     return true;
 }
 
+- (void)windowDidChangeBackingProperties:(NSNotification *)notification
+{
+    _lastScaling = [self backingScaleFactor];
+}
+
 - (void)windowWillClose:(NSNotification *)notification
 {
     _closed = true;
@@ -1257,9 +1313,6 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
         [self restoreParentWindow];
         parent->BaseEvents->Closed();
         [parent->View onClosed];
-        dispatch_async(dispatch_get_main_queue(), ^{
-            [self setContentView: nil];
-        });
     }
 }
 
@@ -1406,18 +1459,6 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
     _parent->GetPosition(&position);
     _parent->BaseEvents->PositionChanged(position);
 }
-
-// TODO this breaks resizing.
-/*- (void)windowDidResize:(NSNotification *)notification
-{
-    
-    auto parent = dynamic_cast<IWindowStateChanged*>(_parent.operator->());
-    
-    if(parent != nullptr)
-    {
-        parent->WindowStateChanged();
-    }
-}*/
 @end
 
 class PopupImpl : public virtual WindowBaseImpl, public IAvnPopup