state: split settings mutations
This commit is contained in:
parent
c2d86dcd7f
commit
36eb811f25
2 changed files with 271 additions and 256 deletions
259
src/state.rs
259
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<ContainerNode>) {
|
||||
node.on_colors_changed();
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
|
||||
fn visit_output(&mut self, node: &Rc<OutputNode>) {
|
||||
node.on_colors_changed();
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
|
||||
fn visit_float(&mut self, node: &Rc<FloatNode>) {
|
||||
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<Self>) {
|
||||
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<Self>, 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<ContainerNode>) {
|
||||
node.on_spaces_changed();
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
fn visit_output(&mut self, node: &Rc<OutputNode>) {
|
||||
node.on_spaces_changed();
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
fn visit_float(&mut self, node: &Rc<FloatNode>) {
|
||||
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<ContainerNode>) {
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
fn visit_output(&mut self, node: &Rc<OutputNode>) {
|
||||
node.schedule_update_render_data();
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
fn visit_float(&mut self, node: &Rc<FloatNode>) {
|
||||
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<OutputId>,
|
||||
) -> Rc<PersistentOutputState> {
|
||||
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<PersistentOutputState> {
|
||||
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),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
268
src/state/settings.rs
Normal file
268
src/state/settings.rs
Normal file
|
|
@ -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<ContainerNode>) {
|
||||
node.on_colors_changed();
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
|
||||
fn visit_output(&mut self, node: &Rc<OutputNode>) {
|
||||
node.on_colors_changed();
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
|
||||
fn visit_float(&mut self, node: &Rc<FloatNode>) {
|
||||
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<Self>) {
|
||||
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<Self>, 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<ContainerNode>) {
|
||||
node.on_spaces_changed();
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
fn visit_output(&mut self, node: &Rc<OutputNode>) {
|
||||
node.on_spaces_changed();
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
fn visit_float(&mut self, node: &Rc<FloatNode>) {
|
||||
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<ContainerNode>) {
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
fn visit_output(&mut self, node: &Rc<OutputNode>) {
|
||||
node.schedule_update_render_data();
|
||||
node.node_visit_children(self);
|
||||
}
|
||||
fn visit_float(&mut self, node: &Rc<FloatNode>) {
|
||||
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<OutputId>,
|
||||
) -> Rc<PersistentOutputState> {
|
||||
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<PersistentOutputState> {
|
||||
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),
|
||||
})
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue