From 1a435a8676939ea0f059bda4889d9c0a2d714635 Mon Sep 17 00:00:00 2001 From: kenji Date: Sun, 31 May 2026 12:47:43 -0500 Subject: [PATCH] add(bitwarden): added window rule for bitwarden extension via socket listening --- apps/hyprland/default.nix | 1 + apps/hyprland/hypr/rules.nix | 3 +- apps/hyprland/scripts/window-rules.nix | 40 ++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 apps/hyprland/scripts/window-rules.nix diff --git a/apps/hyprland/default.nix b/apps/hyprland/default.nix index 9c1b29e..c7b288a 100644 --- a/apps/hyprland/default.nix +++ b/apps/hyprland/default.nix @@ -14,6 +14,7 @@ ./hypr/rules.nix ./scripts/movement.nix + ./scripts/window-rules.nix ./scripts/workspace-toggle.nix ]; wayland.windowManager.hyprland.enable = true; diff --git a/apps/hyprland/hypr/rules.nix b/apps/hyprland/hypr/rules.nix index 2bcd63b..9303a79 100644 --- a/apps/hyprland/hypr/rules.nix +++ b/apps/hyprland/hypr/rules.nix @@ -3,8 +3,7 @@ windowrule = [ # Make all inactive windows transparent "match:class .*, opacity 1 0.8" - # But make Firefox windows opaque again (last rule wins) - "match:title (?i)bitwarden, float on" + "match:class firefox, match:title (?i).*bitwarden.*, no_screen_share on" ]; workspace = [ ]; diff --git a/apps/hyprland/scripts/window-rules.nix b/apps/hyprland/scripts/window-rules.nix new file mode 100644 index 0000000..7d25546 --- /dev/null +++ b/apps/hyprland/scripts/window-rules.nix @@ -0,0 +1,40 @@ +{pkgs, ...}: let + hyprctl = "${pkgs.hyprland}/bin/hyprctl"; + jq = "${pkgs.jq}/bin/jq"; + socat = "${pkgs.socat}/bin/socat"; + + hypr-window-rules = pkgs.writeShellScriptBin "hypr-window-rules" '' + handle() { + local event="$1" + case "$event" in + windowtitlev2*) + local data="''${event#windowtitlev2>>}" + local addr="0x''${data%%,*}" + local title="''${data#*,}" + + if echo "$title" | grep -qi "bitwarden"; then + local info + info=$(${hyprctl} clients -j | ${jq} -r --arg addr "$addr" \ + '.[] | select(.address == $addr) | "\(.class)|\(.floating)"') + local class="''${info%|*}" + local floating="''${info#*|}" + + if [[ "$class" == "firefox" && "$floating" == "false" ]]; then + ${hyprctl} dispatch togglefloating "address:$addr" + fi + fi + ;; + esac + } + + ${socat} - \ + "UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" \ + | while IFS= read -r line; do handle "$line"; done + ''; +in { + home.packages = [hypr-window-rules]; + + wayland.windowManager.hyprland.settings.exec-once = [ + "hypr-window-rules" + ]; +}