aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--niri-config/src/lib.rs8
-rw-r--r--niri-ipc/src/lib.rs26
-rw-r--r--src/niri.rs11
3 files changed, 36 insertions, 9 deletions
diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs
index 4aa1edad..d9ef55d1 100644
--- a/niri-config/src/lib.rs
+++ b/niri-config/src/lib.rs
@@ -243,8 +243,8 @@ pub struct Output {
pub off: bool,
#[knuffel(argument)]
pub name: String,
- #[knuffel(child, unwrap(argument), default = 1.)]
- pub scale: f64,
+ #[knuffel(child, unwrap(argument))]
+ pub scale: Option<f64>,
#[knuffel(child, unwrap(argument, str), default = Transform::Normal)]
pub transform: Transform,
#[knuffel(child)]
@@ -260,7 +260,7 @@ impl Default for Output {
Self {
off: false,
name: String::new(),
- scale: 1.,
+ scale: None,
transform: Transform::Normal,
position: None,
mode: None,
@@ -2291,7 +2291,7 @@ mod tests {
outputs: vec![Output {
off: false,
name: "eDP-1".to_owned(),
- scale: 2.,
+ scale: Some(2.),
transform: Transform::Flipped90,
position: Some(Position { x: 10, y: 20 }),
mode: Some(ConfiguredMode {
diff --git a/niri-ipc/src/lib.rs b/niri-ipc/src/lib.rs
index c721ac9b..db2d7a0f 100644
--- a/niri-ipc/src/lib.rs
+++ b/niri-ipc/src/lib.rs
@@ -278,9 +278,9 @@ pub enum OutputAction {
},
/// Set the output scale.
Scale {
- /// Scale factor to set.
+ /// Scale factor to set, or "auto" for automatic selection.
#[cfg_attr(feature = "clap", arg())]
- scale: f64,
+ scale: ScaleToSet,
},
/// Set the output transform.
Transform {
@@ -329,6 +329,15 @@ pub struct ConfiguredMode {
pub refresh: Option<f64>,
}
+/// Output scale to set.
+#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)]
+pub enum ScaleToSet {
+ /// Niri will pick the scale automatically.
+ Automatic,
+ /// Specific scale.
+ Specific(f64),
+}
+
/// Output position to set.
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "clap", derive(clap::Subcommand))]
@@ -560,3 +569,16 @@ impl FromStr for ConfiguredMode {
})
}
}
+
+impl FromStr for ScaleToSet {
+ type Err = &'static str;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ if s.eq_ignore_ascii_case("auto") {
+ return Ok(Self::Automatic);
+ }
+
+ let scale = s.parse().map_err(|_| "error parsing scale")?;
+ Ok(Self::Specific(scale))
+ }
+}
diff --git a/src/niri.rs b/src/niri.rs
index b6bfb84d..aee3650b 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -1014,7 +1014,7 @@ impl State {
let config = self.niri.config.borrow_mut();
let config = config.outputs.iter().find(|o| o.name == name);
- let scale = config.map(|c| c.scale).unwrap_or_else(|| {
+ let scale = config.and_then(|c| c.scale).unwrap_or_else(|| {
let size_mm = output.physical_properties().size;
let resolution = output.current_mode().unwrap().size;
guess_monitor_scale(size_mm, resolution)
@@ -1077,7 +1077,12 @@ impl State {
niri_ipc::ModeToSet::Specific(mode) => Some(mode),
}
}
- niri_ipc::OutputAction::Scale { scale } => config.scale = scale,
+ niri_ipc::OutputAction::Scale { scale } => {
+ config.scale = match scale {
+ niri_ipc::ScaleToSet::Automatic => None,
+ niri_ipc::ScaleToSet::Specific(scale) => Some(scale),
+ }
+ }
niri_ipc::OutputAction::Transform { transform } => config.transform = transform,
niri_ipc::OutputAction::Position { position } => {
config.position = match position {
@@ -1666,7 +1671,7 @@ impl Niri {
let config = self.config.borrow();
let c = config.outputs.iter().find(|o| o.name == name);
- let scale = c.map(|c| c.scale).unwrap_or_else(|| {
+ let scale = c.and_then(|c| c.scale).unwrap_or_else(|| {
let size_mm = output.physical_properties().size;
let resolution = output.current_mode().unwrap().size;
guess_monitor_scale(size_mm, resolution)