Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update to winit 0.28 #1738

Merged
merged 13 commits into from
May 25, 2023
2 changes: 2 additions & 0 deletions core/src/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@
pub mod icon;

mod event;
mod level;
mod mode;
mod redraw_request;
mod user_attention;

pub use event::Event;
pub use icon::Icon;
pub use level::Level;
pub use mode::Mode;
pub use redraw_request::RedrawRequest;
pub use user_attention::UserAttention;
19 changes: 19 additions & 0 deletions core/src/window/level.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/// A window level groups windows with respect to their z-position.
///
/// The relative ordering between windows in different window levels is fixed.
/// The z-order of a window within the same window level may change dynamically
/// on user interaction.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Level {
/// The default behavior.
#[default]
Normal,

/// The window will always be below normal windows.
///
/// This is useful for a widget-based app.
AlwaysOnBottom,

/// The window will always be on top of normal windows.
AlwaysOnTop,
}
10 changes: 5 additions & 5 deletions runtime/src/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ pub use action::Action;

use crate::command::{self, Command};
use crate::core::time::Instant;
use crate::core::window::{Event, Icon, Mode, UserAttention};
use crate::core::window::{Event, Icon, Level, Mode, UserAttention};
use crate::futures::subscription::{self, Subscription};

/// Subscribes to the frames of the window of the running application.
Expand Down Expand Up @@ -53,7 +53,7 @@ pub fn move_to<Message>(x: i32, y: i32) -> Command<Message> {
Command::single(command::Action::Window(Action::Move { x, y }))
}

/// Sets the [`Mode`] of the window.
/// Changes the [`Mode`] of the window.
pub fn change_mode<Message>(mode: Mode) -> Command<Message> {
Command::single(command::Action::Window(Action::ChangeMode(mode)))
}
Expand Down Expand Up @@ -99,9 +99,9 @@ pub fn gain_focus<Message>() -> Command<Message> {
Command::single(command::Action::Window(Action::GainFocus))
}

/// Changes whether or not the window will always be on top of other windows.
pub fn change_always_on_top<Message>(on_top: bool) -> Command<Message> {
Command::single(command::Action::Window(Action::ChangeAlwaysOnTop(on_top)))
/// Changes the window [`Level`].
pub fn change_level<Message>(level: Level) -> Command<Message> {
Command::single(command::Action::Window(Action::ChangeLevel(level)))
}

/// Fetches an identifier unique to the window.
Expand Down
26 changes: 10 additions & 16 deletions runtime/src/window/action.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
use crate::core::window::{Icon, Mode, UserAttention};
use crate::core::window::{Icon, Level, Mode, UserAttention};
use crate::futures::MaybeSend;

use std::fmt;

/// An operation to be performed on some window.
pub enum Action<T> {
/// Closes the current window and exits the application.
/// Close the current window and exits the application.
Close,
/// Moves the window with the left mouse button until the button is
/// Move the window with the left mouse button until the button is
/// released.
///
/// There’s no guarantee that this will work unless the left mouse
Expand All @@ -20,7 +20,7 @@ pub enum Action<T> {
/// The new logical height of the window
height: u32,
},
/// Sets the window to maximized or back
/// Set the window to maximized or back
Maximize(bool),
/// Set the window to minimized or back
Minimize(bool),
Expand Down Expand Up @@ -70,15 +70,11 @@ pub enum Action<T> {
///
/// - **Web / Wayland:** Unsupported.
GainFocus,
/// Change whether or not the window will always be on top of other windows.
///
/// ## Platform-specific
///
/// - **Web / Wayland:** Unsupported.
ChangeAlwaysOnTop(bool),
/// Change the window [`Level`].
ChangeLevel(Level),
/// Fetch an identifier unique to the window.
FetchId(Box<dyn FnOnce(u64) -> T + 'static>),
/// Changes the window [`Icon`].
/// Change the window [`Icon`].
///
/// On Windows and X11, this is typically the small icon in the top-left
/// corner of the titlebar.
Expand Down Expand Up @@ -119,9 +115,7 @@ impl<T> Action<T> {
Action::RequestUserAttention(attention_type)
}
Self::GainFocus => Action::GainFocus,
Self::ChangeAlwaysOnTop(on_top) => {
Action::ChangeAlwaysOnTop(on_top)
}
Self::ChangeLevel(level) => Action::ChangeLevel(level),
Self::FetchId(o) => Action::FetchId(Box::new(move |s| f(o(s)))),
Self::ChangeIcon(icon) => Action::ChangeIcon(icon),
}
Expand Down Expand Up @@ -154,8 +148,8 @@ impl<T> fmt::Debug for Action<T> {
write!(f, "Action::RequestUserAttention")
}
Self::GainFocus => write!(f, "Action::GainFocus"),
Self::ChangeAlwaysOnTop(on_top) => {
write!(f, "Action::AlwaysOnTop({on_top})")
Self::ChangeLevel(level) => {
write!(f, "Action::ChangeLevel({level:?})")
}
Self::FetchId(_) => write!(f, "Action::FetchId"),
Self::ChangeIcon(_icon) => {
Expand Down
10 changes: 5 additions & 5 deletions src/window/settings.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::window::{Icon, Position};
use crate::window::{Icon, Level, Position};

pub use iced_winit::settings::PlatformSpecific;

Expand Down Expand Up @@ -29,8 +29,8 @@ pub struct Settings {
/// Whether the window should be transparent.
pub transparent: bool,

/// Whether the window will always be on top of other windows.
pub always_on_top: bool,
/// The window [`Level`].
pub level: Level,

/// The icon of the window.
pub icon: Option<Icon>,
Expand All @@ -50,7 +50,7 @@ impl Default for Settings {
resizable: true,
decorations: true,
transparent: false,
always_on_top: false,
level: Level::default(),
icon: None,
platform_specific: Default::default(),
}
Expand All @@ -68,7 +68,7 @@ impl From<Settings> for iced_winit::settings::Window {
resizable: settings.resizable,
decorations: settings.decorations,
transparent: settings.transparent,
always_on_top: settings.always_on_top,
level: settings.level,
icon: settings.icon.map(Icon::into),
platform_specific: settings.platform_specific,
}
Expand Down
7 changes: 4 additions & 3 deletions winit/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,15 @@ wayland-dlopen = ["winit/wayland-dlopen"]
wayland-csd-adwaita = ["winit/wayland-csd-adwaita"]

[dependencies]
window_clipboard = "0.2"
window_clipboard = "0.3"
log = "0.4"
thiserror = "1.0"
raw-window-handle = "0.5"

[dependencies.winit]
version = "0.27"
version = "0.28"
git = "https://github.com/iced-rs/winit.git"
rev = "940457522e9fb9f5dac228b0ecfafe0138b4048c"
rev = "ac1ddfe0bd870910b3aa64a18d386fdd55b30a1d"
default-features = false

[dependencies.iced_runtime]
Expand Down
4 changes: 2 additions & 2 deletions winit/src/application.rs
Original file line number Diff line number Diff line change
Expand Up @@ -794,8 +794,8 @@ pub fn run_command<A, E>(
window::Action::GainFocus => {
window.focus_window();
}
window::Action::ChangeAlwaysOnTop(on_top) => {
window.set_always_on_top(on_top);
window::Action::ChangeLevel(level) => {
window.set_window_level(conversion::window_level(level));
}
window::Action::FetchId(tag) => {
proxy
Expand Down
13 changes: 13 additions & 0 deletions winit/src/conversion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,19 @@ pub fn window_event(
}
}

/// Converts a [`window::Level`] to a [`winit`] window level.
///
/// [`winit`]: https://github.com/rust-windowing/winit
pub fn window_level(level: window::Level) -> winit::window::WindowLevel {
match level {
window::Level::Normal => winit::window::WindowLevel::Normal,
window::Level::AlwaysOnBottom => {
winit::window::WindowLevel::AlwaysOnBottom
}
window::Level::AlwaysOnTop => winit::window::WindowLevel::AlwaysOnTop,
}
}

/// Converts a [`Position`] to a [`winit`] logical position for a given monitor.
///
/// [`winit`]: https://github.com/rust-windowing/winit
Expand Down
5 changes: 3 additions & 2 deletions winit/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@
clippy::from_over_into,
clippy::needless_borrow,
clippy::new_without_default,
clippy::useless_conversion
clippy::useless_conversion,
unsafe_code
)]
#![forbid(rust_2018_idioms, unsafe_code)]
#![forbid(rust_2018_idioms)]
#![allow(clippy::inherent_to_string, clippy::type_complexity)]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
pub use iced_graphics as graphics;
Expand Down
24 changes: 13 additions & 11 deletions winit/src/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ mod platform;
pub use platform::PlatformSpecific;

use crate::conversion;
use crate::core::window::Icon;
use crate::core::window::{Icon, Level};
use crate::Position;

use winit::monitor::MonitorHandle;
Expand Down Expand Up @@ -81,8 +81,8 @@ pub struct Window {
/// Whether the window should be transparent.
pub transparent: bool,

/// Whether the window will always be on top of other windows.
pub always_on_top: bool,
/// The window [`Level`].
pub level: Level,

/// The window icon, which is also usually used in the taskbar
pub icon: Option<Icon>,
Expand All @@ -102,7 +102,7 @@ impl fmt::Debug for Window {
.field("resizable", &self.resizable)
.field("decorations", &self.decorations)
.field("transparent", &self.transparent)
.field("always_on_top", &self.always_on_top)
.field("level", &self.level)
.field("icon", &self.icon.is_some())
.field("platform_specific", &self.platform_specific)
.finish()
Expand All @@ -128,7 +128,7 @@ impl Window {
.with_decorations(self.decorations)
.with_transparent(self.transparent)
.with_window_icon(self.icon.and_then(conversion::icon))
.with_always_on_top(self.always_on_top)
.with_window_level(conversion::window_level(self.level))
.with_visible(self.visible);

if let Some(position) = conversion::position(
Expand Down Expand Up @@ -157,7 +157,9 @@ impl Window {
target_os = "openbsd"
))]
{
use ::winit::platform::unix::WindowBuilderExtUnix;
// `with_name` is available on both `WindowBuilderExtWayland` and `WindowBuilderExtX11` and they do
// exactly the same thing. We arbitrarily choose `WindowBuilderExtWayland` here.
use ::winit::platform::wayland::WindowBuilderExtWayland;

if let Some(id) = _id {
window_builder = window_builder.with_name(id.clone(), id);
Expand All @@ -167,11 +169,11 @@ impl Window {
#[cfg(target_os = "windows")]
{
use winit::platform::windows::WindowBuilderExtWindows;

if let Some(parent) = self.platform_specific.parent {
window_builder = window_builder.with_parent_window(parent);
#[allow(unsafe_code)]
unsafe {
window_builder = window_builder
.with_parent_window(self.platform_specific.parent);
}

window_builder = window_builder
.with_drag_and_drop(self.platform_specific.drag_and_drop);
}
Expand Down Expand Up @@ -205,7 +207,7 @@ impl Default for Window {
resizable: true,
decorations: true,
transparent: false,
always_on_top: false,
level: Level::default(),
icon: None,
platform_specific: Default::default(),
}
Expand Down
3 changes: 2 additions & 1 deletion winit/src/settings/windows.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
//! Platform specific settings for Windows.
use raw_window_handle::RawWindowHandle;

/// The platform specific window settings of an application.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PlatformSpecific {
/// Parent window
pub parent: Option<winit::platform::windows::HWND>,
pub parent: Option<RawWindowHandle>,

/// Drag and drop support
pub drag_and_drop: bool,
Expand Down