aboutsummaryrefslogtreecommitdiff
path: root/src/niri.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-02-11 10:59:57 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-02-11 22:26:59 +0400
commit5e553c2679e62bed702483ca47cf23fd8008bc24 (patch)
treed5c6a56083253f8ba239dcf91f1b13cd653939cc /src/niri.rs
parentcabf712821e63dc7096385ecd4fd9333ad6fe783 (diff)
downloadniri-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.rs15
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);
}