Fixed horizontal scrolling on Logitech MX Master 2S/3
authorJakub Schmidtke <sjakub@gmail.com>
Mon, 30 Sep 2019 23:34:45 +0000 (23:34 +0000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Wed, 16 Oct 2019 03:38:23 +0000 (13:38 +1000)
Logitech MX Master 2S and 3 by default use natural scrolling
for the horizontal scroll wheel, while the main wheel
uses traditional mode. This change inverts the default
direction of horizontal scrolling.

(cherry picked from commit 8490384c688f6e6045414991a17d2c4a69cec858)

quirks/30-vendor-logitech.quirks
src/evdev.c
src/evdev.h
src/quirks.c
src/quirks.h

index 7292234e7f475c683e5e6f397af811a14532b36c..d864c208043ce50e132d157053371758bf5e4412 100644 (file)
@@ -45,3 +45,13 @@ MatchBus=usb
 MatchVendor=0x046D
 MatchProduct=0x4011
 AttrPalmPressureThreshold=400
+
+[Logitech MX Master 2S]
+MatchVendor=0x46D
+MatchProduct=0x4069
+ModelInvertHorizontalScrolling=1
+
+[Logitech MX Master 3]
+MatchVendor=0x46D
+MatchProduct=0x4082
+ModelInvertHorizontalScrolling=1
index 353aff5bc74d52a760baade64347693059e8ca7e..99713f2c2cdbca3f4a313db2f80f59046b215561 100644 (file)
@@ -357,6 +357,11 @@ evdev_notify_axis(struct evdev_device *device,
        struct normalized_coords delta = *delta_in;
        struct discrete_coords discrete = *discrete_in;
 
+       if (device->scroll.invert_horizontal_scrolling) {
+               delta.x *= -1;
+               discrete.x *= -1;
+       }
+
        if (device->scroll.natural_scrolling_enabled) {
                delta.x *= -1;
                delta.y *= -1;
@@ -1841,6 +1846,10 @@ evdev_configure_device(struct evdev_device *device)
                return NULL;
        }
 
+       if (evdev_device_has_model_quirk(device, QUIRK_MODEL_INVERT_HORIZONTAL_SCROLLING)) {
+               device->scroll.invert_horizontal_scrolling = true;
+       }
+
        return fallback_dispatch_create(&device->base);
 }
 
index dd5b45d5ce9dadd849d20c9b95a8722578aef696..7de1fea95d209ee2bfc2ed4cdf0b89d91bf10e56 100644 (file)
@@ -216,6 +216,10 @@ struct evdev_device {
                 * used at runtime to enable/disable the feature */
                bool natural_scrolling_enabled;
 
+               /* set during device init to invert direction of
+                * horizontal scrolling */
+               bool invert_horizontal_scrolling;
+
                /* angle per REL_WHEEL click in degrees */
                struct wheel_angle wheel_click_angle;
 
index 444cdfaaf924b00516d02377b7348a50bb0aa99a..7c0b75a4ac9efbf09d3c3a2e86d30141f54a9c60 100644 (file)
@@ -239,6 +239,7 @@ quirk_get_name(enum quirk q)
        case QUIRK_MODEL_HP_PAVILION_DM4_TOUCHPAD:      return "ModelHPPavilionDM4Touchpad";
        case QUIRK_MODEL_HP_STREAM11_TOUCHPAD:          return "ModelHPStream11Touchpad";
        case QUIRK_MODEL_HP_ZBOOK_STUDIO_G3:            return "ModelHPZBookStudioG3";
+       case QUIRK_MODEL_INVERT_HORIZONTAL_SCROLLING:   return "ModelInvertHorizontalScrolling";
        case QUIRK_MODEL_LENOVO_L380_TOUCHPAD:          return "ModelLenovoL380Touchpad";
        case QUIRK_MODEL_LENOVO_SCROLLPOINT:            return "ModelLenovoScrollPoint";
        case QUIRK_MODEL_LENOVO_T450_TOUCHPAD:          return "ModelLenovoT450Touchpad";
index dd9265d2280dce4a9ebfa882f06ef3b0040cba27..88159b591008f7a5fed1651a7baafaf819461e95 100644 (file)
@@ -71,6 +71,7 @@ enum quirk {
        QUIRK_MODEL_HP_PAVILION_DM4_TOUCHPAD,
        QUIRK_MODEL_HP_STREAM11_TOUCHPAD,
        QUIRK_MODEL_HP_ZBOOK_STUDIO_G3,
+       QUIRK_MODEL_INVERT_HORIZONTAL_SCROLLING,
        QUIRK_MODEL_LENOVO_L380_TOUCHPAD,
        QUIRK_MODEL_LENOVO_SCROLLPOINT,
        QUIRK_MODEL_LENOVO_T450_TOUCHPAD,