diff options
Diffstat (limited to 'winit')
-rw-r--r-- | winit/src/application.rs | 53 | ||||
-rw-r--r-- | winit/src/application/profiler.rs | 4 | ||||
-rw-r--r-- | winit/src/settings.rs | 3 | ||||
-rw-r--r-- | winit/src/window.rs | 75 |
4 files changed, 102 insertions, 33 deletions
diff --git a/winit/src/application.rs b/winit/src/application.rs index 77ca4b31..3fdec658 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -147,11 +147,15 @@ where #[cfg(target_arch = "wasm32")] let target = settings.window.platform_specific.target.clone(); - let builder = settings.window.into_builder( - &application.title(), - event_loop.primary_monitor(), - settings.id, - ); + let should_be_visible = settings.window.visible; + let builder = settings + .window + .into_builder( + &application.title(), + event_loop.primary_monitor(), + settings.id, + ) + .with_visible(false); log::info!("Window builder: {:#?}", builder); @@ -202,6 +206,7 @@ where control_sender, init_command, window, + should_be_visible, settings.exit_on_close_request, ); @@ -268,6 +273,7 @@ async fn run_instance<A, E, C>( mut control_sender: mpsc::UnboundedSender<winit::event_loop::ControlFlow>, init_command: Command<A::Message>, window: winit::window::Window, + should_be_visible: bool, exit_on_close_request: bool, ) where A: Application + 'static, @@ -295,6 +301,10 @@ async fn run_instance<A, E, C>( physical_size.height, ); + if should_be_visible { + window.set_visible(true); + } + run_command( &application, &mut cache, @@ -535,7 +545,7 @@ async fn run_instance<A, E, C>( Err(error) => match error { // This is an unrecoverable error. compositor::SurfaceError::OutOfMemory => { - panic!("{:?}", error); + panic!("{error:?}"); } _ => { debug.render_finished(); @@ -737,11 +747,11 @@ pub fn run_command<A, E>( height, }); } - window::Action::Maximize(value) => { - window.set_maximized(value); + window::Action::Maximize(maximized) => { + window.set_maximized(maximized); } - window::Action::Minimize(value) => { - window.set_minimized(value); + window::Action::Minimize(minimized) => { + window.set_minimized(minimized); } window::Action::Move { x, y } => { window.set_outer_position(winit::dpi::LogicalPosition { @@ -749,7 +759,7 @@ pub fn run_command<A, E>( y, }); } - window::Action::SetMode(mode) => { + window::Action::ChangeMode(mode) => { window.set_visible(conversion::visible(mode)); window.set_fullscreen(conversion::fullscreen( window.primary_monitor(), @@ -771,13 +781,24 @@ pub fn run_command<A, E>( window.set_maximized(!window.is_maximized()) } window::Action::ToggleDecorations => { - window.set_decorations(!window.is_decorated()) + window.set_decorations(!window.is_decorated()); } - window::Action::RequestUserAttention(user_attention) => window - .request_user_attention( + window::Action::RequestUserAttention(user_attention) => { + window.request_user_attention( user_attention.map(conversion::user_attention), - ), - window::Action::GainFocus => window.focus_window(), + ); + } + window::Action::GainFocus => { + window.focus_window(); + } + window::Action::ChangeAlwaysOnTop(on_top) => { + window.set_always_on_top(on_top); + } + window::Action::FetchId(tag) => { + proxy + .send_event(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/application/profiler.rs b/winit/src/application/profiler.rs index 23eaa390..7031507a 100644 --- a/winit/src/application/profiler.rs +++ b/winit/src/application/profiler.rs @@ -49,8 +49,8 @@ impl Profiler { .to_str() .unwrap_or("trace"); - let path = out_dir - .join(format!("{}_trace_{}.json", curr_exe_name, time)); + let path = + out_dir.join(format!("{curr_exe_name}_trace_{time}.json")); layer = layer.file(path); } else { diff --git a/winit/src/settings.rs b/winit/src/settings.rs index 9bbdef5c..45f38833 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -114,8 +114,7 @@ impl Window { .with_decorations(self.decorations) .with_transparent(self.transparent) .with_window_icon(self.icon) - .with_always_on_top(self.always_on_top) - .with_visible(self.visible); + .with_always_on_top(self.always_on_top); if let Some(position) = conversion::position( primary_monitor.as_ref(), diff --git a/winit/src/window.rs b/winit/src/window.rs index 2306bdf1..961562bd 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -22,14 +22,18 @@ pub fn resize<Message>(width: u32, height: u32) -> Command<Message> { })) } -/// Sets the window to maximized or back. -pub fn maximize<Message>(value: bool) -> Command<Message> { - Command::single(command::Action::Window(window::Action::Maximize(value))) +/// Maximizes the window. +pub fn maximize<Message>(maximized: bool) -> Command<Message> { + Command::single(command::Action::Window(window::Action::Maximize( + maximized, + ))) } -/// Set the window to minimized or back. -pub fn minimize<Message>(value: bool) -> Command<Message> { - Command::single(command::Action::Window(window::Action::Minimize(value))) +/// Minimes the window. +pub fn minimize<Message>(minimized: bool) -> Command<Message> { + Command::single(command::Action::Window(window::Action::Minimize( + minimized, + ))) } /// Moves a window to the given logical coordinates. @@ -38,13 +42,8 @@ pub fn move_to<Message>(x: i32, y: i32) -> Command<Message> { } /// Sets the [`Mode`] of the window. -pub fn set_mode<Message>(mode: Mode) -> Command<Message> { - Command::single(command::Action::Window(window::Action::SetMode(mode))) -} - -/// Sets the window to maximized or back. -pub fn toggle_maximize<Message>() -> Command<Message> { - Command::single(command::Action::Window(window::Action::ToggleMaximize)) +pub fn change_mode<Message>(mode: Mode) -> Command<Message> { + Command::single(command::Action::Window(window::Action::ChangeMode(mode))) } /// Fetches the current [`Mode`] of the window. @@ -55,3 +54,53 @@ pub fn fetch_mode<Message>( Box::new(f), ))) } + +/// Toggles the window to maximized or back. +pub fn toggle_maximize<Message>() -> Command<Message> { + Command::single(command::Action::Window(window::Action::ToggleMaximize)) +} + +/// Toggles the window decorations. +pub fn toggle_decorations<Message>() -> Command<Message> { + Command::single(command::Action::Window(window::Action::ToggleDecorations)) +} + +/// Request user attention to the window, this has no effect if the application +/// is already focused. How requesting for user attention manifests is platform dependent, +/// see [`UserAttention`] for details. +/// +/// Providing `None` will unset the request for user attention. Unsetting the request for +/// user attention might not be done automatically by the WM when the window receives input. +pub fn request_user_attention<Message>( + user_attention: Option<UserAttention>, +) -> Command<Message> { + Command::single(command::Action::Window( + window::Action::RequestUserAttention(user_attention), + )) +} + +/// Brings the window to the front and sets input focus. Has no effect if the window is +/// already in focus, minimized, or not visible. +/// +/// This [`Command`] steals input focus from other applications. Do not use this method unless +/// you are certain that's what the user wants. Focus stealing can cause an extremely disruptive +/// user experience. +pub fn gain_focus<Message>() -> Command<Message> { + Command::single(command::Action::Window(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(window::Action::ChangeAlwaysOnTop( + on_top, + ))) +} + +/// Fetches an identifier unique to the window. +pub fn fetch_id<Message>( + f: impl FnOnce(u64) -> Message + 'static, +) -> Command<Message> { + Command::single(command::Action::Window(window::Action::FetchId(Box::new( + f, + )))) +} |