summaryrefslogtreecommitdiff
path: root/overlays/swayosd/exponential.patch
blob: eb90d73926652b3a164afed4cd8872073806b420 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
diff --git a/src/brightness_backend/brightnessctl.rs b/src/brightness_backend/brightnessctl.rs
index ccb0e11..740fdb6 100644
--- a/src/brightness_backend/brightnessctl.rs
+++ b/src/brightness_backend/brightnessctl.rs
@@ -107,10 +107,21 @@ impl VirtualDevice {
 		}
 	}
 
-	fn set_percent(&mut self, mut val: u32) -> anyhow::Result<()> {
-		val = val.clamp(0, 100);
-		self.current = self.max.map(|max| val * max / 100);
-		let _: String = self.run(("set", &*format!("{val}%")))?;
+        fn val_to_percent(&mut self, val: u32) -> u32 {
+                return ((val as f64 / self.get_max() as f64).powf(0.25) * 100_f64).round() as u32;
+        }
+        fn percent_to_val(&mut self, perc: u32) -> u32 {
+                return ((perc as f64 / 100_f64).powf(4_f64) * self.get_max() as f64).round() as u32;
+        }
+
+	fn set_percent(&mut self, val: u32) -> anyhow::Result<()> {
+                let new = self.percent_to_val(val);
+                self.set_val(new)
+	}
+	fn set_val(&mut self, val: u32) -> anyhow::Result<()> {
+                let curr = val.clamp(0, self.get_max());
+                self.current = Some(curr);
+		let _: String = self.run(("set", &*format!("{curr}")))?;
 		Ok(())
 	}
 }
@@ -134,20 +145,18 @@ impl BrightnessBackend for BrightnessCtl {
 
 	fn lower(&mut self, by: u32) -> anyhow::Result<()> {
 		let curr = self.get_current();
-		let max = self.get_max();
-
-		let curr = curr * 100 / max;
+                let mut new = self.device.val_to_percent(curr).saturating_sub(by);
+                new = self.device.percent_to_val(new).min(curr.saturating_sub(1));
 
-		self.device.set_percent(curr.saturating_sub(by))
+		self.device.set_val(new)
 	}
 
 	fn raise(&mut self, by: u32) -> anyhow::Result<()> {
 		let curr = self.get_current();
-		let max = self.get_max();
-
-		let curr = curr * 100 / max;
+                let mut new = self.device.val_to_percent(curr) + by;
+                new = self.device.percent_to_val(new).max(curr + 1);
 
-		self.device.set_percent(curr + by)
+		self.device.set_val(new)
 	}
 
 	fn set(&mut self, val: u32) -> anyhow::Result<()> {