1
0
Fork 0
forked from wry/wry

toplevel-drag: reattach only after drop has finished

This commit is contained in:
Julian Orth 2024-09-17 22:12:50 +02:00
parent 0eb14d2816
commit 2a1d6a8ba8
2 changed files with 11 additions and 5 deletions

View file

@ -154,16 +154,19 @@ impl WlDataSource {
shared.selected_action.get() != 0 && shared.state.get().contains(OFFER_STATE_ACCEPTED) shared.selected_action.get() != 0 && shared.state.get().contains(OFFER_STATE_ACCEPTED)
} }
pub fn on_drop(&self, seat: &Rc<WlSeatGlobal>) { pub fn on_drop(&self) {
self.data.state.or_assign(SOURCE_STATE_DROPPED); self.data.state.or_assign(SOURCE_STATE_DROPPED);
if let Some(drag) = self.toplevel_drag.take() {
drag.finish_drag(seat);
}
self.send_dnd_drop_performed(); self.send_dnd_drop_performed();
let shared = self.data.shared.get(); let shared = self.data.shared.get();
shared.state.or_assign(OFFER_STATE_DROPPED); shared.state.or_assign(OFFER_STATE_DROPPED);
} }
pub fn finish_toplevel_drag(&self, seat: &Rc<WlSeatGlobal>) {
if let Some(drag) = self.toplevel_drag.take() {
drag.finish_drag(seat);
}
}
pub fn send_cancelled(&self, seat: &Rc<WlSeatGlobal>) { pub fn send_cancelled(&self, seat: &Rc<WlSeatGlobal>) {
self.data.state.or_assign(SOURCE_STATE_CANCELLED); self.data.state.or_assign(SOURCE_STATE_CANCELLED);
if let Some(drag) = self.toplevel_drag.take() { if let Some(drag) = self.toplevel_drag.take() {

View file

@ -468,7 +468,7 @@ impl PointerOwner for DndPointerOwner {
let target = self.target.get(); let target = self.target.get();
target.node_on_dnd_drop(&self.dnd); target.node_on_dnd_drop(&self.dnd);
if let Some(src) = &self.dnd.src { if let Some(src) = &self.dnd.src {
src.on_drop(seat); src.on_drop();
} }
let should_drop = match &self.dnd.src { let should_drop = match &self.dnd.src {
None => true, None => true,
@ -491,6 +491,9 @@ impl PointerOwner for DndPointerOwner {
} }
seat.pointer_owner.set_default_pointer_owner(seat); seat.pointer_owner.set_default_pointer_owner(seat);
seat.tree_changed.trigger(); seat.tree_changed.trigger();
if let Some(src) = &self.dnd.src {
src.finish_toplevel_drag(seat);
}
} }
fn axis_node(&self, _seat: &Rc<WlSeatGlobal>) -> Option<Rc<dyn Node>> { fn axis_node(&self, _seat: &Rc<WlSeatGlobal>) -> Option<Rc<dyn Node>> {