diff --git a/egui_glium/src/backend.rs b/egui_glium/src/backend.rs index f5507b85..82f3235f 100644 --- a/egui_glium/src/backend.rs +++ b/egui_glium/src/backend.rs @@ -1,5 +1,7 @@ use crate::{window_settings::WindowSettings, *}; use egui::Color32; +#[cfg(target_os = "windows")] +use glium::glutin::platform::windows::WindowBuilderExtWindows; use std::time::Instant; #[cfg(feature = "persistence")] @@ -55,6 +57,23 @@ impl epi::RepaintSignal for GliumRepaintSignal { } } +#[cfg(target_os = "windows")] +fn window_builder_drag_and_drop( + window_builder: glutin::window::WindowBuilder, + enable: bool, +) -> glutin::window::WindowBuilder { + window_builder.with_drag_and_drop(enable) +} + +#[cfg(not(target_os = "windows"))] +fn window_builder_drag_and_drop( + window_builder: glutin::window::WindowBuilder, + _enable: bool, +) -> glutin::window::WindowBuilder { + // drag and drop can only be disabled on windows + window_builder +} + fn create_display( app: &dyn epi::App, window_settings: Option, @@ -68,6 +87,8 @@ fn create_display( .with_window_icon(window_icon) .with_transparent(app.transparent()); + window_builder = window_builder_drag_and_drop(window_builder, app.drag_and_drop_support()); + let initial_size_points = app.initial_window_size(); if let Some(window_settings) = &window_settings { diff --git a/epi/src/lib.rs b/epi/src/lib.rs index 96f8795e..ef41d09a 100644 --- a/epi/src/lib.rs +++ b/epi/src/lib.rs @@ -155,6 +155,12 @@ pub trait App { fn transparent(&self) -> bool { false } + + /// On Windows: enable drag and drop support. + /// Set to false to avoid issues with crates such as cpal which uses that use multi-threaded COM API + fn drag_and_drop_support(&self) -> bool { + true + } } /// Image data for the icon.