wlr_drag: Destroy drag after releasing grabs
wlr_drag sets up keyboard, pointer and touch grabs, which block 'enter' events (and thus focus changes). For the compositor to be able to update focus (e.g. to focus the drop target) from the destroy handler, the grabs must be released before the destroy event is signalled.
This commit is contained in:
parent
6c8f66ff59
commit
d2ca220fda
|
@ -124,8 +124,6 @@ static void drag_destroy(struct wlr_drag *drag) {
|
||||||
}
|
}
|
||||||
drag->cancelling = true;
|
drag->cancelling = true;
|
||||||
|
|
||||||
wlr_signal_emit_safe(&drag->events.destroy, drag);
|
|
||||||
|
|
||||||
if (drag->started) {
|
if (drag->started) {
|
||||||
wlr_seat_keyboard_end_grab(drag->seat);
|
wlr_seat_keyboard_end_grab(drag->seat);
|
||||||
switch (drag->grab_type) {
|
switch (drag->grab_type) {
|
||||||
|
@ -138,7 +136,12 @@ static void drag_destroy(struct wlr_drag *drag) {
|
||||||
wlr_seat_touch_end_grab(drag->seat);
|
wlr_seat_touch_end_grab(drag->seat);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We issue destroy after ending the grab to allow focus changes.
|
||||||
|
wlr_signal_emit_safe(&drag->events.destroy, drag);
|
||||||
|
|
||||||
|
if (drag->started) {
|
||||||
drag_set_focus(drag, NULL, 0, 0);
|
drag_set_focus(drag, NULL, 0, 0);
|
||||||
|
|
||||||
assert(drag->seat->drag == drag);
|
assert(drag->seat->drag == drag);
|
||||||
|
|
Loading…
Reference in New Issue