Track mouse button values. When the kernel drops, don't
send notify again about a button, that's already pressed or released.
---
 src/evdev.c |   32 ++++++++++++++++++++++++++++++--
 src/evdev.h |    3 +++
 2 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/src/evdev.c b/src/evdev.c
index d2954b5..3740702 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -61,6 +61,20 @@ evdev_led_update(struct evdev_device *device, enum 
weston_led leds)
 }
 
 static inline void
+evdev_process_syn(struct evdev_device *device, struct input_event *e, int time)
+{
+       switch (e->code) {
+       case SYN_DROPPED:
+               device->button_sync_drop = ~0;
+               break;
+       case SYN_REPORT:
+       default:
+               device->pending_events |= EVDEV_SYN;
+               break;
+       }
+}
+
+static inline void
 evdev_process_key(struct evdev_device *device, struct input_event *e, int time)
 {
        if (e->value == 2)
@@ -75,12 +89,26 @@ evdev_process_key(struct evdev_device *device, struct 
input_event *e, int time)
        case BTN_FORWARD:
        case BTN_BACK:
        case BTN_TASK:
+               {
+               const uint32_t button_bit = (1 << (e->code - BTN_MOUSE));
+
+               if (device->button_sync_drop & button_bit) {
+                       const int last_value = !!(device->button_down_cache & 
button_bit);
+                       if (last_value == e->value)
+                               return;
+                       device->button_sync_drop &= ~button_bit;
+               }
                notify_button(device->seat,
                              time, e->code,
                              e->value ? WL_POINTER_BUTTON_STATE_PRESSED :
                                         WL_POINTER_BUTTON_STATE_RELEASED);
-               break;
 
+               if (e->value)
+                       device->button_down_cache |=  button_bit;
+               else
+                       device->button_down_cache &= ~button_bit;
+               }
+               break;
        default:
                notify_key(device->seat,
                           time, e->code,
@@ -308,7 +336,7 @@ fallback_process(struct evdev_dispatch *dispatch,
                evdev_process_key(device, event, time);
                break;
        case EV_SYN:
-               device->pending_events |= EVDEV_SYN;
+               evdev_process_syn(device, event, time);
                break;
        }
 }
diff --git a/src/evdev.h b/src/evdev.h
index eb5c868..3bdfc65 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -77,6 +77,9 @@ struct evdev_device {
        enum evdev_device_capability caps;
 
        int is_mt;
+
+       uint32_t button_down_cache;
+       uint32_t button_sync_drop;
 };
 
 /* copied from udev/extras/input_id/input_id.c */
-- 
1.7.10.4

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to