diff options
-rw-r--r-- | examples/multi_window/src/main.rs | 4 | ||||
-rw-r--r-- | glutin/src/multi_window.rs | 18 | ||||
-rw-r--r-- | src/multi_window/application.rs | 1 | ||||
-rw-r--r-- | winit/src/multi_window.rs | 21 | ||||
-rw-r--r-- | winit/src/window.rs | 2 |
5 files changed, 34 insertions, 12 deletions
diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 17d662b4..c2687ee6 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -441,7 +441,7 @@ impl Pane { fn new(id: usize, axis: pane_grid::Axis) -> Self { Self { id, - scrollable_id: scrollable::Id::new(format!("{:?}", id)), + scrollable_id: scrollable::Id::unique(), axis, is_pinned: false, is_moving: false, @@ -495,7 +495,7 @@ fn view_content<'a>( controls, ] .width(Length::Fill) - .height(Length::Units(800)) + .height(800) .spacing(10) .align_items(Alignment::Center); diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index da450dee..620d01d8 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -25,16 +25,15 @@ use glutin::surface::{GlSurface, SwapInterval}; use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; use crate::application::gl_surface; -use iced_native::window::Action; use iced_winit::multi_window::Event; use std::collections::HashMap; use std::ffi::CString; use std::mem::ManuallyDrop; use std::num::NonZeroU32; +use iced_native::widget::operation; #[cfg(feature = "tracing")] use tracing::{info_span, instrument::Instrument}; -use iced_native::widget::operation; #[allow(unsafe_code)] const ONE: NonZeroU32 = unsafe { NonZeroU32::new_unchecked(1) }; @@ -937,16 +936,27 @@ pub fn run_command<A, E>( let window = windows.get(&id).expect("No window found!"); window.set_decorations(!window.is_decorated()); } - Action::RequestUserAttention(attention_type) => { + window::Action::RequestUserAttention(attention_type) => { let window = windows.get(&id).expect("No window found!"); window.request_user_attention( attention_type.map(conversion::user_attention), ); } - Action::GainFocus => { + window::Action::GainFocus => { let window = windows.get(&id).expect("No window found!"); window.focus_window(); } + window::Action::ChangeAlwaysOnTop(on_top) => { + let window = windows.get(&id).expect("No window found!"); + window.set_always_on_top(on_top); + } + window::Action::FetchId(tag) => { + let window = windows.get(&id).expect("No window found!"); + + proxy + .send_event(Event::Application(tag(window.id().into()))) + .expect("Send message to event loop.") + } }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index 3af1d8d5..d0b515ab 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -148,6 +148,7 @@ pub trait Application: Sized { /// while a scale factor of `0.5` will shrink them to half their size. /// /// By default, it returns `1.0`. + #[allow(unused_variables)] fn scale_factor(&self, window: window::Id) -> f64 { 1.0 } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 17eaa6fe..96dd1c8b 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -4,12 +4,12 @@ mod state; pub use state::State; use crate::clipboard::{self, Clipboard}; +use crate::conversion; use crate::mouse; use crate::renderer; use crate::settings; use crate::widget::operation; use crate::window; -use crate::conversion; use crate::{ Command, Debug, Element, Error, Executor, Proxy, Renderer, Runtime, Settings, Size, Subscription, @@ -22,7 +22,6 @@ use iced_native::user_interface::{self, UserInterface}; pub use iced_native::application::{Appearance, StyleSheet}; -use iced_native::window::Action; use std::collections::HashMap; use std::mem::ManuallyDrop; use std::time::Instant; @@ -147,6 +146,7 @@ where /// while a scale factor of `0.5` will shrink them to half their size. /// /// By default, it returns `1.0`. + #[allow(unused_variables)] fn scale_factor(&self, window: window::Id) -> f64 { 1.0 } @@ -470,7 +470,7 @@ async fn run_instance<A, E, C>( user_interface::State::Outdated, ) { - let user_interfaces: HashMap<_, _> = + let cached_interfaces: HashMap<_, _> = ManuallyDrop::into_inner(interfaces) .drain() .map( @@ -510,7 +510,7 @@ async fn run_instance<A, E, C>( &mut renderer, &mut debug, &states, - user_interfaces, + cached_interfaces, )); if application.should_exit() { @@ -1057,10 +1057,21 @@ pub fn run_command<A, E>( attention_type.map(conversion::user_attention), ); } - Action::GainFocus => { + window::Action::GainFocus => { let window = windows.get(&id).expect("No window found!"); window.focus_window(); } + window::Action::ChangeAlwaysOnTop(on_top) => { + let window = windows.get(&id).expect("No window found!"); + window.set_always_on_top(on_top); + } + window::Action::FetchId(tag) => { + let window = windows.get(&id).expect("No window found!"); + + proxy + .send_event(Event::Application(tag(window.id().into()))) + .expect("Send message to event loop.") + } }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { diff --git a/winit/src/window.rs b/winit/src/window.rs index 88cd3f14..8fd415ef 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -122,7 +122,7 @@ pub fn fetch_id<Message>( id: window::Id, f: impl FnOnce(u64) -> Message + 'static, ) -> Command<Message> { - Command::single(command::Action::Window(id: window::Id, window::Action::FetchId(Box::new( + Command::single(command::Action::Window(id, window::Action::FetchId(Box::new( f, )))) } |