pmacs/builtin/runtime/desktop.lua

73 lines
2.3 KiB
Lua

-- desktop.lua --- session desktop-save wiring (Arc 3 phase 2).
--
-- The Rust `pmacs.session.{save_desktop,restore_desktop,arm_restore,
-- is_daemon}` primitives do the load-bearing work (layout serde +
-- structural rebuild). This thin layer adds the opt-in `desktop_mode`
-- switch and the manual commands.
--
-- Opt-in: nothing happens unless init.lua calls
-- `pmacs.session.desktop_mode(true)`. Local-only in v1 (Q#DS9) — a
-- no-op under a daemon, where each attached frontend has its own layout.
--
-- Framing: docs/desktop-save-framing.md.
local enabled = false
-- Enable (or disable) desktop-save. When enabled in local mode:
-- * arm restore-on-startup (the RunLocal trigger fires it), and
-- * save the session on quit (editor.before-quit).
function pmacs.session.desktop_mode(on)
on = (on ~= false)
if on and pmacs.session.is_daemon() then
-- Local-only in v1; keep quiet rather than half-enable.
return false
end
enabled = on
-- Arm (or, when disabling, unarm) restore-on-startup, so an
-- enable-then-disable in init.lua does not still restore.
pmacs.session.arm_restore(on)
return enabled
end
-- Save on quit. before-quit is short-circuit; returning nil never
-- vetoes, and a save failure must not block quitting (Q#DS8).
pmacs.hook.add("editor.before-quit", function()
if enabled then
pcall(pmacs.session.save_desktop)
end
end)
pmacs.command.define {
name = "desktop-save",
description = "Save the current session (buffers + layout) to disk.",
fn = function()
if pmacs.session.is_daemon() then
pmacs.editor.set_status("desktop-save: local-only in v1")
return
end
local ok, wrote_or_err = pcall(pmacs.session.save_desktop)
if not ok then
pmacs.editor.set_status("desktop-save: " .. tostring(wrote_or_err))
elseif wrote_or_err then
pmacs.editor.set_status("desktop saved")
else
pmacs.editor.set_status("desktop-save: nothing to save")
end
end,
}
pmacs.command.define {
name = "desktop-restore",
description = "Restore the saved session (buffers + layout) from disk.",
fn = function()
if pmacs.session.is_daemon() then
pmacs.editor.set_status("desktop-restore: local-only in v1")
return
end
local ok, err = pcall(pmacs.session.restore_desktop)
if not ok then
pmacs.editor.set_status("desktop-restore: " .. tostring(err))
end
end,
}