mirror of
https://github.com/2dust/v2rayN.git
synced 2026-09-22 22:38:10 +03:00
* 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>
147 lines
4.3 KiB
C#
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
|
|
}
|