diff options
| author | srdusr <[email protected]> | 2026-05-13 19:47:00 +0200 |
|---|---|---|
| committer | srdusr <[email protected]> | 2026-05-13 19:47:00 +0200 |
| commit | 670c9845129fc0c4b6e0192d657eea05e1a64b49 (patch) | |
| tree | 273573d7ed109af3d39e268a6d43787b831c9d47 /crates/config/src/engine/support.rs | |
| parent | 646b37e7e3aa5931079c6b9e804f420bb43c74d5 (diff) | |
| download | srdwm-670c9845129fc0c4b6e0192d657eea05e1a64b49.tar.gz srdwm-670c9845129fc0c4b6e0192d657eea05e1a64b49.zip | |
Expose key bindings over IPC so a launcher can list them
Asked whether srdwm's bindings show in the AGS launcher. They could not:
srd.bind lives entirely in the Lua engine, and nothing published a binding
anywhere a client could read it. There was no IPC command, no field in any
response, and bound_keys() was used only by main.rs to register grabs.
srd.bind now takes an optional third argument, a description, and the loaded
set is copied into the WindowManager after the initial load and after every
reload. Core neither owns nor interprets them - it has no Lua state and
never dispatches a key - it holds them so the IPC layer, which is handed a
WindowManager and nothing else, can serve them. New `srd keybindings` returns
combo and description pairs, sorted so a UI listing them does not reshuffle
on every refresh.
Every binding in the shipped config now carries a description, so the feature
is useful without the user writing any.
Verified live in a nested instance: 46 bindings published, 0 without a
description, and editing the config file updated the list without a restart
(which also exercised reload-on-write again).
Also verified, for the separate report that windows cannot be moved to
another workspace from the AGS workspace pills: the compositor side works.
`srd dispatch move workspace <id> 2` moved a window from workspace 1 to 2 and
correctly hid it, since workspace 1 was active. Nothing to fix here; the
missing piece is on the shell side.
515 tests pass, clippy clean.
Diffstat (limited to 'crates/config/src/engine/support.rs')
| -rw-r--r-- | crates/config/src/engine/support.rs | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/crates/config/src/engine/support.rs b/crates/config/src/engine/support.rs index 76bcf5e..9d81035 100644 --- a/crates/config/src/engine/support.rs +++ b/crates/config/src/engine/support.rs @@ -33,16 +33,18 @@ pub(super) fn do_reload(lua: &Lua, state: &Rc<RefCell<SharedState>>) -> Result<( std::mem::take(&mut s.key_bindings), std::mem::take(&mut s.event_handlers), std::mem::take(&mut s.repeat_keys), + std::mem::take(&mut s.key_descriptions), ); (s.config_dir.clone(), previous) }; - let restore = |state: &Rc<RefCell<SharedState>>, previous: (_, _, _)| { + let restore = |state: &Rc<RefCell<SharedState>>, previous: (_, _, _, _)| { let mut s = state.borrow_mut(); // Whatever the failed run managed to register before erroring is // discarded, not merged: half of a broken config is not a config. s.key_bindings = previous.0; s.event_handlers = previous.1; s.repeat_keys = previous.2; + s.key_descriptions = previous.3; }; let path = config_dir.join("init.lua"); let src = match std::fs::read_to_string(&path) { |