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:
parent
e8dee4308a
commit
2c78f2458c
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue