From 8b0bd140dbcbacf42c3cd45c8871e421c2a7bea8 Mon Sep 17 00:00:00 2001 From: ItsDrike Date: Wed, 7 Aug 2024 22:12:43 +0200 Subject: [PATCH] Add hypridle & hyprlock --- home/programs/graphical/default.nix | 1 + .../graphical/screen-lockers/default.nix | 5 + .../graphical/screen-lockers/hyprlock.nix | 209 ++++++++++++++++++ home/services/default.nix | 1 + home/services/hypridle.nix | 56 +++++ hosts/voyager/default.nix | 2 + options/home/programs/default.nix | 4 + options/home/services.nix | 1 + 8 files changed, 279 insertions(+) create mode 100644 home/programs/graphical/screen-lockers/default.nix create mode 100644 home/programs/graphical/screen-lockers/hyprlock.nix create mode 100644 home/services/hypridle.nix diff --git a/home/programs/graphical/default.nix b/home/programs/graphical/default.nix index 2285b7c..d1a8258 100644 --- a/home/programs/graphical/default.nix +++ b/home/programs/graphical/default.nix @@ -7,5 +7,6 @@ _: { ./browsers ./file-managers ./games + ./screen-lockers ]; } diff --git a/home/programs/graphical/screen-lockers/default.nix b/home/programs/graphical/screen-lockers/default.nix new file mode 100644 index 0000000..2b3077a --- /dev/null +++ b/home/programs/graphical/screen-lockers/default.nix @@ -0,0 +1,5 @@ +_: { + imports = [ + ./hyprlock.nix + ]; +} diff --git a/home/programs/graphical/screen-lockers/hyprlock.nix b/home/programs/graphical/screen-lockers/hyprlock.nix new file mode 100644 index 0000000..ece8158 --- /dev/null +++ b/home/programs/graphical/screen-lockers/hyprlock.nix @@ -0,0 +1,209 @@ +{ + lib, + pkgs, + osConfig, + ... +}: let + inherit (lib) mkIf; + + cfg = osConfig.myOptions.home-manager.programs.screen-lockers.hyprlock; +in { + config = mkIf cfg.enable { + programs.hyprlock = { + enable = true; + + settings = { + general = { + disable_loading_bar = false; + hide_cursor = true; + grace = 3; + }; + + background = [ + { + # TODO: Keep the wallpaper in dotfiles + path = "~/Media/Pictures/Wallpapers/Categories/Extra/origami.png"; + blur_passes = 3; + blur_size = 6; + #contrast = 0.7; + #brightness = 0.7; + noise = 0.01; + contrast = 0.9; + brightness = 0.6; + } + ]; + + # Password circle + input-field = [ + { + size = "300, 250"; + rounding = -1; + outline_thickness = 30; + outer_color = "rgba(129, 162, 190, 85)"; + inner_color = "rgb(29, 31, 33)"; + font_color = "rgb(100, 100, 100)"; + + check_color = "rgb(204, -136, 34)"; # override outer_color while checking the pw (could take a while sometimes - pam lockouts) + fail_color = "rgb(204, 34, 34)"; # override outer_color and fail message color if auth failed + fail_transition = 500; # transition time in ms between normal outer_color and fail_color + fail_text = ""; # Leave this empty (amt of attempts and fail reason shown with labels) + + hide_input = true; + fade_on_empty = false; + placeholder_text = ""; # Leave this empty + + position = "0, 0"; + halign = "center"; + valign = "center"; + } + ]; + + label = [ + # Show time (inside of the circle) + { + text = "cmd[update:200] date +'%H:%M:%S'"; + color = "rgba(129, 162, 190, 1.0)"; + font_size = 35; + font_family = "Noto Sans"; + + position = "0, 30"; + halign = "center"; + valign = "center"; + } + + # Show date (inside of the circle, below time) + { + text = "cmd[update:1000] date +'%a, %d-%m-%Y'"; + color = "rgba(129, 162, 190, 1.0)"; + font_size = 20; + font_family = "Noto Sans"; + + position = "0, -20"; + halign = "center"; + valign = "center"; + } + + # Keyboard layout + { + text = "cmd[update:200] hyprctl devices -j | jq -r '.keyboards[] | select(.name == \"at-translated-set-2-keyboard\") | .active_keymap'"; + color = "rgba(129, 162, 190, 1.0)"; + font_size = 10; + font_family = "Noto Sans"; + + position = "0, -90"; + halign = "center"; + valign = "center"; + } + + # Failed attempts count + { + text = "Logged $ATTEMPTS[0] failure(s)"; + color = "rgba(153, 153, 153, 1.0)"; # gray + font_size = 14; + font_family = "Noto Sans"; + + shadow_passes = 1; + shadow_size = 1.2; + shadow_boost = 1.0; + + position = "0, -200"; + halign = "center"; + valign = "center"; + } + + # Fail reason + { + text = "$FAIL"; + color = "rgba(255, 34, 34, 1.0)"; # red + font_size = 14; + font_family = "Noto Sans"; + + shadow_passes = 1; + shadow_size = 1.2; + shadow_boost = 1.0; + + position = "0, -230"; + halign = "center"; + valign = "center"; + } + + # Splash text + { + text = "Session Locked"; + color = "rgba(255, 255, 255, 1.0)"; + font_size = 40; + font_family = "Monaspace Krypton"; + + shadow_passes = 1; + shadow_size = 5; + shadow_boost = 1.8; + + position = "0, 220"; + halign = "center"; + valign = "center"; + } + + # Device uptime + { + text = "cmd[update:1000] echo \" $(awk '{days=int($1/86400); hours=int(($1%86400)/3600); minutes=int(($1%3600)/60); if (days>0) printf \"%dd %dh %dm\\n\", days, hours, minutes; else if (hours>0) printf \"%dh %dm\\n\", hours, minutes; else printf \"%dm\\n\", minutes; }' /proc/uptime)\""; + color = "rgba(129, 162, 190, 1.0)"; + font_size = 11; + font_family = "Noto Sans"; + + position = "-90, -20"; + halign = "right"; + valign = "top"; + } + + # Battery percentage + { + text = "cmd[update:1000] echo \" $(cat /sys/class/power_supply/BAT0/capacity)%\""; + color = "rgba(129, 162, 190, 1.0)"; + font_size = 11; + font_family = "Noto Sans"; + + shadow_passes = 1; + shadow_size = 5; + shadow_boost = 1.8; + + position = "-20, -20"; + halign = "right"; + valign = "top"; + } + + # User account + { + text = " $USER"; + color = "rgba(129, 162, 190, 1.0)"; + font_size = 11; + font_family = "Noto Sans"; + + shadow_passes = 1; + shadow_size = 5; + shadow_boost = 1.8; + + position = "20, -20"; + halign = "left"; + valign = "top"; + } + + # Recovery email (lost device) + { + text = "recovery@itsdrike.com"; + color = "rgba(129, 162, 190, 1.0)"; + font_size = 11; + font_family = "Noto Sans"; + + shadow_passes = 1; + shadow_size = 5; + shadow_boost = 1.8; + + position = "20, 12"; + halign = "left"; + valign = "bottom"; + } + ]; + }; + }; + }; +} diff --git a/home/services/default.nix b/home/services/default.nix index ce60b8e..d1a6cb7 100644 --- a/home/services/default.nix +++ b/home/services/default.nix @@ -2,5 +2,6 @@ _: { imports = [ ./dunst.nix ./hyprpaper.nix + ./hypridle.nix ]; } diff --git a/home/services/hypridle.nix b/home/services/hypridle.nix new file mode 100644 index 0000000..9c4f053 --- /dev/null +++ b/home/services/hypridle.nix @@ -0,0 +1,56 @@ +{ + lib, + osConfig, + ... +}: let + inherit (lib) mkIf; + + cfg = osConfig.myOptions.home-manager.services.hypridle; + cfgIsWayland = osConfig.myOptions.home-manager.wms.isWayland; +in { + config = mkIf (cfg.enable && cfgIsWayland) { + # NOTE: This assumes dunst, hyprlock and Hyprland are installed + services.hypridle = { + enable = true; + settings = { + general = { + lock_cmd = "hyprlock && dunstctl set-paused true"; + unlock_cmd = "killall -s SIGUSR1 hyprlock && dustctl set-paused false"; + before_sleep_cmd = "loginctl lock-session && dunstctl set-paused true && sleep 2"; + after_sleep_cmd = "dunstctl set-paused false"; + ignore_dbus_inhibit = false; + ignore_systemd_inhibit = false; + }; + + listener = [ + # Warn about going idle (5 mins) + { + timeout = 300; + # use hyprland notifications, in case dunst notifs are paused or whatever + on-timeout = "hyprctl notify 0 10000 'rgb(ff0000)' 'fontsize:20 System going idle in 10 seconds...'"; + on-resume = "hyprctl dismissnotify 1"; + } + + # Lock the session & disable dunst notifications + { + timeout = 310; + on-timeout = "loginctl lock-session"; + } + + # Turn off the screen after another 50s + { + timeout = 400; + on-timeout = "hyprctl dispatch dpms off"; + on-resume = "hyprctl dispatch dpms on"; + } + + # Enter suspend/sleep state (10 minutes) + { + timeout = 600; + on-timeout = "systemctl suspend-then-hibernate"; + } + ]; + }; + }; + }; +} diff --git a/hosts/voyager/default.nix b/hosts/voyager/default.nix index f7b668e..f63d250 100644 --- a/hosts/voyager/default.nix +++ b/hosts/voyager/default.nix @@ -189,6 +189,7 @@ programs = { bars.eww.enable = true; + screen-lockers.hyprlock.enable = true; browsers = { firefox.enable = true; chromium.enable = true; @@ -241,6 +242,7 @@ # to whatever file you wish to actually be your wallpaper wallpaperPath = "/data/Data/Media/Pictures/Wallpapers/active"; }; + hypridle.enable = true; }; }; }; diff --git a/options/home/programs/default.nix b/options/home/programs/default.nix index 9bd7d60..f0018c0 100644 --- a/options/home/programs/default.nix +++ b/options/home/programs/default.nix @@ -67,5 +67,9 @@ in { steam.enable = mkEnableOption "Steam client"; prismlauncher.enable = mkEnableOption "PrismLauncher"; }; + + screen-lockers = { + hyprlock.enable = mkEnableOption "HyprLock (A screenlocker for Hyprland)"; + }; }; } diff --git a/options/home/services.nix b/options/home/services.nix index 4488fc6..02aca68 100644 --- a/options/home/services.nix +++ b/options/home/services.nix @@ -12,5 +12,6 @@ in { description = "Path to the wallpaper of your choosing"; }; }; + hypridle.enable = mkEnableOption "Hypridle (Hyprland idle daemon)"; }; }