nix-dotfiles/hm_modules/polybar.nix
2023-01-19 20:01:19 +01:00

362 lines
11 KiB
Nix

{ config, pkgs, lib, ... }:
with lib;
let
inherit (pkgs.rice) colorPalette opacity;
grep = "${pkgs.gnugrep}/bin/grep";
cut = "${pkgs.coreutils}/bin/cut";
head = "${pkgs.coreutils}/bin/head";
pavucontrol = "${pkgs.pavucontrol}/bin/pavucontrol";
pgrep = "${pkgs.procps}/bin/pgrep";
pkill = "${pkgs.procps}/bin/pkill";
playerCtl = "${pkgs.playerctl}/bin/playerctl";
dunstctl = "${pkgs.dunst}/bin/dunstctl";
notificationStatus = pkgs.writeShellScript "notificationStatus" ''
PATH=$PATH:"${lib.makeBinPath [ pkgs.dbus ]}"
if [[ `${dunstctl} is-paused` == "true" ]]; then echo ; else echo ; fi
'';
notificationToggle = pkgs.writeShellScript "notificationToggle" ''
PATH=$PATH:"${lib.makeBinPath [ pkgs.dbus ]}"
${dunstctl} set-paused toggle
'';
notificationHistory = pkgs.writeShellScript "notificationToggle" ''
PATH=$PATH:"${lib.makeBinPath [ pkgs.dbus ]}"
${dunstctl} set-paused false
for i in {1..10}; do ${dunstctl} history-pop; done
'';
playerStatus =
"${playerCtl} -f '{{emoji(status)}} {{title}} - {{artist}}' metadata | ${head} -c 50";
confirm_command = { cmd, title ? null, text ? null, image ? null }:
lib.concatStringsSep " " [
"${pkgs.yad}/bin/yad --question --center --on-top --sticky --timeout=30 --timeout-indicator=bottom"
(if title == null then "" else ''--title "${title}"'')
(if image == null then "" else ''--image "${image}"'')
(if text == null then "" else ''--text "${text}"'')
"&& ${cmd}"
];
systemctl = "${pkgs.systemd}/bin/systemctl";
loginctl = "${pkgs.systemd}/bin/loginctl";
shutdown = "${pkgs.systemd}/bin/shutdown";
logout = pkgs.writeShellScript "logout" ''
session=`${loginctl} session-status | ${pkgs.coreutils}/bin/head -n 1 | ${pkgs.gawk}/bin/awk '{print $1}'`
${loginctl} terminate-session $session
'';
colors = with pkgs.lib.nix-rice;
let alpha = 255 * opacity;
in palette.toARGBHex rec {
normal = {
foreground = color.darken 10 colorPalette.foreground;
background = color.setAlphaRgba alpha colorPalette.background;
underline = colorPalette.normal.blue;
};
active = {
inherit (colorPalette) foreground;
background = color.setAlphaRgba alpha colorPalette.background;
underline = colorPalette.normal.yellow;
};
selected = {
inherit (colorPalette) foreground;
background = color.setAlphaRgba alpha colorPalette.background;
underline = colorPalette.bright.red;
};
inherit (colorPalette.normal) green red yellow;
inherit (color) transparent;
orange = colorPalette.bright.red;
alert = orange;
};
commonBar = {
locale = config.home.language.base;
monitor = "\${env:MONITOR}";
width = "100%";
height = 20;
radius = 6.0;
fixed-center = false;
inherit (colors.normal) background foreground;
line-size = 2;
line-color = colors.normal.underline;
padding = 0;
module.margin = 0;
separator = " ";
border = {
color = colors.transparent;
left.size = 2;
righ.sizet = 2;
top.size = 2;
bottom.size = 0;
};
font = [
"${pkgs.rice.font.monospace.name}:size=${
toString pkgs.rice.font.monospace.size
};2"
# "Font Awesome 6 Free:size=14;0"
# "Noto Color Emoji:size=2;2"
"Noto Sans Symbols2:size=${toString pkgs.rice.font.monospace.size};2"
"Material Design Icons:size=${toString pkgs.rice.font.monospace.size};2"
# "EmojiOne Color:size=${toString pkgs.rice.font.monospace.size};0"
"Noto Sans CJK JP:size=${toString pkgs.rice.font.monospace.size};0"
"Noto Sans CJK KR:size=${toString pkgs.rice.font.monospace.size};0"
"Noto Sans CJK CN:size=${toString pkgs.rice.font.monospace.size};0"
"Noto Sans CJK HK:size=${toString pkgs.rice.font.monospace.size};0"
];
enable-ipc = true;
wm-restack = "bspwm";
};
ramp = [ "" "" "" "" "" "" ];
in {
home.packages = with pkgs; [
pkgs.rice.font.monospace.package
# emojione
# noto-fonts-emoji
noto-fonts
material-design-icons
# font-awesome
noto-fonts-cjk-sans
];
services.polybar = {
enable = true;
package = pkgs.polybarFull;
script = ''
monitor=`polybar -m | ${grep} primary | ${cut} -d":" -f1`
MONITOR=$monitor polybar primary &
monitors=(`polybar -m | ${grep} -v primary | ${cut} -d":" -f1`)
for monitor in "''${monitors[@]}"; do
MONITOR=$monitor polybar secondary &
done
'';
settings = {
"settings" = { screenchange-reload = false; };
"bar/primary" = recursiveUpdate commonBar {
modules-left = "bspwm";
# modules-center =
modules-right =
"player pulseaudio temperature cpu memory battery notifications powermenu date";
tray = {
position = "right";
padding = 1;
};
};
"bar/secondary" = recursiveUpdate commonBar {
modules-left = "bspwm";
# modules-center =
modules-right =
"player pulseaudio temperature cpu memory battery notifications powermenu date";
};
"module/battery" = {
type = "internal/battery";
adapter = "AC";
battery = "BAT0";
full.at = 98;
animation = {
charging = {
text = [ "" "" "" "" "" "" "" "" "" "" ];
framerate = "750";
};
discharging = {
text = [ "" "" "" "" "" "" "" "" "" "" ];
framerate = "750";
};
};
format = {
charging = recursiveUpdate colors.selected {
text = "<animation-charging> <label-charging>";
};
discharging = recursiveUpdate colors.active {
text = "<animation-discharging> <label-discharging>";
};
full = recursiveUpdate colors.normal { text = " <label-full>"; };
};
label.text = "%percentage%%";
# = {
# chargin = "%percentage%%";
# dischargin = "%percentage%%";
# full = "%percentage%%";
# };
};
"module/bspwm" = {
type = "internal/bspwm";
format = "<label-state>";
label = let
common = {
padding = 1;
# separator = " ";
text = "%name%";
};
in {
focused = recursiveUpdate common colors.selected;
occupied = recursiveUpdate common colors.active;
urgent = recursiveUpdate (recursiveUpdate common colors.active) {
background = colors.alert;
};
empty = recursiveUpdate common colors.normal;
};
};
"module/cpu" = {
type = "internal/cpu";
format = recursiveUpdate colors.normal { text = " <label>"; };
interval = 2;
label = "%percentage-sum%%";
ramp-load = ramp;
};
"module/date" = {
type = "internal/date";
date = {
alt = "%Y-%m-%d";
text = "%a %d/%m/%y";
};
interval = "1";
label = "%date% %time%";
time = {
alt = "%H:%M:%S";
text = "%H:%M";
};
format = colors.normal;
};
"module/memory" = {
type = "internal/memory";
format = recursiveUpdate colors.normal { text = " <label>"; };
interval = 2;
label = "%percentage_used%%";
ramp-used = ramp;
};
"module/pulseaudio" = {
interval = 2;
bar.volume = {
empty = { text = ""; };
fill = { text = ""; };
indicator = { text = "|"; };
width = "10";
foreground = [
colors.green
colors.green
colors.green
colors.green
colors.green
colors.yellow
colors.orange
colors.red
];
};
click.right =
"${pgrep} pavucontrol && ${pkill} pavucontrol || ${pavucontrol}";
format = {
padding = 1;
muted = colors.active;
volume = recursiveUpdate colors.normal {
text = "<ramp-volume> <label-volume>";
};
};
label.muted.text = " muted";
label.volume.text = "%percentage%%";
ramp.volume = [ "" "奔" "" ];
type = "internal/pulseaudio";
};
"module/temperature" = {
format = recursiveUpdate colors.normal {
text = "<ramp> <label>";
warn = {
text = "<ramp> <label-warn>";
underline = colors.alert;
};
};
hwmon.path =
"/sys/devices/platform/coretemp.0/hwmon/hwmon5/temp1_input";
label = {
text = "%temperature-c%";
warn = "%temperature-c%";
};
ramp.text = [ "" "" "" "" "" ];
thermal.zone = "0";
type = "internal/temperature";
warn.temperature = "90";
};
"module/powermenu" = {
type = "custom/menu";
expand.right = true;
format.spacing = 1;
label = {
open = recursiveUpdate colors.normal { text = ""; };
close = recursiveUpdate colors.normal { text = ""; };
};
menu = [[
{
text = "";
exec = confirm_command {
cmd = logout;
title = "Logout";
text = "Do you want to logout?";
};
}
{
text = "";
exec = confirm_command {
cmd = "${systemctl} reboot";
title = "Reboot";
text = "Do you want to reboot?";
};
}
{
text = "";
exec = confirm_command {
cmd = "${systemctl} hibernate";
title = "Hibernate";
text = "Do you want to hibernate?";
};
}
{
text = "";
exec = confirm_command {
cmd = "${shutdown} now";
title = "Shutdown";
text = "Do you want to shutdown?";
};
}
]];
};
"module/notifications" = {
type = "custom/script";
format = recursiveUpdate colors.normal { padding = 0; };
exec = "${notificationStatus}";
click.left = "${notificationToggle}";
click.right = "${notificationHistory}";
interval = 0.5;
# tail = 1;
};
"module/player" = {
type = "custom/script";
format = recursiveUpdate colors.normal { padding = 0; };
exec = playerStatus;
click.left = "${playerCtl} play-pause";
scroll = {
up = "${playerCtl} previous";
down = "${playerCtl} next";
};
interval = 1;
};
};
};
}