diff options
author | Tony Crisci <tony@dubstepdish.com> | 2017-10-16 06:31:53 -0400 |
---|---|---|
committer | Tony Crisci <tony@dubstepdish.com> | 2017-10-16 06:31:53 -0400 |
commit | 3f3110452c28abf017bba7559ec9da7eabf099ea (patch) | |
tree | 8647d61a3572fa052277f8c71ef8260e64f23329 | |
parent | 34f27ff691d046355d68c7d6a2e0dfb438bd7755 (diff) |
wlr-seat: pointer state button info
-rw-r--r-- | include/wlr/types/wlr_seat.h | 11 | ||||
-rw-r--r-- | types/wlr_seat.c | 18 |
2 files changed, 25 insertions, 4 deletions
diff --git a/include/wlr/types/wlr_seat.h b/include/wlr/types/wlr_seat.h index cc7a5927..f5d5c357 100644 --- a/include/wlr/types/wlr_seat.h +++ b/include/wlr/types/wlr_seat.h @@ -75,11 +75,16 @@ struct wlr_seat_pointer_state { struct wlr_seat_handle *focused_handle; struct wlr_surface *focused_surface; - struct wl_listener surface_destroy; - struct wl_listener resource_destroy; - struct wlr_seat_pointer_grab *grab; struct wlr_seat_pointer_grab *default_grab; + + uint32_t button_count; + uint32_t grab_button; + uint32_t grab_serial; + uint32_t grab_time; + + struct wl_listener surface_destroy; + struct wl_listener resource_destroy; }; struct wlr_seat_keyboard { diff --git a/types/wlr_seat.c b/types/wlr_seat.c index 1285f2ee..bad0e5cf 100644 --- a/types/wlr_seat.c +++ b/types/wlr_seat.c @@ -538,8 +538,24 @@ void wlr_seat_pointer_notify_motion(struct wlr_seat *wlr_seat, uint32_t time, uint32_t wlr_seat_pointer_notify_button(struct wlr_seat *wlr_seat, uint32_t time, uint32_t button, uint32_t state) { + if (state == WL_POINTER_BUTTON_STATE_PRESSED) { + if (wlr_seat->pointer_state.button_count == 0) { + wlr_seat->pointer_state.grab_button = button; + wlr_seat->pointer_state.grab_time = time; + } + wlr_seat->pointer_state.button_count++; + } else { + wlr_seat->pointer_state.button_count--; + } + struct wlr_seat_pointer_grab *grab = wlr_seat->pointer_state.grab; - return grab->interface->button(grab, time, button, state); + uint32_t serial = grab->interface->button(grab, time, button, state); + + if (wlr_seat->pointer_state.button_count == 1) { + wlr_seat->pointer_state.grab_serial = serial; + } + + return serial; } void wlr_seat_pointer_notify_axis(struct wlr_seat *wlr_seat, uint32_t time, |