in native/desktop-linux/src/linux/data_transfer.rs [202:264]
fn drop_performed(&mut self, _conn: &Connection, _qh: &QueueHandle<Self>, data_device: &WlDataDevice) {
self.current_drag_target_window_id = None;
let Some(drag_offer) = data_device.data::<DataDeviceData>().and_then(DataDeviceData::drag_offer) else {
debug!("DataDeviceHandler::drop_performed: no drag offer");
return;
};
let x = drag_offer.x;
let y = drag_offer.y;
let surface = &drag_offer.surface;
let action = drag_offer.selected_action;
let Some(window_id) = self.get_window_id(surface) else {
warn!("DataDeviceHandler::drop_performed: couldn't find window for {surface:?}");
return;
};
let mime_type_and_actions = self.get_drag_offer_actions(&drag_offer, x, y, window_id);
let Some(mime_type) = mime_type_and_actions.mime_type else {
debug!("DataDeviceHandler::drop_performed: no matching MIME type");
self.send_event(DropPerformedEvent {
window_id,
content: DataTransferContent::null(),
action: DragAndDropAction::None,
});
return;
};
let read_pipe = match drag_offer.receive(mime_type.clone()) {
Ok(v) => v,
Err(e) => {
warn!("DataDeviceHandler::drop_performed: failed receiving data offer: {e}");
self.send_event(DropPerformedEvent {
window_id,
content: DataTransferContent::null(),
action: DragAndDropAction::None,
});
return;
}
};
if !read_from_pipe(
"DataDeviceHandler::drop_performed",
read_pipe,
mime_type,
&self.loop_handle,
move |state, content| {
drag_offer.finish();
drag_offer.destroy();
state.send_event(DropPerformedEvent {
window_id,
content,
action: action.into(),
});
},
) {
self.send_event(DropPerformedEvent {
window_id,
content: DataTransferContent::null(),
action: DragAndDropAction::None,
});
}
}