diff options
Diffstat (limited to 'winit')
| -rw-r--r-- | winit/Cargo.toml | 6 | ||||
| -rw-r--r-- | winit/src/application.rs | 29 | ||||
| -rw-r--r-- | winit/src/application/state.rs | 19 | ||||
| -rw-r--r-- | winit/src/conversion.rs | 341 | ||||
| -rw-r--r-- | winit/src/lib.rs | 2 | ||||
| -rw-r--r-- | winit/src/position.rs | 22 | ||||
| -rw-r--r-- | winit/src/settings.rs | 20 | ||||
| -rw-r--r-- | winit/src/settings/windows.rs | 16 | 
8 files changed, 442 insertions, 13 deletions
diff --git a/winit/Cargo.toml b/winit/Cargo.toml index 7f117fa1..b1192135 100644 --- a/winit/Cargo.toml +++ b/winit/Cargo.toml @@ -14,11 +14,15 @@ categories = ["gui"]  debug = ["iced_native/debug"]  [dependencies] -winit = "0.24"  window_clipboard = "0.2"  log = "0.4"  thiserror = "1.0" +[dependencies.winit] +version = "0.25" +git = "https://github.com/iced-rs/winit" +rev = "844485272a7412cb35cdbfac3524decdf59475ca" +  [dependencies.iced_native]  version = "0.4"  path = "../native" diff --git a/winit/src/application.rs b/winit/src/application.rs index b1d5f418..5d1aabf9 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -14,6 +14,7 @@ use iced_futures::futures;  use iced_futures::futures::channel::mpsc;  use iced_graphics::window;  use iced_native::program::Program; +use iced_native::Menu;  use iced_native::{Cache, UserInterface};  use std::mem::ManuallyDrop; @@ -98,6 +99,13 @@ pub trait Application: Program<Clipboard = Clipboard> {      fn should_exit(&self) -> bool {          false      } + +    /// Returns the current system [`Menu`] of the [`Application`]. +    /// +    /// By default, it returns an empty [`Menu`]. +    fn menu(&self) -> Menu<Self::Message> { +        Menu::new() +    }  }  /// Runs an [`Application`] with an executor, compositor, and the provided @@ -145,6 +153,7 @@ where              application.mode(),              event_loop.primary_monitor(),          ) +        .with_menu(Some(conversion::menu(&application.menu())))          .build(&event_loop)          .map_err(Error::WindowCreationFailed)?; @@ -310,6 +319,16 @@ async fn run_instance<A, E, C>(                  window.request_redraw();              } +            event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( +                event::MacOS::ReceivedUrl(url), +            )) => { +                use iced_native::event; +                events.push(iced_native::Event::PlatformSpecific( +                    event::PlatformSpecific::MacOS(event::MacOS::ReceivedUrl( +                        url, +                    )), +                )); +            }              event::Event::UserEvent(message) => {                  messages.push(message);              } @@ -370,6 +389,16 @@ async fn run_instance<A, E, C>(                  // Maybe we can use `ControlFlow::WaitUntil` for this.              }              event::Event::WindowEvent { +                event: event::WindowEvent::MenuEntryActivated(entry_id), +                .. +            } => { +                if let Some(message) = +                    conversion::menu_message(state.menu(), entry_id) +                { +                    messages.push(message); +                } +            } +            event::Event::WindowEvent {                  event: window_event,                  ..              } => { diff --git a/winit/src/application/state.rs b/winit/src/application/state.rs index b54d3aed..f60f09be 100644 --- a/winit/src/application/state.rs +++ b/winit/src/application/state.rs @@ -1,5 +1,5 @@  use crate::conversion; -use crate::{Application, Color, Debug, Mode, Point, Size, Viewport}; +use crate::{Application, Color, Debug, Menu, Mode, Point, Size, Viewport};  use std::marker::PhantomData;  use winit::event::{Touch, WindowEvent}; @@ -9,6 +9,7 @@ use winit::window::Window;  #[derive(Debug, Clone)]  pub struct State<A: Application> {      title: String, +    menu: Menu<A::Message>,      mode: Mode,      background_color: Color,      scale_factor: f64, @@ -23,6 +24,7 @@ impl<A: Application> State<A> {      /// Creates a new [`State`] for the provided [`Application`] and window.      pub fn new(application: &A, window: &Window) -> Self {          let title = application.title(); +        let menu = application.menu();          let mode = application.mode();          let background_color = application.background_color();          let scale_factor = application.scale_factor(); @@ -38,6 +40,7 @@ impl<A: Application> State<A> {          Self {              title, +            menu,              mode,              background_color,              scale_factor, @@ -50,6 +53,11 @@ impl<A: Application> State<A> {          }      } +    /// Returns the current [`Menu`] of the [`State`]. +    pub fn menu(&self) -> &Menu<A::Message> { +        &self.menu +    } +      /// Returns the current background [`Color`] of the [`State`].      pub fn background_color(&self) -> Color {          self.background_color @@ -203,5 +211,14 @@ impl<A: Application> State<A> {              self.scale_factor = new_scale_factor;          } + +        // Update menu +        let new_menu = application.menu(); + +        if self.menu != new_menu { +            window.set_menu(Some(conversion::menu(&new_menu))); + +            self.menu = new_menu; +        }      }  } diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index b850a805..b3d05857 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -3,10 +3,11 @@  //! [`winit`]: https://github.com/rust-windowing/winit  //! [`iced_native`]: https://github.com/hecrj/iced/tree/master/native  use crate::keyboard; +use crate::menu::{self, Menu};  use crate::mouse;  use crate::touch;  use crate::window; -use crate::{Event, Mode, Point}; +use crate::{Event, Mode, Point, Position};  /// Converts a winit window event into an iced event.  pub fn window_event( @@ -133,6 +134,49 @@ pub fn window_event(      }  } +/// Converts a [`Position`] to a [`winit`] logical position for a given monitor. +/// +/// [`winit`]: https://github.com/rust-windowing/winit +pub fn position( +    monitor: Option<&winit::monitor::MonitorHandle>, +    (width, height): (u32, u32), +    position: Position, +) -> Option<winit::dpi::Position> { +    match position { +        Position::Default => None, +        Position::Specific(x, y) => { +            Some(winit::dpi::Position::Logical(winit::dpi::LogicalPosition { +                x: f64::from(x), +                y: f64::from(y), +            })) +        } +        Position::Centered => { +            if let Some(monitor) = monitor { +                let start = monitor.position(); + +                let resolution: winit::dpi::LogicalSize<f64> = +                    monitor.size().to_logical(monitor.scale_factor()); + +                let centered: winit::dpi::PhysicalPosition<i32> = +                    winit::dpi::LogicalPosition { +                        x: (resolution.width - f64::from(width)) / 2.0, +                        y: (resolution.height - f64::from(height)) / 2.0, +                    } +                    .to_physical(monitor.scale_factor()); + +                Some(winit::dpi::Position::Physical( +                    winit::dpi::PhysicalPosition { +                        x: start.x + centered.x, +                        y: start.y + centered.y, +                    }, +                )) +            } else { +                None +            } +        } +    } +} +  /// Converts a [`Mode`] to a [`winit`] fullscreen mode.  ///  /// [`winit`]: https://github.com/rust-windowing/winit @@ -156,6 +200,110 @@ pub fn visible(mode: Mode) -> bool {      }  } +/// Converts a `Hotkey` from [`iced_native`] to a [`winit`] Hotkey. +/// +/// [`winit`]: https://github.com/rust-windowing/winit +/// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native +fn hotkey(hotkey: keyboard::Hotkey) -> winit::window::Hotkey { +    use winit::event::ModifiersState; + +    let mut modifiers = ModifiersState::empty(); +    modifiers.set(ModifiersState::CTRL, hotkey.modifiers.control()); +    modifiers.set(ModifiersState::SHIFT, hotkey.modifiers.shift()); +    modifiers.set(ModifiersState::ALT, hotkey.modifiers.alt()); +    modifiers.set(ModifiersState::LOGO, hotkey.modifiers.logo()); + +    winit::window::Hotkey::new(modifiers, to_virtual_keycode(hotkey.key)) +} + +/// Converts a `Menu` from [`iced_native`] to a [`winit`] menu. +/// +/// [`winit`]: https://github.com/rust-windowing/winit +/// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native +pub fn menu<Message>(menu: &Menu<Message>) -> winit::window::Menu { +    fn menu_i<Message>( +        converted: &mut winit::window::Menu, +        starting_id: usize, +        menu: &Menu<Message>, +    ) -> usize { +        let mut id = starting_id; + +        for item in menu.iter() { +            match item { +                menu::Entry::Item { title, hotkey, .. } => { +                    converted.add_item(id, title, hotkey.map(self::hotkey)); + +                    id += 1; +                } +                menu::Entry::Dropdown { title, submenu } => { +                    let mut converted_submenu = winit::window::Menu::new(); +                    let n_children = +                        menu_i(&mut converted_submenu, id, submenu); + +                    converted.add_dropdown(title, converted_submenu); + +                    id += n_children; +                } +                menu::Entry::Separator => { +                    converted.add_separator(); +                } +            } +        } + +        id - starting_id +    } + +    let mut converted = winit::window::Menu::default(); +    let _ = menu_i(&mut converted, 0, menu); + +    converted +} + +/// Given a [`Menu`] and an identifier of a [`menu::Entry`], it returns the +/// `Message` that should be produced when that entry is activated. +pub fn menu_message<Message>(menu: &Menu<Message>, id: u32) -> Option<Message> +where +    Message: Clone, +{ +    fn find_message<Message>( +        target: u32, +        starting_id: u32, +        menu: &Menu<Message>, +    ) -> Result<Message, u32> +    where +        Message: Clone, +    { +        let mut id = starting_id; + +        for entry in menu.iter() { +            match entry { +                menu::Entry::Item { on_activation, .. } => { +                    if id == target { +                        return Ok(on_activation.clone()); +                    } + +                    id += 1; +                } +                menu::Entry::Dropdown { submenu, .. } => { +                    match find_message(target, id, submenu) { +                        Ok(message) => { +                            return Ok(message); +                        } +                        Err(n_children) => { +                            id += n_children; +                        } +                    } +                } +                menu::Entry::Separator => {} +            } +        } + +        Err(id - starting_id) +    } + +    find_message(id, 0, menu).ok() +} +  /// Converts a `MouseCursor` from [`iced_native`] to a [`winit`] cursor icon.  ///  /// [`winit`]: https://github.com/rust-windowing/winit @@ -203,12 +351,14 @@ pub fn mouse_button(mouse_button: winit::event::MouseButton) -> mouse::Button {  pub fn modifiers(      modifiers: winit::event::ModifiersState,  ) -> keyboard::Modifiers { -    keyboard::Modifiers { -        shift: modifiers.shift(), -        control: modifiers.ctrl(), -        alt: modifiers.alt(), -        logo: modifiers.logo(), -    } +    let mut result = keyboard::Modifiers::empty(); + +    result.set(keyboard::Modifiers::SHIFT, modifiers.shift()); +    result.set(keyboard::Modifiers::CTRL, modifiers.ctrl()); +    result.set(keyboard::Modifiers::ALT, modifiers.alt()); +    result.set(keyboard::Modifiers::LOGO, modifiers.logo()); + +    result  }  /// Converts a physical cursor position to a logical `Point`. @@ -252,6 +402,183 @@ pub fn touch_event(      }  } +/// Converts a `KeyCode` from [`iced_native`] to an [`winit`] key code. +/// +/// [`winit`]: https://github.com/rust-windowing/winit +/// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native +fn to_virtual_keycode( +    keycode: keyboard::KeyCode, +) -> winit::event::VirtualKeyCode { +    use keyboard::KeyCode; +    use winit::event::VirtualKeyCode; + +    match keycode { +        KeyCode::Key1 => VirtualKeyCode::Key1, +        KeyCode::Key2 => VirtualKeyCode::Key2, +        KeyCode::Key3 => VirtualKeyCode::Key3, +        KeyCode::Key4 => VirtualKeyCode::Key4, +        KeyCode::Key5 => VirtualKeyCode::Key5, +        KeyCode::Key6 => VirtualKeyCode::Key6, +        KeyCode::Key7 => VirtualKeyCode::Key7, +        KeyCode::Key8 => VirtualKeyCode::Key8, +        KeyCode::Key9 => VirtualKeyCode::Key9, +        KeyCode::Key0 => VirtualKeyCode::Key0, +        KeyCode::A => VirtualKeyCode::A, +        KeyCode::B => VirtualKeyCode::B, +        KeyCode::C => VirtualKeyCode::C, +        KeyCode::D => VirtualKeyCode::D, +        KeyCode::E => VirtualKeyCode::E, +        KeyCode::F => VirtualKeyCode::F, +        KeyCode::G => VirtualKeyCode::G, +        KeyCode::H => VirtualKeyCode::H, +        KeyCode::I => VirtualKeyCode::I, +        KeyCode::J => VirtualKeyCode::J, +        KeyCode::K => VirtualKeyCode::K, +        KeyCode::L => VirtualKeyCode::L, +        KeyCode::M => VirtualKeyCode::M, +        KeyCode::N => VirtualKeyCode::N, +        KeyCode::O => VirtualKeyCode::O, +        KeyCode::P => VirtualKeyCode::P, +        KeyCode::Q => VirtualKeyCode::Q, +        KeyCode::R => VirtualKeyCode::R, +        KeyCode::S => VirtualKeyCode::S, +        KeyCode::T => VirtualKeyCode::T, +        KeyCode::U => VirtualKeyCode::U, +        KeyCode::V => VirtualKeyCode::V, +        KeyCode::W => VirtualKeyCode::W, +        KeyCode::X => VirtualKeyCode::X, +        KeyCode::Y => VirtualKeyCode::Y, +        KeyCode::Z => VirtualKeyCode::Z, +        KeyCode::Escape => VirtualKeyCode::Escape, +        KeyCode::F1 => VirtualKeyCode::F1, +        KeyCode::F2 => VirtualKeyCode::F2, +        KeyCode::F3 => VirtualKeyCode::F3, +        KeyCode::F4 => VirtualKeyCode::F4, +        KeyCode::F5 => VirtualKeyCode::F5, +        KeyCode::F6 => VirtualKeyCode::F6, +        KeyCode::F7 => VirtualKeyCode::F7, +        KeyCode::F8 => VirtualKeyCode::F8, +        KeyCode::F9 => VirtualKeyCode::F9, +        KeyCode::F10 => VirtualKeyCode::F10, +        KeyCode::F11 => VirtualKeyCode::F11, +        KeyCode::F12 => VirtualKeyCode::F12, +        KeyCode::F13 => VirtualKeyCode::F13, +        KeyCode::F14 => VirtualKeyCode::F14, +        KeyCode::F15 => VirtualKeyCode::F15, +        KeyCode::F16 => VirtualKeyCode::F16, +        KeyCode::F17 => VirtualKeyCode::F17, +        KeyCode::F18 => VirtualKeyCode::F18, +        KeyCode::F19 => VirtualKeyCode::F19, +        KeyCode::F20 => VirtualKeyCode::F20, +        KeyCode::F21 => VirtualKeyCode::F21, +        KeyCode::F22 => VirtualKeyCode::F22, +        KeyCode::F23 => VirtualKeyCode::F23, +        KeyCode::F24 => VirtualKeyCode::F24, +        KeyCode::Snapshot => VirtualKeyCode::Snapshot, +        KeyCode::Scroll => VirtualKeyCode::Scroll, +        KeyCode::Pause => VirtualKeyCode::Pause, +        KeyCode::Insert => VirtualKeyCode::Insert, +        KeyCode::Home => VirtualKeyCode::Home, +        KeyCode::Delete => VirtualKeyCode::Delete, +        KeyCode::End => VirtualKeyCode::End, +        KeyCode::PageDown => VirtualKeyCode::PageDown, +        KeyCode::PageUp => VirtualKeyCode::PageUp, +        KeyCode::Left => VirtualKeyCode::Left, +        KeyCode::Up => VirtualKeyCode::Up, +        KeyCode::Right => VirtualKeyCode::Right, +        KeyCode::Down => VirtualKeyCode::Down, +        KeyCode::Backspace => VirtualKeyCode::Back, +        KeyCode::Enter => VirtualKeyCode::Return, +        KeyCode::Space => VirtualKeyCode::Space, +        KeyCode::Compose => VirtualKeyCode::Compose, +        KeyCode::Caret => VirtualKeyCode::Caret, +        KeyCode::Numlock => VirtualKeyCode::Numlock, +        KeyCode::Numpad0 => VirtualKeyCode::Numpad0, +        KeyCode::Numpad1 => VirtualKeyCode::Numpad1, +        KeyCode::Numpad2 => VirtualKeyCode::Numpad2, +        KeyCode::Numpad3 => VirtualKeyCode::Numpad3, +        KeyCode::Numpad4 => VirtualKeyCode::Numpad4, +        KeyCode::Numpad5 => VirtualKeyCode::Numpad5, +        KeyCode::Numpad6 => VirtualKeyCode::Numpad6, +        KeyCode::Numpad7 => VirtualKeyCode::Numpad7, +        KeyCode::Numpad8 => VirtualKeyCode::Numpad8, +        KeyCode::Numpad9 => VirtualKeyCode::Numpad9, +        KeyCode::AbntC1 => VirtualKeyCode::AbntC1, +        KeyCode::AbntC2 => VirtualKeyCode::AbntC2, +        KeyCode::NumpadAdd => VirtualKeyCode::NumpadAdd, +        KeyCode::Plus => VirtualKeyCode::Plus, +        KeyCode::Apostrophe => VirtualKeyCode::Apostrophe, +        KeyCode::Apps => VirtualKeyCode::Apps, +        KeyCode::At => VirtualKeyCode::At, +        KeyCode::Ax => VirtualKeyCode::Ax, +        KeyCode::Backslash => VirtualKeyCode::Backslash, +        KeyCode::Calculator => VirtualKeyCode::Calculator, +        KeyCode::Capital => VirtualKeyCode::Capital, +        KeyCode::Colon => VirtualKeyCode::Colon, +        KeyCode::Comma => VirtualKeyCode::Comma, +        KeyCode::Convert => VirtualKeyCode::Convert, +        KeyCode::NumpadDecimal => VirtualKeyCode::NumpadDecimal, +        KeyCode::NumpadDivide => VirtualKeyCode::NumpadDivide, +        KeyCode::Equals => VirtualKeyCode::Equals, +        KeyCode::Grave => VirtualKeyCode::Grave, +        KeyCode::Kana => VirtualKeyCode::Kana, +        KeyCode::Kanji => VirtualKeyCode::Kanji, +        KeyCode::LAlt => VirtualKeyCode::LAlt, +        KeyCode::LBracket => VirtualKeyCode::LBracket, +        KeyCode::LControl => VirtualKeyCode::LControl, +        KeyCode::LShift => VirtualKeyCode::LShift, +        KeyCode::LWin => VirtualKeyCode::LWin, +        KeyCode::Mail => VirtualKeyCode::Mail, +        KeyCode::MediaSelect => VirtualKeyCode::MediaSelect, +        KeyCode::MediaStop => VirtualKeyCode::MediaStop, +        KeyCode::Minus => VirtualKeyCode::Minus, +        KeyCode::NumpadMultiply => VirtualKeyCode::NumpadMultiply, +        KeyCode::Mute => VirtualKeyCode::Mute, +        KeyCode::MyComputer => VirtualKeyCode::MyComputer, +        KeyCode::NavigateForward => VirtualKeyCode::NavigateForward, +        KeyCode::NavigateBackward => VirtualKeyCode::NavigateBackward, +        KeyCode::NextTrack => VirtualKeyCode::NextTrack, +        KeyCode::NoConvert => VirtualKeyCode::NoConvert, +        KeyCode::NumpadComma => VirtualKeyCode::NumpadComma, +        KeyCode::NumpadEnter => VirtualKeyCode::NumpadEnter, +        KeyCode::NumpadEquals => VirtualKeyCode::NumpadEquals, +        KeyCode::OEM102 => VirtualKeyCode::OEM102, +        KeyCode::Period => VirtualKeyCode::Period, +        KeyCode::PlayPause => VirtualKeyCode::PlayPause, +        KeyCode::Power => VirtualKeyCode::Power, +        KeyCode::PrevTrack => VirtualKeyCode::PrevTrack, +        KeyCode::RAlt => VirtualKeyCode::RAlt, +        KeyCode::RBracket => VirtualKeyCode::RBracket, +        KeyCode::RControl => VirtualKeyCode::RControl, +        KeyCode::RShift => VirtualKeyCode::RShift, +        KeyCode::RWin => VirtualKeyCode::RWin, +        KeyCode::Semicolon => VirtualKeyCode::Semicolon, +        KeyCode::Slash => VirtualKeyCode::Slash, +        KeyCode::Sleep => VirtualKeyCode::Sleep, +        KeyCode::Stop => VirtualKeyCode::Stop, +        KeyCode::NumpadSubtract => VirtualKeyCode::NumpadSubtract, +        KeyCode::Sysrq => VirtualKeyCode::Sysrq, +        KeyCode::Tab => VirtualKeyCode::Tab, +        KeyCode::Underline => VirtualKeyCode::Underline, +        KeyCode::Unlabeled => VirtualKeyCode::Unlabeled, +        KeyCode::VolumeDown => VirtualKeyCode::VolumeDown, +        KeyCode::VolumeUp => VirtualKeyCode::VolumeUp, +        KeyCode::Wake => VirtualKeyCode::Wake, +        KeyCode::WebBack => VirtualKeyCode::WebBack, +        KeyCode::WebFavorites => VirtualKeyCode::WebFavorites, +        KeyCode::WebForward => VirtualKeyCode::WebForward, +        KeyCode::WebHome => VirtualKeyCode::WebHome, +        KeyCode::WebRefresh => VirtualKeyCode::WebRefresh, +        KeyCode::WebSearch => VirtualKeyCode::WebSearch, +        KeyCode::WebStop => VirtualKeyCode::WebStop, +        KeyCode::Yen => VirtualKeyCode::Yen, +        KeyCode::Copy => VirtualKeyCode::Copy, +        KeyCode::Paste => VirtualKeyCode::Paste, +        KeyCode::Cut => VirtualKeyCode::Cut, +        KeyCode::Asterisk => VirtualKeyCode::Asterisk, +    } +} +  /// Converts a `VirtualKeyCode` from [`winit`] to an [`iced_native`] key code.  ///  /// [`winit`]: https://github.com/rust-windowing/winit diff --git a/winit/src/lib.rs b/winit/src/lib.rs index c9f324dd..1707846a 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -31,12 +31,14 @@ pub mod settings;  mod clipboard;  mod error;  mod mode; +mod position;  mod proxy;  pub use application::Application;  pub use clipboard::Clipboard;  pub use error::Error;  pub use mode::Mode; +pub use position::Position;  pub use proxy::Proxy;  pub use settings::Settings; diff --git a/winit/src/position.rs b/winit/src/position.rs new file mode 100644 index 00000000..c260c29e --- /dev/null +++ b/winit/src/position.rs @@ -0,0 +1,22 @@ +/// The position of a window in a given screen. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Position { +    /// The platform-specific default position for a new window. +    Default, +    /// The window is completely centered on the screen. +    Centered, +    /// The window is positioned with specific coordinates: `(X, Y)`. +    /// +    /// When the decorations of the window are enabled, Windows 10 will add some +    /// invisible padding to the window. This padding gets included in the +    /// position. So if you have decorations enabled and want the window to be +    /// at (0, 0) you would have to set the position to +    /// `(PADDING_X, PADDING_Y)`. +    Specific(i32, i32), +} + +impl Default for Position { +    fn default() -> Self { +        Self::Default +    } +} diff --git a/winit/src/settings.rs b/winit/src/settings.rs index 663fa07a..743f79bc 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -9,7 +9,7 @@ mod platform;  pub use platform::PlatformSpecific;  use crate::conversion; -use crate::Mode; +use crate::{Mode, Position};  use winit::monitor::MonitorHandle;  use winit::window::WindowBuilder; @@ -35,6 +35,9 @@ pub struct Window {      /// The size of the window.      pub size: (u32, u32), +    /// The position of the window. +    pub position: Position, +      /// The minimum size of the window.      pub min_size: Option<(u32, u32)>, @@ -80,9 +83,16 @@ impl Window {              .with_transparent(self.transparent)              .with_window_icon(self.icon)              .with_always_on_top(self.always_on_top) -            .with_fullscreen(conversion::fullscreen(primary_monitor, mode))              .with_visible(conversion::visible(mode)); +        if let Some(position) = conversion::position( +            primary_monitor.as_ref(), +            self.size, +            self.position, +        ) { +            window_builder = window_builder.with_position(position); +        } +          if let Some((width, height)) = self.min_size {              window_builder = window_builder                  .with_min_inner_size(winit::dpi::LogicalSize { width, height }); @@ -100,8 +110,13 @@ impl Window {              if let Some(parent) = self.platform_specific.parent {                  window_builder = window_builder.with_parent_window(parent);              } +            window_builder = window_builder +                .with_drag_and_drop(self.platform_specific.drag_and_drop);          } +        window_builder = window_builder +            .with_fullscreen(conversion::fullscreen(primary_monitor, mode)); +          window_builder      }  } @@ -110,6 +125,7 @@ impl Default for Window {      fn default() -> Window {          Window {              size: (1024, 768), +            position: Position::default(),              min_size: None,              max_size: None,              resizable: true, diff --git a/winit/src/settings/windows.rs b/winit/src/settings/windows.rs index 76b8d067..fc26acd7 100644 --- a/winit/src/settings/windows.rs +++ b/winit/src/settings/windows.rs @@ -2,8 +2,20 @@  //! Platform specific settings for Windows.  /// The platform specific window settings of an application. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)]  pub struct PlatformSpecific { -    /// Parent Window +    /// Parent window      pub parent: Option<winapi::shared::windef::HWND>, + +    /// Drag and drop support +    pub drag_and_drop: bool, +} + +impl Default for PlatformSpecific { +    fn default() -> Self { +        Self { +            parent: None, +            drag_and_drop: true, +        } +    }  }  | 
