1
1
Fork 0

Compare commits

..

No commits in common. "cf486d773590fc51323a3898e2a250767bbbc138" and "4a3bb40314da08bfad58f348334cdcb9365a6d50" have entirely different histories.

21 changed files with 468 additions and 574 deletions

View file

@ -8,13 +8,7 @@ with lib; let
in { in {
options.custom.desktops = { options.custom.desktops = {
enable = mkOption {default = config.custom.minimal;}; enable = mkOption {default = config.custom.minimal;};
desktop = mkOption {default = "niri";};
desktop = mkOption {
default =
if config.custom.full
then "niri"
else "gnome";
};
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {

View file

@ -1,6 +1,7 @@
{ {
config, config,
lib, lib,
pkgs,
... ...
}: }:
with lib; let with lib; let
@ -9,23 +10,22 @@ in {
options.custom.desktops.gnome = { options.custom.desktops.gnome = {
enable = mkOption {default = false;}; enable = mkOption {default = false;};
gdm = mkOption {default = true;}; gdm = mkOption {default = true;};
minimal = mkOption {default = false;};
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
# https://wiki.nixos.org/wiki/GNOME
# FIXME: xdg-desktop-portal-[gnome|gtk] not working through steam # FIXME: xdg-desktop-portal-[gnome|gtk] not working through steam
services = { services = {
xserver = mkIf (!cfg.minimal) { xserver = {
enable = true; enable = true;
desktopManager.gnome.enable = true; desktopManager.gnome.enable = true;
displayManager.gdm.enable = cfg.gdm; displayManager.gdm.enable = cfg.gdm;
}; };
gnome = { gnome.gnome-browser-connector.enable = true; # Install extensions from browser
core-os-services.enable = mkIf cfg.minimal true;
gnome-browser-connector.enable = !cfg.minimal;
};
}; };
# Remove default packages
# https://wiki.nixos.org/wiki/GNOME#Excluding_GNOME_Applications
environment.gnome.excludePackages = [pkgs.gnome-shell-extensions];
}; };
} }

View file

@ -10,20 +10,13 @@ in {
options.custom.desktops.hyprland.enable = mkOption {default = false;}; options.custom.desktops.hyprland.enable = mkOption {default = false;};
config = mkIf cfg.enable { config = mkIf cfg.enable {
custom.desktops = mkIf config.custom.full { custom.desktops.hyprland = mkIf config.custom.full {
hyprland = {
binds.enable = true; binds.enable = true;
plugins.enable = true; plugins.enable = true;
rules.enable = true; rules.enable = true;
settings.enable = true; settings.enable = true;
}; };
gnome = {
enable = true;
minimal = true;
};
};
# https://github.com/hyprwm/Hyprland # https://github.com/hyprwm/Hyprland
programs.hyprland.enable = true; programs.hyprland.enable = true;

View file

@ -158,7 +158,7 @@ in {
merge = field: expr: rules: merge = field: expr: rules:
map ( map (
rule: rule:
if isAttrs field if builtins.isAttrs field
then "${rule}, ${lib.concatStringsSep ", " (lib.mapAttrsToList (f: e: format f e) field)}" then "${rule}, ${lib.concatStringsSep ", " (lib.mapAttrsToList (f: e: format f e) field)}"
else "${rule}, ${format field expr}" else "${rule}, ${format field expr}"
) )

View file

@ -15,8 +15,7 @@ in {
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
custom.desktops = mkIf config.custom.full { custom.desktops.niri = mkIf config.custom.full {
niri = {
binds.enable = true; binds.enable = true;
input.enable = true; input.enable = true;
layout.enable = true; layout.enable = true;
@ -24,12 +23,6 @@ in {
rules.enable = true; rules.enable = true;
}; };
gnome = {
enable = true;
minimal = true;
};
};
# https://github.com/YaLTeR/niri # https://github.com/YaLTeR/niri
# https://github.com/sodiboo/niri-flake # https://github.com/sodiboo/niri-flake
# https://github.com/sodiboo/niri-flake/blob/main/docs.md # https://github.com/sodiboo/niri-flake/blob/main/docs.md

View file

@ -25,7 +25,7 @@ in {
click-method = "clickfinger"; # Multi-finger click click-method = "clickfinger"; # Multi-finger click
dwt = true; # Disable while typing dwt = true; # Disable while typing
dwtp = true; # Disable while trackpointing dwtp = true; # Disable while trackpointing
scroll-factor = 0.4; scroll-factor = 0.5;
}; };
# BUG: Applies to trackball device, switch to "flat" when per-device configuration is supported # BUG: Applies to trackball device, switch to "flat" when per-device configuration is supported
@ -33,7 +33,7 @@ in {
mouse = { mouse = {
accel-profile = "adaptive"; accel-profile = "adaptive";
accel-speed = -0.2; accel-speed = -0.1;
}; };
trackball = { trackball = {

View file

@ -5,12 +5,8 @@
... ...
}: }:
with lib; let with lib; let
_1password = "${config.programs._1password-gui.package}/bin/1password";
audio = config.home-manager.users.${config.custom.username}.home.file.".local/bin/audio".source;
niri = "${config.programs.niri.package}/bin/niri"; niri = "${config.programs.niri.package}/bin/niri";
rm = "${pkgs.coreutils}/bin/rm";
sway-audio-idle-inhibit = "${pkgs.sway-audio-idle-inhibit}/bin/sway-audio-idle-inhibit"; sway-audio-idle-inhibit = "${pkgs.sway-audio-idle-inhibit}/bin/sway-audio-idle-inhibit";
wallpaper = "${config.home-manager.users.${config.custom.username}.home.file.".local/bin/wallpaper".source}";
cfg = config.custom.desktops.niri.misc; cfg = config.custom.desktops.niri.misc;
in { in {
@ -23,19 +19,8 @@ in {
programs.niri.settings = { programs.niri.settings = {
# https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous # https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous
# https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#spawn-at-startup spawn-at-startup = [
# https://github.com/YaLTeR/niri/wiki/Configuration:-Key-Bindings#actions
spawn-at-startup = let
home = config.home-manager.users.${config.custom.username}.home.homeDirectory;
in
[
{command = [_1password "--silent"];} # Launch password manager in background
{command = [audio "--init"];} # Enforce audio profile state
{command = [rm "${home}/.cache/walker/clipboard.gob"];} # Clear clipboard history
{command = [sway-audio-idle-inhibit];} # Inhibit while audio is playing {command = [sway-audio-idle-inhibit];} # Inhibit while audio is playing
]
++ optionals config.custom.wallpaper [
{command = [wallpaper];}
]; ];
# HACK: Inherit home-manager environment variables in lieu of upstream fix # HACK: Inherit home-manager environment variables in lieu of upstream fix
@ -45,18 +30,12 @@ in {
mapAttrs (name: value: toString value) mapAttrs (name: value: toString value)
config.home-manager.users.${config.custom.username}.home.sessionVariables; config.home-manager.users.${config.custom.username}.home.sessionVariables;
# https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#cursor cursor = {
cursor = with config.home-manager.users.${config.custom.username}.home.pointerCursor; {
inherit size;
hide-after-inactive-ms = 1000 * 15; # Milliseconds hide-after-inactive-ms = 1000 * 15; # Milliseconds
hide-when-typing = true; hide-when-typing = true;
theme = name;
}; };
# https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#hotkey-overlay
hotkey-overlay.skip-at-startup = true; hotkey-overlay.skip-at-startup = true;
# https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#prefer-no-csd
prefer-no-csd = true; prefer-no-csd = true;
# https://github.com/YaLTeR/niri/wiki/Configuration:-Switch-Events # https://github.com/YaLTeR/niri/wiki/Configuration:-Switch-Events

View file

@ -9,8 +9,7 @@ in {
options.custom.desktops.sway.enable = mkOption {default = false;}; options.custom.desktops.sway.enable = mkOption {default = false;};
config = mkIf cfg.enable { config = mkIf cfg.enable {
custom.desktops = mkIf config.custom.full { custom.desktops.sway = mkIf config.custom.full {
sway = {
binds.enable = true; binds.enable = true;
input.enable = true; input.enable = true;
output.enable = true; output.enable = true;
@ -19,12 +18,6 @@ in {
swayfx.enable = true; swayfx.enable = true;
}; };
gnome = {
enable = true;
minimal = true;
};
};
# https://wiki.nixos.org/wiki/Sway # https://wiki.nixos.org/wiki/Sway
# https://wiki.archlinux.org/title/Sway # https://wiki.archlinux.org/title/Sway
# https://github.com/swaywm/sway # https://github.com/swaywm/sway

View file

@ -43,10 +43,10 @@ with lib; {
(mkIf config.custom.full { (mkIf config.custom.full {
_1password.enable = true; _1password.enable = true;
adb.enable = true; adb.enable = true;
#// ags.enable = true; ags.enable = true;
#// anyrun.enable = true; #// anyrun.enable = true;
#// bitwarden-menu.enable = true; #// bitwarden-menu.enable = true;
#// clipse.enable = true; clipse.enable = true;
discord.enable = true; discord.enable = true;
element-desktop.enable = true; element-desktop.enable = true;
#// fuzzel.enable = true; #// fuzzel.enable = true;
@ -67,13 +67,13 @@ with lib; {
obs-studio.enable = true; obs-studio.enable = true;
onlyoffice.enable = true; onlyoffice.enable = true;
#// onedrive.enable = true; #// onedrive.enable = true;
#// path-of-building.enable = true; path-of-building.enable = true;
#// rbw.enable = true; rbw.enable = true;
remmina.enable = true; remmina.enable = true;
#// rofi-rbw.enable = true; rofi-rbw.enable = true;
#// rofi.enable = true; rofi.enable = true;
seahorse.enable = true; seahorse.enable = true;
#// slurp.enable = true; slurp.enable = true;
steam.enable = true; steam.enable = true;
#// swaylock.enable = true; #// swaylock.enable = true;
#// thunderbird.enable = true; #// thunderbird.enable = true;
@ -82,7 +82,7 @@ with lib; {
walker.enable = true; walker.enable = true;
waybar.enable = true; waybar.enable = true;
wireshark.enable = true; wireshark.enable = true;
#// wofi.enable = true; wofi.enable = true;
#// wpaperd.enable = true; #// wpaperd.enable = true;
}) })
]; ];

View file

@ -17,7 +17,7 @@ in {
font = { font = {
name = config.custom.font.monospace; name = config.custom.font.monospace;
size = 13; size = 14;
}; };
# https://sw.kovidgoyal.net/kitty/conf/ # https://sw.kovidgoyal.net/kitty/conf/
@ -33,7 +33,7 @@ in {
scrollback_lines = -1; scrollback_lines = -1;
strip_trailing_spaces = "smart"; strip_trailing_spaces = "smart";
tab_bar_style = "powerline"; tab_bar_style = "powerline";
touch_scroll_multiplier = 5; touch_scroll_multiplier = 3;
url_style = "straight"; url_style = "straight";
wayland_enable_ime = "no"; wayland_enable_ime = "no";
window_padding_width = "2.5 5"; # top/bottom left/right window_padding_width = "2.5 5"; # top/bottom left/right

View file

@ -41,7 +41,7 @@ in {
# https://starship.rs/config/#prompt # https://starship.rs/config/#prompt
add_newline = false; add_newline = false;
format = concatStrings [ format = concatStringsSep "" [
# Top left # Top left
"$shell" "$shell"
"$all" "$all"
@ -59,19 +59,9 @@ in {
"$character" "$character"
]; ];
# https://starship.rs/advanced-config/#enable-right-prompt
right_format = concatStrings [
# Bottom right
];
# https://starship.rs/config/#battery # https://starship.rs/config/#battery
battery = { battery = {
format = " [$symbol]($style)"; format = " [$symbol]($style)";
charging_symbol = "󰂄";
discharging_symbol = "󰂃";
empty_symbol = "󰂎";
full_symbol = "󰁹";
unknown_symbol = "󰂑";
display = [ display = [
{ {
@ -214,7 +204,7 @@ in {
style = "bold #657b83"; style = "bold #657b83";
# https://docs.rs/chrono/latest/chrono/format/strftime/index.html # https://docs.rs/chrono/latest/chrono/format/strftime/index.html
time_format = "%a %b %-d %-I:%M%P"; time_format = "%a %b %-d %I:%M%P";
}; };
# https://starship.rs/config/#username # https://starship.rs/config/#username

View file

@ -122,7 +122,7 @@ in {
src = "${pkgs.writeShellApplication { src = "${pkgs.writeShellApplication {
name = "search"; name = "search";
text = readFile ./search.sh; text = builtins.readFile ./search.sh;
runtimeInputs = with pkgs; [ runtimeInputs = with pkgs; [
coreutils coreutils
@ -145,7 +145,7 @@ in {
font: larger ${config.custom.font.monospace}; font: larger ${config.custom.font.monospace};
} }
${readFile ./style.css} ${builtins.readFile ./style.css}
''; '';
#!! Inherit from default layout #!! Inherit from default layout

View file

@ -7,41 +7,39 @@
}: }:
with lib; let with lib; let
audio = config.home-manager.users.${config.custom.username}.home.file.".local/bin/audio".source; audio = config.home-manager.users.${config.custom.username}.home.file.".local/bin/audio".source;
bash = "${pkgs.bash}/bin/bash";
blueberry = "${pkgs.blueberry}/bin/blueberry"; blueberry = "${pkgs.blueberry}/bin/blueberry";
bluetoothctl = "${pkgs.bluez}/bin/bluetoothctl"; bluetoothctl = "${pkgs.bluez}/bin/bluetoothctl";
cat = "${pkgs.coreutils}/bin/cat"; cat = "${pkgs.coreutils}/bin/cat";
date = "${pkgs.coreutils}/bin/date";
easyeffects = "${pkgs.easyeffects}/bin/easyeffects"; easyeffects = "${pkgs.easyeffects}/bin/easyeffects";
echo = "${pkgs.coreutils}/bin/echo"; echo = "${pkgs.coreutils}/bin/echo";
gnome-calendar = "${pkgs.gnome-calendar}/bin/gnome-calendar"; grep = "${pkgs.gnugrep}/bin/grep";
gnome-clocks = "${pkgs.gnome-clocks}/bin/gnome-clocks"; hyprctl = "${config.programs.hyprland.package}/bin/hyprctl";
gnome-weather = "${pkgs.gnome-weather}/bin/gnome-weather";
inhibit = config.home-manager.users.${config.custom.username}.home.file.".local/bin/inhibit".source; inhibit = config.home-manager.users.${config.custom.username}.home.file.".local/bin/inhibit".source;
jq = "${pkgs.jq}/bin/jq"; jq = "${pkgs.jq}/bin/jq";
loginctl = "${pkgs.systemd}/bin/loginctl"; loginctl = "${pkgs.systemd}/bin/loginctl";
network = config.home-manager.users.${config.custom.username}.home.file.".local/bin/network".source; network = config.home-manager.users.${config.custom.username}.home.file.".local/bin/network".source;
niri = "${config.programs.niri.package}/bin/niri";
nm-connection-editor = "${pkgs.networkmanagerapplet}/bin/nm-connection-editor"; nm-connection-editor = "${pkgs.networkmanagerapplet}/bin/nm-connection-editor";
pgrep = "${pkgs.procps}/bin/pgrep"; pgrep = "${pkgs.procps}/bin/pgrep";
pwvucontrol = "${pkgs.pwvucontrol}/bin/pwvucontrol"; ping = "${pkgs.iputils}/bin/ping";
pkill = "${pkgs.procps}/bin/pkill";
playerctl = "${pkgs.playerctl}/bin/playerctl";
power = config.home-manager.users.${config.custom.username}.home.file.".local/bin/power".source;
remote = config.home-manager.users.${config.custom.username}.home.file.".local/bin/remote".source; remote = config.home-manager.users.${config.custom.username}.home.file.".local/bin/remote".source;
rfkill = "${pkgs.util-linux}/bin/rfkill"; rfkill = "${pkgs.util-linux}/bin/rfkill";
sleep = "${pkgs.coreutils}/bin/sleep";
swaync-client = "${config.home-manager.users.${config.custom.username}.services.swaync.package}/bin/swaync-client"; swaync-client = "${config.home-manager.users.${config.custom.username}.services.swaync.package}/bin/swaync-client";
swayosd-client = "${pkgs.swayosd}/bin/swayosd-client"; swayosd-client = "${pkgs.swayosd}/bin/swayosd-client";
systemctl = "${pkgs.systemd}/bin/systemctl"; systemctl = "${pkgs.systemd}/bin/systemctl";
systemd-inhibit = "${pkgs.systemd}/bin/systemd-inhibit";
tailscale = "${pkgs.tailscale}/bin/tailscale"; tailscale = "${pkgs.tailscale}/bin/tailscale";
tr = "${pkgs.coreutils}/bin/tr"; tr = "${pkgs.coreutils}/bin/tr";
virsh = "${pkgs.libvirt}/bin/virsh";
virt-manager = "${pkgs.virt-manager}/bin/virt-manager";
vpn = config.home-manager.users.${config.custom.username}.home.file.".local/bin/vpn".source; vpn = config.home-manager.users.${config.custom.username}.home.file.".local/bin/vpn".source;
wttrbar = "${pkgs.wttrbar}/bin/wttrbar"; wttrbar = "${pkgs.wttrbar}/bin/wttrbar";
cfg = config.custom.programs.waybar; cfg = config.custom.programs.waybar;
in { in {
options.custom.programs.waybar = { options.custom.programs.waybar.enable = mkOption {default = false;};
enable = mkOption {default = false;};
desktop = mkOption {default = config.custom.desktops.desktop;};
};
config = mkIf cfg.enable { config = mkIf cfg.enable {
age.secrets = let age.secrets = let
@ -54,96 +52,86 @@ in {
"desktop/vm/myndows.pass" = secret "desktop/vm/myndows.pass"; "desktop/vm/myndows.pass" = secret "desktop/vm/myndows.pass";
}; };
home-manager.sharedModules = [ home-manager.users.${config.custom.username} = {
{
# https://github.com/Alexays/Waybar # https://github.com/Alexays/Waybar
#!! Some settings need a restart to take effect # https://www.nerdfonts.com/cheat-sheet
#?? systemctl --user restart waybar
#?? pkill -SIGUSR2 -x waybar
programs.waybar = { programs.waybar = {
enable = true; enable = true;
systemd.enable = true; systemd.enable = true; # Start on login
# https://github.com/Alexays/Waybar/wiki/Styling # ?? waybar --log-level debug
#?? GTK_DEBUG=interactive waybar
style = let style = let
border = toString config.custom.border;
font = config.custom.font.monospace;
gap = toString config.custom.gap; gap = toString config.custom.gap;
in '' in ''
* { * {
border-radius: 50px; border-radius: 50px;
color: #93a1a1; color: #93a1a1;
font: 18px '${font}'; font: 18px '${config.custom.font.monospace}';
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
.horizontal > box { .horizontal > box {
border: ${border} solid #073642;
margin: 0 ${gap}px ${gap}px; margin: 0 ${gap}px ${gap}px;
} }
${readFile ./style.css} ${readFile ./style.css}
''; '';
### SETTINGS ###
# https://github.com/Alexays/Waybar/wiki/Configuration # https://github.com/Alexays/Waybar/wiki/Configuration
# https://docs.gtk.org/Pango/pango_markup.html#pango-markup # https://docs.gtk.org/Pango/pango_markup.html#pango-markup
# https://www.nerdfonts.com/cheat-sheet #?? pkill -SIGUSR2 -x waybar
settings = let settings = let
# Common module settings ## INHERIT ##
#!! Some settings are commonly available for use but not documented per module
common = {
# https://github.com/Alexays/Waybar/issues/1800
smooth-scrolling-threshold = 2;
on-scroll-down =
if cfg.desktop == "niri"
then "${niri} msg action focus-workspace-down"
else "";
on-scroll-up =
if cfg.desktop == "niri"
then "${niri} msg action focus-workspace-up"
else "";
};
#!! Module defaults are not accurate to documentation #!! Module defaults are not accurate to documentation
cava = # TODO: Submit pull request to fix in addition to inconsistent hyphen vs underscore
common # https://github.com/Alexays/Waybar/wiki/Module:-Cava
// { cava-config = {
autosens = 1; # Default: 1
bar_delimiter = 32; # ASCII code for space, default: 59 or ;
bars = 16; # Default: 2
cava_config = null; # Default: null? cava_config = null; # Default: null?
format-icons = ["" "" "" "" "" "" "" ""]; #!! Required framerate = 30; # Default: 30?
framerate = 30; # Default 30? autosens = 1; # Default: 1
hide_on_silence = true; # Default false # sensitivity = 0; # Default: 100?
higher_cutoff_freq = 10000; # Default 10000? bars = 16; # Default: 2
input_delay = 1; # Default 4 lower_cutoff_freq = 50; # Default: 50?
lower_cutoff_freq = 50; # Default 50? higher_cutoff_freq = 10000; # Default: 10000?
method = "pipewire"; # Default pulse sleep_timer = 5; # Default: 0
monstercat = true; # Default false? hide_on_silence = true; # Default: false
noise_reduction = 0.2; # Default 0.77? method = "pipewire"; # Default: pulse
source = "auto"; # Default: auto?
sample_rate = 44100; # Default: 44100?
sample_bits = 16; # Default: 16?
stereo = false; # Default: true
reverse = false; # Default: false
bar_delimiter = 32; # ASCII code for space, default: 59 or ;
monstercat = true; # Default: false?
waves = true; # Default: false?
noise_reduction = 0.2; # Default: 0.77?
input_delay = 1; # Default: 4
format-icons = [
""
""
""
""
""
""
""
""
]; # !! Required
on-click = easyeffects; on-click = easyeffects;
on-scroll-down = "${swayosd-client} --output-volume lower";
on-scroll-up = "${swayosd-client} --output-volume raise"; on-scroll-up = "${swayosd-client} --output-volume raise";
reverse = false; # Default false on-scroll-down = "${swayosd-client} --output-volume lower";
rotate = 180; rotate = 180;
sample_bits = 16; # Default 16?
sample_rate = 44100; # Default 44100?
#// sensitivity = 0; # Default 100?
sleep_timer = 5; # Default 0
source = "auto"; # Default auto?
stereo = false; # Default true
waves = true; # Default false?
}; };
in { in {
default = { status = {
reload_style_on_change = true; # Reload CSS when modified
## GLOBAL ##
layer = "top"; layer = "top";
position = "bottom"; position = "bottom";
reload_style_on_change = true;
## POSITION ##
modules-left = [ modules-left = [
"custom/power" "custom/power"
"custom/inhibitor" "custom/inhibitor"
@ -152,20 +140,11 @@ in {
(mkIf config.custom.desktops.hyprland.enable "hyprland/workspaces") (mkIf config.custom.desktops.hyprland.enable "hyprland/workspaces")
(mkIf config.custom.desktops.niri.enable "niri/workspaces") (mkIf config.custom.desktops.niri.enable "niri/workspaces")
]; ];
modules-center = [ modules-center = [
#// "cava#forward"
"clock#date" "clock#date"
"clock#time"
# BUG: Padding modifiers not currently supported, so use custom module
# https://github.com/Alexays/Waybar/issues/1469 et al.
#// "clock#time"
"custom/time"
"custom/weather" "custom/weather"
#// "cava#reverse"
]; ];
modules-right = [ modules-right = [
"mpris" "mpris"
"tray" "tray"
@ -177,71 +156,53 @@ in {
"battery" "battery"
]; ];
# https://github.com/Alexays/Waybar/wiki/Module:-Battery ## MODULES ##
battery = # https://github.com/Alexays/Waybar/wiki/Module:-Custom
common "custom/power" = {
// { format = "";
format = "{icon} {power:.0f}W"; on-click = "${systemctl} poweroff";
format-icons = ["󰂃" "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹"]; on-click-right = "${systemctl} reboot";
interval = 5; # Seconds on-click-middle = "${loginctl} terminate-session ''";
states = {
critical = 15; # Percent
warning = 30; # Percent
};
}; };
# https://github.com/Alexays/Waybar/wiki/Module:-Bluetooth "custom/inhibitor" = {
bluetooth = interval = 5;
common exec = "~/.config/waybar/scripts/inhibitor.sh";
// { on-click = inhibit;
format-connected = "󰂱";
format-disabled = "󰂲";
format-off = "󰂲";
format-on = "󰂯";
on-click = "${rfkill} toggle bluetooth";
on-click-middle = "${bluetoothctl} disconnect";
on-click-right = blueberry;
}; };
# https://github.com/Alexays/Waybar/wiki/Module:-Cava "custom/vm" = {
"cava#forward" = cava; interval = 5;
"cava#reverse" = cava // {reverse = true;}; exec = "~/.config/waybar/scripts/vm.sh";
on-click = ''${remote} --vm --client xfreerdp --username Myned --password "$(${cat} ${config.age.secrets."desktop/vm/myndows.pass".path})" ${
# https://github.com/Alexays/Waybar/wiki/Module:-Clock if config.custom.hidpi
# https://fmt.dev/latest/syntax/#chrono-format-specifications then "--scale 140"
"clock#date" = else ""
common } myndows'';
// {
format = "{:%a %b %d}";
tooltip-format = "{calendar}";
on-click-right = gnome-calendar;
calendar = {
format = {
months = "<span color='#eee8d5'>{}</span>";
weeks = "<span color='#eee8d5'>{}</span>";
weekdays = "<span color='#93a1a1'>{}</span>";
days = "<span color='#586e75'>{}</span>";
today = "<span color='#eee8d5'>{}</span>";
};
};
}; };
"clock#time" = "custom/vpn" = {
common interval = 5;
// { exec = "~/.config/waybar/scripts/vpn.sh";
format = "<span text_transform='lowercase'>{:%-I:%M%p}</span>"; on-click = "${vpn} mypi3";
on-click = "${swaync-client} --toggle-panel"; };
on-click-right = gnome-clocks;
# https://github.com/Alexays/Waybar/wiki/Module:-Idle-Inhibitor
# FIXME: Not currently usable
# https://github.com/Alexays/Waybar/issues/690
idle_inhibitor = {
format = "{icon}";
format-icons = {
activated = "󰅶";
deactivated = "󰾪";
};
}; };
# https://github.com/Alexays/Waybar/wiki/Module:-Hyprland # https://github.com/Alexays/Waybar/wiki/Module:-Hyprland
"hyprland/workspaces" = # https://www.nerdfonts.com/cheat-sheet
common "hyprland/workspaces" = {
// { show-special = true;
format = "{icon}"; format = "{icon}";
format-icons = { format-icons = {
android = ""; android = "";
dropdown = "󰞷"; dropdown = "󰞷";
@ -257,28 +218,11 @@ in {
vm = "󰢹"; vm = "󰢹";
wallpaper = "󰏩"; wallpaper = "󰏩";
}; };
show-special = true;
};
# https://github.com/Alexays/Waybar/wiki/Module:-Idle-Inhibitor
# BUG: Not currently compatible with other inhibit activations
# https://github.com/Alexays/Waybar/issues/690
idle_inhibitor =
common
// {
format = "{icon}";
format-icons = {
activated = "󰅶";
deactivated = "󰾪";
};
}; };
# https://github.com/Alexays/Waybar/wiki/Module:-Niri # https://github.com/Alexays/Waybar/wiki/Module:-Niri
"niri/workspaces" = # https://www.nerdfonts.com/cheat-sheet
common "niri/workspaces" = {
// {
format = "{icon}"; format = "{icon}";
format-icons = { format-icons = {
@ -286,52 +230,127 @@ in {
}; };
}; };
# https://github.com/Alexays/Waybar/wiki/Module:-MPRIS cava = cava-config;
mpris =
common # https://github.com/Alexays/Waybar/wiki/Module:-Clock
"clock#date" = {
format = "{:%a %b %d}";
tooltip-format = "{calendar}";
calendar.format = {
months = "<span color='#eee8d5'>{}</span>";
weeks = "<span color='#eee8d5'>{}</span>";
weekdays = "<span color='#93a1a1'>{}</span>";
days = "<span color='#586e75'>{}</span>";
today = "<span color='#eee8d5'>{}</span>";
};
};
"clock#time" = {
# https://fmt.dev/latest/syntax/#chrono-format-specifications
format = "<span text_transform='lowercase'>{:%I:%M%p}</span>";
on-click = "${swaync-client} --toggle-panel";
on-scroll-up = "${swayosd-client} --output-volume raise";
on-scroll-down = "${swayosd-client} --output-volume lower";
};
# https://github.com/bjesus/wttrbar
"custom/weather" = {
format = "{}°";
interval = 60 * 60;
return-type = "json";
exec = lib.strings.concatStringsSep " " [
"${wttrbar}"
"--ampm"
"--fahrenheit"
"--hide-conditions"
"--main-indicator temp_F"
];
};
"cava#reverse" =
cava-config
// { // {
reverse = true;
};
"custom/equalizer" = {
interval = 5;
on-click = audio;
exec = pkgs.writeShellScript "equalizer.sh" ''
${echo} 󰺢
${echo} "$(${cat} ~/.audio)"
${echo} "$(${cat} ~/.audio | ${tr} '[:upper:]' '[:lower:]')"
'';
};
# https://github.com/Alexays/Waybar/wiki/Module:-MPRIS
mpris = {
format = "{player_icon} {dynamic}"; format = "{player_icon} {dynamic}";
format-paused = "{status_icon} {dynamic}"; format-paused = "{status_icon} {dynamic}";
dynamic-len = 25; # Characters dynamic-len = 25;
dynamic-order = ["title" "artist"]; dynamic-order = [
"title"
"artist"
];
dynamic-separator = " 󰧟 "; dynamic-separator = " 󰧟 ";
player-icons.default = "󰎈"; player-icons.default = "󰎈";
status-icons.paused = ""; status-icons.paused = "";
on-click-middle = ""; # TODO: Close music player
# TODO: on-click focus currently playing window
#// on-click = "";
on-click-middle =
if cfg.desktop == "niri"
then ''${niri} msg action close-window --id "$(${niri} msg -j windows | ${jq} '.[] | select(.app_id == "YouTube Music").id')"''
else "";
on-scroll-down = "${swayosd-client} --output-volume lower";
on-scroll-up = "${swayosd-client} --output-volume raise"; on-scroll-up = "${swayosd-client} --output-volume raise";
on-scroll-down = "${swayosd-client} --output-volume lower";
};
# https://github.com/Alexays/Waybar/wiki/Module:-WirePlumber
wireplumber = {
format = "{icon} {volume}%";
format-muted = "󰸈";
format-icons = [
"󰕿"
"󰖀"
"󰕾"
];
on-click = easyeffects;
on-click-right = "${swayosd-client} --output-volume mute-toggle";
on-scroll-up = "${swayosd-client} --output-volume raise";
on-scroll-down = "${swayosd-client} --output-volume lower";
};
# https://github.com/Alexays/Waybar/wiki/Module:-Bluetooth
bluetooth = {
format-disabled = "󰂲";
format-off = "󰂲";
format-on = "󰂯";
format-connected = "󰂱";
on-click = blueberry;
on-click-right = "${bluetoothctl} disconnect";
on-click-middle = "${rfkill} toggle bluetooth"; # Toggle bluetooth on/off
}; };
# https://github.com/Alexays/Waybar/wiki/Module:-Network # https://github.com/Alexays/Waybar/wiki/Module:-Network
network = network = {
common
// {
format = "{icon}"; format = "{icon}";
format-icons = { format-icons = {
disabled = ""; disabled = "";
disconnected = ""; disconnected = "";
ethernet = "󰈀"; ethernet = "󰈀";
linked = ""; linked = "";
wifi = ["󰤯" "󰤟" "󰤢" "󰤥" "󰤨"]; wifi = [
"󰤯"
"󰤟"
"󰤢"
"󰤥"
"󰤨"
];
}; };
on-click = network; on-click = nm-connection-editor;
on-click-right = nm-connection-editor; on-click-right = network; # Toggle networking on/off
}; };
# https://github.com/Alexays/Waybar/wiki/Module:-PowerProfilesDaemon # https://github.com/Alexays/Waybar/wiki/Module:-PowerProfilesDaemon
power-profiles-daemon = power-profiles-daemon = {
common
// {
format = "{icon}"; format = "{icon}";
format-icons = { format-icons = {
@ -344,38 +363,48 @@ in {
tooltip = false; tooltip = false;
}; };
# https://github.com/Alexays/Waybar/wiki/Module:-WirePlumber # https://github.com/Alexays/Waybar/wiki/Module:-Battery
wireplumber = "battery" = {
common format = "{icon} {power:.0f}W";
// { interval = 5;
format = "{icon} {volume}%";
format-icons = ["󰕿" "󰖀" "󰕾"]; format-icons = [
format-muted = "󰸈"; "󰂃"
on-click = "${swayosd-client} --output-volume mute-toggle"; "󰁺"
on-click-right = pwvucontrol; "󰁻"
on-scroll-down = "${swayosd-client} --output-volume lower"; "󰁼"
on-scroll-up = "${swayosd-client} --output-volume raise"; "󰁽"
"󰁾"
"󰁿"
"󰂀"
"󰂁"
"󰂂"
"󰁹"
];
states = {
critical = 15;
warning = 30;
}; };
# https://github.com/Alexays/Waybar/wiki/Module:-Custom on-click = power;
"custom/equalizer" = };
common };
// { };
exec = pkgs.writeShellScript "equalizer.sh" ''
${echo} 󰺢
${echo} "$(${cat} ~/.audio)"
${echo} "$(${cat} ~/.audio | ${tr} '[:upper:]' '[:lower:]')"
'';
interval = 5; # Seconds
on-click = audio;
on-click-right = easyeffects;
}; };
"custom/inhibitor" = # TODO: Convert to writeShellApplication
common ### SCRIPTS ###
// { #?? text
exec = pkgs.writeShellScript "inhibitor.sh" '' #?? tooltip
#?? class
xdg.configFile = {
# Return inhibit idle status
"waybar/scripts/inhibitor.sh" = {
executable = true;
text = ''
#! /usr/bin/env ${bash}
if ${pgrep} systemd-inhibit &> /dev/null; then if ${pgrep} systemd-inhibit &> /dev/null; then
${echo} 󰅶 ${echo} 󰅶
${echo} Enabled ${echo} Enabled
@ -386,34 +415,15 @@ in {
${echo} disabled ${echo} disabled
fi fi
''; '';
interval = 5; # Seconds
on-click = inhibit;
}; };
"custom/power" = # Return tailscale status
common "waybar/scripts/vm.sh" = {
// { executable = true;
format = ""; text = ''
on-click = "${systemctl} poweroff"; #! /usr/bin/env ${bash}
on-click-middle = "${loginctl} terminate-session ${config.custom.username}";
on-click-right = "${systemctl} reboot";
};
"custom/time" = case "$(virsh domstate myndows)" in
common
// {
exec = "${date} '+%-I:%M%P'";
interval = 60; # Seconds
on-click = "${swaync-client} --toggle-panel";
on-click-right = gnome-clocks;
};
"custom/vm" =
common
// {
exec = pkgs.writeShellScript "vm.sh" ''
case "$(${virsh} domstate myndows)" in
'running') 'running')
${echo} ${echo}
${echo} Online ${echo} Online
@ -432,23 +442,14 @@ in {
${echo} unknown;; ${echo} unknown;;
esac esac
''; '';
interval = 5;
on-click = ''${remote} --vm --client xfreerdp --username Myned --password "$(${cat} ${config.age.secrets."desktop/vm/myndows.pass".path})" ${
if config.custom.hidpi
then "--scale 140"
else ""
} myndows'';
on-click-middle = "${virsh} shutdown myndows";
on-click-right = virt-manager;
}; };
"custom/vpn" = # Return tailscale status
common "waybar/scripts/vpn.sh" = {
// { executable = true;
exec = pkgs.writeShellScript "vpn.sh" '' text = ''
#! /usr/bin/env ${bash}
if [[ $(${tailscale} status --json | ${jq} .ExitNodeStatus.Online) == 'true' ]]; then if [[ $(${tailscale} status --json | ${jq} .ExitNodeStatus.Online) == 'true' ]]; then
${echo} 󰖂 ${echo} 󰖂
${echo} Connected ${echo} Connected
@ -459,32 +460,8 @@ in {
${echo} disconnected ${echo} disconnected
fi fi
''; '';
interval = 5; # Seconds
on-click = "${vpn} mypi3";
};
# https://github.com/bjesus/wttrbar
"custom/weather" =
common
// {
exec = lib.strings.concatStringsSep " " [
wttrbar
"--ampm"
"--fahrenheit"
"--hide-conditions"
"--main-indicator temp_F"
];
format = "{}°";
interval = 60 * 60; # Seconds
return-type = "json";
on-click-right = gnome-weather;
}; };
}; };
}; };
}; };
} }
];
};
}

View file

@ -42,6 +42,7 @@ tooltip label {
.horizontal > box { .horizontal > box {
background: #002b36; background: #002b36;
/* border: 2px #586e75 solid; */
padding: 4px; padding: 4px;
} }

View file

@ -26,7 +26,7 @@ in {
-- # TODO: Remove when using Wayland -- # TODO: Remove when using Wayland
config.font_size = ${toString (14 * config.custom.scale)} config.font_size = ${toString (14 * config.custom.scale)}
${readFile ./config.lua} ${builtins.readFile ./config.lua}
return config return config
''; '';

View file

@ -25,7 +25,7 @@ in {
#// excludeShellChecks = ["SC2154"]; # argc evaluates variables at runtime #// excludeShellChecks = ["SC2154"]; # argc evaluates variables at runtime
runtimeInputs = dependencies; runtimeInputs = dependencies;
text = readFile ./${name}.sh; text = builtins.readFile ./${name}.sh;
} }
+ "/bin/${name}"; + "/bin/${name}";
}; };
@ -38,7 +38,7 @@ in {
pkgs.writers.writePython3Bin name {libraries = dependencies;} pkgs.writers.writePython3Bin name {libraries = dependencies;}
# Disable linting # Disable linting
# https://flake8.pycqa.org/en/3.1.1/user/ignoring-errors.html#ignoring-entire-files # https://flake8.pycqa.org/en/3.1.1/user/ignoring-errors.html#ignoring-entire-files
("# flake8: noqa\n" + readFile ./${name}.py) ("# flake8: noqa\n" + builtins.readFile ./${name}.py)
+ "/bin/${name}"; + "/bin/${name}";
}; };
in in

View file

@ -12,51 +12,26 @@ in {
# https://github.com/ErikReider/SwayNotificationCenter # https://github.com/ErikReider/SwayNotificationCenter
services.swaync = { services.swaync = {
enable = true; enable = true;
style = ./style.css;
# https://github.com/ErikReider/SwayNotificationCenter/blob/main/data/style/style.scss
style = let
border = toString config.custom.border;
gap = toString config.custom.gap;
in ''
.control-center {
border: ${border} solid #073642;
margin: ${gap}px;
}
.notification.low {
border: ${border} solid #6c71c4;
}
.notification.normal {
border: ${border} solid #d33682;
}
.notification.critical {
border: ${border} solid #dc322f;
}
${readFile ./style.css}
'';
# https://github.com/ErikReider/SwayNotificationCenter/blob/main/src/configSchema.json # https://github.com/ErikReider/SwayNotificationCenter/blob/main/src/configSchema.json
settings = { settings = {
control-center-height = builtins.floor (config.custom.height / 2); control-center-width = 750 / config.custom.scale;
control-center-height = config.custom.height / 2;
control-center-positionY = "bottom"; control-center-positionY = "bottom";
control-center-width = builtins.floor (1000 / config.custom.scale);
fit-to-screen = false; fit-to-screen = false;
hide-on-clear = true; hide-on-clear = true;
notification-2fa-action = false; notification-2fa-action = false;
notification-icon-size = 32;
#// notification-inline-replies = true; #// notification-inline-replies = true;
notification-window-width = builtins.floor (750 / config.custom.scale);
positionX = "center"; positionX = "center";
positionY = "top"; positionY = "top";
timeout-low = 5;
timeout = 5; # normal timeout = 5; # normal
timeout-critical = 0; timeout-critical = 0;
timeout-low = 5;
widgets = [ widgets = [
"notifications" "notifications"
"backlight"
"inhibitors" "inhibitors"
"dnd" "dnd"
"title" "title"

View file

@ -5,6 +5,7 @@ https://github.com/ErikReider/SwayNotificationCenter/blob/main/data/style/style.
***/ ***/
@define-color cc-bg #002b36; @define-color cc-bg #002b36;
@define-color noti-border-color #073642; @define-color noti-border-color #073642;
@define-color noti-bg #002b36; @define-color noti-bg #002b36;
@define-color noti-bg-opaque #002b36; @define-color noti-bg-opaque #002b36;
@ -12,29 +13,24 @@ https://github.com/ErikReider/SwayNotificationCenter/blob/main/data/style/style.
@define-color noti-bg-hover #073642; @define-color noti-bg-hover #073642;
@define-color noti-bg-hover-opaque #073642; @define-color noti-bg-hover-opaque #073642;
@define-color noti-bg-focus #002b36; @define-color noti-bg-focus #002b36;
@define-color text-color #93a1a1; @define-color text-color #93a1a1;
@define-color text-color-disabled #586e75; @define-color text-color-disabled #586e75;
.control-center { .notification.low {
padding: 16px; border: 2px solid #6c71c4;
} }
.control-center .notification { .notification.normal {
box-shadow: none; border: 2px solid #d33682;
}
.notification.critical {
border: 2px solid #dc322f;
} }
.notification-content { .notification-content {
padding: 12px; padding: 16px;
}
.notification-content .app-icon,
.notification-content .image {
margin: 0 8px 0 0;
}
.notification-group-buttons,
.notification-group-headers {
margin: 0;
} }
.text-box .summary, .text-box .summary,
@ -45,3 +41,13 @@ https://github.com/ErikReider/SwayNotificationCenter/blob/main/data/style/style.
.text-box .body { .text-box .body {
font-size: 16px; font-size: 16px;
} }
.control-center {
/* border: 2px solid #073642; */
margin: 10px; /* Gap size */
padding: 16px;
}
.control-center .notification {
box-shadow: none;
}

View file

@ -119,10 +119,7 @@ in {
workspaces-only-on-primary = mkBoolean true; workspaces-only-on-primary = mkBoolean true;
#?? [as] #?? [as]
experimental-features = mkArray type.string [ experimental-features = mkArray type.string ["variable-refresh-rate"];
"scale-monitor-framebuffer" # https://wiki.archlinux.org/title/HiDPI#Fractional_scaling
"variable-refresh-rate" # https://wiki.archlinux.org/title/Variable_refresh_rate#GNOME
];
}; };
"org/gnome/mutter/wayland/keybindings" = { "org/gnome/mutter/wayland/keybindings" = {

View file

@ -17,15 +17,13 @@ in {
package = pkgs.google-cursor; package = pkgs.google-cursor;
}; };
gtk = let gtk = {
css = readFile ./style.css;
in {
enable = true; enable = true;
gtk3.extraCss = css; gtk3.extraCss = builtins.readFile ./style.css;
gtk4 = { gtk4 = {
extraConfig.gtk-hint-font-metrics = 1; # Fix blurry fonts extraConfig.gtk-hint-font-metrics = 1; # Fix blurry fonts
extraCss = css; extraCss = builtins.readFile ./style.css;
}; };
font = { font = {

View file

@ -97,14 +97,12 @@ in {
gnome-calendar # Calendar gnome-calendar # Calendar
gnome-clocks # Clock gnome-clocks # Clock
gnome-connections # Remote desktop client gnome-connections # Remote desktop client
gnome-contacts # Contact editor
gnome-disk-utility # Disk formatter gnome-disk-utility # Disk formatter
gnome-firmware # Firmware updater gnome-firmware # Firmware updater
gnome-font-viewer # Font viewer gnome-font-viewer # Font viewer
gnome-graphs # Data plotter gnome-graphs # Data plotter
gnome-maps # OpenStreetMap client gnome-maps # OpenStreetMap client
gnome-obfuscate # Image redacter gnome-obfuscate # Image redacter
gnome-online-accounts-gtk # GNOME accounts
gnome-podcasts # Podcast feed gnome-podcasts # Podcast feed
gnome-resources # System monitor gnome-resources # System monitor
gnome-software # Flatpak manager gnome-software # Flatpak manager