diff options
Diffstat (limited to 'winit')
-rw-r--r-- | winit/Cargo.toml | 5 | ||||
-rw-r--r-- | winit/src/application.rs | 52 | ||||
-rw-r--r-- | winit/src/error.rs | 12 | ||||
-rw-r--r-- | winit/src/lib.rs | 3 | ||||
-rw-r--r-- | winit/src/system.rs | 41 |
5 files changed, 93 insertions, 20 deletions
diff --git a/winit/Cargo.toml b/winit/Cargo.toml index 2beebdfb..3b9ae859 100644 --- a/winit/Cargo.toml +++ b/winit/Cargo.toml @@ -12,6 +12,7 @@ categories = ["gui"] [features] debug = ["iced_native/debug"] +system = ["sysinfo"] [dependencies] window_clipboard = "0.2" @@ -41,3 +42,7 @@ version = "0.3.6" [target.'cfg(target_arch = "wasm32")'.dependencies.web-sys] version = "0.3" features = ["Document", "Window"] + +[dependencies.sysinfo] +version = "0.23" +optional = true diff --git a/winit/src/application.rs b/winit/src/application.rs index ed077507..90b03d56 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -13,6 +13,7 @@ use crate::{ use iced_futures::futures; use iced_futures::futures::channel::mpsc; +use iced_graphics::compositor; use iced_graphics::window; use iced_native::program::Program; use iced_native::user_interface::{self, UserInterface}; @@ -137,14 +138,16 @@ where let subscription = application.subscription(); - let window = settings - .window - .into_builder( - &application.title(), - application.mode(), - event_loop.primary_monitor(), - settings.id, - ) + let builder = settings.window.into_builder( + &application.title(), + application.mode(), + event_loop.primary_monitor(), + settings.id, + ); + + log::info!("Window builder: {:#?}", builder); + + let window = builder .build(&event_loop) .map_err(Error::WindowCreationFailed)?; @@ -165,17 +168,18 @@ where let mut clipboard = Clipboard::connect(&window); + let (compositor, renderer) = C::new(compositor_settings, Some(&window))?; + run_command( init_command, &mut runtime, &mut clipboard, &mut proxy, &window, + || compositor.fetch_information(), ); runtime.track(subscription); - let (compositor, renderer) = C::new(compositor_settings, Some(&window))?; - let (mut sender, receiver) = mpsc::unbounded(); let mut instance = Box::pin(run_instance::<A, E, C>( @@ -315,6 +319,7 @@ async fn run_instance<A, E, C>( &mut debug, &mut messages, &window, + || compositor.fetch_information(), ); // Update window @@ -420,7 +425,7 @@ async fn run_instance<A, E, C>( } Err(error) => match error { // This is an unrecoverable error. - window::SurfaceError::OutOfMemory => { + compositor::SurfaceError::OutOfMemory => { panic!("{:?}", error); } _ => { @@ -514,6 +519,7 @@ 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, ) { for message in messages.drain(..) { debug.log_message(&message); @@ -522,7 +528,7 @@ pub fn update<A: Application, E: Executor>( let command = runtime.enter(|| application.update(message)); debug.update_finished(); - run_command(command, runtime, clipboard, proxy, window); + run_command(command, runtime, clipboard, proxy, window, graphics_info); } let subscription = application.subscription(); @@ -536,8 +542,10 @@ pub fn run_command<Message: 'static + std::fmt::Debug + Send, E: Executor>( clipboard: &mut Clipboard, proxy: &mut winit::event_loop::EventLoopProxy<Message>, window: &winit::window::Window, + _graphics_info: impl FnOnce() -> compositor::Information + Copy, ) { use iced_native::command; + use iced_native::system; use iced_native::window; for action in command.actions() { @@ -571,6 +579,26 @@ pub fn run_command<Message: 'static + std::fmt::Debug + Send, E: Executor>( }); } }, + command::Action::System(action) => match action { + system::Action::QueryInformation(_tag) => { + #[cfg(feature = "system")] + { + let graphics_info = _graphics_info(); + let proxy = proxy.clone(); + + let _ = std::thread::spawn(move || { + let information = + crate::system::information(graphics_info); + + let message = _tag(information); + + proxy + .send_event(message) + .expect("Send message to event loop") + }); + } + } + }, } } } diff --git a/winit/src/error.rs b/winit/src/error.rs index 8e1d20e8..eaeafd51 100644 --- a/winit/src/error.rs +++ b/winit/src/error.rs @@ -11,17 +11,13 @@ pub enum Error { #[error("the application window could not be created")] WindowCreationFailed(winit::error::OsError), - /// A suitable graphics adapter or device could not be found. - #[error("a suitable graphics adapter or device could not be found")] - GraphicsAdapterNotFound, + /// The application graphics context could not be created. + #[error("the application graphics context could not be created")] + GraphicsCreationFailed(iced_graphics::Error), } impl From<iced_graphics::Error> for Error { fn from(error: iced_graphics::Error) -> Error { - match error { - iced_graphics::Error::AdapterNotFound => { - Error::GraphicsAdapterNotFound - } - } + Error::GraphicsCreationFailed(error) } } diff --git a/winit/src/lib.rs b/winit/src/lib.rs index 2bb30caa..22e7efdf 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -33,6 +33,9 @@ pub mod conversion; pub mod settings; pub mod window; +#[cfg(feature = "system")] +pub mod system; + mod error; mod mode; mod position; diff --git a/winit/src/system.rs b/winit/src/system.rs new file mode 100644 index 00000000..0ed61dc9 --- /dev/null +++ b/winit/src/system.rs @@ -0,0 +1,41 @@ +//! Access the native system. +use crate::command::{self, Command}; +pub use iced_native::system::*; + +use iced_graphics::compositor; + +/// Query for available system information. +pub fn fetch_information<Message>( + f: impl Fn(Information) -> Message + Send + 'static, +) -> Command<Message> { + Command::single(command::Action::System(Action::QueryInformation( + Box::new(f), + ))) +} + +pub(crate) fn information( + graphics_info: compositor::Information, +) -> Information { + use sysinfo::{ProcessExt, ProcessorExt, System, SystemExt}; + let mut system = System::new_all(); + system.refresh_all(); + + let cpu = system.global_processor_info(); + + let memory_used = sysinfo::get_current_pid() + .and_then(|pid| system.process(pid).ok_or("Process not found")) + .and_then(|process| Ok(process.memory())) + .ok(); + + Information { + system_name: system.name(), + system_kernel: system.kernel_version(), + system_version: system.long_os_version(), + cpu_brand: cpu.brand().into(), + cpu_cores: system.physical_core_count(), + memory_total: system.total_memory(), + memory_used, + graphics_adapter: graphics_info.adapter, + graphics_backend: graphics_info.backend, + } +} |