diff --git a/src/ifs/ipc/wl_data_source.rs b/src/ifs/ipc/wl_data_source.rs index ad365eea..a21feed0 100644 --- a/src/ifs/ipc/wl_data_source.rs +++ b/src/ifs/ipc/wl_data_source.rs @@ -154,16 +154,19 @@ impl WlDataSource { shared.selected_action.get() != 0 && shared.state.get().contains(OFFER_STATE_ACCEPTED) } - pub fn on_drop(&self, seat: &Rc) { + pub fn on_drop(&self) { 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(); let shared = self.data.shared.get(); shared.state.or_assign(OFFER_STATE_DROPPED); } + pub fn finish_toplevel_drag(&self, seat: &Rc) { + if let Some(drag) = self.toplevel_drag.take() { + drag.finish_drag(seat); + } + } + pub fn send_cancelled(&self, seat: &Rc) { self.data.state.or_assign(SOURCE_STATE_CANCELLED); if let Some(drag) = self.toplevel_drag.take() { diff --git a/src/ifs/wl_seat/pointer_owner.rs b/src/ifs/wl_seat/pointer_owner.rs index 5f3623c7..8f9740ff 100644 --- a/src/ifs/wl_seat/pointer_owner.rs +++ b/src/ifs/wl_seat/pointer_owner.rs @@ -468,7 +468,7 @@ impl PointerOwner for DndPointerOwner { let target = self.target.get(); target.node_on_dnd_drop(&self.dnd); if let Some(src) = &self.dnd.src { - src.on_drop(seat); + src.on_drop(); } let should_drop = match &self.dnd.src { None => true, @@ -491,6 +491,9 @@ impl PointerOwner for DndPointerOwner { } seat.pointer_owner.set_default_pointer_owner(seat); seat.tree_changed.trigger(); + if let Some(src) = &self.dnd.src { + src.finish_toplevel_drag(seat); + } } fn axis_node(&self, _seat: &Rc) -> Option> {