From ddc94cf44c5e2ead5fb15c1db98741ba3242e6e3 Mon Sep 17 00:00:00 2001 From: Nico Burns Date: Sun, 6 Jul 2025 17:44:00 +0100 Subject: [PATCH] Native: Accept `winit::WindowAttributes` as a config value (#4364) --- Cargo.lock | 1 + examples/wgpu-texture/Cargo.toml | 1 + examples/wgpu-texture/src/main.rs | 15 ++++++++++++++- packages/native/src/lib.rs | 9 ++++++++- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6cdd20358..a17b0d75d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18426,6 +18426,7 @@ dependencies = [ "dioxus-native", "tracing-subscriber", "wgpu 24.0.5", + "winit", ] [[package]] diff --git a/examples/wgpu-texture/Cargo.toml b/examples/wgpu-texture/Cargo.toml index 04ccaae70..7a2542eb1 100644 --- a/examples/wgpu-texture/Cargo.toml +++ b/examples/wgpu-texture/Cargo.toml @@ -18,6 +18,7 @@ tracing = ["dep:tracing-subscriber", "dioxus-native/tracing"] dioxus-native = { path = "../../packages/native" } dioxus = { workspace = true } wgpu = "24" +winit = "0.30" bytemuck = "1" color = "0.3" tracing-subscriber = { workspace = true, optional = true } diff --git a/examples/wgpu-texture/src/main.rs b/examples/wgpu-texture/src/main.rs index 850085099..58d5698b6 100644 --- a/examples/wgpu-texture/src/main.rs +++ b/examples/wgpu-texture/src/main.rs @@ -5,6 +5,8 @@ use dioxus::prelude::*; use dioxus_native::use_wgpu; use std::any::Any; use wgpu::{Features, Limits}; +use winit::dpi::LogicalSize; +use winit::window::WindowAttributes; mod demo_renderer; @@ -19,6 +21,13 @@ fn limits() -> Limits { ..Limits::default() } } +fn window_attributes() -> WindowAttributes { + // You can also use a `` element to set the window title + // but this demonstrates the use of `WindowAttributes` + WindowAttributes::default() + .with_title("WGPU Example") + .with_inner_size(LogicalSize::new(800, 600)) +} type Color = OpaqueColor<Srgb>; @@ -26,7 +35,11 @@ fn main() { #[cfg(feature = "tracing")] tracing_subscriber::fmt::init(); - let config: Vec<Box<dyn Any>> = vec![Box::new(FEATURES), Box::new(limits())]; + let config: Vec<Box<dyn Any>> = vec![ + Box::new(FEATURES), + Box::new(limits()), + Box::new(window_attributes()), + ]; dioxus_native::launch_cfg(app, Vec::new(), config); } diff --git a/packages/native/src/lib.rs b/packages/native/src/lib.rs index c7e2805cc..e759b53ba 100644 --- a/packages/native/src/lib.rs +++ b/packages/native/src/lib.rs @@ -29,6 +29,7 @@ pub use dioxus_renderer::{use_wgpu, DioxusNativeWindowRenderer, Features, Limits use blitz_shell::{create_default_event_loop, BlitzShellEvent, Config, WindowConfig}; use dioxus_core::{ComponentFunction, Element, VirtualDom}; use std::any::Any; +use winit::window::WindowAttributes; type NodeId = usize; @@ -72,10 +73,12 @@ pub fn launch_cfg_with_props<P: Clone + 'static, M: 'static>( // Read config values let mut features = None; let mut limits = None; + let mut window_attributes = None; let mut _config = None; for mut cfg in configs { cfg = try_read_config!(cfg, features, Features); cfg = try_read_config!(cfg, limits, Limits); + cfg = try_read_config!(cfg, window_attributes, WindowAttributes); cfg = try_read_config!(cfg, _config, Config); let _ = cfg; } @@ -127,7 +130,11 @@ pub fn launch_cfg_with_props<P: Clone + 'static, M: 'static>( // Create document + window from the baked virtualdom let doc = DioxusDocument::new(vdom, net_provider); let renderer = DioxusNativeWindowRenderer::with_features_and_limits(features, limits); - let config = WindowConfig::new(Box::new(doc) as _, renderer.clone()); + let config = WindowConfig::with_attributes( + Box::new(doc) as _, + renderer.clone(), + window_attributes.unwrap_or_default(), + ); // Create application let mut application = DioxusNativeApplication::new(event_loop.create_proxy(), config);