From ea78f94027ecd2c690904a6d7729e9e3cc190a20 Mon Sep 17 00:00:00 2001 From: srdusr <99972264+srdusr@users.noreply.github.com> Date: Fri, 7 Nov 2025 14:04:00 +0200 Subject: Make tiling's master/stack ratio live, add settings readback everywhere Investigated the "tiling needs a lot of work" report directly. The MasterStackLayout algorithm itself was already correct; the real gap was that dragging or resizing a tiled window did nothing durable (raw geometry that the next arrange_workspace silently discarded), and master_ratio/master_count had no live path at all (config-file only). A resize-drag on the shared master/stack boundary now live-adjusts TilingConfig::master_ratio and re-arranges the group immediately; srd set master_ratio/master_count do the same for a keybind or script. Found and fixed a real bug while building this: start_resize's own focus_window call re-stacks its target in self.order before the ratio-drag decision used to be made, silently misclassifying real master-column grabs. Fixed by deciding ratio-drag status (and freezing the membership snapshot it depends on) before that raise happens, applying MasterStackLayout directly against the frozen snapshot rather than re-deriving membership from the by-then-reordered live order. Live- verified in a nested compositor, not just unit-tested. Also closes the readback gaps flagged directly by the AGS peer session: border_width/border_color/corner_radius/decoration_mode/gap_inner/ gap_outer/master_ratio/master_count were all live-settable via srd set with no way to read the current value back, and pin_input had no readback at all. SettingsResponse now reports all of them; a new pinned_inputs query (srd pinned inputs) lists every currently pinned pid/window. --- crates/core/src/theme.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'crates/core/src/theme.rs') diff --git a/crates/core/src/theme.rs b/crates/core/src/theme.rs index 882326f..4dbf96d 100644 --- a/crates/core/src/theme.rs +++ b/crates/core/src/theme.rs @@ -194,6 +194,16 @@ pub fn parse_hex_color(s: &str) -> Option<(u8, u8, u8)> { Some((r, g, b)) } +/// [`parse_hex_color`]'s exact inverse - `#rrggbb`, lowercase, always six +/// hex digits (`{:02x}` per channel, so a channel below `0x10` doesn't +/// collapse to a five-character string). Exists for settings readback: a +/// caller reading `border_color` back over IPC should get the identical +/// string shape `srd set border_color` itself accepts, not a different +/// representation of the same colour. +pub fn format_hex_color(rgb: (u8, u8, u8)) -> String { + format!("#{:02x}{:02x}{:02x}", rgb.0, rgb.1, rgb.2) +} + #[cfg(test)] mod tests { use super::*; @@ -215,6 +225,18 @@ mod tests { assert_eq!(parse_hex_color("#zzzzzz"), None); } + #[test] + fn format_hex_color_round_trips_through_parse_hex_color() { + for rgb in [(0x88, 0xc0, 0xd0), (0, 0, 0), (0xff, 0xff, 0xff), (0x05, 0x0a, 0x0f)] { + assert_eq!(parse_hex_color(&format_hex_color(rgb)), Some(rgb)); + } + } + + #[test] + fn format_hex_color_pads_low_channel_values() { + assert_eq!(format_hex_color((0x05, 0x0a, 0x0f)), "#050a0f"); + } + #[test] fn default_matches_the_legacy_hardcoded_nord_palette() { let t = ThemeConfig::default(); -- cgit v1.2.3