enum libinput_button_state state;
if ((current & 0x1) ^ (old & 0x1)) {
+ uint32_t b;
+
if (!!(current & 0x1))
state = LIBINPUT_BUTTON_STATE_PRESSED;
else
state = LIBINPUT_BUTTON_STATE_RELEASED;
+ b = evdev_to_left_handed(tp->device, button);
evdev_pointer_notify_button(tp->device,
time,
- button,
+ b,
state);
}
}
if ((button & MIDDLE) || ((button & LEFT) && (button & RIGHT)))
- button = BTN_MIDDLE;
+ button = evdev_to_left_handed(tp->device, BTN_MIDDLE);
else if (button & RIGHT)
- button = BTN_RIGHT;
- else
+ button = evdev_to_left_handed(tp->device, BTN_RIGHT);
+ else if (button & LEFT)
+ button = evdev_to_left_handed(tp->device, BTN_LEFT);
+ else /* main area is always BTN_LEFT */
button = BTN_LEFT;
tp->buttons.active = button;
return LIBINPUT_CONFIG_SEND_EVENTS_ENABLED;
}
+static void
+tp_change_to_left_handed(struct evdev_device *device)
+{
+ struct tp_dispatch *tp = (struct tp_dispatch *)device->dispatch;
+
+ if (device->buttons.want_left_handed == device->buttons.left_handed)
+ return;
+
+ if (tp->buttons.state & 0x3) /* BTN_LEFT|BTN_RIGHT */
+ return;
+
+ /* tapping and clickfinger aren't affected by left-handed config,
+ * so checking physical buttons is enough */
+
+ device->buttons.left_handed = device->buttons.want_left_handed;
+}
+
struct evdev_dispatch *
evdev_mt_touchpad_create(struct evdev_device *device)
{
tp->sendevents.config.get_mode = tp_sendevents_get_mode;
tp->sendevents.config.get_default_mode = tp_sendevents_get_default_mode;
+ evdev_init_left_handed(device, tp_change_to_left_handed);
+
return &tp->base;
}