From 5482ff65e54992300379a4260a0cd1a6017ed9d2 Mon Sep 17 00:00:00 2001 From: Richard Weber Date: Wed, 4 Sep 2024 20:40:41 +0300 Subject: [PATCH] Add config reloading for tiling exceptions --- src/config/mod.rs | 40 ++++++++++++++++++++++++++++++++++++---- src/shell/layout/mod.rs | 8 +++----- src/shell/mod.rs | 8 ++++++-- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/config/mod.rs b/src/config/mod.rs index 65de7b01..686fffcb 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -8,8 +8,8 @@ use crate::{ }, }; use cosmic_config::{ConfigGet, CosmicConfigEntry}; -use cosmic_settings_config::{shortcuts, Shortcuts, window_rules}; use cosmic_settings_config::window_rules::ApplicationException; +use cosmic_settings_config::{shortcuts, window_rules, Shortcuts}; use serde::{Deserialize, Serialize}; use smithay::wayland::xdg_activation::XdgActivationState; pub use smithay::{ @@ -208,9 +208,6 @@ impl Config { let system_actions = shortcuts::system_actions(&config); let mut shortcuts = shortcuts::shortcuts(&settings_context); - let tiling_context = window_rules::context().expect("Failed to load window rules config"); - let tiling_exceptions = window_rules::tiling_exceptions(&tiling_context); - // Add any missing default shortcuts recommended by the compositor. key_bindings::add_default_bindings(&mut shortcuts, workspace.workspace_layout); @@ -250,6 +247,41 @@ impl Config { ), }; + let window_rules_context = + window_rules::context().expect("Failed to load window rules config"); + let tiling_exceptions = window_rules::tiling_exceptions(&window_rules_context); + + match cosmic_config::calloop::ConfigWatchSource::new(&window_rules_context) { + Ok(source) => { + if let Err(err) = loop_handle.insert_source(source, |(config, keys), (), state| { + for key in keys { + match key.as_str() { + "tiling_exception_defaults" | "tiling_exception_custom" => { + let new_exceptions = window_rules::tiling_exceptions(&config); + state.common.config.tiling_exceptions = new_exceptions; + state + .common + .shell + .write() + .unwrap() + .update_tiling_exceptions(&state.common.config.tiling_exceptions); + } + _ => (), + } + } + }) { + warn!( + ?err, + "Failed to watch com.system76.CosmicSettings.WindowRules config" + ); + } + } + Err(err) => warn!( + ?err, + "failed to create config watch source for com.system76.CosmicSettings.WindowRules" + ), + }; + Config { dynamic_conf: Self::load_dynamic(xdg.as_ref()), cosmic_conf: cosmic_comp_config, diff --git a/src/shell/layout/mod.rs b/src/shell/layout/mod.rs index 6f71e92b..9169d774 100644 --- a/src/shell/layout/mod.rs +++ b/src/shell/layout/mod.rs @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only -use cosmic_settings_config::shortcuts::action::Orientation; +use cosmic_settings_config::{shortcuts::action::Orientation, window_rules::ApplicationException}; use regex::{Regex, RegexSet}; use smithay::{ desktop::WindowSurface, @@ -9,8 +9,6 @@ use smithay::{ }; use tracing::warn; -use crate::config::Config; - use super::CosmicSurface; pub mod floating; @@ -63,11 +61,11 @@ pub struct TilingExceptions { } impl TilingExceptions { - pub fn new(config: &Config) -> Self { + pub fn new(exceptions_config: &Vec) -> Self { let mut app_ids = Vec::new(); let mut titles = Vec::new(); - for exception in &config.tiling_exceptions { + for exception in exceptions_config { if let Err(e) = Regex::new(&exception.appid) { warn!("Invalid regex for appid: {}, {}", exception.appid, e); continue; diff --git a/src/shell/mod.rs b/src/shell/mod.rs index 8a900af4..9a262ea8 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -17,7 +17,7 @@ use cosmic_comp_config::{ use cosmic_protocols::workspace::v1::server::zcosmic_workspace_handle_v1::{ State as WState, TilingState, }; -use cosmic_settings_config::shortcuts; +use cosmic_settings_config::{shortcuts, window_rules::ApplicationException}; use cosmic_settings_config::shortcuts::action::{Direction, FocusDirection, ResizeDirection}; use keyframe::{ease, functions::EaseInOutCubic}; use smithay::{ @@ -1235,7 +1235,7 @@ impl Shell { pub fn new(config: &Config) -> Self { let theme = cosmic::theme::system_preference(); - let tiling_exceptions = layout::TilingExceptions::new(config); + let tiling_exceptions = layout::TilingExceptions::new(&config.tiling_exceptions); Shell { workspaces: Workspaces::new(config, theme.clone()), @@ -3577,6 +3577,10 @@ impl Shell { &self.theme } + pub fn update_tiling_exceptions(&mut self, exceptions: &Vec) { + self.tiling_exceptions = layout::TilingExceptions::new(exceptions); + } + pub fn take_presentation_feedback( &self, output: &Output,