summaryrefslogtreecommitdiffstats
path: root/winit
diff options
context:
space:
mode:
Diffstat (limited to 'winit')
-rw-r--r--winit/Cargo.toml7
-rw-r--r--winit/src/application.rs51
-rw-r--r--winit/src/application/state.rs29
-rw-r--r--winit/src/conversion.rs17
-rw-r--r--winit/src/lib.rs7
-rw-r--r--winit/src/settings.rs24
-rw-r--r--winit/src/settings/windows.rs3
7 files changed, 90 insertions, 48 deletions
diff --git a/winit/Cargo.toml b/winit/Cargo.toml
index 58e13b3e..de7c1c62 100644
--- a/winit/Cargo.toml
+++ b/winit/Cargo.toml
@@ -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 = "c52db2045d0a2f1b8d9923870de1d4ab1994146e"
default-features = false
[dependencies.iced_runtime]
diff --git a/winit/src/application.rs b/winit/src/application.rs
index 3d7c6e5d..6e7b94ef 100644
--- a/winit/src/application.rs
+++ b/winit/src/application.rs
@@ -308,6 +308,8 @@ async fn run_instance<A, E, C>(
run_command(
&application,
+ &mut compositor,
+ &mut surface,
&mut cache,
&state,
&mut renderer,
@@ -318,7 +320,6 @@ async fn run_instance<A, E, C>(
&mut proxy,
&mut debug,
&window,
- || compositor.fetch_information(),
);
runtime.track(application.subscription().into_recipes());
@@ -356,7 +357,7 @@ async fn run_instance<A, E, C>(
let (interface_state, statuses) = user_interface.update(
&events,
- state.cursor_position(),
+ state.cursor(),
&mut renderer,
&mut clipboard,
&mut messages,
@@ -382,6 +383,8 @@ async fn run_instance<A, E, C>(
// Update application
update(
&mut application,
+ &mut compositor,
+ &mut surface,
&mut cache,
&state,
&mut renderer,
@@ -392,7 +395,6 @@ async fn run_instance<A, E, C>(
&mut debug,
&mut messages,
&window,
- || compositor.fetch_information(),
);
// Update window
@@ -422,7 +424,7 @@ async fn run_instance<A, E, C>(
let (interface_state, _) = user_interface.update(
&[redraw_event.clone()],
- state.cursor_position(),
+ state.cursor(),
&mut renderer,
&mut clipboard,
&mut messages,
@@ -435,7 +437,7 @@ async fn run_instance<A, E, C>(
&renderer::Style {
text_color: state.text_color(),
},
- state.cursor_position(),
+ state.cursor(),
);
debug.draw_finished();
@@ -508,7 +510,7 @@ async fn run_instance<A, E, C>(
&renderer::Style {
text_color: state.text_color(),
},
- state.cursor_position(),
+ state.cursor(),
);
if new_mouse_interaction != mouse_interaction {
@@ -645,8 +647,10 @@ where
/// Updates an [`Application`] by feeding it the provided messages, spawning any
/// resulting [`Command`], and tracking its [`Subscription`].
-pub fn update<A: Application, E: Executor>(
+pub fn update<A: Application, C, E: Executor>(
application: &mut A,
+ compositor: &mut C,
+ surface: &mut C::Surface,
cache: &mut user_interface::Cache,
state: &State<A>,
renderer: &mut A::Renderer,
@@ -657,8 +661,8 @@ pub fn update<A: Application, E: Executor>(
debug: &mut Debug,
messages: &mut Vec<A::Message>,
window: &winit::window::Window,
- graphics_info: impl FnOnce() -> compositor::Information + Copy,
) where
+ C: Compositor<Renderer = A::Renderer> + 'static,
<A::Renderer as core::Renderer>::Theme: StyleSheet,
{
for message in messages.drain(..) {
@@ -676,6 +680,8 @@ pub fn update<A: Application, E: Executor>(
run_command(
application,
+ compositor,
+ surface,
cache,
state,
renderer,
@@ -686,7 +692,6 @@ pub fn update<A: Application, E: Executor>(
proxy,
debug,
window,
- graphics_info,
);
}
@@ -695,8 +700,10 @@ pub fn update<A: Application, E: Executor>(
}
/// Runs the actions of a [`Command`].
-pub fn run_command<A, E>(
+pub fn run_command<A, C, E>(
application: &A,
+ compositor: &mut C,
+ surface: &mut C::Surface,
cache: &mut user_interface::Cache,
state: &State<A>,
renderer: &mut A::Renderer,
@@ -707,10 +714,10 @@ pub fn run_command<A, E>(
proxy: &mut winit::event_loop::EventLoopProxy<A::Message>,
debug: &mut Debug,
window: &winit::window::Window,
- _graphics_info: impl FnOnce() -> compositor::Information + Copy,
) where
A: Application,
E: Executor,
+ C: Compositor<Renderer = A::Renderer> + 'static,
<A::Renderer as core::Renderer>::Theme: StyleSheet,
{
use crate::runtime::command;
@@ -794,20 +801,36 @@ 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
.send_event(tag(window.id().into()))
.expect("Send message to event loop");
}
+ window::Action::Screenshot(tag) => {
+ let bytes = compositor.screenshot(
+ renderer,
+ surface,
+ state.viewport(),
+ state.background_color(),
+ &debug.overlay(),
+ );
+
+ proxy
+ .send_event(tag(window::Screenshot::new(
+ bytes,
+ state.physical_size(),
+ )))
+ .expect("Send message to event loop.")
+ }
},
command::Action::System(action) => match action {
system::Action::QueryInformation(_tag) => {
#[cfg(feature = "system")]
{
- let graphics_info = _graphics_info();
+ let graphics_info = compositor.fetch_information();
let proxy = proxy.clone();
let _ = std::thread::spawn(move || {
diff --git a/winit/src/application/state.rs b/winit/src/application/state.rs
index c37ccca6..967f43f2 100644
--- a/winit/src/application/state.rs
+++ b/winit/src/application/state.rs
@@ -1,7 +1,8 @@
use crate::application::{self, StyleSheet as _};
use crate::conversion;
use crate::core;
-use crate::core::{Color, Point, Size};
+use crate::core::mouse;
+use crate::core::{Color, Size};
use crate::graphics::Viewport;
use crate::runtime::Debug;
use crate::Application;
@@ -20,7 +21,7 @@ where
scale_factor: f64,
viewport: Viewport,
viewport_version: usize,
- cursor_position: winit::dpi::PhysicalPosition<f64>,
+ cursor_position: Option<winit::dpi::PhysicalPosition<f64>>,
modifiers: winit::event::ModifiersState,
theme: <A::Renderer as core::Renderer>::Theme,
appearance: application::Appearance,
@@ -52,8 +53,7 @@ where
scale_factor,
viewport,
viewport_version: 0,
- // TODO: Encode cursor availability in the type-system
- cursor_position: winit::dpi::PhysicalPosition::new(-1.0, -1.0),
+ cursor_position: None,
modifiers: winit::event::ModifiersState::default(),
theme,
appearance,
@@ -89,11 +89,16 @@ where
}
/// Returns the current cursor position of the [`State`].
- pub fn cursor_position(&self) -> Point {
- conversion::cursor_position(
- self.cursor_position,
- self.viewport.scale_factor(),
- )
+ pub fn cursor(&self) -> mouse::Cursor {
+ self.cursor_position
+ .map(|cursor_position| {
+ conversion::cursor_position(
+ cursor_position,
+ self.viewport.scale_factor(),
+ )
+ })
+ .map(mouse::Cursor::Available)
+ .unwrap_or(mouse::Cursor::Unavailable)
}
/// Returns the current keyboard modifiers of the [`State`].
@@ -153,12 +158,10 @@ where
| WindowEvent::Touch(Touch {
location: position, ..
}) => {
- self.cursor_position = *position;
+ self.cursor_position = Some(*position);
}
WindowEvent::CursorLeft { .. } => {
- // TODO: Encode cursor availability in the type-system
- self.cursor_position =
- winit::dpi::PhysicalPosition::new(-1.0, -1.0);
+ self.cursor_position = None;
}
WindowEvent::ModifiersChanged(new_modifiers) => {
self.modifiers = *new_modifiers;
diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs
index a9262184..dcae7074 100644
--- a/winit/src/conversion.rs
+++ b/winit/src/conversion.rs
@@ -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
@@ -250,9 +263,7 @@ pub fn mouse_button(mouse_button: winit::event::MouseButton) -> mouse::Button {
winit::event::MouseButton::Left => mouse::Button::Left,
winit::event::MouseButton::Right => mouse::Button::Right,
winit::event::MouseButton::Middle => mouse::Button::Middle,
- winit::event::MouseButton::Other(other) => {
- mouse::Button::Other(other as u8)
- }
+ winit::event::MouseButton::Other(other) => mouse::Button::Other(other),
}
}
diff --git a/winit/src/lib.rs b/winit/src/lib.rs
index 9f6bcebb..4776ea2c 100644
--- a/winit/src/lib.rs
+++ b/winit/src/lib.rs
@@ -25,11 +25,12 @@
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_cfg))]
+#![cfg_attr(docsrs, feature(doc_auto_cfg))]
pub use iced_graphics as graphics;
pub use iced_runtime as runtime;
pub use iced_runtime::core;
diff --git a/winit/src/settings.rs b/winit/src/settings.rs
index be0ab329..40b3d487 100644
--- a/winit/src/settings.rs
+++ b/winit/src/settings.rs
@@ -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;
@@ -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>,
@@ -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()
@@ -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(
@@ -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);
@@ -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);
}
@@ -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(),
}
diff --git a/winit/src/settings/windows.rs b/winit/src/settings/windows.rs
index ff03a9c5..45d753bd 100644
--- a/winit/src/settings/windows.rs
+++ b/winit/src/settings/windows.rs
@@ -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,