From 354c365a0345787f6b98ee2d77d4516150a61254 Mon Sep 17 00:00:00 2001 From: Christian Meissl Date: Sun, 3 Nov 2024 14:50:02 +0100 Subject: xdg: cleanup activation tokens valid tokens will stay around until explicitly cleaned-up. remove the token after it has been successfully used or we consider it timed out to prevent leaking the memory used by the activation tokens --- src/handlers/mod.rs | 9 +++++++-- src/niri.rs | 14 +++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index f3f5cb82..6de1e09e 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -7,6 +7,7 @@ use std::io::Write; use std::os::fd::OwnedFd; use std::sync::Arc; use std::thread; +use std::time::Duration; use smithay::backend::allocator::dmabuf::Dmabuf; use smithay::backend::drm::DrmNode; @@ -80,6 +81,8 @@ use crate::{ delegate_output_management, delegate_screencopy, }; +pub const XDG_ACTIVATION_TOKEN_TIMEOUT: Duration = Duration::from_secs(10); + impl SeatHandler for State { type KeyboardFocus = WlSurface; type PointerFocus = WlSurface; @@ -624,16 +627,18 @@ impl XdgActivationHandler for State { fn request_activation( &mut self, - _token: XdgActivationToken, + token: XdgActivationToken, token_data: XdgActivationTokenData, surface: WlSurface, ) { - if token_data.timestamp.elapsed().as_secs() < 10 { + if token_data.timestamp.elapsed() < XDG_ACTIVATION_TOKEN_TIMEOUT { if let Some((mapped, _)) = self.niri.layout.find_window_and_output(&surface) { let window = mapped.window.clone(); self.niri.layout.activate_window(&window); self.niri.layer_shell_on_demand_focus = None; self.niri.queue_redraw_all(); + + self.niri.activation_state.remove_token(&token); } } } diff --git a/src/niri.rs b/src/niri.rs index dae46938..19480600 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -110,7 +110,7 @@ use crate::dbus::gnome_shell_screenshot::{NiriToScreenshot, ScreenshotToNiri}; #[cfg(feature = "xdp-gnome-screencast")] use crate::dbus::mutter_screen_cast::{self, ScreenCastToNiri}; use crate::frame_clock::FrameClock; -use crate::handlers::configure_lock_surface; +use crate::handlers::{configure_lock_surface, XDG_ACTIVATION_TOKEN_TIMEOUT}; use crate::input::scroll_tracker::ScrollTracker; use crate::input::{ apply_libinput_settings, mods_with_finger_scroll_binds, mods_with_wheel_binds, TabletData, @@ -1694,6 +1694,18 @@ impl Niri { is_tty && !client.get_data::().unwrap().restricted }); let activation_state = XdgActivationState::new::(&display_handle); + event_loop + .insert_source( + Timer::from_duration(XDG_ACTIVATION_TOKEN_TIMEOUT), + |_, _, state| { + state.niri.activation_state.retain_tokens(|_, token_data| { + token_data.timestamp.elapsed() < XDG_ACTIVATION_TOKEN_TIMEOUT + }); + TimeoutAction::ToDuration(XDG_ACTIVATION_TOKEN_TIMEOUT) + }, + ) + .unwrap(); + let mutter_x11_interop_state = MutterX11InteropManagerState::new::(&display_handle, move |_| true); -- cgit