nixcfg/homeManagerModules/services/waybar/default.nix

405 lines
12 KiB
Nix
Raw Normal View History

2024-04-07 22:16:33 -04:00
{
config,
lib,
pkgs,
2024-04-07 22:16:33 -04:00
...
}: let
cfg = config.ar.home;
in {
config = lib.mkIf cfg.services.waybar.enable {
programs.waybar = {
enable = true;
settings = {
mainBar = {
height = 36;
layer = "top";
output = ["*"];
position = "bottom";
modules-left =
["group/tablet"]
++ lib.optionals (cfg.desktop.hyprland.enable)
["hyprland/submap"]
++ lib.optionals (cfg.desktop.sway.enable)
["sway/scratchpad" "sway/mode"];
modules-center =
lib.optionals (cfg.desktop.hyprland.enable)
["hyprland/workspaces"]
++ lib.optionals (cfg.desktop.sway.enable)
["sway/workspaces"];
2024-07-10 23:43:51 -04:00
modules-right = [
"tray"
"group/hardware"
"clock"
"group/session"
];
2024-07-10 23:43:51 -04:00
"hyprland/workspaces" = {
2024-08-08 16:37:46 -04:00
all-outputs = true;
format = "{icon} {name}";
2024-08-08 16:37:46 -04:00
format-icons = {
active = "󰪥";
default = "󰝥";
urgent = "";
};
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
sort-by = "id";
};
2024-07-10 23:43:51 -04:00
"hyprland/submap" = {
2024-08-08 16:37:46 -04:00
on-click = ''${lib.getExe'
config.wayland.windowManager.hyprland.package "hyprctl"} dispatch submap reset'';
};
2024-07-10 23:43:51 -04:00
"sway/workspaces" = {
2024-08-08 16:37:46 -04:00
all-outputs = true;
format = "{icon} {name}";
2024-08-08 16:37:46 -04:00
format-icons = {
default = "󰝥";
focused = "󰪥";
urgent = "";
};
2024-08-08 16:37:46 -04:00
sort-by = "id";
};
2024-07-10 23:43:51 -04:00
"sway/mode" = {
2024-08-08 16:37:46 -04:00
on-click = ''${lib.getExe' config.wayland.windowManager.sway.package "swaymsg"} mode default'';
};
2024-07-10 23:43:51 -04:00
"sway/scratchpad" = {
2024-08-08 16:37:46 -04:00
format = "{icon} {count}";
format-icons = ["" ""];
on-click = "${lib.getExe' config.wayland.windowManager.sway.package "swaymsg"} scratchpad show";
2024-08-08 16:37:46 -04:00
show-empty = false;
tooltip = true;
tooltip-format = "{app}: {title}";
};
2024-07-10 23:43:51 -04:00
"custom/app-close" = {
2024-08-08 16:37:46 -04:00
on-click = ''${lib.getExe'
config.wayland.windowManager.hyprland.package "hyprctl"} dispatch killactive || ${lib.getExe' config.wayland.windowManager.sway.package "swaymsg"} kill'';
2024-08-08 16:37:46 -04:00
format = "󰅗";
tooltip-format = "Close the focused window.";
};
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
clock = {
format = "{:%I:%M%p}";
interval = 60;
tooltip-format = "{:%Y-%m-%d | %H:%M}";
};
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
battery = let
2024-08-03 17:13:47 -04:00
checkBattery = pkgs.writeShellScript "check-battery" ''
if [ -d /sys/class/power_supply/BAT0 ]; then
BAT=/sys/class/power_supply/BAT0
elif [ -d /sys/class/power_supply/BAT1 ]; then
BAT=/sys/class/power_supply/BAT1
else
echo "No battery found."
exit 1
fi
2024-08-03 17:13:47 -04:00
CRIT=''${1:-10}
NOTIFY=${lib.getExe' pkgs.libnotify "notify-send"}
stat=$(${lib.getExe' pkgs.coreutils "cat"} $BAT/status)
perc=$(${lib.getExe' pkgs.coreutils "cat"} $BAT/capacity)
2024-08-03 17:13:47 -04:00
if [[ $perc -le $CRIT ]] && [[ $stat == "Discharging" ]]; then
$NOTIFY --urgency=critical --icon=dialog-error "Battery Critical" "Current charge: $perc%".
2024-08-03 17:13:47 -04:00
fi
'';
in {
2024-08-08 16:37:46 -04:00
format = "{icon}";
format-icons = ["󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹"];
2024-08-08 16:37:46 -04:00
on-update = "${checkBattery}";
tooltip-format = ''
{capacity}%: {timeTo}.
Draw: {power} watts.'';
2024-08-08 16:37:46 -04:00
states = {critical = 20;};
};
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
idle_inhibitor = {
format = "{icon}";
2024-07-29 21:59:53 -04:00
2024-08-08 16:37:46 -04:00
format-icons = {
activated = "󰅶";
deactivated = "󰾪";
};
2024-07-29 21:59:53 -04:00
2024-08-08 16:37:46 -04:00
timeout = 45;
2024-07-29 21:59:53 -04:00
2024-08-08 16:37:46 -04:00
tooltip-format-activated = ''
Presentation mode enabled.
2024-07-29 21:59:53 -04:00
System will not sleep.'';
2024-08-08 16:37:46 -04:00
tooltip-format-deactivated = ''
Presentation mode disabled.
2024-07-29 21:59:53 -04:00
System will sleep normally.'';
};
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
bluetooth = {
format = "";
format-connected = " {num_connections}";
format-disabled = ""; # an empty format will hide the module
on-clic = lib.getExe' pkgs.blueberry "blueberry";
tooltip-format = "{controller_alias} {controller_address}";
2024-08-08 16:37:46 -04:00
tooltip-format-connected = ''
{controller_alias} {controller_address}
2024-03-28 19:52:15 -04:00
{device_enumerate}'';
2024-08-08 16:37:46 -04:00
tooltip-format-enumerate-connected = "{device_alias} {device_address}";
};
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
pulseaudio = {
format = "{icon}";
format-bluetooth = "{volume}% {icon}󰂯";
format-muted = "";
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
format-icons = {
headphones = "󰋋";
handsfree = "󰋎";
headset = "󰋎";
default = ["" "" ""];
};
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
ignored-sinks = ["Easy Effects Sink"];
on-click = "${lib.getExe pkgs.pavucontrol} -t 3";
scroll-step = 5;
};
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
network = {
format-disabled = "󰀝";
format-disconnected = "󰀦";
format-ethernet = "󰈀";
format-icons = ["󰤟" "󰤢" "󰤥" "󰤨"];
format-wifi = "{icon}";
on-click = "${lib.getExe pkgs.networkmanager_dmenu} -i";
tooltip-format = "{ifname} via {gwaddr} 󰊗";
tooltip-format-disconnected = "Disconnected";
tooltip-format-ethernet = "{ifname} ";
tooltip-format-wifi = "{essid} ({signalStrength}%) {icon}";
};
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
tray = {spacing = 15;};
2024-07-10 23:43:51 -04:00
"custom/dnd" = let
mako-dnd = pkgs.writeShellScript "mako-dnd" ''
show() {
MAKO_MODE=$(${lib.getExe' pkgs.mako "makoctl"} mode)
2024-08-07 18:20:37 -04:00
if ${lib.getExe' pkgs.coreutils "echo"} "$MAKO_MODE" | ${lib.getExe' pkgs.gnugrep "grep"} -q "do-not-disturb"; then
${lib.getExe' pkgs.coreutils "printf"} '{"text": "󰂛", "class": "on", "tooltip": "Notifications snoozed."}\n'
else
2024-08-07 18:20:37 -04:00
${lib.getExe' pkgs.coreutils "printf"} '{"text": "󰂚", "class": "off","tooltip": "Notifications enabled."}\n'
fi
}
toggle() {
${lib.getExe' pkgs.mako "makoctl"} mode -t do-not-disturb
${lib.getExe' pkgs.procps "pkill"} -SIGRTMIN+2 .waybar-wrapped
}
[ $# -gt 0 ] && toggle || show
'';
in {
2024-08-08 16:37:46 -04:00
exec = "${mako-dnd}";
interval = "once";
on-click = "${mako-dnd} toggle";
return-type = "json";
signal = 2;
};
"custom/logout" = {
2024-08-08 16:37:46 -04:00
format = "󰤆";
on-click = ''${lib.getExe config.programs.rofi.package} -i -show power-menu -modi "power-menu:${lib.getExe pkgs.rofi-power-menu} --choices=logout/lockscreen/suspend/shutdown/reboot"'';
tooltip-format = "Manage your session.";
};
2024-07-10 23:43:51 -04:00
"custom/menu" = {
2024-08-08 16:37:46 -04:00
format = "󰀻";
on-click = "${lib.getExe pkgs.nwg-drawer}";
2024-08-08 16:37:46 -04:00
tooltip-format = "Touch-friendly application menu.";
};
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
power-profiles-daemon = {
format = "{icon}";
2024-07-10 23:43:51 -04:00
2024-08-08 16:37:46 -04:00
format-icons = {
balanced = "󰗑";
default = "󰗑";
2024-08-08 16:37:46 -04:00
performance = "󱐌";
power-saver = "󰌪";
};
2024-08-08 16:37:46 -04:00
tooltip-format = ''
Profile: {profile}
Driver: {driver}'';
2024-08-08 16:37:46 -04:00
tooltip = true;
2024-03-28 19:52:15 -04:00
};
2024-07-10 23:43:51 -04:00
"group/tablet" = {
modules =
["custom/menu"]
++ lib.optional (cfg.desktop.hyprland.tabletMode.enable)
"custom/app-close";
orientation = "horizontal";
};
"group/hardware" = {
modules =
["pulseaudio" "bluetooth" "network"]
++ lib.optionals (cfg.laptopMode)
["power-profiles-daemon" "battery"];
orientation = "horizontal";
};
"group/session" = {
modules = ["custom/dnd" "idle_inhibitor" "custom/logout"];
orientation = "horizontal";
};
2024-03-28 19:52:15 -04:00
};
};
style = lib.mkAfter ''
${
lib.optionalString (config.stylix.polarity == "light") "
tooltip {
background: alpha(@base05, ${builtins.toString config.stylix.opacity.desktop});
color: ${config.lib.stylix.colors.withHashtag.base00};
}"
}
tooltip {
border-radius: ${toString cfg.theme.borders.radius}px;
}
#battery,
#bluetooth,
#clock,
#custom-dnd,
#custom-app-close,
#custom-logout,
#custom-menu,
#idle_inhibitor,
#mode,
#network,
#power-profiles-daemon,
#pulseaudio,
#submap,
#tray,
#wireplumber {
margin: 0px 5px;
padding: 0px 5px;
}
#clock,
#tablet,
#hardware,
#mode,
#scratchpad,
#session,
#submap,
#tray,
#workspaces {
margin: 0px 5px;
padding: 0px 2.5px;
}
#workspaces button {
border-radius: 0px;
}
#workspaces button.active,
#workspaces button.focused {
color: ${config.lib.stylix.colors.withHashtag.base0D};
}
#battery.charging,
#power-profiles-daemon.power-saver {
color: ${config.lib.stylix.colors.withHashtag.base0B};
}
#battery.critical:not(.charging),
#custom-dnd.on,
#idle_inhibitor.activated,
#network.disabled,
#network.disconnected,
#power-profiles-daemon.performance,
#pulseaudio.muted {
color: ${config.lib.stylix.colors.withHashtag.base08};
}
#submap,
#mode {
background-color: ${config.lib.stylix.colors.withHashtag.base08};
border-radius: ${toString cfg.theme.borders.radius}px;
color: ${config.lib.stylix.colors.withHashtag.base00};
font-weight: bold;
}
2024-08-08 16:37:46 -04:00
'';
systemd.enable = true;
};
systemd.user.services.waybar = {
Install.WantedBy = lib.mkForce (lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target");
Service.Restart = lib.mkForce "no";
Unit.BindsTo = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target";
2024-03-28 19:52:15 -04:00
};
xdg.configFile."nwg-drawer/drawer.css".text = ''
window {
background-color: alpha (${config.lib.stylix.colors.withHashtag.base00}, ${toString config.stylix.opacity.popups});
color: ${config.lib.stylix.colors.withHashtag.base05}
}
/* search entry */
entry {
background-color: rgba (0, 0, 0, 0.2);
border: alpha(${config.lib.stylix.colors.withHashtag.base07}, ${toString config.stylix.opacity.popups});
2024-08-15 18:31:07 -04:00
border-radius: ${toString cfg.theme.borders.radius}px
}
button, image {
background: none;
border: none;
2024-08-15 18:31:07 -04:00
border-radius: ${toString cfg.theme.borders.radius}px
}
button:active, button:hover, button:focused {
background-color: alpha (${config.lib.stylix.colors.withHashtag.base05}, 0.2);
border: none;
2024-08-15 18:31:07 -04:00
border-radius: ${toString cfg.theme.borders.radius}px;
color: ${config.lib.stylix.colors.withHashtag.base0D}
}
#category-button {
margin: 0 10px 0 10px;
2024-08-15 18:31:07 -04:00
border-radius: ${toString cfg.theme.borders.radius}px
}
#pinned-box {
padding-bottom: 5px;
border-bottom: 1px dotted gray
}
#files-box {
padding: 5px;
border: 1px dotted gray;
2024-08-15 18:31:07 -04:00
border-radius: ${toString cfg.theme.borders.radius}px
}
'';
2024-03-28 19:52:15 -04:00
};
}