{
pkgs,
isNixOS,
...
}:
{
programs.waybar = {
enable = true;
package =
if isNixOS then pkgs.waybar else (pkgs.writeShellScriptBin "waybar" "exec /usr/bin/waybar \"$@\"");
settings = {
mainBar = {
layer = "top";
position = "right";
spacing = 4;
margin-top = 10;
margin-bottom = 10;
margin-left = 8;
margin-right = 8;
mode = "dock";
reload_style_on_change = true;
width = 70;
output = [
"DP-1"
"eDP-1"
"LVDS-1"
];
modules-left = [
"clock"
"custom/notifications"
"privacy"
"custom/spotify"
"pulseaudio"
];
modules-center = [
"hyprland/workspaces"
];
modules-right = [
"battery"
"tray"
];
"hyprland/workspaces" = {
format = "{} - {icon}";
on-click = "activate";
on-click-right = "close";
all-outputs = true;
active-only = false;
sort-by-number = true;
format-icons = {
"1" = "";
"2" = "";
"3" = "";
"4" = "";
"5" = "";
"6" = "";
"7" = "";
"8" = "";
"9" = "";
"10" = "";
default = "";
};
};
tray = {
spacing = 10;
};
clock = {
format = "{:%R}";
format-alt = "{:%d.%m.%Y}";
tooltip-format = "{:%Y %B}\n{calendar}";
calendar = {
mode = "year";
mode-mon-col = 3;
weeks-pos = "right";
on-scroll = 1;
format = {
months = "{}";
days = "{}";
weeks = "W{}";
weekdays = "{}";
today = "{}";
};
actions = {
on-click-right = "mode";
on-scroll-up = "tz_up";
on-scroll-down = "tz_down";
};
};
};
network = {
format-wifi = " ({signalStrength}%) ";
format-ethernet = "";
tooltip-format = "{ifname} via {gwaddr} with {ipaddr}/{cidr} ";
format-linked = "{ifname} (No IP) ";
format-disconnected = "Disconnected ⚠";
on-click = "kitty nmtui";
};
pulseaudio = {
format = "{volume}% {icon}";
format-bluetooth = "{volume}% {icon} {format_source}";
format-bluetooth-muted = " {icon} {format_source}";
format-muted = " ";
format-source = " {volume}% ";
format-source-muted = " ";
format-icons = {
headphone = "";
hands-free = " ";
headset = " ";
phone = " ";
portable = " ";
car = " ";
default = [
""
""
""
];
};
on-click = "pavucontrol -t 3";
on-click-right = "pactl set-sink-mute @DEFAULT_SINK@ toggle";
};
"custom/spotify" = {
format = "{}";
return-type = "json";
on-click = "playerctl play-pause --player spotify";
on-click-right = "killall spotify";
on-scroll-up = "playerctl next --player spotify";
on-scroll-down = "playerctl previous --player spotify";
restart-interval = 0;
hide-empty-text = true;
justify = "center";
max-length = 40;
exec =
let
playerctl = "${pkgs.playerctl}/bin/playerctl";
jq = "${pkgs.jq}/bin/jq";
pkill = "${pkgs.procps}/bin/pkill";
mediaPlayerScript = pkgs.writeShellScript "mediaplayer" ''
if [ -z "$1" ]; then
echo "Użycie: $0 "
exit 1
fi
player="$1"
${playerctl} -p "$player" metadata --format "{{status}} {{artist}} - {{title}}" --follow | while read -r line; do
current_status=$(${playerctl} --player="$player" status 2>/dev/null)
case "$current_status" in
"Playing")
icon=""
;;
"Paused")
icon=""
;;
*)
icon=""
;;
esac
tooltip=$(${playerctl} --player="$player" metadata --format "{{artist}} - {{title}}" 2>/dev/null)
${jq} -nc --arg text "$icon" --arg tooltip "$tooltip" \
'{"text": $text, "tooltip": $tooltip}'
if [[ -n "$icon" ]]; then
${pkill} -SIGRTMIN+1 waybar
fi
done
'';
in
"${mediaPlayerScript} spotify";
};
"custom/notifications" = {
format = "{text}";
on-click-right = "~/.local/bin/check-do-not-disturb.sh change";
exec = "~/.local/bin/check-do-not-disturb.sh show";
exec-on-event = "~/.local/bin/check-do-not-disturb.sh show";
tooltip = false;
return-type = "text";
signal = 2;
};
};
};
style =
#css
''
/* Global styles */
* {
transition: 0.2s all ease-in-out;
font-size: 14px;
font-family: inherit;
padding: 3px;
margin: 1px 2px;
color: @text;
border-radius: 12px;
}
*:hover {
text-shadow: none;
}
/* Window */
window#waybar {
background-color: @base;
border-radius: 15px;
}
/* Workspaces */
#workspaces button {
padding: 2px;
margin: 1px;
background: transparent;
color: @lavender;
box-shadow: inset 0 1.5px;
}
#workspaces button:hover {
background-color: @surface1;
box-shadow: inset 2px 5px;
}
#workspaces button.active {
background-color: @surface0;
box-shadow: inset 1px 4px 0 1px;
}
#workspaces button.urgent {
background-color: @red;
animation-name: blink;
animation-duration: 1s;
animation-timing-function: steps(12);
animation-iteration-count: infinite;
animation-direction: alternate;
}
/* Clock */
#clock {
font-style: oblique;
opacity: 1;
}
/* Modules */
.modules-left,
.modules-right,
.modules-center {
background-color: @crust;
}
/* Tray */
#tray>.needs-attention {
background-color: @red;
}
/* Custom */
#custom-spotify:hover {
background-color: @green;
}
#network:hover {
background-color: @sky;
}
#custom-notifications:hover {
background-color: @sapphire;
}
/* Battery */
#battery {
background-color: @base;
}
#battery.warning:not(.charging) {
background: @yellow;
color: @foreground;
animation-name: blink;
animation-duration: 1s;
animation-timing-function: steps(12);
animation-iteration-count: infinite;
animation-direction: alternate;
}
#battery.charging,
#battery.plugged {
color: @foreground;
background-color: @green;
}
#battery.critical:not(.charging) {
background-color: @red;
color: @foreground;
animation-name: blink;
animation-duration: 1s;
animation-timing-function: steps(12);
animation-iteration-count: infinite;
animation-direction: alternate;
}
@keyframes blink {
to {
background-color: #ff0000;
color: #000000;
}
}
'';
};
}