Files
2dust_v2rayN/v2rayN/v2rayN.Desktop/App.axaml.cs
T
JieXuand2dust 34359885ab Update AppBuilderExtension.cs (#9514)
* Update AppBuilderExtension.cs

* Update MainWindow.axaml.cs

* Update MacAppUtils.cs

* Update App.axaml.cs

* Add regions for MacOS activation and app events

---------

Co-authored-by: 2dust <31833384+2dust@users.noreply.github.com>
2026-06-09 17:00:51 +08:00

147 lines
4.3 KiB
C#

using v2rayN.Desktop.Common;
using v2rayN.Desktop.Views;
namespace v2rayN.Desktop;
public partial class App : Application
{
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
}
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
if (!Design.IsDesignMode)
{
AppManager.Instance.InitComponents();
DataContext = StatusBarViewModel.Instance;
}
var mainWindow = new MainWindow();
desktop.MainWindow = mainWindow;
if (OperatingSystem.IsMacOS())
{
Current?.TryGetFeature<IActivatableLifetime>()?.Activated += OnMacOSActivated;
}
}
base.OnFrameworkInitializationCompleted();
}
#region MacOS Activation
private void OnMacOSActivated(object? sender, ActivatedEventArgs args)
{
if (args.Kind != ActivationKind.Reopen)
{
return;
}
if ((ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.MainWindow is not MainWindow mainWindow)
{
return;
}
var isMiniaturized = MacAppUtils.IsWindowMiniaturized(mainWindow);
Dispatcher.UIThread.Post(() =>
{
if (isMiniaturized)
{
RestoreMacOSAccessoryPolicyAfterMiniaturize(mainWindow);
mainWindow.ShowHideWindow(true);
return;
}
if (!AppManager.Instance.Config.UiItem.MacOSShowInDock)
{
MacAppUtils.SetActivationPolicyAccessory();
}
mainWindow.ShowHideWindow(true);
});
}
private static void RestoreMacOSAccessoryPolicyAfterMiniaturize(MainWindow mainWindow)
{
if (AppManager.Instance.Config.UiItem.MacOSShowInDock)
{
return;
}
mainWindow
.GetObservable(Window.WindowStateProperty)
.Skip(1)
.Where(state => state != WindowState.Minimized)
.Take(1)
.ObserveOn(RxSchedulers.MainThreadScheduler)
.Subscribe(_ => QueueMacOSAccessoryPolicyRestore(mainWindow));
}
private static void QueueMacOSAccessoryPolicyRestore(MainWindow mainWindow)
{
// AppKit may keep isMiniaturized set until the Dock restore animation finishes.
DispatcherTimer.RunOnce(() => RestoreMacOSAccessoryPolicy(mainWindow), TimeSpan.FromMilliseconds(300));
}
private static void RestoreMacOSAccessoryPolicy(MainWindow mainWindow)
{
if (AppManager.Instance.Config.UiItem.MacOSShowInDock || MacAppUtils.IsWindowMiniaturized(mainWindow))
{
return;
}
MacAppUtils.SetActivationPolicyAccessory();
mainWindow.Activate();
mainWindow.Focus();
}
#endregion MacOS Activation
#region App Event
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
if (e.ExceptionObject != null)
{
Logging.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject);
}
}
private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e)
{
Logging.SaveLog("TaskScheduler_UnobservedTaskException", e.Exception);
}
private async void MenuAddServerViaClipboardClick(object? sender, EventArgs e)
{
try
{
if (Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime { MainWindow: not null })
{
AppEvents.AddServerViaClipboardRequested.Publish();
await Task.Delay(1000);
}
}
catch (Exception ex)
{
Logging.SaveLog("MenuAddServerViaClipboardClick", ex);
}
}
private async void MenuExit_Click(object? sender, EventArgs e)
{
await AppManager.Instance.AppExitAsync(false);
AppManager.Instance.Shutdown(true);
}
#endregion App Event
}