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>
Mon, 30 Sep 2019 23:34:45 +0000 (23:34 +0000)
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.

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 0728b4dbf199ffc671d93817c208b47f2452d0b3..60a599e72fd9b6c6ac9fae4ccc3d83d6edf8ffb2 100644 (file)
@@ -356,6 +356,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;
@@ -1840,6 +1845,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 cb5ee34b0bf2d57f33676233ba5bb7de7e2d8dc2..8c0bb96e2f7ca5e256f0a01ac817088c0b91d162 100644 (file)
@@ -238,6 +238,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,