mirror of
https://github.com/bevyengine/bevy
synced 2024-11-10 07:04:33 +00:00
Remove CanvasParentResizePlugin (#11057)
Improves #11052 # Changelog - Remove `Window::fit_canvas_to_parent`, as its resizing on wasm now respects its CSS configuration. ## Migration Guide - Remove uses of `Window::fit_canvas_to_parent` in favor of CSS properties, for example: ```css canvas { width: 100%; height: 100%; } ```
This commit is contained in:
parent
b27f74911a
commit
80f15e0dbb
6 changed files with 1 additions and 166 deletions
|
@ -191,14 +191,6 @@ pub struct Window {
|
|||
///
|
||||
/// This value has no effect on non-web platforms.
|
||||
pub canvas: Option<String>,
|
||||
/// Whether or not to fit the canvas element's size to its parent element's size.
|
||||
///
|
||||
/// **Warning**: this will not behave as expected for parents that set their size according to the size of their
|
||||
/// children. This creates a "feedback loop" that will result in the canvas growing on each resize. When using this
|
||||
/// feature, ensure the parent's size is not affected by its children.
|
||||
///
|
||||
/// This value has no effect on non-web platforms.
|
||||
pub fit_canvas_to_parent: bool,
|
||||
/// Whether or not to stop events from propagating out of the canvas element
|
||||
///
|
||||
/// When `true`, this will prevent common browser hotkeys like F5, F12, Ctrl+R, tab, etc.
|
||||
|
@ -266,7 +258,6 @@ impl Default for Window {
|
|||
transparent: false,
|
||||
focused: true,
|
||||
window_level: Default::default(),
|
||||
fit_canvas_to_parent: false,
|
||||
prevent_default_event_handling: true,
|
||||
canvas: None,
|
||||
window_theme: None,
|
||||
|
|
|
@ -9,8 +9,6 @@
|
|||
pub mod accessibility;
|
||||
mod converters;
|
||||
mod system;
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
mod web_resize;
|
||||
mod winit_config;
|
||||
mod winit_windows;
|
||||
|
||||
|
@ -55,8 +53,6 @@ use winit::{
|
|||
use crate::accessibility::{AccessKitAdapters, AccessKitPlugin, WinitActionHandlers};
|
||||
|
||||
use crate::converters::convert_winit_theme;
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
use crate::web_resize::{CanvasParentResizeEventChannel, CanvasParentResizePlugin};
|
||||
|
||||
/// [`AndroidApp`] provides an interface to query the application state as well as monitor events
|
||||
/// (for example lifecycle and input events).
|
||||
|
@ -143,9 +139,6 @@ impl Plugin for WinitPlugin {
|
|||
|
||||
app.add_plugins(AccessKitPlugin);
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
app.add_plugins(CanvasParentResizePlugin);
|
||||
|
||||
let event_loop = event_loop_builder
|
||||
.build()
|
||||
.expect("Failed to build event loop");
|
||||
|
@ -181,7 +174,6 @@ impl Plugin for WinitPlugin {
|
|||
NonSendMut<AccessKitAdapters>,
|
||||
ResMut<WinitActionHandlers>,
|
||||
ResMut<AccessibilityRequested>,
|
||||
ResMut<CanvasParentResizeEventChannel>,
|
||||
)> = SystemState::from_world(&mut app.world);
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
|
@ -204,7 +196,6 @@ impl Plugin for WinitPlugin {
|
|||
adapters,
|
||||
handlers,
|
||||
accessibility_requested,
|
||||
event_channel,
|
||||
) = create_window_system_state.get_mut(&mut app.world);
|
||||
|
||||
create_windows(
|
||||
|
@ -216,8 +207,6 @@ impl Plugin for WinitPlugin {
|
|||
adapters,
|
||||
handlers,
|
||||
accessibility_requested,
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
event_channel,
|
||||
);
|
||||
|
||||
create_window_system_state.apply(&mut app.world);
|
||||
|
@ -340,7 +329,6 @@ pub fn winit_runner(mut app: App) {
|
|||
NonSend<AccessKitAdapters>,
|
||||
)> = SystemState::new(&mut app.world);
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
let mut create_window_system_state: SystemState<(
|
||||
Commands,
|
||||
Query<(Entity, &mut Window), Added<Window>>,
|
||||
|
@ -351,18 +339,6 @@ pub fn winit_runner(mut app: App) {
|
|||
ResMut<AccessibilityRequested>,
|
||||
)> = SystemState::from_world(&mut app.world);
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
let mut create_window_system_state: SystemState<(
|
||||
Commands,
|
||||
Query<(Entity, &mut Window), Added<Window>>,
|
||||
EventWriter<WindowCreated>,
|
||||
NonSendMut<WinitWindows>,
|
||||
NonSendMut<AccessKitAdapters>,
|
||||
ResMut<WinitActionHandlers>,
|
||||
ResMut<AccessibilityRequested>,
|
||||
ResMut<CanvasParentResizeEventChannel>,
|
||||
)> = SystemState::from_world(&mut app.world);
|
||||
|
||||
// setup up the event loop
|
||||
let event_handler = move |event: Event<()>, event_loop: &EventLoopWindowTarget<()>| {
|
||||
#[cfg(feature = "trace")]
|
||||
|
@ -390,7 +366,6 @@ pub fn winit_runner(mut app: App) {
|
|||
StartCause::Init => {
|
||||
#[cfg(any(target_os = "ios", target_os = "macos"))]
|
||||
{
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
let (
|
||||
commands,
|
||||
mut windows,
|
||||
|
@ -401,18 +376,6 @@ pub fn winit_runner(mut app: App) {
|
|||
accessibility_requested,
|
||||
) = create_window_system_state.get_mut(&mut app.world);
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
let (
|
||||
commands,
|
||||
mut windows,
|
||||
event_writer,
|
||||
winit_windows,
|
||||
adapters,
|
||||
handlers,
|
||||
accessibility_requested,
|
||||
event_channel,
|
||||
) = create_window_system_state.get_mut(&mut app.world);
|
||||
|
||||
create_windows(
|
||||
event_loop,
|
||||
commands,
|
||||
|
@ -422,8 +385,6 @@ pub fn winit_runner(mut app: App) {
|
|||
adapters,
|
||||
handlers,
|
||||
accessibility_requested,
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
event_channel,
|
||||
);
|
||||
|
||||
create_window_system_state.apply(&mut app.world);
|
||||
|
@ -842,7 +803,6 @@ pub fn winit_runner(mut app: App) {
|
|||
|
||||
// create any new windows
|
||||
// (even if app did not update, some may have been created by plugin setup)
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
let (
|
||||
commands,
|
||||
mut windows,
|
||||
|
@ -853,18 +813,6 @@ pub fn winit_runner(mut app: App) {
|
|||
accessibility_requested,
|
||||
) = create_window_system_state.get_mut(&mut app.world);
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
let (
|
||||
commands,
|
||||
mut windows,
|
||||
event_writer,
|
||||
winit_windows,
|
||||
adapters,
|
||||
handlers,
|
||||
accessibility_requested,
|
||||
event_channel,
|
||||
) = create_window_system_state.get_mut(&mut app.world);
|
||||
|
||||
create_windows(
|
||||
event_loop,
|
||||
commands,
|
||||
|
@ -874,8 +822,6 @@ pub fn winit_runner(mut app: App) {
|
|||
adapters,
|
||||
handlers,
|
||||
accessibility_requested,
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
event_channel,
|
||||
);
|
||||
|
||||
create_window_system_state.apply(&mut app.world);
|
||||
|
|
|
@ -19,8 +19,6 @@ use winit::{
|
|||
event_loop::EventLoopWindowTarget,
|
||||
};
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
use crate::web_resize::{CanvasParentResizeEventChannel, WINIT_CANVAS_SELECTOR};
|
||||
use crate::{
|
||||
accessibility::{AccessKitAdapters, WinitActionHandlers},
|
||||
converters::{
|
||||
|
@ -45,7 +43,6 @@ pub(crate) fn create_windows<'a>(
|
|||
mut adapters: NonSendMut<AccessKitAdapters>,
|
||||
mut handlers: ResMut<WinitActionHandlers>,
|
||||
accessibility_requested: ResMut<AccessibilityRequested>,
|
||||
#[cfg(target_arch = "wasm32")] event_channel: ResMut<CanvasParentResizeEventChannel>,
|
||||
) {
|
||||
for (entity, mut window) in created_windows {
|
||||
if winit_windows.get_window(entity).is_some() {
|
||||
|
@ -84,18 +81,6 @@ pub(crate) fn create_windows<'a>(
|
|||
window: window.clone(),
|
||||
});
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
{
|
||||
if window.fit_canvas_to_parent {
|
||||
let selector = if let Some(selector) = &window.canvas {
|
||||
selector
|
||||
} else {
|
||||
WINIT_CANVAS_SELECTOR
|
||||
};
|
||||
event_channel.listen_to_selector(entity, selector);
|
||||
}
|
||||
}
|
||||
|
||||
event_writer.send(WindowCreated { window: entity });
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,83 +0,0 @@
|
|||
use crate::WinitWindows;
|
||||
use bevy_app::{App, Plugin, Update};
|
||||
use bevy_ecs::prelude::*;
|
||||
use crossbeam_channel::{Receiver, Sender};
|
||||
use wasm_bindgen::JsCast;
|
||||
use winit::dpi::LogicalSize;
|
||||
|
||||
pub(crate) struct CanvasParentResizePlugin;
|
||||
|
||||
impl Plugin for CanvasParentResizePlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.init_resource::<CanvasParentResizeEventChannel>()
|
||||
.add_systems(Update, canvas_parent_resize_event_handler);
|
||||
}
|
||||
}
|
||||
|
||||
struct ResizeEvent {
|
||||
size: LogicalSize<f32>,
|
||||
window: Entity,
|
||||
}
|
||||
|
||||
#[derive(Resource)]
|
||||
pub(crate) struct CanvasParentResizeEventChannel {
|
||||
sender: Sender<ResizeEvent>,
|
||||
receiver: Receiver<ResizeEvent>,
|
||||
}
|
||||
|
||||
fn canvas_parent_resize_event_handler(
|
||||
winit_windows: NonSend<WinitWindows>,
|
||||
resize_events: Res<CanvasParentResizeEventChannel>,
|
||||
) {
|
||||
for event in resize_events.receiver.try_iter() {
|
||||
if let Some(window) = winit_windows.get_window(event.window) {
|
||||
let _ = window.request_inner_size(event.size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn get_size(selector: &str) -> Option<LogicalSize<f32>> {
|
||||
let win = web_sys::window().unwrap();
|
||||
let doc = win.document().unwrap();
|
||||
let element = doc.query_selector(selector).ok()??;
|
||||
let parent_element = element.parent_element()?;
|
||||
let rect = parent_element.get_bounding_client_rect();
|
||||
return Some(winit::dpi::LogicalSize::new(
|
||||
rect.width() as f32,
|
||||
rect.height() as f32,
|
||||
));
|
||||
}
|
||||
|
||||
pub(crate) const WINIT_CANVAS_SELECTOR: &str = "canvas[data-raw-handle]";
|
||||
|
||||
impl Default for CanvasParentResizeEventChannel {
|
||||
fn default() -> Self {
|
||||
let (sender, receiver) = crossbeam_channel::unbounded();
|
||||
return Self { sender, receiver };
|
||||
}
|
||||
}
|
||||
|
||||
impl CanvasParentResizeEventChannel {
|
||||
pub(crate) fn listen_to_selector(&self, window: Entity, selector: &str) {
|
||||
let sender = self.sender.clone();
|
||||
let owned_selector = selector.to_string();
|
||||
let resize = move || {
|
||||
if let Some(size) = get_size(&owned_selector) {
|
||||
sender.send(ResizeEvent { size, window }).unwrap();
|
||||
}
|
||||
};
|
||||
|
||||
// ensure resize happens on startup
|
||||
resize();
|
||||
|
||||
let closure = wasm_bindgen::closure::Closure::wrap(Box::new(move |_: web_sys::Event| {
|
||||
resize();
|
||||
}) as Box<dyn FnMut(_)>);
|
||||
let window = web_sys::window().unwrap();
|
||||
|
||||
window
|
||||
.add_event_listener_with_callback("resize", closure.as_ref().unchecked_ref())
|
||||
.unwrap();
|
||||
closure.forget();
|
||||
}
|
||||
}
|
|
@ -16,8 +16,6 @@ fn main() {
|
|||
title: "I am a window!".into(),
|
||||
resolution: (500., 300.).into(),
|
||||
present_mode: PresentMode::AutoVsync,
|
||||
// Tells wasm to resize the window according to the available canvas
|
||||
fit_canvas_to_parent: true,
|
||||
// Tells wasm not to override default event handling, like F5, Ctrl+R etc.
|
||||
prevent_default_event_handling: false,
|
||||
window_theme: Some(WindowTheme::Dark),
|
||||
|
|
|
@ -2,12 +2,10 @@ diff --git a/crates/bevy_window/src/window.rs b/crates/bevy_window/src/window.rs
|
|||
index 7b5c75d38..8e9404b93 100644
|
||||
--- a/crates/bevy_window/src/window.rs
|
||||
+++ b/crates/bevy_window/src/window.rs
|
||||
@@ -245,9 +245,9 @@ impl Default for Window {
|
||||
@@ -245,8 +245,8 @@ impl Default for Window {
|
||||
transparent: false,
|
||||
focused: true,
|
||||
window_level: Default::default(),
|
||||
- fit_canvas_to_parent: false,
|
||||
+ fit_canvas_to_parent: true,
|
||||
prevent_default_event_handling: true,
|
||||
- canvas: None,
|
||||
+ canvas: Some("#bevy".to_string()),
|
||||
|
|
Loading…
Reference in a new issue