diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-06-17 09:18:54 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-06-18 14:01:34 +0300 |
| commit | 33b5beaeee62e47ecaa33fc3175ef9e22931f116 (patch) | |
| tree | 857cdd2378231958437155375236e22ac6aefead | |
| parent | 1dae45c58d7eabeda21ef490d712915890bf6cff (diff) | |
| download | niri-33b5beaeee62e47ecaa33fc3175ef9e22931f116.tar.gz niri-33b5beaeee62e47ecaa33fc3175ef9e22931f116.tar.bz2 niri-33b5beaeee62e47ecaa33fc3175ef9e22931f116.zip | |
Round scale to closest representable
| -rw-r--r-- | src/niri.rs | 7 | ||||
| -rw-r--r-- | src/utils/scale.rs | 17 |
2 files changed, 21 insertions, 3 deletions
diff --git a/src/niri.rs b/src/niri.rs index b8309f65..13e46b08 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -124,7 +124,7 @@ use crate::ui::exit_confirm_dialog::ExitConfirmDialog; use crate::ui::hotkey_overlay::HotkeyOverlay; use crate::ui::screen_transition::{self, ScreenTransition}; use crate::ui::screenshot_ui::{ScreenshotUi, ScreenshotUiRenderElement}; -use crate::utils::scale::guess_monitor_scale; +use crate::utils::scale::{closest_representable_scale, guess_monitor_scale}; use crate::utils::spawning::CHILD_ENV; use crate::utils::{ center, center_f64, get_monotonic_time, ipc_transform_to_smithay, logical_output, @@ -1053,7 +1053,7 @@ impl State { let resolution = output.current_mode().unwrap().size; guess_monitor_scale(size_mm, resolution) }); - let scale = scale.clamp(1., 10.); + let scale = closest_representable_scale(scale.clamp(1., 10.)); let mut transform = config .map(|c| ipc_transform_to_smithay(c.transform)) @@ -1736,7 +1736,8 @@ impl Niri { let resolution = output.current_mode().unwrap().size; guess_monitor_scale(size_mm, resolution) }); - let scale = scale.clamp(1., 10.); + let scale = closest_representable_scale(scale.clamp(1., 10.)); + let mut transform = c .map(|c| ipc_transform_to_smithay(c.transform)) .unwrap_or(Transform::Normal); diff --git a/src/utils/scale.rs b/src/utils/scale.rs index 339d0678..6db88248 100644 --- a/src/utils/scale.rs +++ b/src/utils/scale.rs @@ -51,6 +51,13 @@ fn is_valid_for_resolution(resolution: Size<i32, Physical>, scale: i32) -> bool logical.w * logical.h >= MIN_LOGICAL_AREA } +/// Adjusts the scale to the closest exactly-representable value. +pub fn closest_representable_scale(scale: f64) -> f64 { + // Current fractional-scale Wayland protocol can only represent N / 120 scales. + const FRACTIONAL_SCALE_DENOM: f64 = 120.; + + (scale * FRACTIONAL_SCALE_DENOM).round() / FRACTIONAL_SCALE_DENOM +} #[cfg(test)] mod tests { use k9::snapshot; @@ -101,4 +108,14 @@ mod tests { fn guess_monitor_scale_unknown_size() { assert_eq!(check((0, 0), (1920, 1080)), 1.); } + + #[test] + fn test_round_scale() { + snapshot!(closest_representable_scale(1.3), "1.3"); + snapshot!(closest_representable_scale(1.31), "1.3083333333333333"); + snapshot!(closest_representable_scale(1.32), "1.3166666666666667"); + snapshot!(closest_representable_scale(1.33), "1.3333333333333333"); + snapshot!(closest_representable_scale(1.34), "1.3416666666666666"); + snapshot!(closest_representable_scale(1.35), "1.35"); + } } |
