diff options
| author | Val Packett <val@packett.cool> | 2025-01-01 03:07:47 -0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-01-17 11:16:10 +0300 |
| commit | 890bbff0077cddaa08d7d6c05c797c41b0b4c09e (patch) | |
| tree | 15f3f825bcda7571763f699a8a55787e594ec31c /src/niri.rs | |
| parent | b853d5b1247fddfaeac0dbdfb9304c69c6de463a (diff) | |
| download | niri-890bbff0077cddaa08d7d6c05c797c41b0b4c09e.tar.gz niri-890bbff0077cddaa08d7d6c05c797c41b0b4c09e.tar.bz2 niri-890bbff0077cddaa08d7d6c05c797c41b0b4c09e.zip | |
dbus: DisplayConfig: implement apply_monitors_config
This enables gnome-control-center to apply display configuration
changes. Only temporarily, persistence is ignored currently.
Diffstat (limited to 'src/niri.rs')
| -rw-r--r-- | src/niri.rs | 137 |
1 files changed, 70 insertions, 67 deletions
diff --git a/src/niri.rs b/src/niri.rs index ef4e8e6c..16758ab5 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -1343,82 +1343,85 @@ impl State { self.niri.output_management_state.on_config_changed(config); } - pub fn apply_transient_output_config(&mut self, name: &str, action: niri_ipc::OutputAction) { + pub fn modify_output_config<F>(&mut self, name: &str, fun: F) + where + F: FnOnce(&mut niri_config::Output), + { + // Try hard to find the output config section corresponding to the output set by the + // user. Since if we add a new section and some existing section also matches the + // output, then our new section won't do anything. + let temp; + let match_name = if let Some(output) = self.niri.output_by_name_match(name) { + output.user_data().get::<OutputName>().unwrap() + } else if let Some(output_name) = self + .backend + .tty_checked() + .and_then(|tty| tty.disconnected_connector_name_by_name_match(name)) { - // Try hard to find the output config section corresponding to the output set by the - // user. Since if we add a new section and some existing section also matches the - // output, then our new section won't do anything. - let temp; - let match_name = if let Some(output) = self.niri.output_by_name_match(name) { - output.user_data().get::<OutputName>().unwrap() - } else if let Some(output_name) = self - .backend - .tty_checked() - .and_then(|tty| tty.disconnected_connector_name_by_name_match(name)) - { - temp = output_name; - &temp - } else { - // Even if name is "make model serial", matching will work fine this way. - temp = OutputName { - connector: name.to_owned(), - make: None, - model: None, - serial: None, - }; - &temp + temp = output_name; + &temp + } else { + // Even if name is "make model serial", matching will work fine this way. + temp = OutputName { + connector: name.to_owned(), + make: None, + model: None, + serial: None, }; + &temp + }; - let mut config = self.niri.config.borrow_mut(); - let config = if let Some(config) = config.outputs.find_mut(match_name) { - config - } else { - config.outputs.0.push(niri_config::Output { - // Save name as set by the user. - name: String::from(name), - ..Default::default() - }); - config.outputs.0.last_mut().unwrap() - }; + let mut config = self.niri.config.borrow_mut(); + let config = if let Some(config) = config.outputs.find_mut(match_name) { + config + } else { + config.outputs.0.push(niri_config::Output { + // Save name as set by the user. + name: String::from(name), + ..Default::default() + }); + config.outputs.0.last_mut().unwrap() + }; - match action { - niri_ipc::OutputAction::Off => config.off = true, - niri_ipc::OutputAction::On => config.off = false, - niri_ipc::OutputAction::Mode { mode } => { - config.mode = match mode { - niri_ipc::ModeToSet::Automatic => None, - niri_ipc::ModeToSet::Specific(mode) => Some(mode), - } + fun(config); + } + + pub fn apply_transient_output_config(&mut self, name: &str, action: niri_ipc::OutputAction) { + self.modify_output_config(name, move |config| match action { + niri_ipc::OutputAction::Off => config.off = true, + niri_ipc::OutputAction::On => config.off = false, + niri_ipc::OutputAction::Mode { mode } => { + config.mode = match mode { + niri_ipc::ModeToSet::Automatic => None, + niri_ipc::ModeToSet::Specific(mode) => Some(mode), } - niri_ipc::OutputAction::Scale { scale } => { - config.scale = match scale { - niri_ipc::ScaleToSet::Automatic => None, - niri_ipc::ScaleToSet::Specific(scale) => Some(FloatOrInt(scale)), - } + } + niri_ipc::OutputAction::Scale { scale } => { + config.scale = match scale { + niri_ipc::ScaleToSet::Automatic => None, + niri_ipc::ScaleToSet::Specific(scale) => Some(FloatOrInt(scale)), } - niri_ipc::OutputAction::Transform { transform } => config.transform = transform, - niri_ipc::OutputAction::Position { position } => { - config.position = match position { - niri_ipc::PositionToSet::Automatic => None, - niri_ipc::PositionToSet::Specific(position) => { - Some(niri_config::Position { - x: position.x, - y: position.y, - }) - } - } + } + niri_ipc::OutputAction::Transform { transform } => config.transform = transform, + niri_ipc::OutputAction::Position { position } => { + config.position = match position { + niri_ipc::PositionToSet::Automatic => None, + niri_ipc::PositionToSet::Specific(position) => Some(niri_config::Position { + x: position.x, + y: position.y, + }), } - niri_ipc::OutputAction::Vrr { vrr } => { - config.variable_refresh_rate = if vrr.vrr { - Some(niri_config::Vrr { - on_demand: vrr.on_demand, - }) - } else { - None - } + } + niri_ipc::OutputAction::Vrr { vrr } => { + config.variable_refresh_rate = if vrr.vrr { + Some(niri_config::Vrr { + on_demand: vrr.on_demand, + }) + } else { + None } } - } + }); self.reload_output_config(); } |
