Skip to content

Commit

Permalink
Remove unnecessary has_focus optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
daxpedda committed Sep 3, 2023
1 parent 592b253 commit deab352
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 51 deletions.
3 changes: 1 addition & 2 deletions src/platform_impl/web/event_loop/runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
}
Expand Down
69 changes: 29 additions & 40 deletions src/platform_impl/web/event_loop/window_target.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};

Expand Down Expand Up @@ -93,7 +92,7 @@ impl<T> EventLoopWindowTarget<T> {
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());
Expand All @@ -116,7 +115,7 @@ impl<T> EventLoopWindowTarget<T> {
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),
Expand Down Expand Up @@ -205,15 +204,13 @@ impl<T> EventLoopWindowTarget<T> {
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),
Expand All @@ -234,15 +231,13 @@ impl<T> EventLoopWindowTarget<T> {
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),
Expand All @@ -264,7 +259,7 @@ impl<T> EventLoopWindowTarget<T> {
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),
Expand All @@ -279,9 +274,8 @@ impl<T> EventLoopWindowTarget<T> {
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),
Expand All @@ -308,9 +302,8 @@ impl<T> EventLoopWindowTarget<T> {
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),
Expand Down Expand Up @@ -342,9 +335,8 @@ impl<T> EventLoopWindowTarget<T> {
position: crate::dpi::PhysicalPosition<f64>,
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),
Expand Down Expand Up @@ -474,7 +466,7 @@ impl<T> EventLoopWindowTarget<T> {
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),
Expand All @@ -489,9 +481,8 @@ impl<T> EventLoopWindowTarget<T> {
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),
Expand Down Expand Up @@ -529,9 +520,8 @@ impl<T> EventLoopWindowTarget<T> {
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),
Expand Down Expand Up @@ -559,8 +549,7 @@ impl<T> EventLoopWindowTarget<T> {
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 {
Expand Down
5 changes: 2 additions & 3 deletions src/platform_impl/web/web_sys/canvas.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -29,7 +28,7 @@ use super::{event, ButtonsState, ResizeScaleHandle};
pub struct Canvas {
common: Common,
id: WindowId,
pub has_focus: Arc<AtomicBool>,
pub has_focus: Rc<Cell<bool>>,
pub is_intersecting: Option<bool>,
on_touch_start: Option<EventListenerHandle<dyn FnMut(Event)>>,
on_focus: Option<EventListenerHandle<dyn FnMut(FocusEvent)>>,
Expand Down Expand Up @@ -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,
Expand Down
7 changes: 1 addition & 6 deletions src/platform_impl/web/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Inner>,
Expand All @@ -28,7 +26,6 @@ pub struct Inner {
canvas: Rc<RefCell<backend::Canvas>>,
previous_pointer: RefCell<&'static str>,
destroy_fn: Option<Box<dyn FnOnce()>>,
has_focus: Arc<AtomicBool>,
}

impl Window {
Expand All @@ -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);
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit deab352

Please sign in to comment.