Summary
The Accel Profile combo on the Input page offers default as its first entry. default is not a value niri accepts: accel-profile takes only "adaptive" or "flat". Selecting default writes default, so the pre-save niri validate fails and no change can be saved until that value is reset.
The guard works as designed and config.kdl on disk is never touched. But picking default it leaves the config unsaveable until the value is reset.
Steps to reproduce
- Start from a config.kdl whose touchpad block has no accel-profile key:
input {
touchpad {
tap
natural-scroll
}
}
-
Open NiriMod → Input → expand Touchpad → Accel Profile.
-
Select flat (or adaptive), then save
-
Select default again, then save again
Expected
Selecting default removes the accel-profile key, letting niri apply the device default. Saving succeeds.
Root cause
On the niri side, for reference: accel-profile accepts only adaptive and flat, case-sensitively. There is no neutral value. Omitting the key is how you say "leave the device default", and niri then queries libinput rather than forcing adaptive.
Other choice lists in the project, like pages/workspaces.py:145-155 already does exactly the job to remove the problem. In fact, the code maps the "(any)" choice to a remove_child call rather than writing it out. ACCEL_PROFILES appears to be the only one written back default choice, so this looks like an oversight on the Input page rather than a design choice.
Summary
The Accel Profile combo on the Input page offers default as its first entry. default is not a value niri accepts: accel-profile takes only "adaptive" or "flat". Selecting default writes default, so the pre-save niri validate fails and no change can be saved until that value is reset.
The guard works as designed and config.kdl on disk is never touched. But picking default it leaves the config unsaveable until the value is reset.
Steps to reproduce
Open NiriMod → Input → expand Touchpad → Accel Profile.
Select flat (or adaptive), then save
Select default again, then save again
Expected
Selecting default removes the accel-profile key, letting niri apply the device default. Saving succeeds.
Root cause
On the niri side, for reference: accel-profile accepts only adaptive and flat, case-sensitively. There is no neutral value. Omitting the key is how you say "leave the device default", and niri then queries libinput rather than forcing adaptive.
Other choice lists in the project, like pages/workspaces.py:145-155 already does exactly the job to remove the problem. In fact, the code maps the "(any)" choice to a remove_child call rather than writing it out. ACCEL_PROFILES appears to be the only one written back default choice, so this looks like an oversight on the Input page rather than a design choice.