From 36eb811f25f423c6d17e572fb17189fafc1318fa Mon Sep 17 00:00:00 2001 From: kossLAN Date: Fri, 29 May 2026 19:45:30 -0400 Subject: [PATCH] state: split settings mutations --- src/state.rs | 259 +--------------------------------------- src/state/settings.rs | 268 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 271 insertions(+), 256 deletions(-) create mode 100644 src/state/settings.rs diff --git a/src/state.rs b/src/state.rs index cc1f1db1..afde018e 100644 --- a/src/state.rs +++ b/src/state.rs @@ -2,6 +2,7 @@ mod animations; mod connectors; mod idle; mod rendering; +mod settings; mod xwayland; pub(crate) use animations::LayoutAnimationCandidate; @@ -58,7 +59,7 @@ use { jay_seat_events::JaySeatEvents, jay_workspace_watcher::JayWorkspaceWatcher, wl_buffer::WlBuffer, - wl_output::{BlendSpace, OutputGlobalOpt, OutputId, PersistentOutputState}, + wl_output::{OutputGlobalOpt, OutputId, PersistentOutputState}, wl_seat::{ PhysicalKeyboardId, PhysicalKeyboardIds, PositionHintRequest, SeatIds, WlSeatGlobal, @@ -79,14 +80,13 @@ use { }, io_uring::IoUring, kbvm::{KbvmContext, KbvmMap}, - logger::LogLevel, keyboard::{KeyboardStateIds, LedsListener}, leaks::Tracker, logger::Logger, pr_caps::PrCapsThread, rect::Rect, scale::Scale, - theme::{BarPosition, Color, Theme, ThemeColor, ThemeSized}, + theme::Theme, time::Time, tree::{ ContainerNode, ContainerSplit, Direction, DisplayNode, FindTreeUsecase, FloatNode, @@ -1247,257 +1247,4 @@ impl State { self.tree_changed(); } - fn expose_new_singletons(&self) { - self.globals.expose_new_singletons(self); - } - - pub fn set_color_management_enabled(&self, enabled: bool) { - self.color_management_enabled.set(enabled); - self.expose_new_singletons(); - } - - pub fn set_primary_selection_enabled(&self, enabled: bool) { - self.enable_primary_selection.set(enabled); - self.expose_new_singletons(); - } - - pub fn set_explicit_sync_enabled(&self, enabled: bool) { - self.explicit_sync_enabled.set(enabled); - self.expose_new_singletons(); - } - - pub fn set_log_level(&self, level: LogLevel) { - if let Some(logger) = &self.logger { - logger.set_level(level); - } - } - - pub fn perform_clean_logs_older_than(&self) { - if let Some(time) = self.clean_logs_older_than.get() - && let Some(logger) = &self.logger - { - logger.clean_logs_older_than(time); - } - } - - fn colors_changed(&self) { - struct V; - impl NodeVisitorBase for V { - fn visit_container(&mut self, node: &Rc) { - node.on_colors_changed(); - node.node_visit_children(self); - } - - fn visit_output(&mut self, node: &Rc) { - node.on_colors_changed(); - node.node_visit_children(self); - } - - fn visit_float(&mut self, node: &Rc) { - node.on_colors_changed(); - node.node_visit_children(self); - } - } - self.root.clone().node_visit(&mut V); - self.damage(self.root.extents.get()); - self.icons.clear(); - } - - pub fn reset_colors(&self) { - self.theme.colors.reset(); - self.colors_changed(); - } - - pub fn quit(&self) { - log::info!("Quitting"); - self.ring.stop(); - } - - pub fn reload_config(self: &Rc) { - log::info!("Reloading config"); - let config = ConfigProxy::default(self); - if let Some(config) = self.config.take() { - config.destroy(); - for seat in self.globals.seats.lock().values() { - seat.clear_shortcuts(); - } - } - config.configure(true); - self.config.set(Some(Rc::new(config))); - } - - pub fn set_ei_socket_enabled(self: &Rc, enabled: bool) { - self.enable_ei_acceptor.set(enabled); - self.update_ei_acceptor(); - } - - pub fn set_workspace_display_order(&self, order: WorkspaceDisplayOrder) { - self.workspace_display_order.set(order); - for output in self.root.outputs.lock().values() { - output.handle_workspace_display_order_update(); - } - } - - fn spaces_changed(&self) { - struct V; - impl NodeVisitorBase for V { - fn visit_container(&mut self, node: &Rc) { - node.on_spaces_changed(); - node.node_visit_children(self); - } - fn visit_output(&mut self, node: &Rc) { - node.on_spaces_changed(); - node.node_visit_children(self); - } - fn visit_float(&mut self, node: &Rc) { - node.on_spaces_changed(); - node.node_visit_children(self); - } - } - self.root.clone().node_visit(&mut V); - self.damage(self.root.extents.get()); - self.icons.update_sizes(self); - } - - pub fn set_show_bar(&self, show: bool) { - self.show_bar.set(show); - self.spaces_changed(); - } - - #[allow(dead_code)] - pub fn set_show_titles(&self, show: bool) { - self.theme.show_titles.set(show); - self.spaces_changed(); - } - - #[allow(dead_code)] - pub fn set_floating_titles(&self, floating: bool) { - self.theme.floating_titles.set(floating); - self.spaces_changed(); - } - - pub fn set_ui_drag_enabled(&self, enabled: bool) { - self.ui_drag_enabled.set(enabled); - } - - pub fn set_ui_drag_threshold(&self, threshold: i32) { - self.ui_drag_threshold_squared - .set(threshold.saturating_mul(threshold)); - } - - #[allow(dead_code)] - pub fn set_show_pin_icon(&self, show: bool) { - self.show_pin_icon.set(show); - } - - pub fn set_float_above_fullscreen(&self, v: bool) { - self.float_above_fullscreen.set(v); - for seat in self.globals.seats.lock().values() { - seat.emulate_cursor_moved(); - seat.trigger_tree_changed(false); - } - self.root.update_visible(self); - } - - pub fn reset_sizes(&self) { - self.theme.sizes.reset(); - self.spaces_changed(); - } - - fn fonts_changed(&self) { - struct V; - impl NodeVisitorBase for V { - fn visit_container(&mut self, node: &Rc) { - node.node_visit_children(self); - } - fn visit_output(&mut self, node: &Rc) { - node.schedule_update_render_data(); - node.node_visit_children(self); - } - fn visit_float(&mut self, node: &Rc) { - node.node_visit_children(self); - } - } - self.root.clone().node_visit(&mut V); - } - - pub fn reset_fonts(&self) { - let theme = &self.theme; - theme.font.set(self.theme.default_font.clone()); - theme.bar_font.set(None); - theme.title_font.set(None); - self.fonts_changed(); - } - - pub fn set_font(&self, font: &str) { - self.theme.font.set(Arc::new(font.to_string())); - self.fonts_changed(); - } - - pub fn set_bar_font(&self, font: Option<&str>) { - let font = font.map(|font| Arc::new(font.to_string())); - self.theme.bar_font.set(font); - self.fonts_changed(); - } - - #[allow(dead_code)] - pub fn set_title_font(&self, font: Option<&str>) { - let font = font.map(|font| Arc::new(font.to_string())); - self.theme.title_font.set(font); - self.fonts_changed(); - } - - pub fn set_bar_position(&self, p: BarPosition) { - self.theme.bar_position.set(p); - self.spaces_changed(); - } - - pub fn set_size(&self, sized: ThemeSized, size: i32) { - let field = sized.field(&self.theme); - field.val.set(size); - field.set.set(true); - self.spaces_changed(); - } - - pub fn set_color(&self, colored: ThemeColor, v: Color) { - colored.field(&self.theme).set(v); - self.colors_changed(); - } - - pub fn ensure_persistent_output_state( - &self, - output_id: &Rc, - ) -> Rc { - match self.persistent_output_states.get(output_id) { - Some(ds) => ds, - _ => { - let ds = self.new_persistent_output_state(); - self.persistent_output_states - .set(output_id.clone(), ds.clone()); - ds - } - } - } - - pub fn new_persistent_output_state(&self) -> Rc { - let x1 = self - .root - .outputs - .lock() - .values() - .map(|o| o.global.pos.get().x2()) - .max() - .unwrap_or(0); - Rc::new(PersistentOutputState { - transform: Default::default(), - scale: Default::default(), - pos: Cell::new((x1, 0)), - vrr_mode: Cell::new(self.default_vrr_mode.get()), - vrr_cursor_hz: Cell::new(self.default_vrr_cursor_hz.get()), - tearing_mode: Cell::new(self.default_tearing_mode.get()), - brightness: Cell::new(None), - blend_space: Cell::new(BlendSpace::Srgb), - use_native_gamut: Cell::new(false), - }) - } } diff --git a/src/state/settings.rs b/src/state/settings.rs new file mode 100644 index 00000000..736dafd1 --- /dev/null +++ b/src/state/settings.rs @@ -0,0 +1,268 @@ +use { + crate::{ + config::ConfigProxy, + ifs::wl_output::{BlendSpace, OutputId, PersistentOutputState}, + logger::LogLevel, + theme::{BarPosition, Color, ThemeColor, ThemeSized}, + tree::{ContainerNode, FloatNode, Node, NodeVisitorBase, OutputNode, WorkspaceDisplayOrder}, + }, + std::{cell::Cell, rc::Rc, sync::Arc}, +}; + +use super::State; + +impl State { + pub(super) fn expose_new_singletons(&self) { + self.globals.expose_new_singletons(self); + } + + pub fn set_color_management_enabled(&self, enabled: bool) { + self.color_management_enabled.set(enabled); + self.expose_new_singletons(); + } + + pub fn set_primary_selection_enabled(&self, enabled: bool) { + self.enable_primary_selection.set(enabled); + self.expose_new_singletons(); + } + + pub fn set_explicit_sync_enabled(&self, enabled: bool) { + self.explicit_sync_enabled.set(enabled); + self.expose_new_singletons(); + } + + pub fn set_log_level(&self, level: LogLevel) { + if let Some(logger) = &self.logger { + logger.set_level(level); + } + } + + pub fn perform_clean_logs_older_than(&self) { + if let Some(time) = self.clean_logs_older_than.get() + && let Some(logger) = &self.logger + { + logger.clean_logs_older_than(time); + } + } + + fn colors_changed(&self) { + struct V; + impl NodeVisitorBase for V { + fn visit_container(&mut self, node: &Rc) { + node.on_colors_changed(); + node.node_visit_children(self); + } + + fn visit_output(&mut self, node: &Rc) { + node.on_colors_changed(); + node.node_visit_children(self); + } + + fn visit_float(&mut self, node: &Rc) { + node.on_colors_changed(); + node.node_visit_children(self); + } + } + self.root.clone().node_visit(&mut V); + self.damage(self.root.extents.get()); + self.icons.clear(); + } + + pub fn reset_colors(&self) { + self.theme.colors.reset(); + self.colors_changed(); + } + + pub fn quit(&self) { + log::info!("Quitting"); + self.ring.stop(); + } + + pub fn reload_config(self: &Rc) { + log::info!("Reloading config"); + let config = ConfigProxy::default(self); + if let Some(config) = self.config.take() { + config.destroy(); + for seat in self.globals.seats.lock().values() { + seat.clear_shortcuts(); + } + } + config.configure(true); + self.config.set(Some(Rc::new(config))); + } + + pub fn set_ei_socket_enabled(self: &Rc, enabled: bool) { + self.enable_ei_acceptor.set(enabled); + self.update_ei_acceptor(); + } + + pub fn set_workspace_display_order(&self, order: WorkspaceDisplayOrder) { + self.workspace_display_order.set(order); + for output in self.root.outputs.lock().values() { + output.handle_workspace_display_order_update(); + } + } + + fn spaces_changed(&self) { + struct V; + impl NodeVisitorBase for V { + fn visit_container(&mut self, node: &Rc) { + node.on_spaces_changed(); + node.node_visit_children(self); + } + fn visit_output(&mut self, node: &Rc) { + node.on_spaces_changed(); + node.node_visit_children(self); + } + fn visit_float(&mut self, node: &Rc) { + node.on_spaces_changed(); + node.node_visit_children(self); + } + } + self.root.clone().node_visit(&mut V); + self.damage(self.root.extents.get()); + self.icons.update_sizes(self); + } + + pub fn set_show_bar(&self, show: bool) { + self.show_bar.set(show); + self.spaces_changed(); + } + + #[allow(dead_code)] + pub fn set_show_titles(&self, show: bool) { + self.theme.show_titles.set(show); + self.spaces_changed(); + } + + #[allow(dead_code)] + pub fn set_floating_titles(&self, floating: bool) { + self.theme.floating_titles.set(floating); + self.spaces_changed(); + } + + pub fn set_ui_drag_enabled(&self, enabled: bool) { + self.ui_drag_enabled.set(enabled); + } + + pub fn set_ui_drag_threshold(&self, threshold: i32) { + self.ui_drag_threshold_squared + .set(threshold.saturating_mul(threshold)); + } + + #[allow(dead_code)] + pub fn set_show_pin_icon(&self, show: bool) { + self.show_pin_icon.set(show); + } + + pub fn set_float_above_fullscreen(&self, v: bool) { + self.float_above_fullscreen.set(v); + for seat in self.globals.seats.lock().values() { + seat.emulate_cursor_moved(); + seat.trigger_tree_changed(false); + } + self.root.update_visible(self); + } + + pub fn reset_sizes(&self) { + self.theme.sizes.reset(); + self.spaces_changed(); + } + + fn fonts_changed(&self) { + struct V; + impl NodeVisitorBase for V { + fn visit_container(&mut self, node: &Rc) { + node.node_visit_children(self); + } + fn visit_output(&mut self, node: &Rc) { + node.schedule_update_render_data(); + node.node_visit_children(self); + } + fn visit_float(&mut self, node: &Rc) { + node.node_visit_children(self); + } + } + self.root.clone().node_visit(&mut V); + } + + pub fn reset_fonts(&self) { + let theme = &self.theme; + theme.font.set(self.theme.default_font.clone()); + theme.bar_font.set(None); + theme.title_font.set(None); + self.fonts_changed(); + } + + pub fn set_font(&self, font: &str) { + self.theme.font.set(Arc::new(font.to_string())); + self.fonts_changed(); + } + + pub fn set_bar_font(&self, font: Option<&str>) { + let font = font.map(|font| Arc::new(font.to_string())); + self.theme.bar_font.set(font); + self.fonts_changed(); + } + + #[allow(dead_code)] + pub fn set_title_font(&self, font: Option<&str>) { + let font = font.map(|font| Arc::new(font.to_string())); + self.theme.title_font.set(font); + self.fonts_changed(); + } + + pub fn set_bar_position(&self, p: BarPosition) { + self.theme.bar_position.set(p); + self.spaces_changed(); + } + + pub fn set_size(&self, sized: ThemeSized, size: i32) { + let field = sized.field(&self.theme); + field.val.set(size); + field.set.set(true); + self.spaces_changed(); + } + + pub fn set_color(&self, colored: ThemeColor, v: Color) { + colored.field(&self.theme).set(v); + self.colors_changed(); + } + + pub fn ensure_persistent_output_state( + &self, + output_id: &Rc, + ) -> Rc { + match self.persistent_output_states.get(output_id) { + Some(ds) => ds, + _ => { + let ds = self.new_persistent_output_state(); + self.persistent_output_states + .set(output_id.clone(), ds.clone()); + ds + } + } + } + + pub fn new_persistent_output_state(&self) -> Rc { + let x1 = self + .root + .outputs + .lock() + .values() + .map(|o| o.global.pos.get().x2()) + .max() + .unwrap_or(0); + Rc::new(PersistentOutputState { + transform: Default::default(), + scale: Default::default(), + pos: Cell::new((x1, 0)), + vrr_mode: Cell::new(self.default_vrr_mode.get()), + vrr_cursor_hz: Cell::new(self.default_vrr_cursor_hz.get()), + tearing_mode: Cell::new(self.default_tearing_mode.get()), + brightness: Cell::new(None), + blend_space: Cell::new(BlendSpace::Srgb), + use_native_gamut: Cell::new(false), + }) + } +}