Skip to content

Avoiding libinput wobble detection/hysteresis on the Framework 13 Pro touchpad #388

Open

Description

@sunshowers

Hi there!

Have been using a Framework 13 Pro with Linux and I've been really loving the laptop! I'm not quite sure where this should go, so wanted to put in a couple of notes:

  1. You really want libinput wobble detection turned off. The sensor is absolutely pristine and if libinput detects a wobble, it'll turn on hysteresis, which will make the touchpad feel a lot worse until you log out and log back in again, or reboot.

  2. I investigated how to turn hysteresis detection off and it seems like the way to do that is to use a plugin.

    -- SPDX-License-Identifier: 0BSD
    --
    -- Disable libinput's touchpad hysteresis on the PixArt 093A:1343 haptic
    -- touchpad (Framework Laptop 13 Pro).
    
    libinput:register({1})
    
    libinput:connect("new-evdev-device", function(device)
        local info = device:info()
        if info.vid == 0x093A and info.pid == 0x1343 and
           device:udev_properties()["ID_INPUT_TOUCHPAD"] then
            libinput:log_info("Disabling touchpad hysteresis on " .. device:name())
            device:disable_feature("touchpad-hysteresis")
        end
    end)
  3. But while trying to make this plugin work I ran into a bug in libinput, which I fixed in https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1533 (landed in libinput main, not in a release yet).

I've been running with that libinput patch and the plugin applied, and it's been fantastic -- a truly lovely touchpad experience.

You may want to incorporate this into your official Linux installation somewhere (might require working with distro maintainers) -- it makes the touchpad feel a million times better! You may also want to work with the libinput folks to see if they can add a quirk or similar to permanently exclude your touchpad from wobble detection. The hardware is so good -- it deserves correspondingly excellent software.

Thanks!

Activity

  1. changed the title [-]Avoiding hysteresis detection on the Framework 13 Pro[/-] [+]Avoiding hysteresis detection on the Framework 13 Pro touchpad[/+] on Nov 9, 2026
  2. changed the title [-]Avoiding hysteresis detection on the Framework 13 Pro touchpad[/-] [+]Avoiding wobble detection on the Framework 13 Pro touchpad[/+] on Nov 9, 2026
  3. changed the title [-]Avoiding wobble detection on the Framework 13 Pro touchpad[/-] [+]Avoiding wobble detection/hysteresis on the Framework 13 Pro touchpad[/+] on Nov 9, 2026
  4. changed the title [-]Avoiding wobble detection/hysteresis on the Framework 13 Pro touchpad[/-] [+]Avoiding libinput wobble detection/hysteresis on the Framework 13 Pro touchpad[/+] on Nov 9, 2026
  5. JohnAZoidberg commented on Nov 9, 2026

    @JohnAZoidberg
    Member

    Cool, thanks!

    We expect people to run standard distributions, so this would be good to change upstream instead of distributing a custom plugin.
    We do ship systems prebuilt with linux now, but we try to stay as close to vanilla distro as possible.

    I think this should be done with a quirk, that disables hysteresis on a touchpad if the PID matches. Please add me as reviewer, if you add it.

  6. sunshowers commented on Nov 9, 2026

    @sunshowers
    Author

    Thanks @JohnAZoidberg. I've filed this as https://gitlab.freedesktop.org/libinput/libinput/-/work_items/1364. Not sure what your username is on that gitlab but please feel free to cc yourself and chime in!

  7. JohnAZoidberg commented on Nov 9, 2026

    @JohnAZoidberg
    Member

    I'm glad the module works well! It took months of effort to get the tuning right, especially of the haptic feedback.

  8. sunshowers commented on Nov 10, 2026

    @sunshowers
    Author
  9. sunshowers commented on Nov 10, 2026

    @sunshowers
    Author

    and MR up at gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1537 :)

    This is landed.

    Think I've done my part. The ball is now in y'all's court. Based on my experience running this patch, I think it would really be worth trying it out yourself (for steps to reproduce, see https://gitlab.freedesktop.org/libinput/libinput/-/work_items/1364; for the fix, any recent LLM should be able to build a package for you with little effort). If you think it is as dramatic an improvement as I think it is, it might be worth getting this fixed in the respective packages of the distros you work with, even before they pick up the next stable release.

    Notes for backporters

    You'll want to cherry-pick/apply three patches, all of which should be easily backportable to 1.32. In order from first to last:

    • baf5b097 "touchpad: don't let wobble detection re-enable hysteresis disabled by a plugin"
    • 1cf63c30 "quirks: add AttrTouchpadHysteresis to enable or disable the hysteresis"
    • d00edd6d "quirks: disable the hysteresis on the Framework Laptop 13 Pro touchpad"

    edit: for clarity, after these are applied, you no longer need the lua plugin in the OP.

  10. sunshowers commented on Nov 10, 2026

    @sunshowers
    Author

    Note that the quirk is specific to the 13 Pro. My understanding is that the regular 13 can also be upgraded to the same touchpad. The existing quirk won't apply there, but if the touchpad is jitter-free on those laptops too, the quirk could be broadened:

    --- a/quirks/50-system-framework.quirks
    +++ b/quirks/50-system-framework.quirks
    @@ -6,13 +6,14 @@
     MatchDMIModalias=dmi:*:svnFramework:pnLaptop16*:*
     AttrKeyboardIntegration=internal
    
    -# Framework Laptop 13 Pro haptic touchpad, known to be jitter-free.
    -# Limited to the Laptop 13 Pro for now since that's the only system
    -# this has been verified on.
    -[Framework Laptop 13 Pro Haptic Touchpad]
    +# Framework haptic touchpad, known to be jitter-free. Ships in the
    +# Laptop 13 Pro, and in the Laptop 13 Pro Input Cover Kit that also fits
    +# earlier Laptop 13 mainboards, so match on the vendor rather than the
    +# product name.
    +[Framework Haptic Touchpad]
     MatchBus=i2c
     MatchUdevType=touchpad
     MatchVendor=0x093A
     MatchProduct=0x1343
    -MatchDMIModalias=dmi:*:svnFramework:pnLaptop13Pro*:*
    +MatchDMIModalias=dmi:*:svnFramework:*
     AttrTouchpadHysteresis=0
  11. sudomateo commented on Nov 10, 2026

    @sudomateo

    I run Niri on NixOS and I used this configuration to pull in the listed patches. The trackpad feels great after this. I was wondering why the trackpad seemingly felt worse after the initial login but I never dug into it. Thank you @sunshowers for the work and writeup here! Sharing my Nix configuration if others find it useful, though you can just point an LLM at this issue and it'll do the needful.

      programs.niri.package = pkgs.niri.override {
        libinput = pkgs.libinput.overrideAttrs (old: {
          patches = (old.patches or [ ]) ++ [
            (pkgs.fetchpatch {
              url = "https://gitlab.freedesktop.org/libinput/libinput/-/commit/baf5b097eb22ac6c9fdda8969441c0ad378ce93e.patch";
              hash = "sha256-H0saY2tYpYo+saf0XJuCaq6lOOIpiW5r2O52ZYCOd00=";
            })
            (pkgs.fetchpatch {
              url = "https://gitlab.freedesktop.org/libinput/libinput/-/commit/1cf63c3026e56e079d99dddb2908a697e1541488.patch";
              hash = "sha256-MOGB+LfqPmlaUVIMSXB3uD51xtDcDcBqPK+deiEQ9ac=";
            })
            (pkgs.fetchpatch {
              url = "https://gitlab.freedesktop.org/libinput/libinput/-/commit/d00edd6dcded0bdbfc5a4c3b6bffacfa30f0e8c1.patch";
              hash = "sha256-fvkAh0+z9JxLNKDFdmlhE/Yq7x4NRxGFwaPPLrZ2Yak=";
            })
          ];
        });
      };
  12. anarcat commented on Nov 11, 2026

    @anarcat

    sorry to barge into your issue, but I'm wondering if the FW12 has the same touchpad as the Pro, because i'm seeing weird touchpad issues right now and i wonder if it's related to this.

    thanks for this great work!

  13. sudomateo commented on Nov 11, 2026

    @sudomateo

    I'm wondering if the FW12 has the same touchpad as the Pro

    You're not barging in at all. It's a good question.

    They use different touchpads. The 13 Pro is the first model to use this non-mechanical touchpad. The 12 has the mechanical version.

  14. sunshowers commented on Nov 11, 2026

    @sunshowers
    Author

    @anarcat I think the way to find out would be to try and get a libinput recording going with

    • a perfectly still finger on the touchpad, to determine how jitter-free the sensor is
    • moving a finger very slowly in one direction to see the units go up one at a time
    • moving it back and forth horizontally until wobble detection kicks in

    If you're ok using an LLM, one should be able to guide you through this process; otherwise, see the libinput docs. If it is jitter-free then it can excluded from wobble detection as a libinput quirk, similar to my patch. You will need the first two patches linked above to make the quirk function properly.

  15. JohnAZoidberg commented on Nov 12, 2026

    @JohnAZoidberg
    Member

    They use different touchpads. The 13 Pro is the first model to use this non-mechanical touchpad. The 12 has the mechanism version.

    Technically a touchpad could be using the same finger location (capacitive touch) sensing no matter if it has a button or haptic.

    In practice they don't, the Laptop 12 uses a different, cheaper chip with slightly lower resolution. For cost optimization but also because the sensing area is physically smaller.

    Laptop 13 and Laptop 16 use the same captouch sensing as each other. But the haptic and clickpad models have a different one.

    Platform Type VID PID IC
    Wireless Touchpad Keyboard Click 093A 0361 PCT1036
    Laptop 12 Click 093A 0239 PCT2642
    Laptop 13 Click 093A 0274 PCT3854
    Laptop 13 Haptic 093A 1363 PCT4802
    Laptop 16 Click 093A 0274 PCT3854
    Laptop 16 Haptic 093A 1363 PCT4802

    All our touchpads are quite high quality, so after double-checking the recording we can probably enable it for all of them.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions