From 471f1a117df1d2c8716a8d1120643759d9199110 Mon Sep 17 00:00:00 2001 From: ElKowar <5300871+elkowar@users.noreply.github.com> Date: Mon, 24 Oct 2022 19:08:50 +0200 Subject: [PATCH] Allow for floating-point percentages in window geometry (fixes #601) (#602) --- CHANGELOG.md | 1 + .../yuck/src/config/backend_window_options.rs | 4 ++-- crates/yuck/src/config/config.rs | 2 +- crates/yuck/src/config/window_definition.rs | 2 +- crates/yuck/src/config/window_geometry.rs | 2 +- crates/yuck/src/value/coords.rs | 19 ++++++++++--------- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 943905a..eb1fe5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to eww will be listed here, starting at changes since versio ### Features - Add support for safe access (`?.`) in simplexpr (By: oldwomanjosiah) +- Allow floating-point numbers in percentages for window-geometry ## [0.4.0] (04.09.2022) diff --git a/crates/yuck/src/config/backend_window_options.rs b/crates/yuck/src/config/backend_window_options.rs index 086e00c..37c3b66 100644 --- a/crates/yuck/src/config/backend_window_options.rs +++ b/crates/yuck/src/config/backend_window_options.rs @@ -23,7 +23,7 @@ mod backend { use super::*; - #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)] + #[derive(Debug, Clone, PartialEq, serde::Serialize)] pub struct BackendWindowOptions { pub wm_ignore: bool, pub sticky: bool, @@ -94,7 +94,7 @@ mod backend { } // Surface definition if the backend for X11 is enable - #[derive(Debug, Clone, Copy, Eq, PartialEq, Default, serde::Serialize)] + #[derive(Debug, Clone, Copy, PartialEq, Default, serde::Serialize)] pub struct StrutDefinition { pub side: Side, pub dist: NumWithUnit, diff --git a/crates/yuck/src/config/config.rs b/crates/yuck/src/config/config.rs index 6b46b79..da27c60 100644 --- a/crates/yuck/src/config/config.rs +++ b/crates/yuck/src/config/config.rs @@ -89,7 +89,7 @@ impl FromAst for TopLevel { } } -#[derive(Debug, PartialEq, Eq, Clone, serde::Serialize)] +#[derive(Debug, PartialEq, Clone, serde::Serialize)] pub struct Config { pub widget_definitions: HashMap, pub window_definitions: HashMap, diff --git a/crates/yuck/src/config/window_definition.rs b/crates/yuck/src/config/window_definition.rs index 74f6594..1633b06 100644 --- a/crates/yuck/src/config/window_definition.rs +++ b/crates/yuck/src/config/window_definition.rs @@ -17,7 +17,7 @@ use eww_shared_util::{AttrName, Span, VarName}; use super::{backend_window_options::BackendWindowOptions, widget_use::WidgetUse, window_geometry::WindowGeometry}; -#[derive(Debug, Clone, serde::Serialize, PartialEq, Eq)] +#[derive(Debug, Clone, serde::Serialize, PartialEq)] pub struct WindowDefinition { pub name: String, pub geometry: Option, diff --git a/crates/yuck/src/config/window_geometry.rs b/crates/yuck/src/config/window_geometry.rs index 3d83d52..f86931c 100644 --- a/crates/yuck/src/config/window_geometry.rs +++ b/crates/yuck/src/config/window_geometry.rs @@ -110,7 +110,7 @@ impl std::str::FromStr for AnchorPoint { } } -#[derive(Default, Debug, Clone, Copy, Eq, PartialEq, Serialize)] +#[derive(Default, Debug, Clone, Copy, PartialEq, Serialize)] pub struct WindowGeometry { pub anchor_point: AnchorPoint, pub offset: Coords, diff --git a/crates/yuck/src/value/coords.rs b/crates/yuck/src/value/coords.rs index 1c372bf..f500dff 100644 --- a/crates/yuck/src/value/coords.rs +++ b/crates/yuck/src/value/coords.rs @@ -14,11 +14,11 @@ pub enum Error { MalformedCoords, } -#[derive(Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Display, DebugCustom, SmartDefault)] +#[derive(Clone, Copy, PartialEq, Deserialize, Serialize, Display, DebugCustom, SmartDefault)] pub enum NumWithUnit { #[display(fmt = "{}%", .0)] #[debug(fmt = "{}%", .0)] - Percent(i32), + Percent(f32), #[display(fmt = "{}px", .0)] #[debug(fmt = "{}px", .0)] #[default] @@ -33,10 +33,10 @@ impl NumWithUnit { } } - pub fn perc_relative_to(&self, max: i32) -> i32 { + pub fn perc_relative_to(&self, max: i32) -> f32 { match *self { NumWithUnit::Percent(n) => n, - NumWithUnit::Pixels(n) => ((n as f64 / max as f64) * 100.0) as i32, + NumWithUnit::Pixels(n) => ((n as f64 / max as f64) * 100.0) as f32, } } } @@ -45,19 +45,19 @@ impl FromStr for NumWithUnit { type Err = Error; fn from_str(s: &str) -> Result { - static PATTERN: Lazy = Lazy::new(|| regex::Regex::new("^(-?\\d+)(.*)$").unwrap()); + static PATTERN: Lazy = Lazy::new(|| regex::Regex::new("^(-?\\d+(?:.\\d+)?)(.*)$").unwrap()); let captures = PATTERN.captures(s).ok_or_else(|| Error::NumParseFailed(s.to_string()))?; - let value = captures.get(1).unwrap().as_str().parse::().map_err(|_| Error::NumParseFailed(s.to_string()))?; + let value = captures.get(1).unwrap().as_str().parse::().map_err(|_| Error::NumParseFailed(s.to_string()))?; match captures.get(2).unwrap().as_str() { - "px" | "" => Ok(NumWithUnit::Pixels(value)), + "px" | "" => Ok(NumWithUnit::Pixels(value.floor() as i32)), "%" => Ok(NumWithUnit::Percent(value)), unit => Err(Error::InvalidUnit(unit.to_string())), } } } -#[derive(Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Display, Default)] +#[derive(Clone, Copy, PartialEq, Deserialize, Serialize, Display, Default)] #[display(fmt = "{}*{}", x, y)] pub struct Coords { pub x: NumWithUnit, @@ -106,7 +106,8 @@ mod test { fn test_parse_num_with_unit() { assert_eq!(NumWithUnit::Pixels(55), NumWithUnit::from_str("55").unwrap()); assert_eq!(NumWithUnit::Pixels(55), NumWithUnit::from_str("55px").unwrap()); - assert_eq!(NumWithUnit::Percent(55), NumWithUnit::from_str("55%").unwrap()); + assert_eq!(NumWithUnit::Percent(55.0), NumWithUnit::from_str("55%").unwrap()); + assert_eq!(NumWithUnit::Percent(55.5), NumWithUnit::from_str("55.5%").unwrap()); assert!(NumWithUnit::from_str("55pp").is_err()); }