aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Meissl <meissl.christian@gmail.com>2024-11-03 14:50:02 +0100
committerIvan Molodetskikh <yalterz@gmail.com>2024-11-03 09:13:41 -0800
commit354c365a0345787f6b98ee2d77d4516150a61254 (patch)
treeff7e82d849fad0c7bbe9563010c1387e1ef987d9 /src
parente0ebf1bdff06c38ae3cc9e3114b41572cb792dc0 (diff)
downloadniri-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.rs9
-rw-r--r--src/niri.rs14
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);