From 50cea008d789f1130a9c694cf1bcbc30a8f8e8b9 Mon Sep 17 00:00:00 2001 From: daniilpavliuchyk Date: Mon, 3 Oct 2022 18:18:00 +0300 Subject: [PATCH 1/4] WIP --- native/Avalonia.Native/src/OSX/main.mm | 31 +++++++++++++++---- samples/ControlCatalog.NetCore/Program.cs | 8 +++++ src/Avalonia.Native/AvaloniaNativePlatform.cs | 1 + .../AvaloniaNativePlatformExtensions.cs | 2 ++ src/Avalonia.Native/avn.idl | 1 + 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/main.mm b/native/Avalonia.Native/src/OSX/main.mm index 6ee86b21ae..cf6503b61c 100644 --- a/native/Avalonia.Native/src/OSX/main.mm +++ b/native/Avalonia.Native/src/OSX/main.mm @@ -3,7 +3,7 @@ #include "common.h" static NSString* s_appTitle = @"Avalonia"; - +static int disableSetProcessName; // Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -101,7 +101,9 @@ void SetProcessName(NSString* appTitle) { class MacOptions : public ComSingleObject { + public: + FORWARD_IUNKNOWN() virtual HRESULT SetApplicationTitle(char* utf8String) override @@ -111,11 +113,17 @@ public: @autoreleasepool { auto appTitle = [NSString stringWithUTF8String: utf8String]; - - [[NSProcessInfo processInfo] setProcessName:appTitle]; - - - SetProcessName(appTitle); + if (disableSetProcessName == 0) + { + [[NSProcessInfo processInfo] setProcessName:appTitle]; + + SetProcessName(appTitle); + } + if (disableSetProcessName == 1) + { + auto rootMenu = [NSApp mainMenu]; + [rootMenu setTitle:appTitle]; + } return S_OK; } @@ -133,6 +141,17 @@ public: } } + virtual HRESULT SetDisableSetProcessName(int disable) override + { + START_COM_CALL; + + @autoreleasepool + { + disableSetProcessName = disable; + return S_OK; + } + } + }; /// See "Using POSIX Threads in a Cocoa Application" section here: diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs index b1bacc6483..d0ea7ac85e 100644 --- a/samples/ControlCatalog.NetCore/Program.cs +++ b/samples/ControlCatalog.NetCore/Program.cs @@ -115,6 +115,14 @@ namespace ControlCatalog.NetCore UseDBusMenu = true, EnableIme = true }) + .With(new MacOSPlatformOptions() + { + DisableSetProcessName = true + }) + .With(new AvaloniaNativePlatformOptions() + { + AvaloniaNativeLibraryPath = "/Users/daniilpavliuchyk/Library/Developer/Xcode/DerivedData/Avalonia.Native.OSX-hchxgrlrewlcvufcdcugzgajjpdt/Build/Products/Debug/libAvalonia.Native.OSX.dylib" + }) .UseSkia() .AfterSetup(builder => { diff --git a/src/Avalonia.Native/AvaloniaNativePlatform.cs b/src/Avalonia.Native/AvaloniaNativePlatform.cs index b45fe5559b..acb538268f 100644 --- a/src/Avalonia.Native/AvaloniaNativePlatform.cs +++ b/src/Avalonia.Native/AvaloniaNativePlatform.cs @@ -102,6 +102,7 @@ namespace Avalonia.Native var macOpts = AvaloniaLocator.Current.GetService() ?? new MacOSPlatformOptions(); _factory.MacOptions.SetShowInDock(macOpts.ShowInDock ? 1 : 0); + _factory.MacOptions.SetDisableSetProcessName(macOpts.DisableSetProcessName ? 1 : 0); } AvaloniaLocator.CurrentMutable diff --git a/src/Avalonia.Native/AvaloniaNativePlatformExtensions.cs b/src/Avalonia.Native/AvaloniaNativePlatformExtensions.cs index 61889aa9e4..baa2018183 100644 --- a/src/Avalonia.Native/AvaloniaNativePlatformExtensions.cs +++ b/src/Avalonia.Native/AvaloniaNativePlatformExtensions.cs @@ -83,5 +83,7 @@ namespace Avalonia /// Gets or sets a value indicating whether the native macOS menu bar will be enabled for the application. /// public bool DisableNativeMenus { get; set; } + + public bool DisableSetProcessName { get; set; } } } diff --git a/src/Avalonia.Native/avn.idl b/src/Avalonia.Native/avn.idl index a98d213887..b94b8ec0f4 100644 --- a/src/Avalonia.Native/avn.idl +++ b/src/Avalonia.Native/avn.idl @@ -599,6 +599,7 @@ interface IAvnMacOptions : IUnknown { HRESULT SetShowInDock(int show); HRESULT SetApplicationTitle(char* utf8string); + HRESULT SetDisableSetProcessName(int disable); } [uuid(04c1b049-1f43-418a-9159-cae627ec1367)] From f6cae3af060b0064a98bfdbf6df78732f2b37fcb Mon Sep 17 00:00:00 2001 From: daniilpavliuchyk Date: Mon, 3 Oct 2022 18:21:34 +0300 Subject: [PATCH 2/4] WIP --- native/Avalonia.Native/src/OSX/main.mm | 3 +-- samples/ControlCatalog.NetCore/Program.cs | 8 -------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/main.mm b/native/Avalonia.Native/src/OSX/main.mm index cf6503b61c..ba8a4d439c 100644 --- a/native/Avalonia.Native/src/OSX/main.mm +++ b/native/Avalonia.Native/src/OSX/main.mm @@ -4,6 +4,7 @@ static NSString* s_appTitle = @"Avalonia"; static int disableSetProcessName; + // Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -101,9 +102,7 @@ void SetProcessName(NSString* appTitle) { class MacOptions : public ComSingleObject { - public: - FORWARD_IUNKNOWN() virtual HRESULT SetApplicationTitle(char* utf8String) override diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs index d0ea7ac85e..b1bacc6483 100644 --- a/samples/ControlCatalog.NetCore/Program.cs +++ b/samples/ControlCatalog.NetCore/Program.cs @@ -115,14 +115,6 @@ namespace ControlCatalog.NetCore UseDBusMenu = true, EnableIme = true }) - .With(new MacOSPlatformOptions() - { - DisableSetProcessName = true - }) - .With(new AvaloniaNativePlatformOptions() - { - AvaloniaNativeLibraryPath = "/Users/daniilpavliuchyk/Library/Developer/Xcode/DerivedData/Avalonia.Native.OSX-hchxgrlrewlcvufcdcugzgajjpdt/Build/Products/Debug/libAvalonia.Native.OSX.dylib" - }) .UseSkia() .AfterSetup(builder => { From 677e89edd0b516b6f3a3f6bf625557622be216d5 Mon Sep 17 00:00:00 2001 From: daniilpavliuchyk Date: Mon, 3 Oct 2022 18:30:01 +0300 Subject: [PATCH 3/4] WIP --- native/Avalonia.Native/src/OSX/main.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native/Avalonia.Native/src/OSX/main.mm b/native/Avalonia.Native/src/OSX/main.mm index ba8a4d439c..2fc72afb46 100644 --- a/native/Avalonia.Native/src/OSX/main.mm +++ b/native/Avalonia.Native/src/OSX/main.mm @@ -3,7 +3,7 @@ #include "common.h" static NSString* s_appTitle = @"Avalonia"; -static int disableSetProcessName; +static int disableSetProcessName = 0; // Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be From d34c31fa1c2413b648962713338c7ee602c0b972 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 27 Oct 2022 15:00:50 +0100 Subject: [PATCH 4/4] implement disabling app delegate. --- native/Avalonia.Native/src/OSX/app.mm | 11 +++++++---- native/Avalonia.Native/src/OSX/common.h | 2 +- native/Avalonia.Native/src/OSX/main.mm | 13 ++++++++++++- src/Avalonia.Native/AvaloniaNativePlatform.cs | 1 + .../AvaloniaNativePlatformExtensions.cs | 6 ++++++ src/Avalonia.Native/avn.idl | 1 + 6 files changed, 28 insertions(+), 6 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/app.mm b/native/Avalonia.Native/src/OSX/app.mm index a15d0c9601..9cc9fc9523 100644 --- a/native/Avalonia.Native/src/OSX/app.mm +++ b/native/Avalonia.Native/src/OSX/app.mm @@ -95,11 +95,14 @@ ComPtr _events; } @end -extern void InitializeAvnApp(IAvnApplicationEvents* events) +extern void InitializeAvnApp(IAvnApplicationEvents* events, bool disableAppDelegate) { - NSApplication* app = [AvnApplication sharedApplication]; - id delegate = [[AvnAppDelegate alloc] initWithEvents:events]; - [app setDelegate:delegate]; + if(!disableAppDelegate) + { + NSApplication* app = [AvnApplication sharedApplication]; + id delegate = [[AvnAppDelegate alloc] initWithEvents:events]; + [app setDelegate:delegate]; + } } HRESULT AvnApplicationCommands::HideApp() diff --git a/native/Avalonia.Native/src/OSX/common.h b/native/Avalonia.Native/src/OSX/common.h index a90a235b9d..7ee7205776 100644 --- a/native/Avalonia.Native/src/OSX/common.h +++ b/native/Avalonia.Native/src/OSX/common.h @@ -32,7 +32,7 @@ extern void SetServicesMenu (IAvnMenu* menu); extern IAvnMenu* GetAppMenu (); extern NSMenuItem* GetAppMenuItem (); -extern void InitializeAvnApp(IAvnApplicationEvents* events); +extern void InitializeAvnApp(IAvnApplicationEvents* events, bool disableAppDelegate); extern NSApplicationActivationPolicy AvnDesiredActivationPolicy; extern NSPoint ToNSPoint (AvnPoint p); extern NSRect ToNSRect (AvnRect r); diff --git a/native/Avalonia.Native/src/OSX/main.mm b/native/Avalonia.Native/src/OSX/main.mm index 2fc72afb46..c29d4108d0 100644 --- a/native/Avalonia.Native/src/OSX/main.mm +++ b/native/Avalonia.Native/src/OSX/main.mm @@ -4,6 +4,7 @@ static NSString* s_appTitle = @"Avalonia"; static int disableSetProcessName = 0; +static bool disableAppDelegate = false; // Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be @@ -151,6 +152,16 @@ public: } } + virtual HRESULT SetDisableAppDelegate(int disable) override + { + START_COM_CALL; + + @autoreleasepool { + disableAppDelegate = disable; + return S_OK; + } + } + }; /// See "Using POSIX Threads in a Cocoa Application" section here: @@ -193,7 +204,7 @@ public: @autoreleasepool{ [[ThreadingInitializer new] do]; } - InitializeAvnApp(events); + InitializeAvnApp(events, disableAppDelegate); return S_OK; }; diff --git a/src/Avalonia.Native/AvaloniaNativePlatform.cs b/src/Avalonia.Native/AvaloniaNativePlatform.cs index acb538268f..5ba2eab3ab 100644 --- a/src/Avalonia.Native/AvaloniaNativePlatform.cs +++ b/src/Avalonia.Native/AvaloniaNativePlatform.cs @@ -103,6 +103,7 @@ namespace Avalonia.Native _factory.MacOptions.SetShowInDock(macOpts.ShowInDock ? 1 : 0); _factory.MacOptions.SetDisableSetProcessName(macOpts.DisableSetProcessName ? 1 : 0); + _factory.MacOptions.SetDisableAppDelegate(macOpts.DisableAvaloniaAppDelegate ? 1 : 0); } AvaloniaLocator.CurrentMutable diff --git a/src/Avalonia.Native/AvaloniaNativePlatformExtensions.cs b/src/Avalonia.Native/AvaloniaNativePlatformExtensions.cs index baa2018183..189f45d7c8 100644 --- a/src/Avalonia.Native/AvaloniaNativePlatformExtensions.cs +++ b/src/Avalonia.Native/AvaloniaNativePlatformExtensions.cs @@ -85,5 +85,11 @@ namespace Avalonia public bool DisableNativeMenus { get; set; } public bool DisableSetProcessName { get; set; } + + /// + /// Gets or sets a value indicating whether Avalonia can install its own AppDelegate. + /// Disabling this can be useful in some scenarios like when running as a plugin inside an existing macOS application. + /// + public bool DisableAvaloniaAppDelegate { get; set; } } } diff --git a/src/Avalonia.Native/avn.idl b/src/Avalonia.Native/avn.idl index b94b8ec0f4..f84af3c9b2 100644 --- a/src/Avalonia.Native/avn.idl +++ b/src/Avalonia.Native/avn.idl @@ -600,6 +600,7 @@ interface IAvnMacOptions : IUnknown HRESULT SetShowInDock(int show); HRESULT SetApplicationTitle(char* utf8string); HRESULT SetDisableSetProcessName(int disable); + HRESULT SetDisableAppDelegate(int disable); } [uuid(04c1b049-1f43-418a-9159-cae627ec1367)]