diff options
| author | Christian Meissl <meissl.christian@gmail.com> | 2024-11-03 14:50:02 +0100 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-11-03 09:13:41 -0800 |
| commit | 354c365a0345787f6b98ee2d77d4516150a61254 (patch) | |
| tree | ff7e82d849fad0c7bbe9563010c1387e1ef987d9 /src | |
| parent | e0ebf1bdff06c38ae3cc9e3114b41572cb792dc0 (diff) | |
| download | niri-354c365a0345787f6b98ee2d77d4516150a61254.tar.gz niri-354c365a0345787f6b98ee2d77d4516150a61254.tar.bz2 niri-354c365a0345787f6b98ee2d77d4516150a61254.zip | |
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
Diffstat (limited to 'src')
| -rw-r--r-- | src/handlers/mod.rs | 9 | ||||
| -rw-r--r-- | 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::<ClientState>().unwrap().restricted }); let activation_state = XdgActivationState::new::<State>(&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::<State, _>(&display_handle, move |_| true); |
