nixos: add quickshell/waybar/taffybar modules

- Switch taffybar input to the local submodule
- Add caelestia quickshell (home-manager module)
- Make waybar/taffybar mutually exclusive, defaulting based on xmonad
- Move tray ordering and status notifier watcher config into the right modules
This commit is contained in:
2026-02-05 12:00:46 -08:00
committed by Kat Huang
parent 2d8d5d7fcb
commit 1f60631e6c
12 changed files with 436 additions and 899 deletions

View File

@@ -33,14 +33,17 @@
./plasma.nix ./plasma.nix
./postgres.nix ./postgres.nix
./rabbitmq.nix ./rabbitmq.nix
./quickshell.nix
./secrets.nix ./secrets.nix
./ssh.nix ./ssh.nix
./sni.nix ./sni.nix
./syncthing.nix ./syncthing.nix
./taffybar.nix
./tts.nix ./tts.nix
./user-specific.nix ./user-specific.nix
./users.nix ./users.nix
./vscode.nix ./vscode.nix
./waybar.nix
./wsl.nix ./wsl.nix
./wyoming.nix ./wyoming.nix
./xmonad.nix ./xmonad.nix

View File

@@ -1,4 +1,4 @@
{ inputs, config, pkgs, makeEnable, ... }: { inputs, config, pkgs, lib, makeEnable, ... }:
makeEnable config "myModules.desktop" true { makeEnable config "myModules.desktop" true {
services.greenclip.enable = true; services.greenclip.enable = true;
imports = [ imports = [
@@ -8,6 +8,16 @@ makeEnable config "myModules.desktop" true {
./xremap.nix ./xremap.nix
]; ];
assertions = [
{
assertion = config.myModules.taffybar.enable != config.myModules.waybar.enable;
message = "Enable exactly one of myModules.taffybar or myModules.waybar.";
}
];
myModules.taffybar.enable = lib.mkDefault config.myModules.xmonad.enable;
myModules.waybar.enable = lib.mkDefault (!config.myModules.xmonad.enable);
services.xserver = { services.xserver = {
exportConfiguration = true; exportConfiguration = true;
enable = true; enable = true;

1110
nixos/flake.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -74,7 +74,7 @@
}; };
taffybar = { taffybar = {
url = "github:taffybar/taffybar/old-master"; url = "path:/home/imalison/dotfiles/dotfiles/config/taffybar/taffybar";
inputs = { inputs = {
nixpkgs.follows = "nixpkgs"; nixpkgs.follows = "nixpkgs";
}; };
@@ -82,12 +82,12 @@
imalison-taffybar = { imalison-taffybar = {
url = "path:../dotfiles/config/taffybar"; url = "path:../dotfiles/config/taffybar";
# inputs = { inputs = {
# nixpkgs.follows = "nixpkgs"; nixpkgs.follows = "nixpkgs";
# flake-utils.follows = "flake-utils"; flake-utils.follows = "flake-utils";
# xmonad.follows = "xmonad"; xmonad.follows = "xmonad";
# taffybar.follows = "taffybar"; taffybar.follows = "taffybar";
# }; };
}; };
notifications-tray-icon = { notifications-tray-icon = {
@@ -132,7 +132,7 @@
nixtheplanet.url = "github:matthewcroughan/nixtheplanet"; nixtheplanet.url = "github:matthewcroughan/nixtheplanet";
codex-cli-nix = { codex-cli-nix = {
url = "github:sadjow/codex-cli-nix"; url = "github:colonelpanic8/codex-cli-nix/fix/add-libcap-to-rpath";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
@@ -141,6 +141,11 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
caelestia-shell = {
url = "github:caelestia-dots/shell";
inputs.nixpkgs.follows = "nixpkgs";
};
}; };
outputs = inputs @ { outputs = inputs @ {

View File

@@ -1,4 +1,4 @@
{ config, pkgs, lib, makeEnable, inputs, ... }: { config, pkgs, makeEnable, inputs, ... }:
makeEnable config "myModules.hyprland" true { makeEnable config "myModules.hyprland" true {
programs.hyprland = { programs.hyprland = {
enable = true; enable = true;
@@ -8,29 +8,6 @@ makeEnable config "myModules.hyprland" true {
withUWSM = true; withUWSM = true;
}; };
home-manager.sharedModules = [
{
programs.waybar.enable = true;
systemd.user.services.waybar = {
Unit = {
Description = "Waybar";
PartOf = [ "wayland-session@Hyprland.target" ];
After = [ "wayland-session@Hyprland.target" ];
};
Service = {
ExecStartPre = "${pkgs.bash}/bin/bash -lc 'uid=$(id -u); for i in $(seq 1 50); do runtime_dir=\"$XDG_RUNTIME_DIR\"; if [ -z \"$runtime_dir\" ]; then runtime_dir=\"/run/user/$uid\"; fi; if [ -n \"$WAYLAND_DISPLAY\" ] && [ -S \"$runtime_dir/$WAYLAND_DISPLAY\" ]; then exit 0; fi; sleep 0.1; done; exit 1'";
ExecStart = "${pkgs.waybar}/bin/waybar";
Restart = "always";
RestartSec = 1;
};
Install = {
WantedBy = [ "wayland-session@Hyprland.target" ];
};
};
}
];
# Hyprland-specific packages # Hyprland-specific packages
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
# Hyprland utilities # Hyprland utilities

View File

@@ -17,6 +17,7 @@
myModules.gitea-runner.enable = false; myModules.gitea-runner.enable = false;
myModules.nvidia.enable = true; myModules.nvidia.enable = true;
myModules.electron.enable = true; myModules.electron.enable = true;
myModules.quickshell.enable = true;
myModules.wyoming.enable = false; myModules.wyoming.enable = false;
myModules.tts.enable = false; myModules.tts.enable = false;

21
nixos/quickshell.nix Normal file
View File

@@ -0,0 +1,21 @@
{ config, lib, makeEnable, inputs, ... }:
makeEnable config "myModules.quickshell" false {
home-manager.sharedModules = [
inputs.caelestia-shell.homeManagerModules.default
({ lib, nixos, ... }:
let
hyprlandEnabled = lib.attrByPath ["myModules" "hyprland" "enable"] false nixos.config;
in
{
programs.caelestia = {
enable = true;
cli.enable = true;
systemd.target = lib.mkDefault (
if hyprlandEnabled
then "wayland-session@Hyprland.target"
else "graphical-session.target"
);
};
})
];
}

View File

@@ -1,7 +1,23 @@
{ config, makeEnable, ... }: { config, lib, makeEnable, ... }:
makeEnable config "myModules.sni" true { makeEnable config "myModules.sni" true {
home-manager.sharedModules = [ home-manager.sharedModules = [
{ {
systemd.user.services =
let
wantGraphicalPre = {
Install.WantedBy = lib.mkAfter [ "graphical-session-pre.target" ];
};
in
{
blueman-applet = wantGraphicalPre;
kdeconnect = wantGraphicalPre;
kdeconnect-indicator = wantGraphicalPre;
network-manager-applet = wantGraphicalPre;
pasystray = wantGraphicalPre;
udiskie = wantGraphicalPre;
flameshot = wantGraphicalPre;
};
services.blueman-applet = { services.blueman-applet = {
enable = true; enable = true;
}; };
@@ -25,11 +41,6 @@ makeEnable config "myModules.sni" true {
tray = "always"; tray = "always";
}; };
services.status-notifier-watcher = {
enable = true;
flags = ["--log-level" "DEBUG"];
};
services.pasystray.enable = true; services.pasystray.enable = true;
services.flameshot = { services.flameshot = {

82
nixos/taffybar.nix Normal file
View File

@@ -0,0 +1,82 @@
{ config, inputs, pkgs, makeEnable, ... }:
makeEnable config "myModules.taffybar" false {
nixpkgs.overlays = with inputs; (
if builtins.isList taffybar.overlays
then taffybar.overlays
else builtins.attrValues taffybar.overlays
) ++ [
(final: prev: {
haskellPackages = prev.haskellPackages.override (old: {
overrides = prev.lib.composeExtensions (old.overrides or (_: _: {})) (hself: hsuper: {
taffybar = prev.haskell.lib.overrideCabal hsuper.taffybar (oa: {
postPatch = (oa.postPatch or "") + ''
patch -p1 <<'PATCH'
diff --git a/src/System/Taffybar/Widget/HyprlandWorkspaces.hs b/src/System/Taffybar/Widget/HyprlandWorkspaces.hs
index 8e0e07a..a40b1a6 100644
--- a/src/System/Taffybar/Widget/HyprlandWorkspaces.hs
+++ b/src/System/Taffybar/Widget/HyprlandWorkspaces.hs
@@ -27,7 +27,7 @@ import Control.Monad.IO.Class (MonadIO(liftIO))
import Control.Monad.Trans.Reader (ReaderT, ask, runReaderT)
import Data.Aeson (FromJSON(..), eitherDecode', withObject, (.:), (.:?), (.!=))
import Data.Char (toLower)
-import Data.List (foldl', sortOn, stripSuffix)
+import Data.List (foldl', sortOn, stripPrefix)
import Data.Maybe (fromMaybe, listToMaybe, mapMaybe)
import qualified Data.Map.Strict as M
import qualified Data.MultiMap as MM
@@ -42,12 +42,11 @@ import StatusNotifier.Tray (scalePixbufToSize)
import System.Environment.XDG.DesktopEntry
( DesktopEntry
, deFilename
- , getDirectoryEntriesDefault
- , getImageForDesktopEntry
+ , getDirectoryEntriesDefault
)
import System.Taffybar.Context
import System.Taffybar.Util
import System.Taffybar.Widget.Generic.AutoSizeImage (autoSizeImage)
-import System.Taffybar.Widget.Util (buildContentsBox, widgetSetClassGI)
+import System.Taffybar.Widget.Util (buildContentsBox, getImageForDesktopEntry, widgetSetClassGI)
import System.Taffybar.WindowIcon (getWindowIconFromClasses, pixBufFromColor)
@@ -316,6 +315,10 @@ normalizeAppId :: String -> String
normalizeAppId name =
let stripped = fromMaybe name (stripSuffix ".desktop" name)
in map toLower stripped
+
+stripSuffix :: Eq a => [a] -> [a] -> Maybe [a]
+stripSuffix suffix xs =
+ reverse <$> stripPrefix (reverse suffix) (reverse xs)
getWindowIconFromDesktopEntryByAppId ::
Int32 -> String -> TaffyIO (Maybe Gdk.Pixbuf)
PATCH
'';
});
});
});
})
];
environment.systemPackages = [
inputs.imalison-taffybar.defaultPackage.${pkgs.stdenv.hostPlatform.system}
];
home-manager.sharedModules = [
{
services.status-notifier-watcher.enable = true;
# Disable kded6's statusnotifierwatcher module so it doesn't race with
# the Haskell status-notifier-watcher for the org.kde.StatusNotifierWatcher bus name.
xdg.configFile."kded6rc".text = ''
[Module-statusnotifierwatcher]
autoload=false
'';
services.taffybar = {
enable = true;
package = inputs.imalison-taffybar.defaultPackage.${pkgs.stdenv.hostPlatform.system};
};
}
];
}

26
nixos/waybar.nix Normal file
View File

@@ -0,0 +1,26 @@
{ config, pkgs, makeEnable, ... }:
makeEnable config "myModules.waybar" false {
home-manager.sharedModules = [
{
programs.waybar.enable = true;
systemd.user.services.waybar = {
Unit = {
Description = "Waybar";
PartOf = [ "wayland-session@Hyprland.target" "tray.target" ];
After = [ "wayland-session@Hyprland.target" "tray.target" ];
Wants = [ "tray.target" ];
};
Service = {
ExecStartPre = "${pkgs.bash}/bin/bash -lc 'uid=$(id -u); runtime_dir=\"$XDG_RUNTIME_DIR\"; if [ -z \"$runtime_dir\" ]; then runtime_dir=\"/run/user/$uid\"; fi; for i in $(seq 1 50); do if [ -n \"$WAYLAND_DISPLAY\" ] && [ -S \"$runtime_dir/$WAYLAND_DISPLAY\" ]; then found=1; break; fi; sleep 0.1; done; if [ -z \"$found\" ]; then exit 1; fi; \"$HOME/.config/waybar/scripts/render-config\"'";
ExecStart = "${pkgs.waybar}/bin/waybar -c %t/waybar/config.jsonc -s %t/waybar/style.css";
Restart = "always";
RestartSec = 1;
};
Install = {
WantedBy = [ "wayland-session@Hyprland.target" ];
};
};
}
];
}

View File

@@ -5,7 +5,7 @@ makeEnable config "myModules.xmonad" true {
xmonad-contrib.overlay xmonad-contrib.overlay
notifications-tray-icon.overlay notifications-tray-icon.overlay
(import ../dotfiles/config/xmonad/overlay.nix) (import ../dotfiles/config/xmonad/overlay.nix)
] ++ taffybar.overlays; ];
services.rumno.enable = true; services.rumno.enable = true;
@@ -29,20 +29,13 @@ makeEnable config "myModules.xmonad" true {
haskellPackages.imalison-xmonad haskellPackages.imalison-xmonad
# haskellPackages.notifications-tray-icon # haskellPackages.notifications-tray-icon
# haskellPackages.gtk-sni-tray # haskellPackages.gtk-sni-tray
haskellPackages.status-notifier-item
haskellPackages.dbus-hslogger haskellPackages.dbus-hslogger
inputs.imalison-taffybar.defaultPackage."${pkgs.stdenv.hostPlatform.system}"
]; ];
home-manager.sharedModules = [ home-manager.sharedModules = [
{ {
imports = [ ./dunst.nix ]; imports = [ ./dunst.nix ];
services.taffybar = {
enable = true;
package = inputs.imalison-taffybar.defaultPackage."${pkgs.stdenv.hostPlatform.system}";
};
services.autorandr.enable = true; services.autorandr.enable = true;
services.random-background = { services.random-background = {