Skip to main content

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")
numlockboolean-Toggle NumLock on/off
keyboard_repeat_ratenumber25Key repeat rate (keys per second)
keyboard_repeat_delaynumber600Delay before repeat starts (milliseconds)

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.

Finding Device Names

To see connected device names, use a Lua snippet:

somewm-client eval 'for _, d in ipairs(awesome._get_input_devices and awesome._get_input_devices() or {}) do print(d) end'

Or check your system's libinput device list:

libinput list-devices | grep "Device:"

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