summaryrefslogtreecommitdiffstats
path: root/winit
diff options
context:
space:
mode:
Diffstat (limited to 'winit')
-rw-r--r--winit/Cargo.toml5
-rw-r--r--winit/src/application.rs52
-rw-r--r--winit/src/error.rs12
-rw-r--r--winit/src/lib.rs3
-rw-r--r--winit/src/system.rs41
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,
+ }
+}