diff --git a/dotfiles/config/taffybar/TaffybarConfig/Widgets.hs b/dotfiles/config/taffybar/TaffybarConfig/Widgets.hs index 14c2aa24..4601bb7b 100644 --- a/dotfiles/config/taffybar/TaffybarConfig/Widgets.hs +++ b/dotfiles/config/taffybar/TaffybarConfig/Widgets.hs @@ -30,6 +30,7 @@ import System.Taffybar.Information.ChromeWindowInfo (getChromeWindowInfoRefreshC import System.Taffybar.Util (postGUIASync) import System.Taffybar.Widget import qualified System.Taffybar.Widget.ASUS as ASUS +import qualified System.Taffybar.Widget.Audio as Audio import System.Taffybar.Widget.CPUMonitor (cpuMonitorNew) import System.Taffybar.Widget.Generic.Graph (GraphConfig (..), GraphDirection (..), GraphStyle (..), defaultGraphConfig) import qualified System.Taffybar.Widget.NetworkManager as NetworkManager @@ -39,7 +40,6 @@ import System.Taffybar.Widget.OpenAIUsage defaultOpenAIUsageStackConfig, openAIUsageSectionNewWith, ) -import qualified System.Taffybar.Widget.PulseAudio as PulseAudio import System.Taffybar.Widget.SNIMenu (withNmAppletMenu) import System.Taffybar.Widget.SNITray ( CollapsibleSNITrayParams (..), @@ -76,7 +76,7 @@ import Text.Read (readMaybe) audioWidget :: TaffyIO Gtk.Widget audioWidget = - decorateWithClassAndBoxM "audio" PulseAudio.pulseAudioNew + decorateWithClassAndBoxM "audio" Audio.audioNew networkInnerWidget :: TaffyIO Gtk.Widget networkInnerWidget = @@ -241,7 +241,7 @@ audioBacklightWidget :: TaffyIO Gtk.Widget audioBacklightWidget = stackInPill "audio-backlight" - [ PulseAudio.pulseAudioNew, + [ Audio.audioNew, backlightNewChanWith defaultBacklightWidgetConfig { backlightFormat = "$percent$%", diff --git a/dotfiles/config/taffybar/cabal.project b/dotfiles/config/taffybar/cabal.project index 8a2bb331..8ca1beff 100644 --- a/dotfiles/config/taffybar/cabal.project +++ b/dotfiles/config/taffybar/cabal.project @@ -7,3 +7,4 @@ packages: taffybar/packages/status-notifier-item taffybar/packages/dbus-menu taffybar/packages/dbus-hslogger + taffybar/packages/gi-wireplumber diff --git a/dotfiles/config/taffybar/flake.lock b/dotfiles/config/taffybar/flake.lock index a050b565..dff17bbf 100644 --- a/dotfiles/config/taffybar/flake.lock +++ b/dotfiles/config/taffybar/flake.lock @@ -136,11 +136,11 @@ "xmonad-contrib": "xmonad-contrib" }, "locked": { - "lastModified": 1778303085, - "narHash": "sha256-pDFWJ3BJ4jaZOi1hq7SHzRCdnII8PgvBNxcyoFgx4BE=", + "lastModified": 1778662099, + "narHash": "sha256-vHiVLdTRBvEyEL0ebGENA/Hv1vTwpWQ96Gj3JNPqeD0=", "owner": "taffybar", "repo": "taffybar", - "rev": "45b31b789fdfeff7251f0f77e1259ef4d1cc987a", + "rev": "1741477fea5e9fd18b23f717d6d5c91b2aec09fa", "type": "github" }, "original": { diff --git a/dotfiles/config/taffybar/flake.nix b/dotfiles/config/taffybar/flake.nix index b22bfd52..940c0341 100644 --- a/dotfiles/config/taffybar/flake.nix +++ b/dotfiles/config/taffybar/flake.nix @@ -107,6 +107,13 @@ { }) (_: { doCheck = false; doHaddock = false; }); + gi-wireplumber = + pkgs.haskell.lib.overrideCabal + (hself.callCabal2nix "gi-wireplumber" + (localTaffybarSubdir "packages/gi-wireplumber") + { }) + (_: { doCheck = false; doHaddock = false; }); + dbus-hslogger = hself.callCabal2nix "dbus-hslogger" (localTaffybarSubdir "packages/dbus-hslogger") @@ -116,12 +123,24 @@ # modules (e.g. System.Taffybar.Widget.ASUS) used by this config. taffybar = pkgs.haskell.lib.overrideCabal (pkgs.haskell.lib.disableStaticLibraries - (hself.callCabal2nix "taffybar" cleanedTaffybarSource { inherit (pkgs) gtk3; })) + (hself.callCabal2nix "taffybar" cleanedTaffybarSource { + inherit (pkgs) gtk3; + })) (oa: { doHaddock = false; doCheck = false; - # Needed for gi-gtk-layer-shell (introspection data). - librarySystemDepends = (oa.librarySystemDepends or []) ++ [ pkgs.gtk-layer-shell ]; + # Needed for gi-gtk-layer-shell and gi-wireplumber introspection data. + librarySystemDepends = (oa.librarySystemDepends or []) ++ [ + pkgs.gtk-layer-shell + pkgs.wireplumber + ]; + shellHook = '' + ${oa.shellHook or ""} + export PKG_CONFIG_PATH="${pkgs.wireplumber.dev}/lib/pkgconfig:${pkgs.pipewire.dev}/lib/pkgconfig:''${PKG_CONFIG_PATH:-}" + export GI_GIR_PATH="${pkgs.wireplumber.dev}/share/gir-1.0:''${GI_GIR_PATH:-}" + export GI_TYPELIB_PATH="${pkgs.wireplumber}/lib/girepository-1.0:${pkgs.glib.out}/lib/girepository-1.0:''${GI_TYPELIB_PATH:-}" + export XDG_DATA_DIRS="${pkgs.wireplumber.dev}/share:''${XDG_DATA_DIRS:-}" + ''; }); # gi-gtk-hs patching is now handled by taffybar's fixVersionNamePackages overlay @@ -184,6 +203,7 @@ pkgs.librsvg ]; shellHook = '' + ${hpkgs.taffybar.env.shellHook or ""} # GHCi loads package DLL dependencies via the runtime linker, so it # needs zlib on LD_LIBRARY_PATH in addition to the build-time -L flags. export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath [ pkgs.zlib ]}:''${LD_LIBRARY_PATH:-}" diff --git a/dotfiles/config/taffybar/taffybar b/dotfiles/config/taffybar/taffybar index 5af1f40e..1741477f 160000 --- a/dotfiles/config/taffybar/taffybar +++ b/dotfiles/config/taffybar/taffybar @@ -1 +1 @@ -Subproject commit 5af1f40e567a8a672394cb08678db1e56e83952d +Subproject commit 1741477fea5e9fd18b23f717d6d5c91b2aec09fa diff --git a/dotfiles/config/taffybar/taffybar.hs b/dotfiles/config/taffybar/taffybar.hs index a9a5ee3b..f2349829 100644 --- a/dotfiles/config/taffybar/taffybar.hs +++ b/dotfiles/config/taffybar/taffybar.hs @@ -1,16 +1,17 @@ module Main (main) where -import TaffybarConfig.Config (mkSimpleTaffyConfig) -import TaffybarConfig.Host (cssFilesForHost) import Network.HostName (getHostName) import System.Environment.XDG.BaseDir (getUserConfigFile) import System.Log.Logger (Priority (WARNING), rootLoggerName, setLevel, updateGlobalLogger) import System.Taffybar (startTaffybar) -import System.Taffybar.Context (detectBackend) +import System.Taffybar.Context (appendHook, detectBackend) import System.Taffybar.DBus import System.Taffybar.DBus.Toggle import System.Taffybar.Hooks (withLogLevels) +import System.Taffybar.Information.ChromeWindowInfo (registerChromeWindowInfoRefreshRequests) import System.Taffybar.SimpleConfig (toTaffybarConfig) +import TaffybarConfig.Config (mkSimpleTaffyConfig) +import TaffybarConfig.Host (cssFilesForHost) main :: IO () main = do @@ -25,4 +26,5 @@ main = do withLogServer $ withLogLevels $ withToggleServer $ - toTaffybarConfig simpleTaffyConfig + appendHook registerChromeWindowInfoRefreshRequests $ + toTaffybarConfig simpleTaffyConfig diff --git a/nixos/chrome-favicon-dbus.nix b/nixos/chrome-favicon-dbus.nix new file mode 100644 index 00000000..f8883601 --- /dev/null +++ b/nixos/chrome-favicon-dbus.nix @@ -0,0 +1,100 @@ +{ + config, + inputs, + lib, + pkgs, + makeEnable, + ... +}: let + system = pkgs.stdenv.hostPlatform.system; + bridgePackage = inputs.chrome-favicon-dbus.packages.${system}.default; + extensionSource = "${inputs.chrome-favicon-dbus}/extension"; + extensionManifest = builtins.fromJSON (builtins.readFile "${extensionSource}/manifest.json"); + extensionVersion = extensionManifest.version; + extensionId = "odlameecjipmbmbejkplpemijjgpljce"; + extensionKey = pkgs.writeText "chrome-favicon-dbus-extension.pem" '' + -----BEGIN PRIVATE KEY----- + MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDF0IL1wJ4JyaYc + c3vcixly8UEYUxo6TEwpPFIj/9bTGsIVCzVMxeirqn3979o9DUxZGgn6Ktm6LTnb + h1MK5FZxO3PDdiiotmejbWd79c7PWvGU/Vlf3WuSeej1ksEpNw9GEE/PJ6J9Q0nA + 8kpbJ6sicAY0S0ZzdL7XKNRKGdy6t2BrsO2MBBGcMh/EpkoxzgPBx3/mefcebUnl + 7nIStYX+59w27epsZOLOS/7FPJhx8rda0Lfw3GtFtWef7vWW2DrDuPV1+dDbp8ZH + jspqGGncBJJ7yuUwMpDNEunBOkb/t75LCL+ISn4i5EvMZbQjvRgZOht6jHbVSJeG + eBIVHSG1AgMBAAECggEAGtx10A+0FiGo+g+Pd/L2hXZvr7EnLFfsdqP/hm5o+jkV + tjxTpEVykw7/dVJS2Pv7jFTeGnejoaWfB+mgE+hOOamITng2zLQaLiW+yeUmzF7t + 05y0fHFJeHYv9VrUeneEzi+MWtWnuak/tGDiSm8ATNiX6xV2r1pgyMA9VYOeBsd/ + Q7aCpMgtD9fP3Vo3b8PousmZRB1c3xMf3XIcxdxEppFlUVlGTSi2kuFoEwM6i2fr + 5ptfM8JrSoPZwB6neTg959vpezviYJviDufbCaH777Uvrvr+i5Dzifrjo94yhtp4 + +sv9jVDqL4gUCIkEs3EtQJH57tZtti+mQ8hTsFh6iQKBgQDkcqnQjkCuuIffrzgX + dnRXwCHWptsDqwJaEnyxUoGZhP8tUcOfX8cXkn9AKZCMq/eyzXR4qIWIaKevcTUN + s35YMoXCUZ/Xmj98/9A9rZ8Z/sJnJPvpqctNer59NhCjyIMdh4k3NZAfSoBNgTXt + kz0ir3A0pZTUDeDSXNQe7kVUPQKBgQDdrApydIm4oJIlLq2KctHv/YYpCZRSebmS + Wr+CdTFtjIMl5SBoVeCA+joovLOd+3VYdpHHp0eWkcvjD08K+shLWJ1JtIEMuTDO + KJ1C6iPYRPVD6HZhjP2xtwO1gnGiyF5O5qMkfqQXP0B8iDaUTaoaZloJNpNw2fa2 + UF1ZvDVC2QKBgCqjXB6Y7mmt925Afe+jJEPckHRH4Ejm+iFlofBWvemxcQ88W467 + iaVUqnuHRnt6/VhaEIsUqRe0sNeGAaj0/3fmtiB2q6bKG19xP6TDaxam/hHSTVJn + ZpKnfjZQiPqIyjAQxAOR87xjY18T5sTY3mhC5mZtIUIS9QtOWCkNv9LhAoGBALys + YxP6FwKbQOj+6tytT/zpl5g0PBda3dUxAlHit9hbQYEunT/Q4E5HLNthiawMzFso + SHpb6fXBUH2JmShqPbLL0MxcI38V3PGL5hZ/PVUllHBhWuk63O+3KyQBzADWdFbJ + vdAhLj9PKe8U7Qebdw4TUc0Hs8TY8EFK87meFOM5AoGAZyCQvbXR0nbJuXmahhrT + sKFlAiM3ID+0LN137qeKegxbEOit5sTBjCkdFSovsqyoKR5mF5g3J3Zq/JK4naHD + l/7vEZbO+yR/rn/exH3Aj+GIIy83kvsRsPbAbW8aII7MhRZKEa/W3bdtHfczyI6r + apyjjEZEct41A23iQkkbytQ= + -----END PRIVATE KEY----- + ''; + extensionPackage = + pkgs.runCommand "chrome-favicon-dbus-extension-${extensionVersion}" { + nativeBuildInputs = [pkgs.google-chrome]; + } '' + export HOME="$TMPDIR/home" + mkdir -p "$HOME" "$out" + cp -R --no-preserve=mode "${extensionSource}" extension + google-chrome-stable \ + --pack-extension="$PWD/extension" \ + --pack-extension-key="${extensionKey}" + cp extension.crx "$out/chrome-favicon-dbus.crx" + cp -R extension "$out/unpacked" + ''; + runtimePath = lib.makeBinPath [ + pkgs.coreutils + pkgs.hyprland + pkgs.xdotool + pkgs.which + ]; +in + makeEnable config "myModules.chrome-favicon-dbus" false { + home-manager.sharedModules = [ + { + home.packages = [bridgePackage]; + + xdg.configFile."google-chrome-unpacked-extensions/chrome-favicon-dbus" = { + source = extensionSource; + recursive = true; + }; + + xdg.configFile."google-chrome/External Extensions/${extensionId}.json".text = builtins.toJSON { + external_crx = "${extensionPackage}/chrome-favicon-dbus.crx"; + external_version = extensionVersion; + }; + + systemd.user.services.chrome-favicon-dbus = { + Unit = { + Description = "Chrome favicon metadata over D-Bus"; + After = ["graphical-session.target"]; + PartOf = ["graphical-session.target"]; + }; + + Service = { + ExecStart = "${bridgePackage}/bin/chrome-favicon-dbus --host 127.0.0.1 --port 38933 --path /update"; + Environment = "PATH=${runtimePath}:/run/current-system/sw/bin"; + Restart = "on-failure"; + RestartSec = 2; + }; + + Install = { + WantedBy = ["graphical-session.target"]; + }; + }; + } + ]; + } diff --git a/nixos/configuration.nix b/nixos/configuration.nix index b5360374..084bdd57 100644 --- a/nixos/configuration.nix +++ b/nixos/configuration.nix @@ -11,6 +11,7 @@ ./bootloaders/systemd-boot.nix ./cache-server.nix ./cache.nix + ./chrome-favicon-dbus.nix ./code.nix ./cua.nix ./desktop.nix diff --git a/nixos/flake.lock b/nixos/flake.lock index 200336a8..98670f9d 100644 --- a/nixos/flake.lock +++ b/nixos/flake.lock @@ -84,6 +84,26 @@ "type": "github" } }, + "chrome-favicon-dbus": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1778633515, + "narHash": "sha256-QC/nUlGoqUx63cGwQCkHEN0Qs85PSdF7RYrHYmD4L+A=", + "owner": "taffybar", + "repo": "chrome-favicon-dbus", + "rev": "b791fe9d57b1e09c06f56174d73d9c43b8493fe5", + "type": "github" + }, + "original": { + "owner": "taffybar", + "repo": "chrome-favicon-dbus", + "type": "github" + } + }, "claude-code-nix": { "inputs": { "flake-utils": [ @@ -1747,6 +1767,7 @@ "hyprland", "aquamarine" ], + "chrome-favicon-dbus": "chrome-favicon-dbus", "claude-code-nix": "claude-code-nix", "codex-cli-nix": "codex-cli-nix", "codex-desktop-linux": "codex-desktop-linux", @@ -1907,11 +1928,11 @@ "xmonad-contrib": "xmonad-contrib" }, "locked": { - "lastModified": 1778446663, - "narHash": "sha256-xHKRrar08yPsOVbPG7DlouKU83r8P0WAwoxUuje3kq0=", + "lastModified": 1778662099, + "narHash": "sha256-vHiVLdTRBvEyEL0ebGENA/Hv1vTwpWQ96Gj3JNPqeD0=", "owner": "taffybar", "repo": "taffybar", - "rev": "2c95fd5a8aa125d0ba89873a7d4dfd49bb57b00c", + "rev": "1741477fea5e9fd18b23f717d6d5c91b2aec09fa", "type": "github" }, "original": { diff --git a/nixos/flake.nix b/nixos/flake.nix index 33dd23a8..c65cbd88 100644 --- a/nixos/flake.nix +++ b/nixos/flake.nix @@ -91,6 +91,11 @@ }; }; + chrome-favicon-dbus = { + url = "github:taffybar/chrome-favicon-dbus"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + # Hyprland and plugins from official flakes for proper plugin compatibility hyprland = { url = "git+https://github.com/hyprwm/Hyprland?submodules=1"; diff --git a/nixos/taffybar.nix b/nixos/taffybar.nix index 543d115a..a264cd88 100644 --- a/nixos/taffybar.nix +++ b/nixos/taffybar.nix @@ -200,6 +200,7 @@ in makeEnable config "myModules.taffybar" false { myModules.sni.enable = true; + myModules.chrome-favicon-dbus.enable = true; environment.systemPackages = [ taffybarPackage