diff --git a/src/platform_impl/web/event_loop/runner.rs b/src/platform_impl/web/event_loop/runner.rs index c6dd652cd4b..d594543f0a5 100644 --- a/src/platform_impl/web/event_loop/runner.rs +++ b/src/platform_impl/web/event_loop/runner.rs @@ -9,7 +9,6 @@ use crate::event_loop::{ControlFlow, DeviceEvents}; use crate::platform_impl::platform::backend::EventListenerHandle; use crate::window::WindowId; -use std::sync::atomic::Ordering; use std::{ cell::{Cell, RefCell}, clone::Clone, @@ -754,7 +753,7 @@ impl Shared { DeviceEvents::Always => true, DeviceEvents::WhenFocused => self.0.all_canvases.borrow().iter().any(|(_, canvas)| { if let Some(canvas) = canvas.upgrade() { - canvas.borrow().has_focus.load(Ordering::Relaxed) + canvas.borrow().has_focus.get() } else { false } diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index d080dabb996..30ed9c2da98 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -4,7 +4,6 @@ use std::collections::{vec_deque::IntoIter as VecDequeIter, VecDeque}; use std::iter; use std::marker::PhantomData; use std::rc::Rc; -use std::sync::atomic::Ordering; use raw_window_handle::{RawDisplayHandle, WebDisplayHandle}; @@ -93,7 +92,7 @@ impl EventLoopWindowTarget { let has_focus = canvas.has_focus.clone(); let modifiers = self.modifiers.clone(); canvas.on_blur(move || { - has_focus.store(false, Ordering::Relaxed); + has_focus.set(false); let clear_modifiers = (!modifiers.get().is_empty()).then(|| { modifiers.set(ModifiersState::empty()); @@ -116,7 +115,7 @@ impl EventLoopWindowTarget { let runner = self.runner.clone(); let has_focus = canvas.has_focus.clone(); canvas.on_focus(move || { - if !has_focus.swap(true, Ordering::Relaxed) { + if !has_focus.replace(true) { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Focused(true), @@ -205,15 +204,13 @@ impl EventLoopWindowTarget { let modifiers = self.modifiers.clone(); move |active_modifiers, pointer_id| { - let focus = (has_focus.load(Ordering::Relaxed) - && modifiers.get() != active_modifiers) - .then(|| { - modifiers.set(active_modifiers); - Event::WindowEvent { - window_id: RootWindowId(id), - event: WindowEvent::ModifiersChanged(active_modifiers.into()), - } - }); + let focus = (has_focus.get() && modifiers.get() != active_modifiers).then(|| { + modifiers.set(active_modifiers); + Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::ModifiersChanged(active_modifiers.into()), + } + }); let pointer = pointer_id.map(|pointer_id| Event::WindowEvent { window_id: RootWindowId(id), @@ -234,15 +231,13 @@ impl EventLoopWindowTarget { let modifiers = self.modifiers.clone(); move |active_modifiers, pointer_id| { - let focus = (has_focus.load(Ordering::Relaxed) - && modifiers.get() != active_modifiers) - .then(|| { - modifiers.set(active_modifiers); - Event::WindowEvent { - window_id: RootWindowId(id), - event: WindowEvent::ModifiersChanged(active_modifiers.into()), - } - }); + let focus = (has_focus.get() && modifiers.get() != active_modifiers).then(|| { + modifiers.set(active_modifiers); + Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::ModifiersChanged(active_modifiers.into()), + } + }); let pointer = pointer_id.map(|pointer_id| Event::WindowEvent { window_id: RootWindowId(id), @@ -264,7 +259,7 @@ impl EventLoopWindowTarget { let modifiers = self.modifiers.clone(); move |active_modifiers| { - if has_focus.load(Ordering::Relaxed) && modifiers.get() != active_modifiers { + if has_focus.get() && modifiers.get() != active_modifiers { modifiers.set(active_modifiers); runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), @@ -279,9 +274,8 @@ impl EventLoopWindowTarget { let modifiers = self.modifiers.clone(); move |active_modifiers, pointer_id, events| { - let modifiers = (has_focus.load(Ordering::Relaxed) - && modifiers.get() != active_modifiers) - .then(|| { + let modifiers = + (has_focus.get() && modifiers.get() != active_modifiers).then(|| { modifiers.set(active_modifiers); Event::WindowEvent { window_id: RootWindowId(id), @@ -308,9 +302,8 @@ impl EventLoopWindowTarget { let modifiers = self.modifiers.clone(); move |active_modifiers, device_id, events| { - let modifiers = (has_focus.load(Ordering::Relaxed) - && modifiers.get() != active_modifiers) - .then(|| { + let modifiers = + (has_focus.get() && modifiers.get() != active_modifiers).then(|| { modifiers.set(active_modifiers); Event::WindowEvent { window_id: RootWindowId(id), @@ -342,9 +335,8 @@ impl EventLoopWindowTarget { position: crate::dpi::PhysicalPosition, buttons, button| { - let modifiers = (has_focus.load(Ordering::Relaxed) - && modifiers.get() != active_modifiers) - .then(|| { + let modifiers = + (has_focus.get() && modifiers.get() != active_modifiers).then(|| { modifiers.set(active_modifiers); Event::WindowEvent { window_id: RootWindowId(id), @@ -474,7 +466,7 @@ impl EventLoopWindowTarget { let modifiers = self.modifiers.clone(); move |active_modifiers| { - if has_focus.load(Ordering::Relaxed) && modifiers.get() != active_modifiers { + if has_focus.get() && modifiers.get() != active_modifiers { modifiers.set(active_modifiers); runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), @@ -489,9 +481,8 @@ impl EventLoopWindowTarget { let modifiers = self.modifiers.clone(); move |active_modifiers, pointer_id, position, button| { - let modifiers = (has_focus.load(Ordering::Relaxed) - && modifiers.get() != active_modifiers) - .then(|| { + let modifiers = + (has_focus.get() && modifiers.get() != active_modifiers).then(|| { modifiers.set(active_modifiers); Event::WindowEvent { window_id: RootWindowId(id), @@ -529,9 +520,8 @@ impl EventLoopWindowTarget { let modifiers = self.modifiers.clone(); move |active_modifiers, device_id, location, force| { - let modifiers = (has_focus.load(Ordering::Relaxed) - && modifiers.get() != active_modifiers) - .then(|| { + let modifiers = + (has_focus.get() && modifiers.get() != active_modifiers).then(|| { modifiers.set(active_modifiers); Event::WindowEvent { window_id: RootWindowId(id), @@ -559,8 +549,7 @@ impl EventLoopWindowTarget { let modifiers = self.modifiers.clone(); canvas.on_mouse_wheel( move |pointer_id, delta, active_modifiers| { - let modifiers_changed = (has_focus.load(Ordering::Relaxed) - && modifiers.get() != active_modifiers) + let modifiers_changed = (has_focus.get() && modifiers.get() != active_modifiers) .then(|| { modifiers.set(active_modifiers); Event::WindowEvent { diff --git a/src/platform_impl/web/web_sys/canvas.rs b/src/platform_impl/web/web_sys/canvas.rs index 049c89162f5..1196ae8dc78 100644 --- a/src/platform_impl/web/web_sys/canvas.rs +++ b/src/platform_impl/web/web_sys/canvas.rs @@ -1,6 +1,5 @@ use std::cell::Cell; use std::rc::{Rc, Weak}; -use std::sync::atomic::AtomicBool; use std::sync::{Arc, Mutex}; use smol_str::SmolStr; @@ -29,7 +28,7 @@ use super::{event, ButtonsState, ResizeScaleHandle}; pub struct Canvas { common: Common, id: WindowId, - pub has_focus: Arc, + pub has_focus: Rc>, pub is_intersecting: Option, on_touch_start: Option>, on_focus: Option>, @@ -139,7 +138,7 @@ impl Canvas { Ok(Canvas { common, id, - has_focus: Arc::new(AtomicBool::new(false)), + has_focus: Rc::new(Cell::new(false)), is_intersecting: None, on_touch_start: None, on_blur: None, diff --git a/src/platform_impl/web/window.rs b/src/platform_impl/web/window.rs index 39961039d4d..2362d5f5026 100644 --- a/src/platform_impl/web/window.rs +++ b/src/platform_impl/web/window.rs @@ -15,8 +15,6 @@ use super::{backend, monitor::MonitorHandle, EventLoopWindowTarget, Fullscreen}; use std::cell::RefCell; use std::collections::VecDeque; use std::rc::Rc; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::Arc; pub struct Window { inner: Dispatcher, @@ -28,7 +26,6 @@ pub struct Inner { canvas: Rc>, previous_pointer: RefCell<&'static str>, destroy_fn: Option>, - has_focus: Arc, } impl Window { @@ -52,14 +49,12 @@ impl Window { let runner = target.runner.clone(); let destroy_fn = Box::new(move || runner.notify_destroy_window(RootWI(id))); - let has_focus = canvas.borrow().has_focus.clone(); let inner = Inner { id, window: window.clone(), canvas, previous_pointer: RefCell::new("auto"), destroy_fn: Some(destroy_fn), - has_focus, }; inner.set_title(&attr.title); @@ -383,7 +378,7 @@ impl Inner { #[inline] pub fn has_focus(&self) -> bool { - self.has_focus.load(Ordering::Relaxed) + self.canvas.borrow().has_focus.get() } pub fn title(&self) -> String {