diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-07-04 17:51:11 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-07-05 07:35:01 +0300 |
| commit | 9dcc9160b3b4be6c44672e8579e1e7107453c8b7 (patch) | |
| tree | a4e3c0da792b0eadb65033c47bce3fb6c4419611 | |
| parent | 43df7fad46033692abc6a2b223e6d98f8b7a5aed (diff) | |
| download | niri-9dcc9160b3b4be6c44672e8579e1e7107453c8b7.tar.gz niri-9dcc9160b3b4be6c44672e8579e1e7107453c8b7.tar.bz2 niri-9dcc9160b3b4be6c44672e8579e1e7107453c8b7.zip | |
Put Outputs config into a dedicated struct
| -rw-r--r-- | niri-config/src/lib.rs | 27 | ||||
| -rw-r--r-- | src/backend/tty.rs | 9 | ||||
| -rw-r--r-- | src/handlers/mod.rs | 2 | ||||
| -rw-r--r-- | src/niri.rs | 28 | ||||
| -rw-r--r-- | src/protocols/output_management.rs | 14 |
5 files changed, 41 insertions, 39 deletions
diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs index f1bd0afe..1d2bfc63 100644 --- a/niri-config/src/lib.rs +++ b/niri-config/src/lib.rs @@ -23,7 +23,7 @@ pub struct Config { #[knuffel(child, default)] pub input: Input, #[knuffel(children(name = "output"))] - pub outputs: Vec<Output>, + pub outputs: Outputs, #[knuffel(children(name = "spawn-at-startup"))] pub spawn_at_startup: Vec<SpawnAtStartup>, #[knuffel(child, default)] @@ -289,6 +289,9 @@ pub struct Touch { pub map_to_output: Option<String>, } +#[derive(Debug, Default, Clone, PartialEq)] +pub struct Outputs(pub Vec<Output>); + #[derive(knuffel::Decode, Debug, Clone, PartialEq)] pub struct Output { #[knuffel(child)] @@ -1514,6 +1517,24 @@ fn expect_only_children<S>( } } +impl FromIterator<Output> for Outputs { + fn from_iter<T: IntoIterator<Item = Output>>(iter: T) -> Self { + Self(Vec::from_iter(iter)) + } +} + +impl Outputs { + pub fn find(&self, name: &str) -> Option<&Output> { + self.0.iter().find(|o| o.name.eq_ignore_ascii_case(name)) + } + + pub fn find_mut(&mut self, name: &str) -> Option<&mut Output> { + self.0 + .iter_mut() + .find(|o| o.name.eq_ignore_ascii_case(name)) + } +} + impl<S> knuffel::Decode<S> for DefaultColumnWidth where S: knuffel::traits::ErrorSpan, @@ -2635,7 +2656,7 @@ mod tests { focus_follows_mouse: true, workspace_auto_back_and_forth: true, }, - outputs: vec![Output { + outputs: Outputs(vec![Output { off: false, name: "eDP-1".to_owned(), scale: Some(FloatOrInt(2.)), @@ -2647,7 +2668,7 @@ mod tests { refresh: Some(144.), }), variable_refresh_rate: true, - }], + }]), layout: Layout { focus_ring: FocusRing { off: false, diff --git a/src/backend/tty.rs b/src/backend/tty.rs index cb04c717..0654f4f0 100644 --- a/src/backend/tty.rs +++ b/src/backend/tty.rs @@ -752,8 +752,7 @@ impl Tty { .config .borrow() .outputs - .iter() - .find(|o| o.name.eq_ignore_ascii_case(&output_name)) + .find(&output_name) .cloned() .unwrap_or_default(); @@ -1633,8 +1632,7 @@ impl Tty { .config .borrow() .outputs - .iter() - .find(|o| o.name.eq_ignore_ascii_case(&surface.name)) + .find(&surface.name) .cloned() .unwrap_or_default(); if config.off { @@ -1763,8 +1761,7 @@ impl Tty { .config .borrow() .outputs - .iter() - .find(|o| o.name.eq_ignore_ascii_case(&output_name)) + .find(&output_name) .cloned() .unwrap_or_default(); diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index f288e24f..5c502a1f 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -555,7 +555,7 @@ impl OutputManagementHandler for State { &mut self.niri.output_management_state } - fn apply_output_config(&mut self, config: Vec<niri_config::Output>) { + fn apply_output_config(&mut self, config: niri_config::Outputs) { self.niri.config.borrow_mut().outputs = config; self.reload_output_config(); } diff --git a/src/niri.rs b/src/niri.rs index 24a328a0..54211bce 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -156,7 +156,7 @@ pub struct Niri { /// This does not include transient output config changes done via IPC. It is only used when /// reloading the config from disk to determine if the output configuration should be reloaded /// (and transient changes dropped). - pub config_file_output_config: Vec<niri_config::Output>, + pub config_file_output_config: niri_config::Outputs, pub event_loop: LoopHandle<'static, State>, pub scheduler: Scheduler<()>, @@ -1058,10 +1058,7 @@ impl State { for output in self.niri.global_space.outputs() { let name = output.name(); let config = self.niri.config.borrow_mut(); - let config = config - .outputs - .iter() - .find(|o| o.name.eq_ignore_ascii_case(&name)); + let config = config.outputs.find(&name); let scale = config .and_then(|c| c.scale) @@ -1113,18 +1110,14 @@ impl State { pub fn apply_transient_output_config(&mut self, name: &str, action: niri_ipc::OutputAction) { { let mut config = self.niri.config.borrow_mut(); - let config = if let Some(config) = config - .outputs - .iter_mut() - .find(|o| o.name.eq_ignore_ascii_case(name)) - { + let config = if let Some(config) = config.outputs.find_mut(name) { config } else { - config.outputs.push(niri_config::Output { + config.outputs.0.push(niri_config::Output { name: String::from(name), ..Default::default() }); - config.outputs.last_mut().unwrap() + config.outputs.0.last_mut().unwrap() }; match action { @@ -1753,11 +1746,7 @@ impl Niri { for output in self.global_space.outputs().chain(new_output) { let name = output.name(); let position = self.global_space.output_geometry(output).map(|geo| geo.loc); - let config = config - .outputs - .iter() - .find(|o| o.name.eq_ignore_ascii_case(&name)) - .and_then(|c| c.position); + let config = config.outputs.find(&name).and_then(|c| c.position); outputs.push(Data { output: output.clone(), @@ -1862,10 +1851,7 @@ impl Niri { let name = output.name(); let config = self.config.borrow(); - let c = config - .outputs - .iter() - .find(|o| o.name.eq_ignore_ascii_case(&name)); + let c = config.outputs.find(&name); let scale = c.and_then(|c| c.scale).map(|s| s.0).unwrap_or_else(|| { let size_mm = output.physical_properties().size; let resolution = output.current_mode().unwrap().size; diff --git a/src/protocols/output_management.rs b/src/protocols/output_management.rs index 2842fced..23e419ba 100644 --- a/src/protocols/output_management.rs +++ b/src/protocols/output_management.rs @@ -38,7 +38,7 @@ pub struct OutputManagementManagerState { serial: u32, clients: HashMap<ClientId, ClientData>, current_state: HashMap<OutputId, niri_ipc::Output>, - current_config: Vec<niri_config::Output>, + current_config: niri_config::Outputs, } pub struct OutputManagementManagerGlobalData { @@ -47,7 +47,7 @@ pub struct OutputManagementManagerGlobalData { pub trait OutputManagementHandler { fn output_management_state(&mut self) -> &mut OutputManagementManagerState; - fn apply_output_config(&mut self, config: Vec<niri_config::Output>); + fn apply_output_config(&mut self, config: niri_config::Outputs); } #[derive(Debug)] @@ -84,11 +84,11 @@ impl OutputManagementManagerState { clients: HashMap::new(), serial: 0, current_state: HashMap::new(), - current_config: Vec::new(), + current_config: Default::default(), } } - pub fn on_config_changed(&mut self, new_config: Vec<niri_config::Output>) { + pub fn on_config_changed(&mut self, new_config: niri_config::Outputs) { self.current_config = new_config; } @@ -405,8 +405,7 @@ where Entry::Vacant(entry) => { let mut config = g_state .current_config - .iter() - .find(|o| o.name.eq_ignore_ascii_case(¤t_config.name)) + .find(¤t_config.name) .cloned() .unwrap_or_else(|| niri_config::Output { name: current_config.name.clone(), @@ -455,8 +454,7 @@ where Entry::Vacant(entry) => { let mut config = g_state .current_config - .iter() - .find(|o| o.name.eq_ignore_ascii_case(¤t_config.name)) + .find(¤t_config.name) .cloned() .unwrap_or_else(|| niri_config::Output { name: current_config.name.clone(), |
