Add HostShutdownGate and shutdown handling

Introduce HostShutdownGate to serialize and record the first host shutdown request (Restart preferred over later Exit). Add tests (HostShutdownGateTests) and a tray-menu spec describing shutdown requirements. Integrate the gate into App: expose IsShutdownInProgress, ignore tray/settings/component-library actions during shutdown, reuse/track the fused component library window, ensure edit-mode exit on failures, and close the library during shutdown. Add TrySubmitShutdown to commit shutdown intent, schedule forced termination, perform exit cleanup, and invoke desktop lifetime shutdown. Update HostApplicationLifecycleService to use the new TrySubmitShutdown flow for Exit/Restart. Harden DesktopTrayService.Dispose to clear icons and dispose the tray icon safely. These changes ensure irreversible shutdown commits, prevent UI reopening during shutdown, preserve restart intent, and avoid duplicate or conflicting shutdown actions.
This commit is contained in:
lincube
2026-04-23 14:18:09 +08:00
parent 927dc8d1fd
commit 2d9391f930
6 changed files with 344 additions and 25 deletions

View File

@@ -128,6 +128,27 @@ internal sealed class DesktopTrayService : IDisposable
{
}
try
{
TrayIcon.SetIcons(_application, []);
}
catch
{
}
try
{
if (_trayIcon is IDisposable disposable)
{
disposable.Dispose();
}
}
catch
{
}
_trayIcon = null;
SetState(TrayAvailabilityState.Unavailable, "Dispose");
}