evdev: enable middle button configuration on some devices
authorPeter Hutterer <peter.hutterer@who-t.net>
Tue, 14 Apr 2015 04:41:39 +0000 (14:41 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Fri, 17 Apr 2015 02:50:08 +0000 (12:50 +1000)
Devices that have left and right buttons but no middle button get middle
button emulation (without config). Devices that have a middle button too get
a config option but default to off. Most mice have LMR set as buttons,
regardless whether they have a middle button.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
src/evdev.c

index 6ca874a146a0fe249a3a0735ac9f9c38b211c9f6..da33eaeb93a42648b0819a02a825fe832c283163 100644 (file)
@@ -1143,6 +1143,24 @@ fallback_dispatch_create(struct libinput_device *device)
        evdev_init_calibration(evdev_device, dispatch);
        evdev_init_sendevents(evdev_device, dispatch);
 
+       /* BTN_MIDDLE is set on mice even when it's not present. So
+        * we can only use the absense of BTN_MIDDLE to mean something, i.e.
+        * we enable it by default on anything that only has L&R.
+        * If we have L&R and no middle, we don't expose it as config
+        * option */
+       if (libevdev_has_event_code(evdev_device->evdev, EV_KEY, BTN_LEFT) &&
+           libevdev_has_event_code(evdev_device->evdev, EV_KEY, BTN_RIGHT)) {
+               bool has_middle = libevdev_has_event_code(evdev_device->evdev,
+                                                         EV_KEY,
+                                                         BTN_MIDDLE);
+               bool want_config = has_middle;
+               bool enable_by_default = !has_middle;
+
+               evdev_init_middlebutton(evdev_device,
+                                       enable_by_default,
+                                       want_config);
+       }
+
        return dispatch;
 }