Call dragloop callback on DRAG_SUCCESS

A race condition is possible. For example, if we first receive a
XCB_MOTION_NOTIFY event and then, while drain_drag_events is still
running, a XCB_BUTTON_RELEASE event the first event is never handled
because we return.

This fixes the flakiness of the tests in #3085.
This commit is contained in:
Orestis Floros 2018-08-21 21:10:02 +03:00
parent e8dee4308a
commit 2c78f2458c
No known key found for this signature in database
GPG Key ID: E9AD9F32E401E38F
1 changed files with 8 additions and 3 deletions

View File

@ -742,9 +742,14 @@ static bool drain_drag_events(EV_P, struct drag_x11_cb *dragloop) {
free(event); free(event);
if (dragloop->result != DRAGGING) { if (dragloop->result != DRAGGING) {
free(last_motion_notify);
ev_break(EV_A_ EVBREAK_ONE); ev_break(EV_A_ EVBREAK_ONE);
return true; if (dragloop->result == DRAG_SUCCESS) {
/* Ensure motion notify events are handled. */
break;
} else {
free(last_motion_notify);
return true;
}
} }
} }
@ -766,7 +771,7 @@ static bool drain_drag_events(EV_P, struct drag_x11_cb *dragloop) {
FREE(last_motion_notify); FREE(last_motion_notify);
xcb_flush(conn); xcb_flush(conn);
return false; return dragloop->result != DRAGGING;
} }
static void xcb_drag_prepare_cb(EV_P_ ev_prepare *w, int revents) { static void xcb_drag_prepare_cb(EV_P_ ev_prepare *w, int revents) {