# Fix macOS workspace session restore when closing window via X button \(\#60477\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/99b0ed6b55017fe110557af7408afff9a6cd9e71)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: 99b0ed6b55017fe110557af7408afff9a6cd9e71

Requested commit: 99b0ed6b55017fe110557af7408afff9a6cd9e71

Commit: 99b0ed6b55017fe110557af7408afff9a6cd9e71

Tree: 709a41c3faa7be5dcafd9fc84356da0fc8ef118b

Author: Caleul Raposo Caixeta

Committer: GitHub

## Message

```
Fix macOS workspace session restore when closing window via X button (#60477)

Closes https://github.com/zed-industries/zed/issues/48468

## Solution

This change addresses a macOS shutdown ordering issue where closing the
last window with the native close button could clear session state
before persistence tasks complete, causing next launch to open no
project/untitled.

-
[crates/workspace/src/workspace.rs](/Users/caleul/Documents/Work/Projects/zed/crates/workspace/src/workspace.rs)
- Make `save_last_workspace` dynamic on macOS based on whether closing
the last window will quit the app (`on_last_window_closed == quit_app`).
- Keeps `save_last_workspace` true only when the window close path is
equivalent to quit, so last-session data remains valid only in the
intended scenario.

-
[crates/workspace/src/multi_workspace.rs](/Users/caleul/Documents/Work/Projects/zed/crates/workspace/src/multi_workspace.rs)
  - In `close_window`, before removing the window, explicitly flush:
    - workspace serialization tasks
    - pending workspace removal tasks
    - multi-workspace serialization task
  - This prevents losing in-memory state on fast close/quit paths.

-
[crates/session/src/session.rs](/Users/caleul/Documents/Work/Projects/zed/crates/session/src/session.rs)
- Guard `app_will_quit` to only persist window stack when non-empty,
preventing empty-stack state from being written during close path that
destroys the window stack first.

## Testing

- Did you test these changes?  
- Manual repro/fix confirmed in local testing flow by the previous
author.
  - Please confirm after merge with:
    1) open 2–3 projects in workspace sidebar  
2) set `on_last_window_closed: "quit_app"` and `restore_on_startup:
"last_session"`
    3) close with red X  
    4) relaunch app and verify sessions restore all active workspaces

- Are there any parts that need more testing?  
- Multi-window mixed close scenarios and one-window with dirty
non-serializable items.
- Regression for non-quit close mode (`on_last_window_closed: "close")
to ensure behavior remains unchanged.

- How can others test this?  
  - Follow the 4-step repro path above on macOS.
- Check logs for `timed out waiting on app_will_quit` in
`~/Library/Logs/Zed/Zed.log` and confirm no restore regression.

- Platforms tested:  
  - Verified for macOS (target path of bug).  
  - Not validated on Linux/Windows in this patch path.

## Self-Review Checklist

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content adheres to Zed's UI standards (no UI/UX diff here)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes

- Closing last macOS window via the red close button now correctly
preserves and restores last-session workspace state when configured to
quit on last-window close.

---------

Co-authored-by: Kirill Bulatov <kirill@zed.dev>
```

## Parents

- [b9d1fe592892448cf8db95c37abd1007b49afc00](https://git.cafe/gitcafe/zed/commit/b9d1fe592892448cf8db95c37abd1007b49afc00?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/99b0ed6b55017fe110557af7408afff9a6cd9e71?format=markdown)
