using System.Windows; using CursorLang.Services; using CursorLang.ViewModels; using CursorLang.Views; using Microsoft.Extensions.DependencyInjection; namespace CursorLang; // ReSharper disable once RedundantExtendsListEntry public partial class App : Application { private ServiceProvider? _services; private SingleInstanceGate? _instanceGate; private MainWindowPresenter? _presenter; private ITrayIcon? _tray; protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); bool automatic = StartupLaunch.IsAutomatic(e.Args); var gate = new SingleInstanceGate(); if (!gate.TryAcquire(showRunningInstance: !automatic)) { gate.Dispose(); Shutdown(); return; } _instanceGate = gate; _instanceGate.ActivationRequested += OnActivationRequested; var services = new ServiceCollection(); ConfigureServices(services); _services = services.BuildServiceProvider(); _services.GetRequiredService(); _presenter = _services.GetRequiredService(); MainWindow = _services.GetRequiredService(); _tray = _services.GetRequiredService(); _tray.OpenRequested += OnOpenRequested; _tray.ExitRequested += OnExitRequested; bool hasTray = _tray.Install(); if (!automatic || !hasTray) { _presenter.Show(); } if (!hasTray) { _presenter.Detach(); ShutdownMode = ShutdownMode.OnMainWindowClose; } _ = _services.GetRequiredService().InitializeAsync(); _ = _services.GetRequiredService().StartAsync(); _services.GetRequiredService().Start(); _services.GetRequiredService().Start(); } protected override void OnExit(ExitEventArgs e) { if (_tray is not null) { _tray.OpenRequested -= OnOpenRequested; _tray.ExitRequested -= OnExitRequested; } _services?.Dispose(); if (_instanceGate is not null) { _instanceGate.ActivationRequested -= OnActivationRequested; _instanceGate.Dispose(); } base.OnExit(e); } private void OnActivationRequested(object? sender, EventArgs e) => _presenter?.Show(); private void OnOpenRequested(object? sender, EventArgs e) => _presenter?.Show(); private void OnExitRequested(object? sender, EventArgs e) { _presenter?.AllowClose(); Shutdown(); } internal static void ConfigureServices(IServiceCollection services) { services.AddSingleton(new KeyboardLayoutOptions()); services.AddSingleton(new UpdateOptions()); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService().Load()); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddSingleton(); } }