From 837a041abd5449c7423eb6e9e95be18f831404a6 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 23 Sep 2014 14:35:42 +1000 Subject: [PATCH] touchpad: hook up left-handed configuration Tapping and clickfinger is unaffected, physical and software buttons are swapped. The main area of a clickpad remains as left button though. Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- src/evdev-mt-touchpad-buttons.c | 13 +++++++++---- src/evdev-mt-touchpad.c | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c index 21417ab9..3dcc8b0b 100644 --- a/src/evdev-mt-touchpad-buttons.c +++ b/src/evdev-mt-touchpad-buttons.c @@ -661,14 +661,17 @@ tp_post_physical_buttons(struct tp_dispatch *tp, uint64_t time) 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); } @@ -758,10 +761,12 @@ tp_post_softbutton_buttons(struct tp_dispatch *tp, uint64_t time) } 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; diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index 56f46ece..a8d12e42 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -1056,6 +1056,23 @@ tp_sendevents_get_default_mode(struct libinput_device *device) 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) { @@ -1078,5 +1095,7 @@ 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; } -- 2.34.1