Browse Source

Ensure virtual destructor chain

pull/1977/head
Nikita Tsukanov 8 years ago
parent
commit
8ac77adb76
  1. 4
      src/Avalonia.Native.OSX/window.h
  2. 12
      src/Avalonia.Native.OSX/window.mm
  3. 12
      src/headers/comimpl.h

4
src/Avalonia.Native.OSX/window.h

@ -3,7 +3,7 @@
#ifndef window_h #ifndef window_h
#define window_h #define window_h
#import "ArcTraceWindow.h"
class WindowBaseImpl; class WindowBaseImpl;
@interface AvnView : NSView<NSTextInputClient> @interface AvnView : NSView<NSTextInputClient>
@ -13,7 +13,7 @@ class WindowBaseImpl;
-(void) setSwRenderedFrame: (AvnFramebuffer* _Nonnull) fb dispose: (IUnknown* _Nonnull) dispose; -(void) setSwRenderedFrame: (AvnFramebuffer* _Nonnull) fb dispose: (IUnknown* _Nonnull) dispose;
@end @end
@interface AvnWindow : NSWindow <NSWindowDelegate> @interface AvnWindow : ArcTraceWindow <NSWindowDelegate>
-(AvnWindow* _Nonnull) initWithParent: (WindowBaseImpl* _Nonnull) parent; -(AvnWindow* _Nonnull) initWithParent: (WindowBaseImpl* _Nonnull) parent;
-(void) setCanBecomeKeyAndMain; -(void) setCanBecomeKeyAndMain;
-(void) pollModalSession: (NSModalSession _Nonnull) session; -(void) pollModalSession: (NSModalSession _Nonnull) session;

12
src/Avalonia.Native.OSX/window.mm

@ -13,6 +13,7 @@ private:
public: public:
FORWARD_IUNKNOWN() FORWARD_IUNKNOWN()
virtual ~WindowBaseImpl(){}
AvnView* View; AvnView* View;
AvnWindow* Window; AvnWindow* Window;
ComPtr<IAvnWindowBaseEvents> BaseEvents; ComPtr<IAvnWindowBaseEvents> BaseEvents;
@ -23,6 +24,7 @@ public:
{ {
BaseEvents = events; BaseEvents = events;
View = [[AvnView alloc] initWithParent:this]; View = [[AvnView alloc] initWithParent:this];
Window = [[AvnWindow alloc] initWithParent:this]; Window = [[AvnWindow alloc] initWithParent:this];
lastPositionSet.X = 100; lastPositionSet.X = 100;
@ -343,14 +345,13 @@ private:
CGRect _lastUndecoratedFrame; CGRect _lastUndecoratedFrame;
AvnWindowState _lastWindowState; AvnWindowState _lastWindowState;
FORWARD_IUNKNOWN()
BEGIN_INTERFACE_MAP() BEGIN_INTERFACE_MAP()
INHERIT_INTERFACE_MAP(WindowBaseImpl) INHERIT_INTERFACE_MAP(WindowBaseImpl)
INTERFACE_MAP_ENTRY(IAvnWindow, IID_IAvnWindow) INTERFACE_MAP_ENTRY(IAvnWindow, IID_IAvnWindow)
END_INTERFACE_MAP() END_INTERFACE_MAP()
virtual ~WindowImpl(){
virtual uint Release() NSLog(@"~WindowImpl");
{
return ComObject::Release();
} }
ComPtr<IAvnWindowEvents> WindowEvents; ComPtr<IAvnWindowEvents> WindowEvents;
@ -1017,7 +1018,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
- (BOOL)windowShouldClose:(NSWindow *)sender - (BOOL)windowShouldClose:(NSWindow *)sender
{ {
auto window = dynamic_cast<WindowImpl*>(_parent.operator->()); auto window = dynamic_cast<WindowImpl*>(_parent.getRaw());
if(window != nullptr) if(window != nullptr)
{ {
@ -1087,6 +1088,7 @@ private:
INHERIT_INTERFACE_MAP(WindowBaseImpl) INHERIT_INTERFACE_MAP(WindowBaseImpl)
INTERFACE_MAP_ENTRY(IAvnPopup, IID_IAvnPopup) INTERFACE_MAP_ENTRY(IAvnPopup, IID_IAvnPopup)
END_INTERFACE_MAP() END_INTERFACE_MAP()
virtual ~PopupImpl(){}
ComPtr<IAvnWindowEvents> WindowEvents; ComPtr<IAvnWindowEvents> WindowEvents;
PopupImpl(IAvnWindowEvents* events) : WindowBaseImpl(events) PopupImpl(IAvnWindowEvents* events) : WindowBaseImpl(events)
{ {

12
src/headers/comimpl.h

@ -90,6 +90,7 @@ public:
{ {
return E_NOINTERFACE; return E_NOINTERFACE;
}; };
virtual ~ComUnknownObject(){}
}; };
template<class TInterface, GUID const* TIID> class ComSingleObject : public ComObject, public virtual TInterface template<class TInterface, GUID const* TIID> class ComSingleObject : public ComObject, public virtual TInterface
@ -97,6 +98,9 @@ template<class TInterface, GUID const* TIID> class ComSingleObject : public ComO
BEGIN_INTERFACE_MAP() BEGIN_INTERFACE_MAP()
INTERFACE_MAP_ENTRY(TInterface, *TIID) INTERFACE_MAP_ENTRY(TInterface, *TIID)
END_INTERFACE_MAP() END_INTERFACE_MAP()
public:
virtual ~ComSingleObject(){}
}; };
template<class TInterface> template<class TInterface>
@ -151,8 +155,12 @@ public:
_obj = 0; _obj = 0;
} }
} }
public: TInterface* getRaw()
{
return _obj;
}
operator TInterface*() const operator TInterface*() const
{ {
return _obj; return _obj;

Loading…
Cancel
Save