How to Configure Touchpad Gestures on Fedora (libinput)

Enable touchpad gestures on Fedora by adding specific configuration lines to the libinput local-overrides.quirk file.

Touchpad gestures refuse to work or feel wrong

You switched to Fedora because you wanted a system that respects your workflow. You sit down, swipe three fingers to switch workspaces, and nothing happens. Or worse, the scroll direction fights your muscle memory, and the settings menu offers no way to fix it. You check the desktop settings, toggle every switch, and the touchpad still behaves like a mouse from 2005. The desktop environment settings are grayed out, or they simply do not match the hardware capabilities.

The problem is rarely the settings application. The input driver layer is misinterpreting the hardware signals, or the quirk database lacks the specific override your laptop model needs. Fedora ships with a comprehensive database of hardware quirks, but new laptops or obscure models sometimes slip through. You can patch this gap by writing a local override that tells the input driver exactly how to interpret your device.

The input stack and where gestures live

Think of the input stack as a three-layer pipeline. The kernel sees the raw hardware interrupts from the touchpad controller. libinput sits in the middle, translating those interrupts into standardized events like "finger down," "finger move," and "gesture start." The desktop environment sits on top, listening to libinput and deciding what action to take, such as "switch workspace" or "scroll page."

When gestures fail, the break usually happens at the libinput layer. The driver might not recognize the touchpad as a multitouch device, or the hardware reports coordinates in a format libinput does not expect. Fedora uses libinput as the default input driver for both X11 and Wayland sessions. The desktop environment cannot enable gestures if libinput does not report them. You must fix the driver layer first.

Configuration files in /etc/ are for user modifications. Files in /usr/lib/ ship with packages and get overwritten on update. Always edit /etc/libinput/local-overrides.quirk. Never touch /usr/share/libinput/. Package updates will wipe your changes if you edit the system directory.

Identify the device and current state

Before writing overrides, you need the exact device name and current properties. The libinput tool queries the kernel input subsystem and prints the driver's view of the hardware.

Here is how to list all input devices and find your touchpad.

# List all input devices detected by libinput.
# The output shows device name, driver, and capabilities.
libinput list-devices

Look for the device with Device: SynPS/2 Synaptics TouchPad or ELAN Touchpad or ALPSPS/2 ALPS DualPoint TouchPad. Note the Device Node path, usually /dev/input/eventX. Check the Capabilities line. If you see Pointer but not Gesture, the driver is not detecting multitouch. If you see Gesture but gestures still fail, the properties might be wrong.

Here is how to filter the output for your specific device and inspect its properties.

# Replace 'Synaptics' with a substring of your device name.
# The -A flag prints lines after the match to show properties.
libinput list-devices | grep -A 30 "Synaptics"

Look for properties like LibInput Natural Scrolling Enabled, LibInput Tap Enabled, and LibInput Scroll Method. These values determine behavior. If Natural Scrolling is 0 and you want it 1, or if Scroll Method is 0 (None) and you want 2 (Two-Finger), you need a quirk override.

Write a local override quirk

The quirk file uses a simple syntax to match devices and force property values. The file is read every time a device is opened. You can override any LibInput property supported by the driver.

Here is how to create or edit the local overrides file.

# Open the local overrides file in a text editor.
# Create the file if it does not exist.
# The /etc path ensures your changes survive package updates.
sudo nano /etc/libinput/local-overrides.quirk

Add a block for your device. The first line is a match pattern. Use wildcards to catch model variations. Subsequent lines set properties.

# Match the device by name pattern.
# Use * wildcards to catch model variations.
# This pattern matches any device name containing "Synaptics".
Synaptics TouchPad:*:

    # Force natural scrolling behavior.
    # 1 enables natural scrolling, 0 disables it.
    LibInput Natural Scrolling Enabled=1

    # Enable tap-to-click.
    # 1 enables tapping, 0 disables it.
    LibInput Tap Enabled=1

    # Set scroll method to two-finger scrolling.
    # 0 is None, 1 is Edge, 2 is Two-Finger.
    LibInput Scroll Method=2

    # Set click method to button areas.
    # 1 is Button Areas, 2 is Clickfinger.
    LibInput Click Method=1

    # Adjust acceleration profile.
    # 0 is none, 1 is default, 2 is adaptive.
    # Increase speed with a value between -1.0 and 1.0.
    LibInput Accel Speed=0.5

The match pattern Synaptics TouchPad:*: uses the format Name:Driver:. The * in the driver field matches any driver. If your device name has spaces, include them. If you have multiple touchpads, use a more specific pattern like ThinkPad X1:*: to avoid affecting other devices.

Save the file and exit the editor. The changes do not take effect immediately. libinput caches quirks when the device is opened. You must restart your session for the compositor to re-open the device and read the new quirks.

Log out and back in. Restarting the display manager or running systemctl restart does not help because the running session holds the device open. A full logout forces the driver to reload.

Verify the fix

After logging back in, check that the properties have changed. The libinput list-devices output should reflect your overrides.

Here is how to confirm the properties are active.

# Filter the device output again.
# Compare the property values against your quirk file.
libinput list-devices | grep -A 30 "Synaptics"

If you see LibInput Natural Scrolling Enabled=1 and LibInput Scroll Method=2, the driver is applying your overrides. Test the gestures in the desktop environment. If the desktop settings were grayed out before, they might now be available.

If the properties changed but gestures still do not work, the issue is likely in the desktop environment configuration, not libinput. GNOME and KDE have their own gesture handlers. Check the desktop settings to ensure gestures are enabled there.

Debug gesture events directly

When gestures feel inconsistent, you need to see what libinput is actually reporting. The debug-events tool prints raw events in real time. This is the most reliable way to verify that the driver sees your finger movements.

Here is how to capture gesture events from your touchpad.

# Run debug-events with sudo to access the device node.
# Replace /dev/input/event8 with your device node from list-devices.
# Move your fingers on the touchpad to generate events.
sudo libinput debug-events --device /dev/input/event8

Move your fingers on the touchpad. You will see output like GESTURE_SWIPE_BEGIN, GESTURE_SWIPE_UPDATE, and GESTURE_SWIPE_END. The Update events show the finger count and delta coordinates.

text
event1   GESTURE_SWIPE_BEGIN    +0.00s  fingers: 3
event1   GESTURE_SWIPE_UPDATE   +0.01s  fingers: 3 dx:  12.00 dy:   0.00
event1   GESTURE_SWIPE_UPDATE   +0.02s  fingers: 3 dx:  24.00 dy:   0.00
event1   GESTURE_SWIPE_END      +0.05s  fingers: 3

If you see GESTURE_SWIPE events, libinput is working correctly. The desktop environment should receive these events. If you see only POINTER_MOTION and no gesture events, the driver is not detecting multitouch. Check the Capabilities line in list-devices. If Gesture is missing, the hardware might be reporting itself incorrectly, or the kernel module needs a parameter.

Here is how to check the kernel log for touchpad detection issues.

# Search the kernel ring buffer for touchpad related messages.
# Look for errors or module loading failures.
journalctl -k | grep -i -E "touchpad|psmouse|i2c_hid"

If you see errors like psmouse: serio interrupt timed out or i2c_hid: failed to read report descriptor, the hardware communication is failing. This requires kernel parameters or firmware updates, not libinput quirks.

Common pitfalls and error patterns

Gestures can break for reasons unrelated to quirks. Wayland sessions handle input differently than X11. In Wayland, the compositor mediates all input. If the compositor does not support gestures, libinput quirks will not help. Fedora Workstation uses GNOME on Wayland by default, which has excellent gesture support. If you are using a custom window manager like Sway or Hyprland, check its documentation for gesture configuration.

Syntax errors in the quirk file can cause libinput to ignore the entire block. The driver does not always print errors to the terminal. Check the journal for warnings.

Here is how to find libinput warnings in the journal.

# Filter journal for libinput messages.
# Look for "quirk" or "override" keywords.
journalctl -u gdm | grep -i libinput

If you see Failed to parse quirk file, check your syntax. Ensure the match pattern ends with a colon. Ensure property names are exact. Property names are case-sensitive. LibInput Natural Scrolling Enabled is correct. LibInput natural scrolling enabled is not.

Some laptops have dual touchpads or virtual touchpads created by the firmware. libinput might be reading the wrong device. Use libinput list-devices to identify all touch devices. Disable the unwanted device in the quirk file if necessary by setting LibInput Ignore=1.

Decision matrix

Use the Settings application when your touchpad works but you want to change scroll direction, sensitivity, or enable tap-to-click on a supported laptop.

Use the local overrides quirk file when the touchpad is detected but multitouch gestures fail, or when the hardware reports incorrect capabilities.

Use libinput debug-events when you need to verify that finger movements are being translated into gesture events by the driver.

Use journalctl -k when the touchpad is not detected at all, or when you see kernel errors related to psmouse or i2c_hid.

Use a third-party gesture daemon only when you are running a window manager that lacks built-in gesture support and you cannot switch to a desktop environment.

Where to go next