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,11 +742,16 @@ static bool drain_drag_events(EV_P, struct drag_x11_cb *dragloop) {
|
|||
free(event);
|
||||
|
||||
if (dragloop->result != DRAGGING) {
|
||||
free(last_motion_notify);
|
||||
ev_break(EV_A_ EVBREAK_ONE);
|
||||
if (dragloop->result == DRAG_SUCCESS) {
|
||||
/* Ensure motion notify events are handled. */
|
||||
break;
|
||||
} else {
|
||||
free(last_motion_notify);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (last_motion_notify == NULL) {
|
||||
return true;
|
||||
|
@ -766,7 +771,7 @@ static bool drain_drag_events(EV_P, struct drag_x11_cb *dragloop) {
|
|||
FREE(last_motion_notify);
|
||||
|
||||
xcb_flush(conn);
|
||||
return false;
|
||||
return dragloop->result != DRAGGING;
|
||||
}
|
||||
|
||||
static void xcb_drag_prepare_cb(EV_P_ ev_prepare *w, int revents) {
|
||||
|
|
Loading…
Reference in New Issue