diff --git a/winit/src/lib.rs b/winit/src/lib.rs index 00a96e63..ea056b2d 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -661,6 +661,7 @@ async fn run_instance
(
let mut dnd_surface: Option<
Arc (
}
}
+ platform_specific_handler.retain_subsurfaces(|id| {
+ window_manager.get(id).is_some()
+ || dnd_surface_id == Some(id)
+ });
+
for (_id, window) in window_manager.iter_mut() {
window.raw.request_redraw();
}
@@ -1522,6 +1528,7 @@ async fn run_instance (
match evt {
dnd::SourceEvent::Finished
| dnd::SourceEvent::Cancelled => {
+ dnd_surface_id = None;
dnd_surface = None;
}
_ => {}
@@ -1565,7 +1572,208 @@ async fn run_instance (
break;
}
}
- Event::StartDnd => {}
+ Event::StartDnd => {
+ let compositor = match compositor.as_mut() {
+ Some(c) => c,
+ None => {
+ tracing::error!("No compositor for DnD");
+ continue;
+ }
+ };
+ let queued = clipboard.get_queued();
+ for crate::clipboard::StartDnd {
+ internal,
+ source_surface,
+ icon_surface,
+ content,
+ actions,
+ } in queued
+ {
+ let Some(window_id) = source_surface.and_then(|source| {
+ match source {
+ core::clipboard::DndSource::Surface(s) => Some(s),
+ core::clipboard::DndSource::Widget(w) => {
+ // search windows for widget with operation
+ user_interfaces.iter_mut().find_map(
+ |(ui_id, ui)| {
+ let Some(ui_renderer) = window_manager
+ .get_mut(ui_id.clone())
+ .map(|w| &w.renderer)
+ else {
+ return None;
+ };
+
+ let operation: Box<
+ dyn operation::Operation<()>,
+ > = Box::new(operation::map(
+ Box::new(
+ operation::search_id::search_id(
+ w.clone(),
+ ),
+ ),
+ |_| {},
+ ));
+ let mut current_operation =
+ Some(operation);
+
+ while let Some(mut operation) =
+ current_operation.take()
+ {
+ ui.operate(
+ ui_renderer,
+ operation.as_mut(),
+ );
+
+ match operation.finish() {
+ operation::Outcome::None => {}
+ operation::Outcome::Some(
+ (),
+ ) => {
+ return Some(ui_id.clone());
+ }
+ operation::Outcome::Chain(
+ next,
+ ) => {
+ current_operation =
+ Some(next);
+ }
+ }
+ }
+ None
+ },
+ )
+ }
+ }
+ }) else {
+ eprintln!("No source surface");
+ continue;
+ };
+
+ let Some(window) = window_manager.get_mut(window_id) else {
+ eprintln!("No window");
+ continue;
+ };
+
+ let state = &window.state;
+ let mut dnd_buffer = None;
+ let icon_surface = icon_surface.map(|i| {
+ let mut icon_surface =
+ i.downcast::