Propagate taffybar audio and favicon updates

This commit is contained in:
2026-05-13 01:56:39 -07:00
parent cade9b9628
commit bd85161f7a
11 changed files with 168 additions and 17 deletions

View File

@@ -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$%",

View File

@@ -7,3 +7,4 @@ packages:
taffybar/packages/status-notifier-item
taffybar/packages/dbus-menu
taffybar/packages/dbus-hslogger
taffybar/packages/gi-wireplumber

View File

@@ -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": {

View File

@@ -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:-}"

View File

@@ -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

View File

@@ -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"];
};
};
}
];
}

View File

@@ -11,6 +11,7 @@
./bootloaders/systemd-boot.nix
./cache-server.nix
./cache.nix
./chrome-favicon-dbus.nix
./code.nix
./cua.nix
./desktop.nix

27
nixos/flake.lock generated
View File

@@ -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": {

View File

@@ -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";

View File

@@ -200,6 +200,7 @@
in
makeEnable config "myModules.taffybar" false {
myModules.sni.enable = true;
myModules.chrome-favicon-dbus.enable = true;
environment.systemPackages = [
taffybarPackage