pmacs/builtin/runtime/window.lua

64 lines
2.4 KiB
Lua

-- window.lua --- side-window settings, quit, and keyboard resize.
--
-- The Lua half of the bottom-panel arc's window surface. The placement
-- policy itself is Rust (`pmacs.window.display` / `display_file` /
-- `quit` / `resize`); this module owns the two settings those paths
-- resolve, plus the interactive commands and their Emacs bindings.
--
-- Both settings are read against the window's OWN buffer (buffer-local
-- override -> global -> default), so a project or a mode hook can pin a
-- taller panel for one buffer with `pmacs.config.set_local`.
--
-- Framing: docs/bottom-panel-framing.md (Q#BP2, Q#BP5b, Q#BP11).
-- Outer rows (text + mode line) a freshly created panel takes when the
-- caller supplies no explicit `height`. Only consulted at CREATION: a
-- replacement preserves whatever height the user dragged the slot to.
pmacs.config.define {
name = "window.panel-height",
description = "Outer rows a newly created bottom panel occupies.",
type = "integer",
default = 12,
min = 2,
mutability = "live",
}
-- A preference, not a structural rule: it constrains INTERACTIVE resize
-- (drag and the commands below) and is deliberately ignored by the
-- ordinary layout pass and by frame-resize reconciliation, so raising it
-- can never invalidate a layout that already exists.
--
-- The registry floor is 1 rather than 2 on purpose: a value below the
-- STRUCTURAL floor is clamped when it is read, not rejected when it is
-- written, so a user who asks for a smaller minimum simply gets the
-- smallest one the layout can actually honor.
pmacs.config.define {
name = "window.min-height",
description = "Smallest outer rows interactive resize will leave a window.",
type = "integer",
default = 2,
min = 1,
mutability = "live",
}
pmacs.command.define {
name = "window.quit",
description = "Quit the selected side window: restore or delete it",
fn = function() pmacs.window.quit() end,
}
pmacs.command.define {
name = "window.enlarge",
description = "Make the selected window one row taller",
fn = function() pmacs.window.resize(nil, 1) end,
}
pmacs.command.define {
name = "window.shrink",
description = "Make the selected window one row shorter",
fn = function() pmacs.window.resize(nil, -1) end,
}
pmacs.keymap.bind { scope = "global", sequence = "C-x ^", command = "window.enlarge" }
pmacs.keymap.bind { scope = "global", sequence = "C-x C-^", command = "window.shrink" }