From 7cd8f67ab374b32a3844f4996329b8d4b9d8a561 Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Mon, 26 Jun 2023 16:59:39 +0200 Subject: [PATCH] shell/window: Remember activated state --- src/shell/element/window.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/shell/element/window.rs b/src/shell/element/window.rs index 930079f7..614c72d7 100644 --- a/src/shell/element/window.rs +++ b/src/shell/element/window.rs @@ -38,7 +38,7 @@ use std::{ fmt, hash::Hash, sync::{ - atomic::{AtomicU8, Ordering}, + atomic::{AtomicBool, AtomicU8, Ordering}, Arc, Mutex, }, }; @@ -60,6 +60,7 @@ impl fmt::Debug for CosmicWindow { pub struct CosmicWindowInternal { pub(super) window: CosmicSurface, mask: Arc>>, + activated: Arc, /// TODO: This needs to be per seat pointer_entered: Arc, last_seat: Arc, Serial)>>>, @@ -70,6 +71,7 @@ impl fmt::Debug for CosmicWindowInternal { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("CosmicWindowInternal") .field("window", &self.window) + .field("activated", &self.activated.load(Ordering::SeqCst)) .field("pointer_entered", &self.pointer_entered) // skip seat to avoid loop .field("last_seat", &"...") @@ -115,6 +117,7 @@ impl CosmicWindow { CosmicWindowInternal { window, mask: Arc::new(Mutex::new(None)), + activated: Arc::new(AtomicBool::new(false)), pointer_entered: Arc::new(AtomicU8::new(Focus::None as u8)), last_seat: Arc::new(Mutex::new(None)), last_title: Arc::new(Mutex::new(last_title)), @@ -321,10 +324,17 @@ impl SpaceElement for CosmicWindow { }) } fn set_activate(&self, activated: bool) { - SpaceElement::set_activate(&self.0, activated); - self.0.force_redraw(); - self.0 - .with_program(|p| SpaceElement::set_activate(&p.window, activated)); + if self + .0 + .with_program(|p| p.activated.load(Ordering::SeqCst) != activated) + { + SpaceElement::set_activate(&self.0, activated); + self.0.force_redraw(); + self.0.with_program(|p| { + p.activated.store(activated, Ordering::SeqCst); + SpaceElement::set_activate(&p.window, activated); + }); + } } fn output_enter(&self, output: &Output, overlap: Rectangle) { SpaceElement::output_enter(&self.0, output, overlap);