diff --git a/src/ClaudeDo.Ui/ViewModels/IslandsShellViewModel.cs b/src/ClaudeDo.Ui/ViewModels/IslandsShellViewModel.cs index e879fd4e..93837d53 100644 --- a/src/ClaudeDo.Ui/ViewModels/IslandsShellViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/IslandsShellViewModel.cs @@ -1,3 +1,5 @@ +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Threading; using System; using System.Threading; @@ -686,10 +688,6 @@ public sealed partial class IslandsShellViewModel : ViewModelBase, IDisposable } } - // Set by MainWindow: force-closes the window without re-triggering its own close - // confirmation (the shutdown dialog above already confirmed). - public Action? CloseWindow { get; set; } - // Test seam: overrides the real kill-worker + close-window body. internal Action? ShutdownOperation { get; set; } @@ -706,7 +704,14 @@ public sealed partial class IslandsShellViewModel : ViewModelBase, IDisposable { var exe = _workerLocator.Find(); if (exe is not null) KillMatchingWorkerProcesses(exe); - CloseWindow?.Invoke(); + + // Closing just the MainWindow relies on ShutdownMode.OnMainWindowClose, which asks + // every open window to close and backs off if any of them cancels — and + // MissionControlWindow always cancels its own close (it hides instead, see + // MissionControlWindow.OnClosing), so the process never actually exited. Shutdown() + // force-closes every window, ignoring that cancellation. + if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + desktop.Shutdown(); } private bool _updatingClaudeCli; diff --git a/src/ClaudeDo.Ui/Views/MainWindow.axaml.cs b/src/ClaudeDo.Ui/Views/MainWindow.axaml.cs index ba65fb72..b1633f86 100644 --- a/src/ClaudeDo.Ui/Views/MainWindow.axaml.cs +++ b/src/ClaudeDo.Ui/Views/MainWindow.axaml.cs @@ -80,11 +80,6 @@ public partial class MainWindow : Window WindowState = WindowState.Normal; Activate(); }; - vm.CloseWindow = () => - { - _forceClose = true; - Close(); - }; if (vm.Tasks is not null) vm.Tasks.IsWindowVisible = WindowState != WindowState.Minimized; }