380 lines
12 KiB
Nix
380 lines
12 KiB
Nix
{ config, pkgs, lib, ... }:
|
|
with lib;
|
|
let
|
|
inherit (pkgs.rice) colorPalette opacity;
|
|
grep = "${pkgs.gnugrep}/bin/grep";
|
|
cut = "${pkgs.coreutils}/bin/cut";
|
|
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";
|
|
zscroll = "${pkgs.zscroll}/bin/zscroll";
|
|
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
|
|
'';
|
|
keyboardStatus = pkgs.writeShellScript "keyboardStatus" ''
|
|
PATH=$PATH:"${lib.makeBinPath [ pkgs.coreutils ]}"
|
|
if [[ `cat ~/.local/share/keyboard-switch.state` == "disabled" ]]; then echo ; else echo ; fi
|
|
'';
|
|
keyboardToggle = pkgs.writeShellScript "keyboardToggle" ''
|
|
PATH=$PATH:"${lib.makeBinPath [ pkgs.keyboard-switch ]}"
|
|
keyboard-switch
|
|
'';
|
|
notificationHistory = pkgs.writeShellScript "notificationToggle" ''
|
|
PATH=$PATH:"${lib.makeBinPath [ pkgs.dbus ]}"
|
|
${dunstctl} set-paused false
|
|
for i in {1..10}; do ${dunstctl} history-pop; done
|
|
'';
|
|
playerStatusBasic = pkgs.writeShellScript "playerStatusBasic" ''
|
|
${playerCtl} status || true
|
|
'';
|
|
playerStatusSrc = pkgs.writeShellScript "playerStatusSrc" ''
|
|
${playerCtl} -f '{{title}} - {{artist}}' metadata || true
|
|
'';
|
|
playerStatus = pkgs.writeShellScript "playerStatus" ''
|
|
${zscroll} -l 25 -M ${playerStatusBasic} \
|
|
-m "Playing" "-b '▶ ' -s 1" \
|
|
-m "Paused" "-b '⏸ ' -s 0" \
|
|
-u true ${playerStatusSrc} &
|
|
wait
|
|
'';
|
|
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 = builtins.attrValues {
|
|
inherit (pkgs) noto-fonts material-design-icons noto-fonts-cjk-sans;
|
|
# emojione
|
|
# noto-fonts-emoji
|
|
# font-awesome
|
|
inherit (pkgs.rice.font.monospace) package;
|
|
};
|
|
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 keyboard-switch 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 keyboard-switch 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";
|
|
format = colors.normal;
|
|
date = { alt = "%Y-%m-%d"; text = "%a %d/%m/%y"; };
|
|
interval = "1";
|
|
label = "%date% %time%";
|
|
time = { alt = "%H:%M:%S"; text = "%H:%M"; };
|
|
};
|
|
|
|
"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/keyboard-switch" = {
|
|
type = "custom/script";
|
|
format = recursiveUpdate colors.normal { padding = 0; };
|
|
exec = "${keyboardStatus}";
|
|
click.left = "${keyboardToggle}";
|
|
interval = 1;
|
|
# tail = 1;
|
|
};
|
|
"module/player" = {
|
|
type = "custom/script";
|
|
format = colors.normal;
|
|
exec = playerStatus;
|
|
tail = true;
|
|
click.left = "${playerCtl} play-pause";
|
|
clicl.right = "${playerCtl} stop";
|
|
scroll = {
|
|
up = "${playerCtl} previous";
|
|
down = "${playerCtl} next";
|
|
};
|
|
};
|
|
"module/player-prev" = {
|
|
type = "custom/script";
|
|
format = colors.normal;
|
|
exec = "echo ";
|
|
click.left = "${playerCtl} previous";
|
|
};
|
|
"module/player-next" = {
|
|
type = "custom/script";
|
|
format = colors.normal;
|
|
exec = "echo ";
|
|
click.left = "${playerCtl} next";
|
|
};
|
|
"module/player-play-pause" = {
|
|
type = "custom/script";
|
|
format = colors.normal;
|
|
exec = "echo ";
|
|
click.left = "${playerCtl} play-pause";
|
|
};
|
|
};
|
|
};
|
|
}
|