Skip to main content

Input Devices

Input configuration is a set of plain read/write properties on kiln.input. Writing one applies it; reading one returns the last value you wrote (there is no readback from the hardware). The kiln.input reference lists all 11 properties with their defaults.

1. Keyboard layout​

Set the keymap once at the top of your config:

local kiln = require("kiln")

kiln.input.keymap = { layout = "us", variant = "colemak" }

All five fields are optional; unset ones take XKB defaults. options takes the usual XKB option string, for example options = "caps:escape".

2. Layout switching with a bar indicator​

Because kiln.input reads back what you wrote, the store doubles as the state for an indicator. A toggle bind plus a bar cell:

local layouts = { "us", "de" }

kiln.input.keymap = { layout = layouts[1] }

kiln.key {
mods = { "mod" }, key = "i",
desc = "switch keyboard layout", group = "input",
press = function()
local cur = kiln.input.keymap and kiln.input.keymap.layout
local next_i = 1
for i, l in ipairs(layouts) do
if l == cur then
next_i = i % #layouts + 1
end
end
kiln.input.keymap = { layout = layouts[next_i] }
kiln.dirty()
end,
}

-- In your bar function:
screen.on("added", function(s)
kiln.ui.bar(s, { edge = "top" }, function()
kiln.widgets.taglist(s)
kiln.ui.spacer()
kiln.ui.text((kiln.input.keymap and kiln.input.keymap.layout or "us"),
{ size = 12, color = kiln.theme.muted })
kiln.widgets.clock()
end)
end)

The bar function re-runs on every redraw, so the kiln.dirty() after the keymap write is what refreshes the label.

3. Repeat and numlock​

kiln.input.repeat_rate = 40
kiln.input.repeat_delay = 300
kiln.input.numlock = true

Rate and delay always travel together to the keyboard, which is why both have defaults: writing one keeps the other's current value.

4. Set up the touchpad and mouse​

kiln.input.tap_to_click = true
kiln.input.natural_scrolling = true
kiln.input.accel_profile = "flat"
kiln.input.accel_speed = 0.3
kiln.input.scroll_method = "two_finger"
kiln.input.click_method = "clickfinger"

Each write sends only that field; everything else on the device is untouched. A device that does not support a given setting ignores it, so a config written for a touchpad is harmless on a desktop mouse.

5. The all-devices caveat​

warning

Input settings apply to every device of their kind: there is no per-device targeting. A pointer write configures all pointer devices present at that moment, and a device plugged in later starts with its own defaults until the property is written again. If you hotplug mice or keyboards regularly, re-apply your settings from a bind, or simply reload the config, which re-runs the writes.

See also​