Add live config reload, session locking and managed daemons

Refine focus gradients, shell workspace controls and popup motion. Correct floating stacking and preserve client-chosen dialog sizes. Add lock protocol probes and session integration.
This commit is contained in:
Samuel Onoja committed 2026-09-26 19:03:37 +01:00
1 parent b422448d88
commit 672b4e2b60
41 files changed
+2694 -298

No files matched your search

+3
View File
@@ -27,6 +27,9 @@ impl XdgActivationHandler for Ferese {
data: XdgActivationTokenData,
surface: WlSurface,
) {
if self.session_lock.active {
return;
}
let valid = data.serial.is_some() && data.timestamp.elapsed() <= TOKEN_MAX_AGE;
self.xdg_activation_state.remove_token(&token);
if !valid {
+6
View File
@@ -90,6 +90,12 @@ impl CompositorHandler for Ferese {
}
fn destroyed(&mut self, surface: &WlSurface) {
if self.session_lock.active {
self.session_lock
.surfaces
.retain(|_, lock| lock.wl_surface() != surface);
self.focus_lock_surface();
}
self.backdrop_generation = self.backdrop_generation.wrapping_add(1);
crate::backends::direct::render_all(self);
if self.idle_inhibitors.remove(surface).is_some() {
+2 -1
View File
@@ -107,7 +107,8 @@ pub fn handle_commit(state: &mut Ferese, surface: &WlSurface) {
}
let policy = layer.cached_state();
if policy.keyboard_interactivity == KeyboardInteractivity::Exclusive
if !state.session_lock.active
&& policy.keyboard_interactivity == KeyboardInteractivity::Exclusive
&& matches!(policy.layer, Layer::Top | Layer::Overlay)
{
state
+4
View File
@@ -137,6 +137,10 @@ impl Ferese {
with_damage: bool,
) {
let mut used = data.used.lock().unwrap();
if self.session_lock.active {
frame.failed();
return;
}
if *used {
frame.post_error(
zwlr_screencopy_frame_v1::Error::AlreadyUsed,
+9
View File
@@ -115,6 +115,9 @@ impl XdgShellHandler for Ferese {
}
fn move_request(&mut self, surface: ToplevelSurface, seat: wl_seat::WlSeat, serial: Serial) {
if self.session_lock.active {
return;
}
let Some(seat) = Seat::from_resource(&seat) else {
return;
};
@@ -163,6 +166,9 @@ impl XdgShellHandler for Ferese {
serial: Serial,
edges: smithay::reexports::wayland_protocols::xdg::shell::server::xdg_toplevel::ResizeEdge,
) {
if self.session_lock.active {
return;
}
let Some(seat) = Seat::from_resource(&seat) else {
return;
};
@@ -247,6 +253,9 @@ impl XdgShellHandler for Ferese {
}
fn grab(&mut self, surface: PopupSurface, seat: wl_seat::WlSeat, serial: Serial) {
if self.session_lock.active {
return;
}
let Some(seat) = Seat::from_resource(&seat) else {
return;
};