Open
Conversation
There was a problem hiding this comment.
Pull request overview
Adds compositor-side session management backed by an embedded/dynamically-loaded SQLite store, exposing it through new xdg_session_manager_v1 / xdg_session_v1 / xdg_toplevel_session_v1 Wayland interfaces and integrating restore/updates with toplevel/workspace/output state.
Changes:
- Introduces a SQLite subsystem (dynloaded
libsqlite3.so) with a dedicated worker thread and job/statement API. - Implements session/toplevel persistence + GC via new
smmodule, SQL schema, and (de)serialization wire formats. - Hooks session state into toplevel lifecycle/commit timeline and exposes the new session manager global + wire protocol definitions.
Reviewed changes
Copilot reviewed 75 out of 75 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| wire/xdg_toplevel_session_v1.txt | New toplevel session protocol messages |
| wire/xdg_session_v1.txt | New session protocol messages |
| wire/xdg_session_manager_v1.txt | New session manager protocol messages |
| src/utils/thread_local_data/tests.rs | Update tests for new ThreadLocalData::new signature |
| src/utils/thread_local_data.rs | ThreadLocalData::new now takes ThreadId by value |
| src/utils/send_sync_rc.rs | Update SendSyncRc::new signature to take ThreadId by value |
| src/utils/pid_info.rs | Store PidInfo.exe as Rc<String> |
| src/utils/opaque.rs | Add byte conversion helpers for Opaque |
| src/utils/data_dir.rs | New helper for $XDG_DATA_HOME/jay base directory |
| src/utils.rs | Export utils::data_dir module |
| src/tree/workspace.rs | Workspace name now Rc<String> + add stable workspace hash |
| src/tree/toplevel.rs | Track ToplevelSession in ToplevelData and push state updates |
| src/tree/output.rs | Adjust workspace map removal for Rc<String> workspace names |
| src/state.rs | Add sqlite/session-manager to State + restore mapping + flush helpers |
| src/sqlite/sqlite_sys.rs | Dynloaded sqlite3 FFI + constants/result codes |
| src/sqlite/sqlite_api.rs | Safe-ish wrapper for exec/prepare/bind/step/column access |
| src/sqlite/sql/insert_user.sql | Insert per-instance “user” row |
| src/sqlite/sql/init.sql | Initialize base sqlite schema (user + temp table) |
| src/sqlite/sql/delete_user.sql | Delete instance “user” row on shutdown |
| src/sqlite/sql/delete_user_to_delete.sql | Remove active users from delete set |
| src/sqlite/sql/delete_unlocked_users.sql | GC users not backed by active lock files |
| src/sqlite.rs | SQLite worker thread, job plumbing, lockfile mechanism, optimize task |
| src/sm/sql/toplevel_store.sql | Persist toplevel state blob |
| src/sm/sql/toplevel_rename.sql | Rename/replace toplevel name |
| src/sm/sql/toplevel_list.sql | List stored toplevels |
| src/sm/sql/toplevel_list_by_age_class.sql | Age-class counts for GC (toplevel) |
| src/sm/sql/toplevel_insert.sql | Insert toplevel row |
| src/sm/sql/toplevel_disown_one.sql | Disown a single toplevel from a user |
| src/sm/sql/toplevel_disown_all.sql | Disown all toplevels for a session/user |
| src/sm/sql/toplevel_del.sql | Delete toplevel by (session,name,user) |
| src/sm/sql/toplevel_del_in_age_class.sql | GC toplevels in an age class |
| src/sm/sql/toplevel_acquire.sql | Acquire a toplevel by name (assign user_id) |
| src/sm/sql/session_upsert.sql | Upsert session row and return id |
| src/sm/sql/session_owned.sql | Ownership check for session_id/user_id |
| src/sm/sql/session_load.sql | Load session data by session name |
| src/sm/sql/session_list.sql | List sessions |
| src/sm/sql/session_list_by_age_class.sql | Age-class counts for GC (session) |
| src/sm/sql/session_disown.sql | Disown a session for a user |
| src/sm/sql/session_del.sql | Delete a session by (session,user) |
| src/sm/sql/session_del_unchecked.sql | Delete session (no owner check) returning id |
| src/sm/sql/session_del_in_age_class.sql | GC sessions in an age class |
| src/sm/sql/init.sql | Session management schema + triggers + indexes |
| src/sm/sm_wire/sm_wire_toplevel.rs | bincode format for toplevel persisted state |
| src/sm/sm_wire/sm_wire_session.rs | bincode format for session persisted state |
| src/sm/sm_wire.rs | Shared wire helpers (rect conversion) |
| src/sm/sm_jobs/sm_toplevel_update.rs | Job to update toplevel persisted state |
| src/sm/sm_jobs/sm_toplevel_rename.rs | Job to rename toplevel in DB |
| src/sm/sm_jobs/sm_toplevel_disown.rs | Job to disown a toplevel on drop |
| src/sm/sm_jobs/sm_toplevel_del.rs | Job to delete a toplevel |
| src/sm/sm_jobs/sm_toplevel_acquire.rs | Job to acquire/restore/insert toplevel row |
| src/sm/sm_jobs/sm_session_list.rs | Job to list sessions+toplevels |
| src/sm/sm_jobs/sm_session_disown.rs | Job to disown a session+toplevels |
| src/sm/sm_jobs/sm_session_del.rs | Job to delete a session |
| src/sm/sm_jobs/sm_session_acquire.rs | Job to create/update session row |
| src/sm/sm_jobs/sm_common.rs | DB state holder, ownership check, and GC logic |
| src/sm/sm_jobs.rs | Job scheduling/stack reuse utilities |
| src/sm.rs | Session manager + session/toplevel session state machine |
| src/main.rs | Register new sm and sqlite modules |
| src/macros.rs | Adjust opaque! macro attrs for clippy/dead_code |
| src/logger.rs | Use data_dir() for log directory base |
| src/it/tests/t0018_click_to_active_ws.rs | Fix workspace name comparisons after Rc<String> change |
| src/ifs/xdg_session_v1.rs | Implement xdg_session_v1 object and requests/events |
| src/ifs/xdg_session_manager_v1.rs | Implement global/object for xdg_session_manager_v1 |
| src/ifs/wl_surface/xdg_surface/xdg_toplevel/xdg_toplevel_session_v1.rs | Implement per-toplevel session object + restore handshake |
| src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs | Integrate session restore + track commit requested + disown |
| src/ifs/wl_surface/xdg_surface.rs | Add commit hook + pending restored marker plumbing |
| src/ifs/wl_surface/commit_timeline.rs | Add “toplevel restored” dependency gating to commit flush |
| src/ifs/jay_reexec.rs | Flush sqlite before re-exec |
| src/ifs.rs | Export new session manager/session interfaces |
| src/globals.rs | Register XdgSessionManagerV1 singleton |
| src/control_center/cc_window.rs | Adjust workspace name access (Rc<String>) |
| src/control_center/cc_clients.rs | Adjust exe access (Rc<String>) |
| src/compositor.rs | Initialize sqlite + session manager; spawn optimize/flush tasks |
| src/client.rs | Track per-client sqlite accounting + live sessions list |
| book/src/features.md | Document new global xdg_session_manager_v1 |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.