60 lines
2.7 KiB
Markdown
60 lines
2.7 KiB
Markdown
|
|
# Spec Delta
|
||
|
|
|
||
|
|
## Purpose
|
||
|
|
|
||
|
|
Allows users to configure keyboard shortcuts that map key combinations to application actions, with sensible built-in defaults when no configuration file exists.
|
||
|
|
|
||
|
|
## ADDED Requirements
|
||
|
|
|
||
|
|
### Requirement: Default bindings are available without configuration
|
||
|
|
The system SHALL provide built-in default bindings for all documented actions, including digits 1-4 selecting the Glider, Blinker, Block, and Toad patterns, Space rotating, Escape cancelling, and Ctrl+Q quitting.
|
||
|
|
|
||
|
|
#### Scenario: No config file present
|
||
|
|
- **WHEN** the application starts and `~/.config/wlgol/keys.conf` does not exist
|
||
|
|
- **THEN** the application uses the built-in default bindings
|
||
|
|
- **AND** creates the config file with the default contents
|
||
|
|
|
||
|
|
### Requirement: Configuration file overrides defaults by merge
|
||
|
|
The system SHALL read `~/.config/wlgol/keys.conf` as TOML when it exists and merge its entries over the built-in defaults, so only specified keys change.
|
||
|
|
|
||
|
|
#### Scenario: Partial override
|
||
|
|
- **WHEN** the config file defines a binding for key "1" only
|
||
|
|
- **THEN** key "1" uses the configured action
|
||
|
|
- **AND** all other keys keep their default bindings
|
||
|
|
|
||
|
|
#### Scenario: Full replacement of a key
|
||
|
|
- **WHEN** the config file defines a binding for a key that has a default
|
||
|
|
- **THEN** the configured action replaces the default for that key
|
||
|
|
|
||
|
|
### Requirement: Key combinations are modifier-aware
|
||
|
|
The system SHALL match a binding only when the modifiers required by the binding are active, supporting Ctrl, Shift, Alt, and Super.
|
||
|
|
|
||
|
|
#### Scenario: Modifier required
|
||
|
|
- **WHEN** the user presses Q while Ctrl is held and a `ctrl+q = quit` binding exists
|
||
|
|
- **THEN** the quit action is triggered
|
||
|
|
|
||
|
|
#### Scenario: Modifier not held
|
||
|
|
- **WHEN** the user presses Q without Ctrl while a `ctrl+q = quit` binding exists
|
||
|
|
- **THEN** the quit action is not triggered by that binding
|
||
|
|
|
||
|
|
### Requirement: Readable key aliases are supported
|
||
|
|
The system SHALL accept human-readable key names such as space, escape, enter, and arrow names in binding keys.
|
||
|
|
|
||
|
|
#### Scenario: Alias binding
|
||
|
|
- **WHEN** the config file contains `space = rotate`
|
||
|
|
- **THEN** pressing the space bar triggers the rotate action
|
||
|
|
|
||
|
|
### Requirement: Malformed entries are ignored
|
||
|
|
The system SHALL ignore malformed or unrecognized binding entries and continue using defaults for the affected keys.
|
||
|
|
|
||
|
|
#### Scenario: Invalid entry
|
||
|
|
- **WHEN** the config file contains an entry with an unknown action
|
||
|
|
- **THEN** that entry is ignored
|
||
|
|
- **AND** the application still starts successfully
|
||
|
|
|
||
|
|
### Requirement: Actions trigger on key press
|
||
|
|
The system SHALL dispatch a bound action when the corresponding key is pressed, not on release.
|
||
|
|
|
||
|
|
#### Scenario: Press triggers action
|
||
|
|
- **WHEN** the user presses a key with a valid binding
|
||
|
|
- **THEN** the bound action is invoked once for that press
|