Browse Source

work towards menu per window.

pull/2978/head
Dan Walmsley 7 years ago
parent
commit
ffcfeaa956
  1. 3
      native/Avalonia.Native/inc/avalonia-native.h
  2. 2
      native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj
  3. 1
      native/Avalonia.Native/src/OSX/common.h
  4. 6
      native/Avalonia.Native/src/OSX/main.mm
  5. 12
      native/Avalonia.Native/src/OSX/menu.mm
  6. 1
      native/Avalonia.Native/src/OSX/window.h
  7. 30
      native/Avalonia.Native/src/OSX/window.mm
  8. 6
      src/Avalonia.Native/AvaloniaNativeMenuExporter.cs

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

@ -175,7 +175,6 @@ public:
virtual HRESULT CreateClipboard(IAvnClipboard** ppv) = 0;
virtual HRESULT CreateCursorFactory(IAvnCursorFactory** ppv) = 0;
virtual HRESULT ObtainGlFeature(IAvnGlFeature** ppv) = 0;
virtual HRESULT ObtainAppMenu (IAvnAppMenu** ppv) = 0;
virtual HRESULT CreateMenu (IAvnAppMenu** ppv) = 0;
virtual HRESULT CreateMenuItem (IAvnAppMenuItem** ppv) = 0;
};
@ -208,6 +207,8 @@ AVNCOM(IAvnWindowBase, 02) : IUnknown
virtual HRESULT SetCursor(IAvnCursor* cursor) = 0;
virtual HRESULT CreateGlRenderTarget(IAvnGlSurfaceRenderTarget** ret) = 0;
virtual HRESULT GetSoftwareFramebuffer(AvnFramebuffer*ret) = 0;
virtual HRESULT SetMainMenu(IAvnAppMenu* menu) = 0;
virtual HRESULT GetMainMenu(IAvnAppMenu** ret) = 0;
virtual bool TryLock() = 0;
virtual void Unlock() = 0;
};

2
native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj

@ -34,7 +34,6 @@
37DDA9B121933371002E132B /* AvnString.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AvnString.h; sourceTree = "<group>"; };
37E2330E21583241000CB7E2 /* KeyTransform.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = KeyTransform.mm; sourceTree = "<group>"; };
520624B222973F4100C4DCEF /* menu.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = menu.mm; sourceTree = "<group>"; };
5296D43022F30EBC005B125D /* menu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = menu.h; path = ../../../../../../../../System/Volumes/Data/Users/danwalmsley/repos/Avalonia/native/Avalonia.Native/src/OSX/menu.h; sourceTree = "<group>"; };
5B21A981216530F500CEE36E /* cursor.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = cursor.mm; sourceTree = "<group>"; };
5B8BD94E215BFEA6005ED2A7 /* clipboard.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = clipboard.mm; sourceTree = "<group>"; };
5BF943652167AD1D009CAE35 /* cursor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cursor.h; sourceTree = "<group>"; };
@ -89,7 +88,6 @@
37C09D8A21581EF2006A6758 /* window.h */,
AB00E4F62147CA920032A60A /* main.mm */,
520624B222973F4100C4DCEF /* menu.mm */,
5296D43022F30EBC005B125D /* menu.h */,
37A517B22159597E00FBA241 /* Screens.mm */,
37C09D8721580FE4006A6758 /* SystemDialogs.mm */,
AB7A61F02147C815003C5833 /* Products */,

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

@ -19,7 +19,6 @@ extern IAvnClipboard* CreateClipboard();
extern IAvnCursorFactory* CreateCursorFactory();
extern IAvnGlFeature* GetGlFeature();
extern IAvnGlSurfaceRenderTarget* CreateGlRenderTarget(NSWindow* window, NSView* view);
extern IAvnAppMenu* GetAppMenu();
extern IAvnAppMenu* CreateAppMenu();
extern IAvnAppMenuItem* CreateAppMenuItem();

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

@ -225,12 +225,6 @@ public:
return S_OK;
}
virtual HRESULT ObtainAppMenu(IAvnAppMenu** ppv) override
{
*ppv = ::GetAppMenu();
return S_OK;
}
virtual HRESULT CreateMenu (IAvnAppMenu** ppv) override
{
*ppv = ::CreateAppMenu();

12
native/Avalonia.Native/src/OSX/menu.mm

@ -170,12 +170,13 @@ HRESULT AvnAppMenu::Clear()
return S_OK;
}
static IAvnAppMenu* s_AppMenu = nullptr;
//static IAvnAppMenu* s_AppMenu = nullptr;
extern IAvnAppMenu* GetAppMenu()
/*extern IAvnAppMenu* GetAppMenu()
{
@autoreleasepool
{
//todo get rid of this method.
if(s_AppMenu == nullptr)
{
id menubar = [NSMenu new];
@ -183,7 +184,7 @@ extern IAvnAppMenu* GetAppMenu()
[NSApp setMainMenu:menubar];
id appMenuItem = [AvnMenuItem new];
[[NSApp mainMenu] addItem:appMenuItem];
[menubar addItem:appMenuItem];
[appMenuItem setSubmenu:[AvnMenu new]];
@ -192,13 +193,14 @@ extern IAvnAppMenu* GetAppMenu()
return s_AppMenu;
}
}
}*/
extern IAvnAppMenu* CreateAppMenu()
{
@autoreleasepool
{
return new AvnAppMenu();
id menuBar = [NSMenu new];
return new AvnAppMenu(menuBar);
}
}

1
native/Avalonia.Native/src/OSX/window.h

@ -20,6 +20,7 @@ class WindowBaseImpl;
-(void) pollModalSession: (NSModalSession _Nonnull) session;
-(void) restoreParentWindow;
-(bool) shouldTryToHandleEvents;
-(void) setMenu:(NSMenu *)menu;
@end
struct INSWindowHolder

30
native/Avalonia.Native/src/OSX/window.mm

@ -63,9 +63,11 @@ public:
SoftwareDrawingOperation CurrentSwDrawingOperation;
AvnPoint lastPositionSet;
NSString* _lastTitle;
IAvnAppMenu* _mainMenu;
WindowBaseImpl(IAvnWindowBaseEvents* events)
{
_mainMenu = nullptr;
BaseEvents = events;
View = [[AvnView alloc] initWithParent:this];
@ -209,6 +211,27 @@ public:
}
}
virtual HRESULT SetMainMenu(IAvnAppMenu* menu) override
{
_mainMenu = menu;
return S_OK;
}
virtual HRESULT GetMainMenu(IAvnAppMenu** ret) override
{
if(ret == nullptr)
{
return E_POINTER;
}
*ret = _mainMenu;
return S_OK;
}
virtual bool TryLock() override
{
@autoreleasepool
@ -1042,6 +1065,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
ComPtr<WindowBaseImpl> _parent;
bool _canBecomeKeyAndMain;
bool _closed;
NSMenu* _menu;
}
- (void)dealloc
@ -1065,6 +1089,12 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
}
}
-(void) setMenu:(NSMenu *)menu
{
_menu = menu;
[NSApp setMenu:menu];
}
-(void) setCanBecomeKeyAndMain
{
_canBecomeKeyAndMain = true;

6
src/Avalonia.Native/AvaloniaNativeMenuExporter.cs

@ -114,7 +114,8 @@ namespace Avalonia.Native
LayoutUpdated?.Invoke((_revision, 0));
SetMenu(_menu.Items);
_exported = true;
}
@ -228,8 +229,9 @@ namespace Avalonia.Native
}
}
private void SetMenu(ICollection<NativeMenuItem> menuItems)
private void SetMenu(IAvnWindow avnWindow, ICollection<NativeMenuItem> menuItems)
{
var appMenu = _factory.ObtainAppMenu();
appMenu.Clear();

Loading…
Cancel
Save