493 lines
14 KiB
Nix
493 lines
14 KiB
Nix
{
|
|
config,
|
|
pkgs,
|
|
lib,
|
|
...
|
|
}: let
|
|
hyprgamemode = pkgs.writeShellScriptBin "gamemode" ''
|
|
#!/usr/bin/env sh
|
|
HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==1{print $2}')
|
|
if [ "$HYPRGAMEMODE" = 1 ] ; then
|
|
hyprctl --batch "\
|
|
keyword animations:enabled 0;\
|
|
keyword decoration:shadow:enabled 0;\
|
|
keyword decoration:blur:enabled 0;\
|
|
keyword general:gaps_in 0;\
|
|
keyword general:gaps_out 0;\
|
|
keyword general:border_size 1;\
|
|
keyword decoration:rounding 0"
|
|
exit
|
|
fi
|
|
hyprctl reload
|
|
hyprctl monitors | grep 'HDMI' && hyprctl keyword monitor "eDP-1, disable"
|
|
'';
|
|
volume-notify = pkgs.writeShellScriptBin "volume-notify" ''
|
|
#!/usr/bin/env sh
|
|
|
|
volumep="$(wpctl get-volume @DEFAULT_AUDIO_SINK@)"
|
|
|
|
case "$volumep" in
|
|
*0.0*) volumep="''${volumep##* 0.0}%" ;;
|
|
*0.*) volumep="''${volumep##* 0.}%" ;;
|
|
*MUTED*) volumep='MUTED' ;;
|
|
*) volumep="100%" ;;
|
|
esac
|
|
|
|
notify-send -h string:x-canonical-private-synchronous:sys-notify "🔊 Volume: ''${volumep}"
|
|
'';
|
|
toggle-sound-output = pkgs.writeShellScriptBin "toggle-sound-output" ''
|
|
#!/usr/bin/env sh
|
|
|
|
speakers="alsa_output.pci-0000_05_00.1.hdmi-stereo"
|
|
headphones="alsa_output.usb-Xtrfy_SC1_Xtrfy_SC1-00.analog-stereo"
|
|
|
|
current="$(wpctl status -n | grep Audio/Sink | grep -oE '[^ ]+$')"
|
|
|
|
if [ "''${current}" = "''${headphones}" ]; then
|
|
wpctl set-default "$(pw-cli info $speakers | head -n 1 | awk '{print $2}')"
|
|
else
|
|
wpctl set-default "$(pw-cli info $headphones | head -n 1 | awk '{print $2}')"
|
|
fi
|
|
|
|
'';
|
|
power-menu = pkgs.writeShellScriptBin "power-menu" ''
|
|
#!/usr/bin/env sh
|
|
|
|
case "$(printf "shutdown\\nreboot" | tofi --prompt "Choose your poison")" in
|
|
"shutdown") poweroff ;;
|
|
"reboot") reboot ;;
|
|
esac
|
|
'';
|
|
grim = "${pkgs.grim}/bin/grim";
|
|
vpn-toggle = pkgs.writeShellScriptBin "vpn-toggle" ''
|
|
#!/usr/bin/env sh
|
|
|
|
if [ "$(nmcli --overview -f GENERAL.STATE connection show hetz)" = "" ]; then
|
|
nmcli con up hetz
|
|
notify-send "VPN" "UP"
|
|
else
|
|
nmcli con down hetz
|
|
notify-send "VPN" "DOWN"
|
|
fi
|
|
|
|
'';
|
|
playerctl = "${pkgs.playerctl}/bin/playerctl";
|
|
in {
|
|
options = {
|
|
crony.hyprland.enable = lib.mkEnableOption "Enable hyprland and configure it for me";
|
|
};
|
|
|
|
config = lib.mkIf config.crony.hyprland.enable {
|
|
home.packages = with pkgs; [
|
|
(writeShellScriptBin "tofi-pass" ''
|
|
tofi --hide-input true --prompt-text 'Password: ' --require-match false --hidden-character '.' < /dev/null
|
|
'')
|
|
cliphist
|
|
wl-clipboard
|
|
];
|
|
|
|
# Enable and setup tofi
|
|
programs.tofi = {
|
|
enable = true;
|
|
settings = {
|
|
anchor = "top";
|
|
width = "100%";
|
|
height = "34";
|
|
horizontal = true;
|
|
history = false;
|
|
require-match = false;
|
|
terminal = "foot";
|
|
outline-width = 0;
|
|
border-width = 0;
|
|
min-input-width = 120;
|
|
result-spacing = 15;
|
|
padding-top = 4;
|
|
padding-bottom = 0;
|
|
padding-left = 5;
|
|
padding-right = 5;
|
|
};
|
|
};
|
|
|
|
# Setup and enable mako
|
|
services.mako = {
|
|
enable = true;
|
|
defaultTimeout = 5000;
|
|
layer = "overlay";
|
|
width = 200;
|
|
};
|
|
|
|
# Enable hyprpaper
|
|
services.hyprpaper.enable = true;
|
|
|
|
# Enable hypridle
|
|
services.hypridle = {
|
|
enable = true;
|
|
settings = {
|
|
general = {
|
|
lock_cmd = "pidof hyprlock || hyprlock"; # avoid starting multiple hyprlock instances.
|
|
before_sleep_cmd = "loginctl lock-session"; # lock before suspend.
|
|
after_sleep_cmd = "hyprctl dispatch dpms on"; # to avoid having to press a key twice to turn on the display.
|
|
};
|
|
|
|
listener = [
|
|
{
|
|
timeout = 10; # 10 sec
|
|
on-timeout = "pidof hyprlock && hyprctl dispatch dpms off"; # Turn off screen if hyprlock is running
|
|
on-resume = "hyprctl dispatch dpms on"; # Turn on screen when activiy is detected after timeout has fired
|
|
}
|
|
{
|
|
timeout = 300; # 5min
|
|
on-timeout = "loginctl lock-session"; # lock screen when timeout has passed
|
|
}
|
|
{
|
|
timeout = 310; # 5min and 10 sec
|
|
on-timeout = "hyprctl dispatch dpms off"; # Turn off screen if hyprlock is running
|
|
on-resume = "hyprctl dispatch dpms on"; # Turn on screen when activiy is detected after timeout has fired
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
# Enable hyprlock
|
|
programs.hyprlock = {
|
|
enable = true;
|
|
settings = {
|
|
general = {
|
|
disable_loading_bar = true;
|
|
grace = 0;
|
|
hide_cursor = true;
|
|
no_fade_in = false;
|
|
};
|
|
|
|
image = {
|
|
path = "$HOME/.face";
|
|
size = 150;
|
|
border_size = 4;
|
|
border_color = "rgb(d5c4a1)";
|
|
position = "0, 285";
|
|
halign = "center";
|
|
valign = "center";
|
|
};
|
|
|
|
label = [
|
|
{
|
|
text = "$TIME";
|
|
font_size = 90;
|
|
color = "rgb(d5c4a1)";
|
|
position = "0, 165";
|
|
halign = "center";
|
|
valight = "center";
|
|
}
|
|
{
|
|
text = ''cmd[update:43200000] date +"%Y %m %d"'';
|
|
font_size = 25;
|
|
color = "rgb(d5c4a1)";
|
|
position = "0, -225";
|
|
halign = "center";
|
|
valign = "center";
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
# Disable stylix to add full css, I only need it to add colors
|
|
stylix.targets.waybar.addCss = false;
|
|
|
|
# Enable and install waybar
|
|
programs.waybar = {
|
|
enable = true;
|
|
style = ''
|
|
.modules-left {
|
|
padding-left: 10px;
|
|
}
|
|
|
|
#workspaces {
|
|
background-color: @base01;
|
|
margin: 0.25em;
|
|
border-radius: 1em;
|
|
}
|
|
#workspaces button {
|
|
padding: 0 0.5em;
|
|
color: @base06;
|
|
}
|
|
|
|
#workspaces button.empty {
|
|
color: @base03;
|
|
}
|
|
|
|
#workspaces button.visible {
|
|
color: @base06;
|
|
}
|
|
|
|
#workspaces button.active {
|
|
color: @base0D;
|
|
}
|
|
|
|
#window {
|
|
color: @base0D;
|
|
padding: 0 1em;
|
|
}
|
|
|
|
#cpu,
|
|
#memory,
|
|
#temperature,
|
|
#battery,
|
|
#disk,
|
|
#clock {
|
|
color: @base00;
|
|
background-color: @base0D;
|
|
margin: 0.25em;
|
|
border-radius: 0.5em;
|
|
padding: 0 0.5em;
|
|
}
|
|
|
|
#tray {
|
|
background-color: @base00;
|
|
}
|
|
|
|
.modules-right {
|
|
padding-right: 10px;
|
|
}
|
|
'';
|
|
settings = {
|
|
mainBar = {
|
|
height = 34;
|
|
modules-left = [
|
|
"hyprland/workspaces"
|
|
"hyprland/window"
|
|
];
|
|
modules-center = [
|
|
];
|
|
modules-right = [
|
|
"cpu"
|
|
"memory"
|
|
"temperature"
|
|
"disk"
|
|
"battery"
|
|
"clock"
|
|
"tray"
|
|
];
|
|
"hyprland/workspaces" = {
|
|
persistent-workspaces = {
|
|
"*" = [1 2 3 4 5 6 7 8 9];
|
|
};
|
|
};
|
|
disk = {
|
|
path = "/";
|
|
unit = "GB";
|
|
format = " {percentage_used}%";
|
|
};
|
|
tray = {
|
|
spacing = 10;
|
|
};
|
|
clock = {
|
|
format = " {:%Y.%m.%d %H:%M}";
|
|
};
|
|
cpu = {
|
|
format = " {usage}%";
|
|
};
|
|
memory = {
|
|
format = " {}%";
|
|
};
|
|
temperature = {
|
|
critical-threshold = 80;
|
|
hwmon-path = "/sys/class/hwmon/hwmon2/temp1_input";
|
|
format = " {temperatureC}°C";
|
|
};
|
|
battery = {
|
|
states = {
|
|
warning = 30;
|
|
critical = 15;
|
|
};
|
|
|
|
format = "{icon} {capacity}%";
|
|
format-full = "{icon} {capacity}%";
|
|
format-charging = " {icon} {capacity}%";
|
|
format-plugged = " {capacity}%";
|
|
format-icons = [" " " " " " " " " "];
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
# Setup and enable hyprland
|
|
wayland.windowManager.hyprland = {
|
|
enable = true;
|
|
|
|
systemd.enable = false; # Using USWM globally
|
|
|
|
settings = {
|
|
"$mod" = "SUPER";
|
|
"$menu" = "tofi";
|
|
"$terminal" = "foot";
|
|
|
|
exec = [
|
|
# Fix laptop monitor getting turned on while my external monitor connected
|
|
"hyprctl monitors | grep 'HDMI' && hyprctl keyword monitor 'eDP-1, disable'"
|
|
];
|
|
|
|
exec-once = [
|
|
"wl-paste --type text --watch cliphist store" # Stores only text data
|
|
"wl-paste --type image --watch cliphist store" # Stores only image data
|
|
"keepassxc" # Startup my password manager
|
|
"waybar" # Start waybar on start
|
|
];
|
|
|
|
monitor = [
|
|
"HDMI-A-1, 1920x1080@144, 0x0, 1"
|
|
];
|
|
|
|
animations = {
|
|
enabled = "yes";
|
|
};
|
|
|
|
decoration = {
|
|
blur = {
|
|
enabled = true;
|
|
};
|
|
|
|
shadow = {
|
|
enabled = true;
|
|
};
|
|
|
|
rounding = 10;
|
|
};
|
|
|
|
general = {
|
|
border_size = 3;
|
|
gaps_in = 5;
|
|
gaps_out = 10;
|
|
layout = "master";
|
|
allow_tearing = true;
|
|
};
|
|
|
|
misc = {
|
|
vrr = 1;
|
|
};
|
|
|
|
input = {
|
|
kb_layout = "us,hr";
|
|
kb_options = "caps:escape,grp:alt_space_toggle";
|
|
accel_profile = "flat";
|
|
};
|
|
|
|
master = {
|
|
mfact = "0.5";
|
|
new_status = "slave";
|
|
};
|
|
|
|
binds = {
|
|
allow_workspace_cycles = true;
|
|
};
|
|
|
|
bind = [
|
|
"$mod, Return, exec, $terminal"
|
|
"$mod SHIFT, Q, killactive"
|
|
"$mod CTRL, E, exit"
|
|
"$mod SHIFT, Space, togglefloating"
|
|
"$mod, D, exec, tofi-run | xargs hyprctl dispatch exec --"
|
|
"$mod SHIFT, D, exec, tofi-drun | xargs hyprctl dispatch exec --"
|
|
|
|
"$mod, F, fullscreen"
|
|
|
|
"$mod SHIFT, L, exec, hyprlock --immediate"
|
|
|
|
"$mod, B, exec, chromium"
|
|
"$mod SHIFT, B, exec, librewolf"
|
|
|
|
"$mod, G, exec, ${hyprgamemode}/bin/gamemode"
|
|
"$mod, F1, exec, ${toggle-sound-output}/bin/toggle-sound-output"
|
|
"$mod SHIFT, E, exec, ${power-menu}/bin/power-menu"
|
|
"$mod, w, exec, ${vpn-toggle}/bin/vpn-toggle"
|
|
|
|
"$mod, F12, exec, ${grim} $HOME/Pictures/screenshots/$(date +'%s_grim.png')"
|
|
|
|
"$mod, V, exec, cliphist list | tofi --horizontal false --height 380 | cliphist decode | wl-copy"
|
|
|
|
"$mod, j, layoutmsg, cyclenext"
|
|
"$mod, k, layoutmsg, cycleprev"
|
|
"$mod SHIFT, j, layoutmsg, swapnext"
|
|
"$mod SHIFT, k, layoutmsg, swapprev"
|
|
|
|
"$mod, h, layoutmsg, mfact -0.05"
|
|
"$mod, l, layoutmsg, mfact +0.05"
|
|
|
|
"$mod, Tab, workspace, previous"
|
|
|
|
"$mod, 1, workspace, 1"
|
|
"$mod, 2, workspace, 2"
|
|
"$mod, 3, workspace, 3"
|
|
"$mod, 4, workspace, 4"
|
|
"$mod, 5, workspace, 5"
|
|
"$mod, 6, workspace, 6"
|
|
"$mod, 7, workspace, 7"
|
|
"$mod, 8, workspace, 8"
|
|
"$mod, 9, workspace, 9"
|
|
|
|
"$mod SHIFT, 1, movetoworkspacesilent, 1"
|
|
"$mod SHIFT, 2, movetoworkspacesilent, 2"
|
|
"$mod SHIFT, 3, movetoworkspacesilent, 3"
|
|
"$mod SHIFT, 4, movetoworkspacesilent, 4"
|
|
"$mod SHIFT, 5, movetoworkspacesilent, 5"
|
|
"$mod SHIFT, 6, movetoworkspacesilent, 6"
|
|
"$mod SHIFT, 7, movetoworkspacesilent, 7"
|
|
"$mod SHIFT, 8, movetoworkspacesilent, 8"
|
|
"$mod SHIFT, 9, movetoworkspacesilent, 9"
|
|
];
|
|
|
|
bindel = [
|
|
", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ --limit 1 && ${volume-notify}/bin/volume-notify"
|
|
", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- --limit 1 && ${volume-notify}/bin/volume-notify"
|
|
", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && ${volume-notify}/bin/volume-notify"
|
|
];
|
|
|
|
# Requires playerctl
|
|
bindl = [
|
|
", XF86AudioPlay, exec, ${playerctl} play-pause"
|
|
", XF86AudioPrev, exec, ${playerctl} previous"
|
|
", XF86AudioNext, exec, ${playerctl} next"
|
|
|
|
'', switch:off:Lid Switch,exec,hyprctl keyword monitor "eDP-1, 1920x1080, 0x0, 1"''
|
|
'', switch:on:Lid Switch,exec,hyprctl keyword monitor "eDP-1, disable"''
|
|
];
|
|
|
|
bindm = [
|
|
# mouse movements
|
|
"$mod, mouse:272, movewindow"
|
|
"$mod, mouse:273, resizewindow"
|
|
"$mod ALT, mouse:272, resizewindow"
|
|
];
|
|
|
|
windowrulev2 = [
|
|
# Hide xwaylandvideobridge
|
|
"opacity 0.0 override, class:^(xwaylandvideobridge)$"
|
|
"noanim, class:^(xwaylandvideobridge)$"
|
|
"noinitialfocus, class:^(xwaylandvideobridge)$"
|
|
"maxsize 1 1, class:^(xwaylandvideobridge)$"
|
|
"noblur, class:^(xwaylandvideobridge)$"
|
|
"nofocus, class:^(xwaylandvideobridge)$"
|
|
|
|
# Disable animations for ueberzugpp
|
|
"noanim, class:^(ueberzugpp.*)$"
|
|
|
|
# Allow tearing for sifu
|
|
"immediate, class:^(steam_app_2138710)$"
|
|
"immediate, class:^(steam_app_1145360)$"
|
|
"immediate, class:^(Graveyard Keeper.x86_64)$"
|
|
"immediate, class:^(gamescope)$"
|
|
"immediate, class:^(steam_app_1087760)$"
|
|
|
|
# Make workspace 6 a floating layout
|
|
"float, workspace:6"
|
|
|
|
# Make keepassxc floating
|
|
"float, class:^(org.keepassxc.KeePassXC)$"
|
|
|
|
# Move to workspace 5
|
|
"workspace 5, class:^(vesktop)$"
|
|
];
|
|
};
|
|
};
|
|
};
|
|
}
|