Fix duplicated pointer axis events

In pointer.c, some axis event was emitted even if the event pointer did not have
current axis.

In X11 backend pointer scroll events seem to be composed of both BUTTON_PRESS
and BUTTON_RELEASE. Therefore we should skip one of them (RELEASE) to avoid
event duplication.
This commit is contained in:
D.B 2017-10-13 22:50:59 +02:00
parent 1df9b0bc13
commit 7cdc19d57f
2 changed files with 12 additions and 4 deletions

View File

@ -128,7 +128,7 @@ void handle_pointer_axis(struct libinput_event *event,
} }
wlr_event.delta = libinput_event_pointer_get_axis_value( wlr_event.delta = libinput_event_pointer_get_axis_value(
pevent, axies[i]); pevent, axies[i]);
wl_signal_emit(&wlr_dev->pointer->events.axis, &wlr_event);
} }
wl_signal_emit(&wlr_dev->pointer->events.axis, &wlr_event);
} }
} }

View File

@ -63,8 +63,7 @@ static bool handle_x11_event(struct wlr_x11_backend *x11, xcb_generic_event_t *e
x11->time = ev->time; x11->time = ev->time;
break; break;
} }
case XCB_BUTTON_PRESS: case XCB_BUTTON_PRESS: {
case XCB_BUTTON_RELEASE: {
xcb_button_press_event_t *ev = (xcb_button_press_event_t *)event; xcb_button_press_event_t *ev = (xcb_button_press_event_t *)event;
if (ev->detail == XCB_BUTTON_INDEX_4 || if (ev->detail == XCB_BUTTON_INDEX_4 ||
@ -79,7 +78,16 @@ static bool handle_x11_event(struct wlr_x11_backend *x11, xcb_generic_event_t *e
.delta = delta, .delta = delta,
}; };
wl_signal_emit(&x11->pointer.events.axis, &axis); wl_signal_emit(&x11->pointer.events.axis, &axis);
} else { x11->time = ev->time;
break;
}
}
/* fallthrough */
case XCB_BUTTON_RELEASE: {
xcb_button_press_event_t *ev = (xcb_button_press_event_t *)event;
if (ev->detail != XCB_BUTTON_INDEX_4 &&
ev->detail != XCB_BUTTON_INDEX_5) {
struct wlr_event_pointer_button button = { struct wlr_event_pointer_button button = {
.device = &x11->pointer_dev, .device = &x11->pointer_dev,
.time_sec = ev->time / 1000, .time_sec = ev->time / 1000,