73 lines
2.2 KiB
Rust
73 lines
2.2 KiB
Rust
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
use crate::{shell::SessionLock, state::State, utils::prelude::*};
|
|
use smithay::{
|
|
delegate_session_lock,
|
|
output::Output,
|
|
reexports::wayland_server::{protocol::wl_output::WlOutput, Resource},
|
|
utils::Size,
|
|
wayland::session_lock::{
|
|
LockSurface, SessionLockHandler, SessionLockManagerState, SessionLocker,
|
|
},
|
|
};
|
|
use std::collections::HashMap;
|
|
|
|
impl SessionLockHandler for State {
|
|
fn lock_state(&mut self) -> &mut SessionLockManagerState {
|
|
&mut self.common.session_lock_manager_state
|
|
}
|
|
|
|
fn lock(&mut self, locker: SessionLocker) {
|
|
let mut shell = self.common.shell.write();
|
|
|
|
// Reject lock if sesion lock exists and is still valid
|
|
if let Some(session_lock) = shell.session_lock.as_ref() {
|
|
if self
|
|
.common
|
|
.display_handle
|
|
.get_client(session_lock.ext_session_lock.id())
|
|
.is_ok()
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
let ext_session_lock = locker.ext_session_lock().clone();
|
|
locker.lock();
|
|
shell.session_lock = Some(SessionLock {
|
|
ext_session_lock,
|
|
surfaces: HashMap::new(),
|
|
});
|
|
|
|
for output in shell.outputs() {
|
|
self.backend.schedule_render(&output);
|
|
}
|
|
}
|
|
|
|
fn unlock(&mut self) {
|
|
let mut shell = self.common.shell.write();
|
|
shell.session_lock = None;
|
|
|
|
for output in shell.outputs() {
|
|
self.backend.schedule_render(&output);
|
|
}
|
|
}
|
|
|
|
fn new_surface(&mut self, lock_surface: LockSurface, wl_output: WlOutput) {
|
|
let mut shell = self.common.shell.write();
|
|
if let Some(session_lock) = &mut shell.session_lock {
|
|
if let Some(output) = Output::from_resource(&wl_output) {
|
|
lock_surface.with_pending_state(|states| {
|
|
let size = output.geometry().size;
|
|
states.size = Some(Size::from((size.w as u32, size.h as u32)));
|
|
});
|
|
lock_surface.send_configure();
|
|
session_lock
|
|
.surfaces
|
|
.insert(output.clone(), lock_surface.clone());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
delegate_session_lock!(State);
|