Skip to main content
Version: 2.1 (dev)

awful.input somewm-only

Runtime input device configuration for SomeWM. This API is unique to SomeWM and not available in AwesomeWM.

Usage​

local awful = require("awful")

-- Set properties
awful.input.tap_to_click = 1
awful.input.natural_scrolling = 1

-- Get properties
print(awful.input.accel_speed)

Pointer Properties​

PropertyTypeDefaultDescription
tap_to_clicknumber (0/1)0Enable tap-to-click on touchpads
natural_scrollingnumber (0/1)0Invert scroll direction (macOS-style)
accel_speednumber0.0Pointer acceleration (-1.0 to 1.0)
scroll_buttonnumber0Button for scroll-on-button-down
left_handednumber (0/1)0Swap left/right mouse buttons
middle_button_emulationnumber (0/1)0Emulate middle button with left+right
scroll_methodstringnilScroll method (see below)
accel_profilestringnilAcceleration profile (see below)
tap_and_dragnumber (0/1)1Enable tap-and-drag
drag_locknumber (0/1)0Enable drag lock
tap_3fg_dragnumber (0/1)-1Three-finger drag (tap 3 fingers, drag with 1)
disable_while_typingnumber (0/1)1Disable while typing
dwtpnumber (0/1)-1Disable touchpad while trackpoint in use (ThinkPad)
scroll_button_locknumber (0/1)-1Scroll button toggle vs hold (1=toggle, 0=hold)
clickfinger_button_mapstringnilButton map for clickfinger mode (see below)
tap_button_mapstringnilButton map for tap-to-click mode (see below)
click_methodstringnilClick method: "none", "button_areas", "clickfinger"
send_events_modestringnilSend events mode: "enabled", "disabled", "disabled_on_external_mouse"

For Boolean number arguments (0/1) a value of -1 means leave it untouched (i.e., at the device default).

Button Maps​

The tap_button_map and clickfinger_button_map settings control which mouse button is triggered by multi-finger taps/clicks:

Value1 finger2 fingers3 fingers
"lrm"LeftRightMiddle
"lmr"LeftMiddleRight

Scroll Button​

The scroll_button setting specifies which button activates scroll-on-button mode. Common values:

ValueButton
0Device default
274Middle mouse button (common for TrackPoints)
8Back/thumb button

Scroll Methods​

ValueMethod
nilDefault (device-dependent)
"two_finger"Two-finger scrolling
"edge"Edge scrolling
"button"Button scrolling

Acceleration Profiles​

ValueProfile
"adaptive"Adaptive (accelerates with speed)
"flat"Flat (constant speed)

Keyboard Properties​

PropertyTypeDefaultDescription
xkb_layoutstring"us"Keyboard layout (e.g., "us", "de", "us,ru")
xkb_variantstring""Layout variant (e.g., "dvorak", "colemak")
xkb_optionsstring""XKB options (e.g., "ctrl:nocaps")
xkb_modelstring""XKB model (e.g., "pc105")
xkb_rulesstring""XKB rules (e.g., "base")
numlockboolean-Toggle NumLock on/off
keyboard_repeat_ratenumber25Key repeat rate (keys per second)
keyboard_repeat_delaynumber600Delay before repeat starts (milliseconds)
Repeat timing vs. the keymap

keyboard_repeat_rate and keyboard_repeat_delay are sent to clients, which perform the repeating themselves. The keymap carries a separate per-key flag deciding whether a key may repeat at all, and a key that defines an explicit action has that flag off. These two properties do not override it. See Key Repeat Is Client-Side.

Common XKB Options​

OptionEffect
ctrl:nocapsCaps Lock acts as Ctrl
ctrl:swapcapsSwap Caps Lock and Ctrl
compose:raltRight Alt is Compose key
grp:alt_shift_toggleAlt+Shift switches layouts
grp:win_space_toggleSuper+Space switches layouts
Wayland Limitation

grp:* toggle options do not automatically switch layouts on Wayland. Use explicit keybindings instead. See Keyboard Layout Switching for workarounds.

Input Rules​

Per-device input configuration using the same { rule, properties } pattern as client rules. Rules let you apply different settings to different devices, for example enabling natural scrolling on your touchpad but not your mouse.

How Rules Work​

Each rule has a condition that matches devices and properties to apply. Rules are evaluated in order; later matches override earlier ones per property. Global awful.input.* settings act as defaults when no rule matches.

awful.input.rules = {
{ rule = { type = "touchpad" },
properties = { natural_scrolling = 1, tap_to_click = 1 } },
{ rule = { type = "pointer" },
properties = { natural_scrolling = 0, accel_profile = "flat" } },
}

Rule Conditions​

FieldTypeDescription
typestringDevice type: "touchpad" or "pointer" (mice, trackballs, trackpoints)
namestringSubstring match against the device name (e.g., "Logitech G502")

Both fields are optional. Omitting a field matches all devices. When both are present, both must match.

Device names match the names libinput reports; the Input Devices guide shows how to discover them.

Rule Properties​

Rules accept any pointer property listed above. Keyboard properties are not per-device and cannot be used in rules.

Per-Device Override​

Target a specific device by name:

awful.input.rules = {
{ rule = { type = "touchpad" },
properties = { natural_scrolling = 1 } },
{ rule = { name = "Logitech G502" },
properties = { accel_speed = -0.5, accel_profile = "flat" } },
}

Precedence​

  1. Start with global defaults (awful.input.* properties)
  2. Apply each matching rule in order
  3. Last matching rule wins for any given property
-- Global default: natural scrolling on for everything
awful.input.natural_scrolling = 1

-- Override: turn it off for mice only
awful.input.rules = {
{ rule = { type = "pointer" },
properties = { natural_scrolling = 0 } },
}
-- Result: touchpads get natural scrolling (global), mice don't (rule override)

Clearing Rules​

Set to nil to remove all rules and revert to global-only behavior:

awful.input.rules = nil

Example Configuration​

-- In rc.lua
local awful = require("awful")

-- Global defaults (apply to all devices unless overridden by rules)
awful.input.disable_while_typing = 1
awful.input.keyboard_repeat_rate = 30
awful.input.keyboard_repeat_delay = 300
awful.input.xkb_layout = "us"
awful.input.xkb_options = "ctrl:nocaps,compose:ralt"

-- Per-device rules
awful.input.rules = {
{ rule = { type = "touchpad" },
properties = {
natural_scrolling = 1,
tap_to_click = 1,
tap_3fg_drag = 1,
accel_speed = 0.3,
dwtp = 1, -- Disable touchpad while using trackpoint (ThinkPad)
} },
{ rule = { type = "pointer" },
properties = {
natural_scrolling = 0,
accel_profile = "flat",
} },
}

See Also​