aboutsummaryrefslogtreecommitdiff
path: root/src/niri.rs
diff options
context:
space:
mode:
authorVal Packett <val@packett.cool>2025-01-01 03:07:47 -0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-01-17 11:16:10 +0300
commit890bbff0077cddaa08d7d6c05c797c41b0b4c09e (patch)
tree15f3f825bcda7571763f699a8a55787e594ec31c /src/niri.rs
parentb853d5b1247fddfaeac0dbdfb9304c69c6de463a (diff)
downloadniri-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.rs137
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();
}