Add named keyboard binding modes (#32)

Add named keyboard shortcut maps with an Escape exit and a panel indicator. Keep press/release ownership across transitions, validate remapped Escape keys, and cancel stale repeats and focus previews.

Give the indicator ownership of the panel while a mode is active. Close popovers, collapse Morph, and keep Live Activities data current without resizing the hidden panel. Document configuration and transition behavior.

Validation: 1,519 workspace Rust tests passed; 70 Python tests passed. Workspace build, formatting, Clippy, and Settings configuration validation passed. Opt-in native desktop checks were not rerun because Weston is absent.

Related: #5.
This commit is contained in:
Samuel Onoja authored and GitHub committed 2026-10-12 23:22:02 +01:00
1 parent 6b0d903ad0
commit 7d58eeb65d
28 files changed
+1258 -35

No files matched your search

+10 -2
View File
@@ -22,7 +22,7 @@
DEALINGS IN THE SOFTWARE.
</copyright>
<interface name="ferese_shell_manager_v1" version="8">
<interface name="ferese_shell_manager_v1" version="9">
<description summary="create a capability-scoped Ferese shell controller">
This private global is visible only to clients granted the shell-control
capability. It does not assign a Wayland surface role.
@@ -35,7 +35,7 @@
<request name="destroy" type="destructor"/>
</interface>
<interface name="ferese_shell_v1" version="8">
<interface name="ferese_shell_v1" version="9">
<description summary="managed-window metadata and shell control">
Window, workspace, and output identifiers are unsigned 64-bit values
encoded as high and low 32-bit words. Each snapshot atomically replaces
@@ -205,5 +205,13 @@
<arg name="workspace_hi" type="uint"/>
<arg name="workspace_lo" type="uint"/>
</request>
<event name="binding_mode" since="9">
<description summary="active keyboard binding mode inside a snapshot">
Sent between snapshot_begin and snapshot_end. An empty name denotes
the default bindings. Other names must be displayed with an Escape exit
hint until the next snapshot replaces them.
</description>
<arg name="name" type="string"/>
</event>
</interface>
</protocol>