Prevent locking while another lock client is already active

Fixes double swaylock from manual + swayidle.
This commit is contained in:
Ivan Molodetskikh
2024-02-17 07:47:06 +04:00
parent 31c13b6a69
commit 62892d6361
+22 -3
View File
@@ -44,6 +44,7 @@ use smithay::reexports::calloop::{
self, Idle, Interest, LoopHandle, LoopSignal, Mode, PostAction, RegistrationToken, self, Idle, Interest, LoopHandle, LoopSignal, Mode, PostAction, RegistrationToken,
}; };
use smithay::reexports::input; use smithay::reexports::input;
use smithay::reexports::wayland_protocols::ext::session_lock::v1::server::ext_session_lock_v1::ExtSessionLockV1;
use smithay::reexports::wayland_protocols::xdg::shell::server::xdg_toplevel::WmCapabilities; use smithay::reexports::wayland_protocols::xdg::shell::server::xdg_toplevel::WmCapabilities;
use smithay::reexports::wayland_protocols_misc::server_decoration as _server_decoration; use smithay::reexports::wayland_protocols_misc::server_decoration as _server_decoration;
use smithay::reexports::wayland_server::backend::{ use smithay::reexports::wayland_server::backend::{
@@ -263,7 +264,7 @@ pub enum LockState {
#[default] #[default]
Unlocked, Unlocked,
Locking(SessionLocker), Locking(SessionLocker),
Locked, Locked(ExtSessionLockV1),
} }
#[derive(PartialEq, Eq)] #[derive(PartialEq, Eq)]
@@ -1300,8 +1301,9 @@ impl Niri {
.all(|state| state.lock_render_state == LockRenderState::Locked); .all(|state| state.lock_render_state == LockRenderState::Locked);
if all_locked { if all_locked {
let lock = confirmation.ext_session_lock().clone();
confirmation.lock(); confirmation.lock();
self.lock_state = LockState::Locked; self.lock_state = LockState::Locked(lock);
} else { } else {
// Still waiting. // Still waiting.
self.lock_state = LockState::Locking(confirmation); self.lock_state = LockState::Locking(confirmation);
@@ -2108,8 +2110,9 @@ impl Niri {
.all(|state| state.lock_render_state == LockRenderState::Locked); .all(|state| state.lock_render_state == LockRenderState::Locked);
if all_locked { if all_locked {
let lock = confirmation.ext_session_lock().clone();
confirmation.lock(); confirmation.lock();
self.lock_state = LockState::Locked; self.lock_state = LockState::Locked(lock);
} else { } else {
// Still waiting. // Still waiting.
self.lock_state = LockState::Locking(confirmation); self.lock_state = LockState::Locking(confirmation);
@@ -2833,6 +2836,22 @@ impl Niri {
} }
pub fn lock(&mut self, confirmation: SessionLocker) { pub fn lock(&mut self, confirmation: SessionLocker) {
// Check if another client is in the process of locking.
if matches!(self.lock_state, LockState::Locking(_)) {
info!("refusing lock as another client is currently locking");
return;
}
// Check if we're already locked with an active client.
if let LockState::Locked(lock) = &self.lock_state {
if lock.is_alive() {
info!("refusing lock as already locked with an active client");
return;
}
// If the client had died, continue with the new lock.
}
info!("locking session"); info!("locking session");
self.screenshot_ui.close(); self.screenshot_ui.close();