feat: refactor and add recording function on waybar

This commit is contained in:
danny 2025-08-11 01:14:53 +08:00
parent 47b5336149
commit f3475c7d02
15 changed files with 656 additions and 586 deletions

View file

@ -1,6 +1,6 @@
configuration {
show-icons: true;
font: "FreeSans Regular 12";
font: "JetBrainsMono 12";
icon-theme: "Gruvbox-Plus-Dark";
display-ssh: "󰣀 ssh:";

View file

@ -1,173 +0,0 @@
{
terminal,
osConfig,
wallRand,
rofiWall,
pkgs,
lib,
}:
let
modulesConfig = import ./modules.nix {
inherit
terminal
osConfig
wallRand
rofiWall
pkgs
lib
;
};
in
map (dev: dev // modulesConfig) [
# Monitor 1
{
output = "DP-5";
layer = "top";
exclusive = true;
passthrough = false;
position = "top";
fixed-center = true;
ipc = true;
margin-top = 0;
margin-left = 0;
margin-right = 0;
margin-bottom = 0;
modules-left = [
"custom/os"
"hyprland/workspaces"
"clock"
"custom/cava"
"mpris"
];
modules-center = [
"hyprland/window"
];
modules-right = (
[
"wlr/taskbar"
]
++ (
if osConfig.programs.gamemode.enable then
[
"custom/gamemode"
]
else
[ ]
)
++ [
"custom/airplay"
"custom/wallRand"
"custom/wireguard"
"idle_inhibitor"
"network"
"cpu"
"memory"
"pulseaudio"
"custom/swaync"
]
);
}
# Monitor 2
{
output = "DP-6";
layer = "top";
exclusive = true;
height = 54;
passthrough = false;
position = "top";
fixed-center = true;
ipc = true;
margin-top = 0;
margin-left = 0;
margin-right = 0;
margin-bottom = 0;
modules-left = [
"clock"
"mpris"
];
modules-center = [
"hyprland/window"
];
modules-right = [
"wlr/taskbar"
"temperature"
"cpu"
"memory"
"pulseaudio"
];
}
# Lap
{
output = "eDP-1";
layer = "top";
exclusive = true;
passthrough = false;
position = "top";
fixed-center = true;
ipc = true;
margin-top = 0;
margin-left = 0;
margin-right = 0;
margin-bottom = 0;
modules-left = [
"custom/os"
"hyprland/workspaces"
"clock"
"mpris"
];
modules-center = [
"hyprland/window"
];
modules-right = [
"wlr/taskbar"
"temperature"
"custom/wallRand"
"custom/wireguard"
"idle_inhibitor"
"network"
"pulseaudio"
"battery"
"custom/swaync"
];
}
# Other
{
output = [
"!eDP-1"
"!DP-1"
"!DP-3"
];
layer = "top";
exclusive = true;
passthrough = false;
position = "top";
fixed-center = true;
ipc = true;
margin-top = 0;
margin-left = 0;
margin-right = 0;
margin-bottom = 0;
modules-left = [
"custom/os"
"hyprland/workspaces"
"clock"
"mpris"
"custom/cava"
];
modules-center = [
"hyprland/window"
];
modules-right = [
"wlr/taskbar"
"temperature"
"custom/wireguard"
"idle_inhibitor"
"network"
"cpu"
"memory"
"pulseaudio"
"battery"
"custom/swaync"
];
}
]

View file

@ -1,314 +0,0 @@
{
terminal,
osConfig,
wallRand,
pkgs,
rofiWall,
lib,
}:
let
terminalRun = "${terminal} -e";
in
{
"hyprland/workspaces" = {
active-only = false;
all-outputs = true;
format = "{icon}";
show-special = false;
on-click = "activate";
on-scroll-up = "hyprctl dispatch workspace e+1";
on-scroll-down = "hyprctl dispatch workspace e-1";
persistent-workspaces = {
"1" = [ ];
"2" = [ ];
"3" = [ ];
"4" = [ ];
};
format-icons = {
active = "";
default = "";
};
};
clock = {
format = "<b>󰥔 {:%H:%M 󰃭 %d/%m}</b>";
tooltip-format = "{:%A %d %B %Y}";
};
actions = {
on-click-right = "mode";
on-click-forward = "tz_up";
on-click-backward = "tz_down";
on-scroll-up = "shift_up";
on-scroll-down = "shift_down";
};
"custom/os" = {
format = "󱄅";
on-click = "wlogout --protocol layer-shell";
};
cpu = {
format = " {usage}%";
max-length = 20;
interval = 5;
on-click-right = "${terminalRun} btop";
};
"hyprland/window" = {
format = "{}";
max-length = 40;
separate-outputs = true;
offscreen-css = true;
offscreen-css-text = "(inactive)";
rewrite = {
"nvim . (.*)" = " $1";
"(.*) - Visual Studio Code" = " $1";
"\\(\\d+\\) Discord (.*)" = " $1";
# Firefox
"(.*) - YouTube Mozilla Firefox" = " $1";
"(.*)\\.pdf Mozilla Firefox" = " $1";
"(.*) Mozilla Firefox" = " $1";
"(.*) - YouTube Music Mozilla Firefox" = "󰎆 $1";
# Firefox Nightly
"(.*) - YouTube Firefox Nightly" = " $1";
"(.*)\\.pdf Firefox Nightly" = " $1";
"(.*) Firefox Nightly" = " $1";
"(.*) - YouTube Music Firefox Nightly" = "󰎆 $1";
# Zen
"(.*) - YouTube Zen Browser" = " $1";
"(.*) - YouTube Music Zen Browser" = "󰎆 $1";
"(.*) Zen Browser" = " $1";
"(.*) - VLC media player" = " $1";
};
};
memory = {
interval = 30;
format = " {used:0.1f}GB/{total:0.1f}G";
format-alt-click = "click";
tooltip = true;
tooltip-format = "{used:0.1f}GB/{total:0.1f}G";
on-click-right = "${terminalRun} btop";
};
mpris = {
interval = 10;
format = " {status_icon} <i>{title} | {artist} </i>";
format-paused = " {status_icon} <i>{title} | {artist} </i>";
on-click = "playerctl play-pause";
on-click-right = "playerctl next";
scroll-step = 5.0;
smooth-scrolling-threshold = 1;
status-icons = {
paused = "󰐎";
playing = "󰎇";
stopped = "";
};
max-length = 30;
};
pulseaudio = {
format = "{icon} {volume}%";
format-bluetooth = "󰂰 {volume}%";
format-muted = " Muted";
format-icons = {
default = [
""
""
" "
" "
];
ignored-sinks = [
"Easy Effects Sink"
];
};
scroll-step = 5.0;
on-click = "pavucontrol -t 3";
tooltip-format = "{icon} {desc} | {volume}%";
smooth-scrolling-threshold = 1;
};
temperature = {
interval = 10;
tooltip = true;
hwmon-path = [
"/sys/class/hwmon/hwmon1/temp1_input"
"/sys/class/thermal/thermal_zone0/temp"
];
critical-threshold = 82;
format-critical = " {temperatureC}°C";
format = "{icon} {temperatureC}°C";
format-icons = [
""
""
""
""
];
on-click-right = "kitty -c ~/.config/kitty/kitty.conf --title btop sh -c 'btop'";
};
"custom/swaync" = {
tooltip = true;
format = "{icon}";
format-icons = {
notification = "󱅫";
none = "󰂚";
dnd-notification = "󱏧<span foreground='red'><sup></sup></span>";
dnd-none = "󱏧";
inhibited-notification = "󰂚<span foreground='red'><sup></sup></span>";
inhibited-none = "󰂚";
dnd-inhibited-notification = "<span foreground='red'><sup></sup></span>";
dnd-inhibited-none = "󱏧";
};
return-type = "json";
exec-if = "which swaync-client";
exec = "swaync-client -swb";
on-click = "sleep 0.1 && swaync-client -t -sw";
on-click-right = "swaync-client -d -sw";
escape = true;
};
"wlr/taskbar" = {
format = " {icon} ";
icon-size = 20;
all-outputs = false;
tooltip-format = "{title}";
on-click = "activate";
on-click-middle = "close";
ignore-list = [
"rofi"
"firefox"
"firefox-nightly"
"zen"
"kitty"
"jetbrains-studio"
"Brave-browser"
"Spotify"
"nemo"
"vlc"
"com.mitchellh.ghostty"
"code"
".virt-manager-wrapped"
"virt-manager"
];
};
"custom/cava" = {
exec = "~/.config/scripts/waybarCava.sh";
format = "{}";
on-click = "${terminalRun} cava";
};
battery =
let
fullAt = if osConfig.services.tlp.enable then 80 else 96;
in
{
full-at = fullAt;
states = {
good = fullAt;
warning = 30;
critical = 15;
};
format = "{icon} {capacity}%";
format-icons = [
"󰂎"
"󰁺"
"󰁻"
"󰁼"
"󰁽"
"󰁾"
"󰁿"
"󰂀"
"󰂁"
"󰂂"
"󰁹"
];
format-charging = "󰂄 {capacity}%";
format-plugged = "󰂄 {capacity}%";
format-alt = "{icon} {time}";
};
network = {
format = "{ifname}";
format-wifi = "󰤨";
format-ethernet = "󰈀";
format-disconnected = "󰤭";
tooltip-format = "{ifname} via {gwaddr} 󰊗";
tooltip-format-wifi = "󰤢 {essid}: {signalStrength}%";
tooltip-format-ethernet = "{ifname} via {gwaddr} 󰊗";
tooltip-format-disconnected = "Disconnected";
max-length = 50;
interval = 5;
on-click = "~/.config/scripts/rofiWifi.sh";
};
idle_inhibitor = {
format = "{icon}";
format-icons = {
activated = "󰅶";
deactivated = "󰾫";
};
};
"custom/wireguard" = {
format = "{icon}";
format-icons = {
connected = "󰒘";
disconnected = "";
};
exec = "~/.config/scripts/wgStatus.sh";
exec-if = "which wg-quick";
on-click = "~/.config/scripts/wgStatus.sh toggle";
tooltip = true;
interval = 3;
return-type = "json";
escape = true;
};
"custom/gamemode" = {
format = "{icon}";
format-icons = {
active = "󰊗";
inactive = "󰺷";
};
exec = "~/.config/scripts/gamemodeStatus.sh";
on-click = "~/.config/scripts/gamemodeStatus.sh toggle";
tooltip = true;
interval = 3;
return-type = "json";
escape = true;
};
"custom/wallRand" = {
format = "";
on-click = "${rofiWall}";
on-click-right = "${wallRand}";
};
"custom/airplay" =
let
toggleScript = pkgs.writeShellScript "airplayStatus" ''
SERVICE="uxplay"
ICON="󱖑"
if [ "$1" = "toggle" ]; then
if systemctl --user is-active --quiet "$SERVICE"; then
systemctl --user stop "$SERVICE"
notify-send "$ICON Airplay" "off" >/dev/null 2>&1
else
systemctl --user start "$SERVICE"
notify-send "$ICON Airplay" "on" >/dev/null 2>&1
fi
exit 0
fi
if ! systemctl --user is-active --quiet "$SERVICE"; then
echo "{\"text\": \"inactive\", \"tooltip\": \"airplay is inactive\", \"alt\": \"inactive\", \"class\": \"inactive\"}"
exit 0
fi
echo "{\"text\": \"active\", \"tooltip\": \"airplay is running\", \"alt\": \"active\", \"class\": \"active\"}"
exit 0
'';
in
{
format = "{icon}";
format-icons = {
active = "󱖑";
inactive = "";
};
exec = toggleScript;
interval = 3;
tooltip = true;
return-type = "json";
escape = true;
on-click = "${toggleScript} toggle";
};
}

View file

@ -46,6 +46,8 @@ tooltip label {
#custom-gamemode,
#custom-wallRand,
#custom-airplay,
#custom-bitwarden,
#custom-recording,
#clock,
#cpu,
#memory,
@ -86,6 +88,8 @@ tooltip label {
#custom-gamemode,
#custom-wallRand,
#custom-airplay,
#custom-bitwarden,
#custom-recording,
#battery {
margin-left: 4px;
}
@ -135,6 +139,8 @@ tooltip label {
#custom-gamemode,
#custom-wallRand,
#custom-airplay,
#custom-bitwarden,
#custom-recording,
#network,
#idle_inhibitor {
padding-left: 10px; padding-right: 14px;

17
home/scripts/mkWall.nix Normal file
View file

@ -0,0 +1,17 @@
{ config, pkgs }:
let
mkWall = pkgs.writeShellScriptBin "setWall" ''
url="$1"
filepath="/tmp/wall_cache/$(echo -n "$url" | base64 | tr -d '\n')"
if [[ ! -f "$filepath" ]]; then
curl -sL "$url" -o "$filepath"
fi
${config.services.swww.package}/bin/swww img "$filepath" \
--transition-fps 45 \
--transition-duration 1 \
--transition-type random
'';
in
mkWall

View file

@ -0,0 +1,17 @@
# Rofi selecter for bitwarden cli
{
pkgs,
}:
let
selector = pkgs.writeShellScript "rbw-selector" ''
selection=$(rbw list | rofi -dmenu -p "Search" )
if [[ -z "$selection" ]]; then
exit 0
fi
rbw get "$selection" | tr -d '\n' | wl-copy
notify-send "󰯄 Bitwarden" "Password for $selection: Copied"
'';
in
selector

47
home/scripts/record.nix Normal file
View file

@ -0,0 +1,47 @@
{
pkgs,
...
}:
let
record = pkgs.writeShellScript "toggle-wf-record" ''
PID_FILE="/tmp/wf-recorder.pid"
OUTPUT_DIR="$HOME/Videos/recordings"
FILENAME="$OUTPUT_DIR/recording_$(date +%Y%m%d_%H%M%S).mp4"
SINK_DEV="$(${pkgs.pulseaudio.out}/bin/pactl get-default-sink).monitor"
declare -A recordOptions=(
[Monitor]="${pkgs.slurp}/bin/slurp -o"
[Area]="${pkgs.slurp}/bin/slurp"
)
if [[ -f "$PID_FILE" ]]; then
pid=$(cat "$PID_FILE")
if kill "$pid" 2>/dev/null; then
rm "$PID_FILE"
echo "Stopped recording"
notify-send "󰑋 RECORD" "Recording saved to $FILENAME"
else
echo "No process found, cleaning up"
notify-send "󰑋 RECORD" "Failed: No process found, cleaning up"
rm "$PID_FILE"
fi
else
choice=$(printf "%s\n" "''\${!recordOptions[@]}" | rofi -i -dmenu -config ~/.config/rofi/config.rasi -p "Which mode")
if [[ -z "$choice" ]]; then
exit 1
fi
mkdir -p "$OUTPUT_DIR"
${pkgs.wf-recorder}/bin/wf-recorder -y \
-g "$(''\${recordOptions[$choice]})" \
--audio="$SINK_DEV" \
-f "$FILENAME" &
echo $! > "$PID_FILE"
echo "Started recording: $FILENAME"
fi
'';
in
record

View file

@ -0,0 +1,9 @@
{ pkgs, config }:
let
mkWall = import ./mkWall.nix { inherit pkgs config; };
rofiWall = pkgs.writeShellScript "rofiWall" ''
url=$(rofi -i -dmenu -config ~/.config/rofi/config.rasi -p "URL")
${mkWall}/bin/setWall "$url"
'';
in
rofiWall

View file

@ -1,12 +1,17 @@
{
mainMod,
config,
nvidia-offload-enabled,
lib,
pkgs,
rofiWall,
monitors ? [ ],
}:
with builtins;
let
inherit (lib) optionalString;
notransTag = "notrans";
firefox = "firefox";
prefix = if nvidia-offload-enabled then "nvidia-offload" else "";
browser = "${prefix} ${firefox}";
@ -26,6 +31,10 @@ let
fi
'';
rofiWall = import ../../scripts/rofiwall.nix { inherit config pkgs; };
rbwSelector = import ../../scripts/rbwSelector.nix { inherit pkgs; };
scrollStep =
let
monitorsNum = length monitors;
@ -47,6 +56,12 @@ in
''${mainMod}, S, togglesplit, # dwindle''
''CTRL ${mainMod} SHIFT, L, exec, hyprlock''
# Toggle transparent
''${mainMod}, n, tagwindow, ${notransTag}''
# Bitwarden Selector
(optionalString config.programs.rbw.enable ''CTRL ${mainMod}, P, exec, ${rbwSelector}'')
# Screenshot
''${mainMod} SHIFT, s, exec, hyprshot -m region ${clipboardOnly}''
''CTRL SHIFT, s, exec, hyprshot -m window ${clipboardOnly}''

View file

@ -1,10 +1,16 @@
let
inherit (builtins) map concatLists;
top = "60";
right = "100%-w-10";
notransTag = "notrans";
noTransList = [
"title:(.*)( - YouTube Mozilla Firefox)"
"title:(.*)( - Mozilla Firefox)"
];
in
{
windowrule = [
"pseudo, class:fcitx"
"pseudo, class:(org.fcitx.)"
"float, class:file_progress"
"float, class:confirm"
"float, class:dialog"
@ -21,10 +27,7 @@ in
"fullscreen, title:wlogout"
"float, title:wlogout"
"fullscreen, title:wlogout"
"idleinhibit stayfocused, class:mpv"
];
windowrulev2 = [
"float, title:^(Media viewer)$"
"float, title:^(File Operation Progress)$"
"float, class:^(it.mijorus.smile)"
@ -67,7 +70,7 @@ in
# Airplay
"pin, class: ^(GStreamer)$"
"float, class: ^(GStreamer)$"
"opacity 1.0, class: ^(GStreamer)$"
"opacity 1.0 override 1.0 override, class: ^(GStreamer)$"
"animation slide right 20%, class: ^(GStreamer)$"
# Bluetooth
@ -94,7 +97,24 @@ in
# Davinci resolve
"center 1, initialClass: ^(resolve), floating: 1"
];
# Disable Tansparent for youtube video
"opacity 1.0 override 1.0 override, title:(.*)( - YouTube Mozilla Firefox)"
"noblur, title:(.*)( - YouTube Mozilla Firefox)"
"opacity 1.0 override 1.0 override, title:(.*)( - Mozilla Firefox)"
"noblur, title:(.*)( - YouTube Mozilla Firefox)"
# Disable Tansparent
"opacity 1.0 override 1.0 override, tag:${notransTag}"
"noblur, tag: ^(${notransTag})$"
]
++ (concatLists (
map (w: [
"opacity 1.0 override 1.0 override, ${w}"
"noblur, ${w}"
]) noTransList
));
layerrule = [
"blur, waybar"

View file

@ -7,7 +7,6 @@
inputs,
config,
system,
username,
osConfig,
...
}:
@ -28,54 +27,12 @@ let
song_info=$(playerctl metadata --format '{{title}} 󰎆 {{artist}}')
echo "$song_info"
'';
mkWall = pkgs.writeShellScriptBin "setWall" ''
url="$1"
filepath="/tmp/wall_cache/$(echo -n "$url" | base64 | tr -d '\n')"
if [[ ! -f "$filepath" ]]; then
curl -sL "$url" -o "$filepath"
fi
${config.services.swww.package}/bin/swww img "$filepath" \
--transition-fps 45 \
--transition-duration 1 \
--transition-type random
'';
rofiWall = pkgs.writeShellScript "rofiWall" ''
url=$(rofi -i -dmenu -config ~/.config/rofi/config.rasi -p "URL")
${mkWall}/bin/setWall "$url"
'';
# Change Wallpaper
wallRand = pkgs.writeShellScript "wallRand" ''
mapfile -t wallpapers < <(find /tmp/wall_cache -type f)
count="''${#wallpapers[@]}"
random_index=$(( RANDOM % count ))
selected="''${wallpapers[$random_index]}"
if [ ! -f "$selected" ]; then
echo "File not exist: $selected"
exit 1
fi
${config.services.swww.package}/bin/swww img $selected --transition-fps 45 --transition-duration 1 --transition-type random
'';
in
{
# For wallpapers
systemd.user.tmpfiles.rules = [
"d /tmp/wall_cache 700 ${username} -"
];
home.packages = with pkgs; [
mpvpaper # Video Wallpaper
hyprcursor
libnotify
mkWall
];
wayland.windowManager.hyprland = {
@ -106,7 +63,8 @@ in
mainMod
pkgs
monitors
rofiWall
config
lib
;
nvidia-offload-enabled = osConfig.hardware.nvidia.prime.offload.enableOffloadCmd;
};
@ -181,7 +139,7 @@ in
package = inputs.swww.packages.${system}.swww;
};
# === hyprpaper === #
# === hyprpaper (Disabled) === #
services.hyprpaper = {
enable = false;
settings = {
@ -384,33 +342,6 @@ in
};
};
# === waybar === #
systemd.user.services.waybar = {
Unit = {
PartOf = [ "graphical-session.target" ];
After = [ "graphical-session.target" ];
};
};
programs.waybar = {
enable = true;
style = ../../home/config/waybar/style.css;
settings = import ../../home/config/waybar/config.nix {
inherit
terminal
osConfig
wallRand
rofiWall
pkgs
lib
;
};
systemd = {
enable = true;
target = "graphical-session.target";
};
};
# === swaync === #
services.swaync = {
enable = true;

424
home/user/waybar.nix Normal file
View file

@ -0,0 +1,424 @@
{
settings ? [ ],
}:
{
osConfig,
config,
username,
pkgs,
...
}:
let
mkWall = import ../scripts/mkWall.nix { inherit config pkgs; };
rofiWall = import ../scripts/rofiwall.nix { inherit config pkgs; };
# Change Wallpaper
wallRand = pkgs.writeShellScript "wallRand" ''
mapfile -t wallpapers < <(find /tmp/wall_cache -type f)
count="''${#wallpapers[@]}"
random_index=$(( RANDOM % count ))
selected="''${wallpapers[$random_index]}"
if [ ! -f "$selected" ]; then
echo "File not exist: $selected"
exit 1
fi
${config.services.swww.package}/bin/swww img $selected --transition-fps 45 --transition-duration 1 --transition-type random
'';
rbwSelector = import ../scripts/rbwSelector.nix { inherit pkgs; };
toggleRecord = pkgs.callPackage ../scripts/record.nix { };
in
{
home.packages = [
mkWall
];
# For wallpapers
systemd.user.tmpfiles.rules = [
"d /tmp/wall_cache 700 ${username} -"
];
# === waybar === #
systemd.user.services.waybar = {
Unit = {
PartOf = [ "graphical-session.target" ];
After = [ "graphical-session.target" ];
};
};
programs.waybar = {
enable = true;
style = ../../home/config/waybar/style.css;
settings =
let
commonConfig = {
layer = "top";
exclusive = true;
passthrough = false;
position = "top";
fixed-center = true;
ipc = true;
margin-top = 0;
margin-left = 0;
margin-right = 0;
margin-bottom = 0;
modules-center = [
"hyprland/window"
];
};
modulesConfig =
let
terminalRun = "${config.programs.ghostty.package}/bin/ghostty -e";
in
{
"hyprland/workspaces" = {
active-only = false;
all-outputs = true;
format = "{icon}";
show-special = false;
on-click = "activate";
on-scroll-up = "hyprctl dispatch workspace e+1";
on-scroll-down = "hyprctl dispatch workspace e-1";
persistent-workspaces = {
"1" = [ ];
"2" = [ ];
"3" = [ ];
"4" = [ ];
};
format-icons = {
active = "";
default = "";
};
};
clock = {
format = "<b>󰥔 {:%H:%M 󰃭 %d/%m}</b>";
tooltip-format = "{:%A %d %B %Y}";
};
actions = {
on-click-right = "mode";
on-click-forward = "tz_up";
on-click-backward = "tz_down";
on-scroll-up = "shift_up";
on-scroll-down = "shift_down";
};
"custom/os" = {
format = "󱄅";
on-click = "wlogout --protocol layer-shell";
};
cpu = {
format = " {usage}%";
max-length = 20;
interval = 5;
on-click-right = "${terminalRun} btop";
};
"hyprland/window" = {
format = "{}";
max-length = 40;
separate-outputs = true;
offscreen-css = true;
offscreen-css-text = "(inactive)";
rewrite = {
"nvim . (.*)" = " $1";
"(.*) - Visual Studio Code" = " $1";
"\\(\\d+\\) Discord (.*)" = " $1";
# Firefox
"(.*) - YouTube Mozilla Firefox" = " $1";
"(.*)\\.pdf Mozilla Firefox" = " $1";
"(.*) Mozilla Firefox" = " $1";
"(.*) - YouTube Music Mozilla Firefox" = "󰎆 $1";
# Firefox Nightly
"(.*) - YouTube Firefox Nightly" = " $1";
"(.*)\\.pdf Firefox Nightly" = " $1";
"(.*) Firefox Nightly" = " $1";
"(.*) - YouTube Music Firefox Nightly" = "󰎆 $1";
# Zen
"(.*) - YouTube Zen Browser" = " $1";
"(.*) - YouTube Music Zen Browser" = "󰎆 $1";
"(.*) Zen Browser" = " $1";
"(.*) - VLC media player" = " $1";
};
};
memory = {
interval = 30;
format = " {used:0.1f}GB/{total:0.1f}G";
format-alt-click = "click";
tooltip = true;
tooltip-format = "{used:0.1f}GB/{total:0.1f}G";
on-click-right = "${terminalRun} btop";
};
mpris = {
interval = 10;
format = " {status_icon} <i>{title} | {artist} </i>";
format-paused = " {status_icon} <i>{title} | {artist} </i>";
on-click = "playerctl play-pause";
on-click-right = "playerctl next";
scroll-step = 5.0;
smooth-scrolling-threshold = 1;
status-icons = {
paused = "󰐎";
playing = "󰎇";
stopped = "";
};
max-length = 30;
};
pulseaudio = {
format = "{icon} {volume}%";
format-bluetooth = "󰂰 {volume}%";
format-muted = " Muted";
format-icons = {
default = [
""
""
" "
" "
];
ignored-sinks = [
"Easy Effects Sink"
];
};
scroll-step = 5.0;
on-click = "pavucontrol -t 3";
tooltip-format = "{icon} {desc} | {volume}%";
smooth-scrolling-threshold = 1;
};
temperature = {
interval = 10;
tooltip = true;
hwmon-path = [
"/sys/class/hwmon/hwmon1/temp1_input"
"/sys/class/thermal/thermal_zone0/temp"
];
critical-threshold = 82;
format-critical = " {temperatureC}°C";
format = "{icon} {temperatureC}°C";
format-icons = [
""
""
""
""
];
on-click-right = "kitty -c ~/.config/kitty/kitty.conf --title btop sh -c 'btop'";
};
"custom/swaync" = {
tooltip = true;
format = "{icon}";
format-icons = {
notification = "󱅫";
none = "󰂚";
dnd-notification = "󱏧<span foreground='red'><sup></sup></span>";
dnd-none = "󱏧";
inhibited-notification = "󰂚<span foreground='red'><sup></sup></span>";
inhibited-none = "󰂚";
dnd-inhibited-notification = "<span foreground='red'><sup></sup></span>";
dnd-inhibited-none = "󱏧";
};
return-type = "json";
exec-if = "which swaync-client";
exec = "swaync-client -swb";
on-click = "sleep 0.1 && swaync-client -t -sw";
on-click-right = "swaync-client -d -sw";
escape = true;
};
"wlr/taskbar" = {
format = " {icon} ";
icon-size = 20;
all-outputs = false;
tooltip-format = "{title}";
on-click = "activate";
on-click-middle = "close";
ignore-list = [
"rofi"
"firefox"
"firefox-nightly"
"zen"
"kitty"
"jetbrains-studio"
"Brave-browser"
"Spotify"
"nemo"
"vlc"
"com.mitchellh.ghostty"
"code"
".virt-manager-wrapped"
"virt-manager"
];
};
"custom/cava" = {
exec = "~/.config/scripts/waybarCava.sh";
format = "{}";
on-click = "${terminalRun} cava";
};
battery =
let
fullAt = if osConfig.services.tlp.enable then 80 else 96;
in
{
full-at = fullAt;
states = {
good = fullAt;
warning = 30;
critical = 15;
};
format = "{icon} {capacity}%";
format-icons = [
"󰂎"
"󰁺"
"󰁻"
"󰁼"
"󰁽"
"󰁾"
"󰁿"
"󰂀"
"󰂁"
"󰂂"
"󰁹"
];
format-charging = "󰂄 {capacity}%";
format-plugged = "󰂄 {capacity}%";
format-alt = "{icon} {time}";
};
network = {
format = "{ifname}";
format-wifi = "󰤨";
format-ethernet = "󰈀";
format-disconnected = "󰤭";
tooltip-format = "{ifname} via {gwaddr} 󰊗";
tooltip-format-wifi = "󰤢 {essid}: {signalStrength}%";
tooltip-format-ethernet = "{ifname} via {gwaddr} 󰊗";
tooltip-format-disconnected = "Disconnected";
max-length = 50;
interval = 5;
on-click = "~/.config/scripts/rofiWifi.sh";
};
idle_inhibitor = {
format = "{icon}";
format-icons = {
activated = "󰅶";
deactivated = "󰾫";
};
};
"custom/wireguard" = {
format = "{icon}";
format-icons = {
connected = "󰒘";
disconnected = "";
};
exec = "~/.config/scripts/wgStatus.sh";
exec-if = "which wg-quick";
on-click = "~/.config/scripts/wgStatus.sh toggle";
tooltip = true;
interval = 3;
return-type = "json";
escape = true;
};
"custom/gamemode" = {
format = "{icon}";
format-icons = {
active = "󰊗";
inactive = "󰺷";
};
exec = "~/.config/scripts/gamemodeStatus.sh";
on-click = "~/.config/scripts/gamemodeStatus.sh toggle";
tooltip = true;
interval = 3;
return-type = "json";
escape = true;
};
"custom/wallRand" = {
format = "";
on-click = "${rofiWall}";
on-click-right = "${wallRand}";
};
"custom/airplay" =
let
toggleScript = pkgs.writeShellScript "airplayStatus" ''
SERVICE="uxplay"
ICON="󱖑"
if [ "$1" = "toggle" ]; then
if systemctl --user is-active --quiet "$SERVICE"; then
systemctl --user stop "$SERVICE"
notify-send "$ICON Airplay" "off" >/dev/null 2>&1
else
systemctl --user start "$SERVICE"
notify-send "$ICON Airplay" "on" >/dev/null 2>&1
fi
exit 0
fi
if ! systemctl --user is-active --quiet "$SERVICE"; then
echo "{\"text\": \"inactive\", \"tooltip\": \"airplay is inactive\", \"alt\": \"inactive\", \"class\": \"inactive\"}"
exit 0
fi
echo "{\"text\": \"active\", \"tooltip\": \"airplay is running\", \"alt\": \"active\", \"class\": \"active\"}"
exit 0
'';
in
{
format = "{icon}";
format-icons = {
active = "󱖑";
inactive = "";
};
exec = toggleScript;
interval = 3;
tooltip = true;
return-type = "json";
escape = true;
on-click = "${toggleScript} toggle";
};
"custom/bitwarden" = {
format = "󰯄";
on-click = "${rbwSelector}";
};
"custom/recording" = {
exec = "[ -f \"/tmp/wf-recorder.pid\" ] && echo \"󰑋\" || echo \"\" ";
interval = 1;
on-click = "${toggleRecord}";
};
};
otherConfig = {
modules-left = [
"custom/os"
"hyprland/workspaces"
"clock"
"mpris"
"custom/cava"
];
modules-right = [
"wlr/taskbar"
"temperature"
"custom/recording"
"idle_inhibitor"
"network"
"cpu"
"memory"
"pulseaudio"
"battery"
"custom/swaync"
];
};
finalList = if ((builtins.length settings) == 0) then [ otherConfig ] else settings;
in
map (dev: dev // modulesConfig // commonConfig) finalList;
systemd = {
enable = true;
target = "graphical-session.target";
};
};
}