mirror of
https://github.com/niri-wm/niri.git
synced 2026-06-24 02:01:18 +07:00
Put Outputs config into a dedicated struct
This commit is contained in:
+24
-3
@@ -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,
|
||||
|
||||
+3
-6
@@ -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();
|
||||
|
||||
|
||||
+1
-1
@@ -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();
|
||||
}
|
||||
|
||||
+7
-21
@@ -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;
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user