diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-11 10:59:57 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-11 22:26:59 +0400 |
| commit | 5e553c2679e62bed702483ca47cf23fd8008bc24 (patch) | |
| tree | d5c6a56083253f8ba239dcf91f1b13cd653939cc /src/niri.rs | |
| parent | cabf712821e63dc7096385ecd4fd9333ad6fe783 (diff) | |
| download | niri-5e553c2679e62bed702483ca47cf23fd8008bc24.tar.gz niri-5e553c2679e62bed702483ca47cf23fd8008bc24.tar.bz2 niri-5e553c2679e62bed702483ca47cf23fd8008bc24.zip | |
Implement org.freedesktop.ScreenSaver Inhibit
xdg-desktop-portal currently has no way of disabling the Inhibit portal
or ever returning an error to the application from it. Thus Flatpak
Firefox will never fall back to its Wayland backend. To remedy this,
let's actually implement the FDO Inhibit interface that the portal can
use.
Diffstat (limited to 'src/niri.rs')
| -rw-r--r-- | src/niri.rs | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/niri.rs b/src/niri.rs index c0e33969..ca9a7c47 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -3,7 +3,7 @@ use std::collections::{HashMap, HashSet}; use std::ffi::OsString; use std::path::PathBuf; use std::rc::Rc; -use std::sync::atomic::Ordering; +use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; use std::time::{Duration, Instant}; use std::{env, mem, thread}; @@ -181,6 +181,7 @@ pub struct Niri { pub keyboard_focus: Option<WlSurface>, pub idle_inhibiting_surfaces: HashSet<WlSurface>, + pub is_fdo_idle_inhibited: Arc<AtomicBool>, pub cursor_manager: CursorManager, pub cursor_texture_cache: CursorTextureCache, @@ -1029,6 +1030,7 @@ impl Niri { seat, keyboard_focus: None, idle_inhibiting_surfaces: HashSet::new(), + is_fdo_idle_inhibited: Arc::new(AtomicBool::new(false)), cursor_manager, cursor_texture_cache: Default::default(), cursor_shape_manager_state, @@ -1880,11 +1882,12 @@ impl Niri { self.idle_inhibiting_surfaces.retain(|s| s.is_alive()); - let is_inhibited = self.idle_inhibiting_surfaces.iter().any(|surface| { - with_states(surface, |states| { - surface_primary_scanout_output(surface, states).is_some() - }) - }); + let is_inhibited = self.is_fdo_idle_inhibited.load(Ordering::SeqCst) + || self.idle_inhibiting_surfaces.iter().any(|surface| { + with_states(surface, |states| { + surface_primary_scanout_output(surface, states).is_some() + }) + }); self.idle_notifier_state.set_is_inhibited(is_inhibited); } |
