From ad4b8c267e519d03740813826ba98120446427c7 Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Fri, 8 May 2026 22:16:38 -0700 Subject: [PATCH] Add pinned window indicators --- dotfiles/config/hypr/hyprland.lua | 33 +++++++++++++++++-- .../taffybar/TaffybarConfig/Workspaces.hs | 3 +- dotfiles/config/taffybar/flake.lock | 6 ++-- dotfiles/config/taffybar/taffybar | 2 +- dotfiles/config/taffybar/taffybar.css | 14 +++++++- nixos/flake.lock | 4 +-- nixos/flake.nix | 2 ++ 7 files changed, 53 insertions(+), 11 deletions(-) diff --git a/dotfiles/config/hypr/hyprland.lua b/dotfiles/config/hypr/hyprland.lua index d2887172..0999bcfe 100644 --- a/dotfiles/config/hypr/hyprland.lua +++ b/dotfiles/config/hypr/hyprland.lua @@ -1478,6 +1478,25 @@ local function float_and_resize_active_window() dispatch(hl.dsp.window.resize()) end +local function toggle_pinned_active_window() + local window = hl.get_active_window() + local selector = window_selector(window) + if not window or not selector then + return + end + + if window.pinned then + dispatch(hl.dsp.window.pin({ action = "disable", window = selector })) + dispatch(hl.dsp.window.float({ action = "disable", window = selector })) + return + end + + if not window.floating then + float_active_window_preserving_tiled_geometry() + end + dispatch(hl.dsp.window.pin({ action = "enable", window = selector })) +end + local function schedule_scratchpad_geometry(name, window, target_monitor) hl.timer(function() apply_scratchpad_geometry(name, window, target_monitor) @@ -1762,6 +1781,7 @@ local function show_active_window_info() "Class: " .. tostring(window.class or ""), "Title: " .. tostring(window.title or ""), "Workspace: " .. tostring(workspace), + "Pinned: " .. tostring(window.pinned or false), "Address: " .. tostring(window.address or ""), "PID: " .. tostring(window.pid or ""), } @@ -1943,10 +1963,10 @@ hl.config({ general = { gaps_in = 5, gaps_out = 10, - border_size = 0, + border_size = 2, col = { - active_border = { colors = { "rgba(edb443ee)", "rgba(33ccffee)" }, angle = 45 }, - inactive_border = "rgba(595959aa)", + active_border = { colors = { "rgba(3b82f6ee)", "rgba(33ccffee)" }, angle = 45 }, + inactive_border = "rgba(00000000)", }, layout = columns_layout, allow_tearing = false, @@ -2086,6 +2106,12 @@ local function apply_rules() decorate = false, no_shadow = true, }) + hl.window_rule({ + name = "subtle-pinned-window-border", + match = { pin = true }, + border_size = 2, + border_color = "rgba(edb443ff) rgba(ff4d5dcc)", + }) end bind(main_mod .. " + P", exec(launcher_command)) @@ -2232,6 +2258,7 @@ bind(main_mod .. " + CTRL + Space", gather_workspace_into_tabbed_group) bind(main_mod .. " + bracketright", monocle_next) bind(main_mod .. " + bracketleft", monocle_prev) bind(main_mod .. " + T", hl.dsp.window.float({ action = "disable" })) +bind(main_mod .. " + O", toggle_pinned_active_window) bind(main_mod .. " + M", minimize_active_window) bind(main_mod .. " + SHIFT + M", restore_last_minimized) bind(main_mod .. " + CTRL + SHIFT + M", function() diff --git a/dotfiles/config/taffybar/TaffybarConfig/Workspaces.hs b/dotfiles/config/taffybar/TaffybarConfig/Workspaces.hs index 370df5a5..059d6689 100644 --- a/dotfiles/config/taffybar/TaffybarConfig/Workspaces.hs +++ b/dotfiles/config/taffybar/TaffybarConfig/Workspaces.hs @@ -127,7 +127,8 @@ workspaceCandidateInfo name = WorkspaceModel.windowPosition = Nothing, WorkspaceModel.windowUrgent = False, WorkspaceModel.windowActive = False, - WorkspaceModel.windowMinimized = False + WorkspaceModel.windowMinimized = False, + WorkspaceModel.windowPinned = False } workspaceIconFromCandidate :: Int32 -> Text -> TaffyIO (Maybe Gdk.Pixbuf) diff --git a/dotfiles/config/taffybar/flake.lock b/dotfiles/config/taffybar/flake.lock index 6062ef96..a050b565 100644 --- a/dotfiles/config/taffybar/flake.lock +++ b/dotfiles/config/taffybar/flake.lock @@ -136,11 +136,11 @@ "xmonad-contrib": "xmonad-contrib" }, "locked": { - "lastModified": 1778147268, - "narHash": "sha256-q/1DIMXQEU4y95gAFacnrHwqxYbkpqwtpmVGTFmmTMo=", + "lastModified": 1778303085, + "narHash": "sha256-pDFWJ3BJ4jaZOi1hq7SHzRCdnII8PgvBNxcyoFgx4BE=", "owner": "taffybar", "repo": "taffybar", - "rev": "e52f00e8d6a0fe903dada5001778808d093eafb6", + "rev": "45b31b789fdfeff7251f0f77e1259ef4d1cc987a", "type": "github" }, "original": { diff --git a/dotfiles/config/taffybar/taffybar b/dotfiles/config/taffybar/taffybar index be3aa010..45b31b78 160000 --- a/dotfiles/config/taffybar/taffybar +++ b/dotfiles/config/taffybar/taffybar @@ -1 +1 @@ -Subproject commit be3aa010f7c3938a711e9191a7c0fae342ce6f45 +Subproject commit 45b31b789fdfeff7251f0f77e1259ef4d1cc987a diff --git a/dotfiles/config/taffybar/taffybar.css b/dotfiles/config/taffybar/taffybar.css index b4bef484..4eb35381 100644 --- a/dotfiles/config/taffybar/taffybar.css +++ b/dotfiles/config/taffybar/taffybar.css @@ -256,10 +256,22 @@ .workspaces .window-icon-container.active { background-color: rgba(255, 255, 255, 0.10); - border-color: rgba(255, 255, 255, 0.5); + border-color: rgba(59, 130, 246, 0.76); border-radius: 7px; } +.workspaces .window-icon-container.pinned { + border-color: rgba(255, 77, 93, 0.74); + box-shadow: inset 0 -2px 0 rgba(255, 77, 93, 0.72); +} + +.workspaces .window-icon-container.pinned.active { + border-color: rgba(237, 180, 67, 0.95); + box-shadow: + inset 0 -2px 0 rgba(237, 180, 67, 0.9), + 0 0 0 1px rgba(237, 180, 67, 0.22); +} + .workspaces .active .contents, .workspaces .visible .contents { background-color: transparent; diff --git a/nixos/flake.lock b/nixos/flake.lock index a97fcb7a..68bace72 100644 --- a/nixos/flake.lock +++ b/nixos/flake.lock @@ -1827,8 +1827,8 @@ ] }, "locked": { - "lastModified": 1778195259, - "narHash": "sha256-exYzNU6vVQg3z1v8ZNDLMjV8+GxbubiEqndT8rFzrm0=", + "lastModified": 1778303132, + "narHash": "sha256-P8W/cn7iiWbvrrkyv4LPENnsVbKbASK6+bLKZbxeIoA=", "path": "/home/imalison/dotfiles/dotfiles/config/taffybar/taffybar", "type": "path" }, diff --git a/nixos/flake.nix b/nixos/flake.nix index 40666d65..0771b0a3 100644 --- a/nixos/flake.nix +++ b/nixos/flake.nix @@ -452,6 +452,7 @@ "https://cache.flox.dev" "https://org-agenda-api.cachix.org" "https://colonelpanic8-dotfiles.cachix.org" + "https://taffybar.cachix.org" "https://codex-cli.cachix.org" "https://claude-code.cachix.org" ]; @@ -473,6 +474,7 @@ "flox-cache-public-1:7F4OyH7ZCnFhcze3fJdfyXYLQw/aV7GEed86nQ7IsOs=" "org-agenda-api.cachix.org-1:liKFemKkOLV/rJt2txDNcpDjRsqLuBneBjkSw/UVXKA=" "colonelpanic8-dotfiles.cachix.org-1:O6GF3nptpeMFapX29okzO92eSWXR36zqW6ZF2C8P0eQ=" + "taffybar.cachix.org-1:beZotJ1nVEsAnJxa3lWn0zwzZM7oeXmGh4ADRpHeeIo=" "codex-cli.cachix.org-1:1Br3H1hHoRYG22n//cGKJOk3cQXgYobUel6O8DgSing=" "claude-code.cachix.org-1:YeXf2aNu7UTX8Vwrze0za1WEDS+4DuI2kVeWEE4fsRk=" ];