fn drop_performed()

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,
            });
        }
    }