Skip to content

Implement session management#854

Open
mahkoh wants to merge 4 commits intomasterfrom
jorth/sqlite
Open

Implement session management#854
mahkoh wants to merge 4 commits intomasterfrom
jorth/sqlite

Conversation

@mahkoh
Copy link
Copy Markdown
Owner

@mahkoh mahkoh commented Apr 5, 2026

No description provided.

github-actions[bot]
github-actions bot previously approved these changes Apr 5, 2026
github-actions[bot]
github-actions bot previously approved these changes Apr 5, 2026
github-actions[bot]
github-actions bot previously approved these changes Apr 6, 2026
github-actions[bot]
github-actions bot previously approved these changes Apr 7, 2026
github-actions[bot]
github-actions bot previously approved these changes Apr 7, 2026
github-actions[bot]
github-actions bot previously approved these changes Apr 7, 2026
github-actions[bot]
github-actions bot previously approved these changes Apr 7, 2026
github-actions[bot]
github-actions bot previously approved these changes Apr 8, 2026
github-actions[bot]
github-actions bot previously approved these changes Apr 8, 2026
github-actions[bot]
github-actions bot previously approved these changes Apr 8, 2026
github-actions[bot]
github-actions bot previously approved these changes Apr 9, 2026
@mahkoh mahkoh marked this pull request as ready for review April 9, 2026 17:55
Copilot AI review requested due to automatic review settings April 9, 2026 17:55
github-actions[bot]
github-actions bot previously approved these changes Apr 9, 2026
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 sm module, 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants