Browse Source

Fixed vtable layout

pull/1977/head
Nikita Tsukanov 7 years ago
parent
commit
280cce125d
  1. 1
      src/Avalonia.Native.OSX/Screens.mm
  2. 2
      src/Avalonia.Native.OSX/SystemDialogs.mm
  3. 1
      src/Avalonia.Native.OSX/clipboard.mm
  4. 1
      src/Avalonia.Native.OSX/cursor.h
  5. 1
      src/Avalonia.Native.OSX/cursor.mm
  6. 2
      src/Avalonia.Native.OSX/main.mm
  7. 2
      src/Avalonia.Native.OSX/platformthreading.mm
  8. 27
      src/Avalonia.Native.OSX/window.mm
  9. 22
      src/headers/avalonia-native.h
  10. 17
      src/headers/com.h

1
src/Avalonia.Native.OSX/Screens.mm

@ -6,6 +6,7 @@
class Screens : public ComSingleObject<IAvnScreens, &IID_IAvnScreens>
{
public:
FORWARD_IUNKNOWN()
virtual HRESULT GetScreenCount (int* ret)
{
@autoreleasepool

2
src/Avalonia.Native.OSX/SystemDialogs.mm

@ -6,6 +6,8 @@
class SystemDialogs : public ComSingleObject<IAvnSystemDialogs, &IID_IAvnSystemDialogs>
{
public:
FORWARD_IUNKNOWN()
virtual void SelectFolderDialog (IAvnWindow* parentWindowHandle,
IAvnSystemDialogEvents* events,
const char* title,

1
src/Avalonia.Native.OSX/clipboard.mm

@ -6,6 +6,7 @@
class Clipboard : public ComSingleObject<IAvnClipboard, &IID_IAvnClipboard>
{
public:
FORWARD_IUNKNOWN()
virtual HRESULT GetText (void** retOut)
{
@autoreleasepool

1
src/Avalonia.Native.OSX/cursor.h

@ -13,6 +13,7 @@ private:
NSCursor * _native;
public:
FORWARD_IUNKNOWN()
Cursor(NSCursor * cursor)
{
_native = cursor;

1
src/Avalonia.Native.OSX/cursor.mm

@ -50,6 +50,7 @@ class CursorFactory : public ComSingleObject<IAvnCursorFactory, &IID_IAvnCursorF
};
public:
FORWARD_IUNKNOWN()
virtual HRESULT GetCursor (AvnStandardCursorType cursorType, IAvnCursor** retOut)
{
*retOut = s_cursorMap[cursorType];

2
src/Avalonia.Native.OSX/main.mm

@ -15,6 +15,7 @@ static void SetActivationPolicy()
class MacOptions : public ComSingleObject<IAvnMacOptions, &IID_IAvnMacOptions>
{
public:
FORWARD_IUNKNOWN()
virtual HRESULT SetShowInDock(int show)
{
ShowInDock = show;
@ -62,6 +63,7 @@ class AvaloniaNative : public ComSingleObject<IAvaloniaNativeFactory, &IID_IAval
{
public:
FORWARD_IUNKNOWN()
virtual HRESULT Initialize()
{
@autoreleasepool{

2
src/Avalonia.Native.OSX/platformthreading.mm

@ -61,6 +61,7 @@ private:
class LoopCancellation : public ComSingleObject<IAvnLoopCancellation, &IID_IAvnLoopCancellation>
{
public:
FORWARD_IUNKNOWN()
bool Cancelled = 0;
virtual void Cancel()
{
@ -69,6 +70,7 @@ private:
};
public:
FORWARD_IUNKNOWN()
ComPtr<IAvnSignaledCallback> SignaledCallback;
PlatformThreadingInterface()

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

@ -6,17 +6,20 @@
#include "KeyTransform.h"
#include "cursor.h"
class WindowBaseImpl : public ComSingleObject<IAvnWindowBase, &IID_IAvnWindowBase>, public INSWindowHolder
class WindowBaseImpl : public virtual ComSingleObject<IAvnWindowBase, &IID_IAvnWindowBase>, public INSWindowHolder
{
private:
NSCursor* cursor;
public:
FORWARD_IUNKNOWN()
AvnView* View;
AvnWindow* Window;
ComPtr<IAvnWindowBaseEvents> BaseEvents;
AvnPoint lastPositionSet;
WindowBaseImpl(IAvnWindowBaseEvents* events)
{
BaseEvents = events;
@ -785,7 +788,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
}*/
@end
class PopupImpl : public WindowBaseImpl, public IAvnPopup
class PopupImpl : public virtual WindowBaseImpl, public IAvnPopup
{
private:
BEGIN_INTERFACE_MAP()
@ -847,7 +850,7 @@ public:
}
};
class WindowImpl : public WindowBaseImpl, public IAvnWindow, public IWindowStateChanged
class WindowImpl : public virtual WindowBaseImpl, public virtual IAvnWindow, public IWindowStateChanged
{
private:
bool _canResize = true;
@ -859,6 +862,12 @@ private:
INHERIT_INTERFACE_MAP(WindowBaseImpl)
INTERFACE_MAP_ENTRY(IAvnWindow, IID_IAvnWindow)
END_INTERFACE_MAP()
virtual uint Release()
{
return ComObject::Release();
}
ComPtr<IAvnWindowEvents> WindowEvents;
WindowImpl(IAvnWindowEvents* events) : WindowBaseImpl(events)
{
@ -1035,11 +1044,21 @@ protected:
}
};
typedef void (*pfnvoid)();
struct vtable
{
pfnvoid entries[30];
};
extern IAvnWindow* CreateAvnWindow(IAvnWindowEvents*events)
{
@autoreleasepool
{
IAvnWindow* ptr = dynamic_cast<IAvnWindow*>(new WindowImpl(events));
IAvnWindow* ptr = (IAvnWindow*)new WindowImpl(events);
auto vt = *(vtable**)(void*)ptr;
return ptr;
}
}

22
src/headers/avalonia-native.h

@ -140,7 +140,7 @@ enum AvnWindowEdge
WindowEdgeSouthEast
};
AVNCOM(IAvaloniaNativeFactory, 01) : virtual IUnknown
AVNCOM(IAvaloniaNativeFactory, 01) : IUnknown
{
public:
virtual HRESULT Initialize() = 0;
@ -154,7 +154,7 @@ public:
virtual HRESULT CreateCursorFactory(IAvnCursorFactory** ppv) = 0;
};
AVNCOM(IAvnWindowBase, 02) : virtual IUnknown
AVNCOM(IAvnWindowBase, 02) : IUnknown
{
virtual HRESULT Show() = 0;
virtual HRESULT Hide () = 0;
@ -216,7 +216,7 @@ AVNCOM(IAvnWindowEvents, 06) : IAvnWindowBaseEvents
virtual void WindowStateChanged (AvnWindowState state) = 0;
};
AVNCOM(IAvnMacOptions, 07) : virtual IUnknown
AVNCOM(IAvnMacOptions, 07) : IUnknown
{
virtual HRESULT SetShowInDock(int show) = 0;
};
@ -231,12 +231,12 @@ AVNCOM(IAvnSignaledCallback, 09) : IUnknown
virtual void Signaled(int priority, bool priorityContainsMeaningfulValue) = 0;
};
AVNCOM(IAvnLoopCancellation, 0a) : virtual IUnknown
AVNCOM(IAvnLoopCancellation, 0a) : IUnknown
{
virtual void Cancel() = 0;
};
AVNCOM(IAvnPlatformThreadingInterface, 0b) : virtual IUnknown
AVNCOM(IAvnPlatformThreadingInterface, 0b) : IUnknown
{
virtual bool GetCurrentThreadIsLoopThread() = 0;
virtual void SetSignaledCallback(IAvnSignaledCallback* cb) = 0;
@ -247,12 +247,12 @@ AVNCOM(IAvnPlatformThreadingInterface, 0b) : virtual IUnknown
virtual IUnknown* StartTimer(int priority, int ms, IAvnActionCallback* callback) = 0;
};
AVNCOM(IAvnSystemDialogEvents, 0c) : virtual IUnknown
AVNCOM(IAvnSystemDialogEvents, 0c) : IUnknown
{
virtual void OnCompleted (int numResults, void* ptrFirstResult) = 0;
};
AVNCOM(IAvnSystemDialogs, 0d) : virtual IUnknown
AVNCOM(IAvnSystemDialogs, 0d) : IUnknown
{
virtual void SelectFolderDialog (IAvnWindow* parentWindowHandle,
IAvnSystemDialogEvents* events,
@ -275,24 +275,24 @@ AVNCOM(IAvnSystemDialogs, 0d) : virtual IUnknown
const char* filters) = 0;
};
AVNCOM(IAvnScreens, 0e) : virtual IUnknown
AVNCOM(IAvnScreens, 0e) : IUnknown
{
virtual HRESULT GetScreenCount (int* ret) = 0;
virtual HRESULT GetScreen (int index, AvnScreen* ret) = 0;
};
AVNCOM(IAvnClipboard, 0f) : virtual IUnknown
AVNCOM(IAvnClipboard, 0f) : IUnknown
{
virtual HRESULT GetText (void** retOut) = 0;
virtual HRESULT SetText (char* text) = 0;
virtual HRESULT Clear() = 0;
};
AVNCOM(IAvnCursor, 10) : virtual IUnknown
AVNCOM(IAvnCursor, 10) : IUnknown
{
};
AVNCOM(IAvnCursorFactory, 11) : virtual IUnknown
AVNCOM(IAvnCursorFactory, 11) : IUnknown
{
virtual HRESULT GetCursor (AvnStandardCursorType cursorType, IAvnCursor** retOut) = 0;
};

17
src/headers/com.h

@ -107,13 +107,30 @@ public:
};
#define FORWARD_IUNKNOWN() \
virtual ULONG Release(){ \
return ComObject::Release(); \
} \
virtual ULONG AddRef() \
{ \
return ComObject::AddRef(); \
} \
virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) \
{ \
return ComObject::QueryInterface(riid, ppvObject); \
}
#define BEGIN_INTERFACE_MAP() public: virtual HRESULT STDMETHODCALLTYPE QueryInterfaceImpl(REFIID riid, void **ppvObject){
#define INTERFACE_MAP_ENTRY(TInterface, IID) if(0 == memcmp(riid, &IID, sizeof(GUID))) { TInterface* casted = this; *ppvObject = casted; return S_OK; }
#define END_INTERFACE_MAP() return E_NOINTERFACE; }
#define INHERIT_INTERFACE_MAP(TBase) if(TBase::QueryInterfaceImpl(riid, ppvObject) == S_OK) return S_OK;
class ComUnknownObject : public ComObject
{
public:
FORWARD_IUNKNOWN()
virtual ::HRESULT STDMETHODCALLTYPE QueryInterfaceImpl(REFIID riid, void **ppvObject) override
{
return E_NOINTERFACE;

Loading…
Cancel
Save