From afaa34df918c21fd65d696a7a144c6871b75f106 Mon Sep 17 00:00:00 2001 From: Daniel Flanagan Date: Sat, 21 Dec 2024 17:10:45 -0600 Subject: [PATCH] feat: use hypridle and hyprlock --- modules/home-manager/default.nix | 79 +++++++++++- modules/home-manager/ewwbar.nix | 6 - modules/home-manager/hyprland.nix | 193 ++++++++++++++++++++++++------ modules/home-manager/sway.nix | 52 -------- nixos/foxtrot.nix | 14 +++ 5 files changed, 249 insertions(+), 95 deletions(-) delete mode 100644 modules/home-manager/ewwbar.nix diff --git a/modules/home-manager/default.nix b/modules/home-manager/default.nix index 27439d9..27ed502 100644 --- a/modules/home-manager/default.nix +++ b/modules/home-manager/default.nix @@ -35,6 +35,76 @@ }; }; + eww = { + programs.eww = { + enable = true; + # NOTE: might be better as a mk out of store symlink or w/e + configDir = ./eww; + }; + }; + + mako = { + config, + pkgs, + ... + }: { + services.mako = { + enable = true; + extraConfig = with style.colors.withHashPrefix; '' + border-size=2 + border-radius=5 + padding=10,15 + max-visible=5 + default-timeout=15000 + font=Symbols Nerd Font ${toString style.font.size},${style.font.name} ${toString style.font.size} + anchor=top-right + on-notify=exec ${pkgs.mpv}/bin/mpv --volume=50 ~/.notify.wav + actions=1 + icons=1 + width=400 + height=150 + + background-color=${bg}DD + text-color=${text} + border-color=${primary} + progress-color=${primary} + + [urgency=high] + border-color=${urgent} + + [urgency=high] + background-color=${urgent}EE + border-color=${urgent} + text-color=${bg} + ''; + }; + }; + + tofi = { + config, + pkgs, + ... + }: { + programs.tofi = { + enable = true; + settings = { + font = "${pkgs.iosevkaLyteTerm}/share/fonts/truetype/IosevkaLyteTerm-regular.ttf"; + font-size = 12; + text-color = "#f8f8f8"; + prompt-color = "#f38ba8"; + selection-color = "#66d9ef"; + background-color = "#1e1e2e"; + outline-width = 0; + border-width = 1; + border-color = "#66d9ef"; + width = 640; + height = 400; + + fuzzy-match = "true"; + }; + }; + }; + broot = {}; emacs = {pkgs, ...}: { @@ -1135,7 +1205,14 @@ }; }; - hyprland = import ./hyprland.nix; + hyprland = { + imports = with homeManagerModules; [ + tofi + mako + eww + (import ./hyprland.nix) + ]; + }; iex = { home.file.".iex.exs" = { diff --git a/modules/home-manager/ewwbar.nix b/modules/home-manager/ewwbar.nix deleted file mode 100644 index cd0aef1..0000000 --- a/modules/home-manager/ewwbar.nix +++ /dev/null @@ -1,6 +0,0 @@ -{...}: { - programs.eww = { - enable = true; - configDir = ./eww; - }; -} diff --git a/modules/home-manager/hyprland.nix b/modules/home-manager/hyprland.nix index 4f4c32a..55d1051 100644 --- a/modules/home-manager/hyprland.nix +++ b/modules/home-manager/hyprland.nix @@ -8,19 +8,9 @@ }: let inherit (style) colors; in { - imports = [ - ./ewwbar.nix - # ./mako.nix - # ./swaylock.nix - # TODO: figure out how to import this for this module _and_ for the sway module? - # ./linux-desktop.nix - ]; - - # TODO: Hyprland seems to have issues with resuming from hibernation on my - # laptop where it uses a ton of CPU. + # TODO: Hyprland seems to sometimes use a ton of CPU? home.packages = with pkgs; [ - # TODO: integrate osd swayosd ]; @@ -54,29 +44,7 @@ in { "[workspace 1 silent] wezterm" "xwaylandvideobridge" "systemctl --user import-environment QT_QPA_PLATFORMTHEME" - # "wezterm" - # NOTE: maybe check out hypridle? - (lib.concatStringsSep " " [ - "swayidle -w" - "before-sleep 'swaylock'" - "timeout 300 'notify-send \"Idling in 5 minutes\"' resume 'notify-send \"Idling cancelled.\"'" - "timeout 480 'notify-send -u critical \"Idling in 2 minutes\"'" - "timeout 510 'notify-send -u critical \"Idling in 90 seconds\"'" - "timeout 540 'notify-send -u critical \"Idling in 60 seconds!\"'" - "timeout 570 'notify-send -u critical \"Idling in 30 seconds!\"'" - "timeout 590 'notify-send -u critical \"Idling in 10 seconds!\"'" - "timeout 591 'notify-send -u critical \"Idling in 9 seconds!\"'" - "timeout 592 'notify-send -u critical \"Idling in 8 seconds!\"'" - "timeout 593 'notify-send -u critical \"Idling in 7 seconds!\"'" - "timeout 594 'notify-send -u critical \"Idling in 6 seconds!\"'" - "timeout 595 'notify-send -u critical \"Idling in 5 seconds!\"'" - "timeout 596 'notify-send -u critical \"Idling in 4 seconds!\"'" - "timeout 597 'notify-send -u critical \"Idling in 3 seconds!\"'" - "timeout 598 'notify-send -u critical \"Idling in 2 seconds!\"'" - "timeout 599 'notify-send -u critical \"Idling in 1 second!\"'" - "timeout 600 'swaylock -f'" - "timeout 600 'hyprctl dispatch dpms off' resume 'hyprctl dispatch dpms on'" - ]) + "hypridle" ]; env = [ @@ -134,7 +102,7 @@ in { }; decoration = { - rounding = 3; + rounding = 5; /* blur = "no"; @@ -231,7 +199,7 @@ in { # Scroll through existing workspaces with mod + scroll "$mod, mouse_down, workspace, e+1" "$mod, mouse_up, workspace, e-1" - "CTRL SHIFT $mod, L, exec, swaylock" + "CTRL SHIFT $mod, L, exec, hyprlock" "$mod CTRL, space, exec, makoctl dismiss" "$mod SHIFT CTRL, space, exec, makoctl restore" "$mod SHIFT, space, exec, makoctl invoke default" @@ -296,4 +264,157 @@ in { windowrulev2 = nofocus, class:^(xwaylandvideobridge)$ ''; }; + + programs.hyprlock = { + enable = true; + settings = { + # docs: https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock + + general = { + grace = 0; + no_face_out = true; + }; + + input-field = [ + { + monitor = ""; + fade_on_empty = false; + placeholder_text = "Locked"; + rounding = 5; + font_size = 20; + font_color = "rgba(255, 255, 255, 1.0)"; + inner_color = "rgba(31, 31, 47, 0.95)"; + outer_color = "0xff74c7ec 0xff74c7ec 45deg"; + outline_thickness = 3; + position = "0, -200"; + + dots_size = 0.1; + size = "300 75"; + font_family = "IosevkaLyteTerm"; + + shadow_passes = 3; + shadow_size = 8; + shadow_color = "rgba(0, 0, 0, 1.0)"; + shadow_boost = 0.8; + } + ]; + + background = [ + { + path = "~/.wallpaper"; + blur_passes = 2; + } + ]; + + label = [ + { + monitor = ""; + font_size = 64; + + halign = "center"; + valign = "center"; + text_align = "center"; + + # rotate = 10; + position = "0, 200"; + font_family = "IosevkaLyteTerm"; + text = ''Locked for $USER''; + + shadow_passes = 1; + shadow_size = 8; + shadow_color = "rgba(0, 0, 0, 1.0)"; + shadow_boost = 0.5; + } + + { + monitor = ""; + font_size = 20; + + halign = "center"; + valign = "center"; + text_align = "center"; + color = "rgba(255, 255, 255, 0.5)"; + + position = "0 120"; + font_family = "IosevkaLyteTerm"; + text = "cmd[update:1000] date '+%a %b %d %H:%M:%S'"; + + shadow_passes = 3; + shadow_size = 1; + shadow_color = "rgba(0, 0, 0, 1.0)"; + shadow_boost = 1.0; + } + + { + monitor = ""; + font_size = 200; + + halign = "center"; + valign = "center"; + text_align = "center"; + color = "rgba(220, 240, 255, 0.8)"; + position = "0 500"; + font_family = "NerdFontSymbolsOnly"; + text = "󰍁"; + + shadow_passes = 3; + shadow_size = 1; + shadow_color = "rgba(0, 0, 0, 1.0)"; + shadow_boost = 1.0; + } + ]; + }; + }; + + services.hypridle = let + secondsPerMinute = 60; + lockSeconds = 10 * secondsPerMinute; + in { + enable = true; + settings = { + general = { + after_sleep_cmd = "hyprctl dispatch dpms on"; + before_sleep_cmd = "loginctl lock-session"; + ignore_dbus_inhibit = false; + lock_cmd = "pidof hyprlock || hyprlock"; + }; + + listener = [ + { + timeout = lockSeconds - 300; + on-timeout = ''notify-send "Auto-locking in 5 minutes"''; + on-resume = ''notify-send "Auto-locking cancelled"''; + } + { + timeout = lockSeconds - 180; + on-timeout = ''notify-send "Auto-locking in 3 minutes"''; + } + { + timeout = lockSeconds - 120; + on-timeout = ''notify-send "Auto-locking in 2 minutes"''; + } + { + timeout = lockSeconds - 60; + on-timeout = ''notify-send "Auto-locking in 1 minute"''; + } + { + timeout = lockSeconds - 30; + on-timeout = ''notify-send "Auto-locking in 30 seconds"''; + } + { + timeout = lockSeconds - 10; + on-timeout = ''notify-send -u critical "Auto-locking in 10 seconds"''; + } + { + timeout = lockSeconds; + on-timeout = ''loginctl lock-session''; + } + { + timeout = lockSeconds + 5; + on-timeout = ''hyprctl dispatch dpms off''; + on-resume = ''hyprctl dispatch dpms on''; + } + ]; + }; + }; } diff --git a/modules/home-manager/sway.nix b/modules/home-manager/sway.nix index 56f7128..1a60fe5 100644 --- a/modules/home-manager/sway.nix +++ b/modules/home-manager/sway.nix @@ -2,7 +2,6 @@ style, lib, config, - pkgs, ... }: { programs.foot = { @@ -20,57 +19,6 @@ }; }; - home.file."${config.xdg.configHome}/mako/config" = { - enable = true; - text = with style.colors.withHashPrefix; '' - border-size=2 - border-radius=5 - padding=10,15 - max-visible=5 - default-timeout=15000 - font=Symbols Nerd Font ${toString style.font.size},${style.font.name} ${toString style.font.size} - anchor=top-right - on-notify=exec ${pkgs.mpv}/bin/mpv --volume=50 ~/.notify.wav - actions=1 - icons=1 - width=400 - height=150 - - background-color=${bg}DD - text-color=${text} - border-color=${primary} - progress-color=${primary} - - [urgency=high] - border-color=${urgent} - - [urgency=high] - background-color=${urgent}EE - border-color=${urgent} - text-color=${bg} - ''; - }; - - home.file."${config.xdg.configHome}/tofi/config" = { - enable = true; - text = '' - font = ${pkgs.iosevkaLyteTerm}/share/fonts/truetype/IosevkaLyteTerm-regular.ttf - font-size = 12 - - text-color = #f8f8f8 - prompt-color = #f38ba8 - selection-color = #66d9ef - background-color = #1e1e2e - outline-width = 0 - border-width = 1 - border-color = #66d9ef - width = 640 - height = 400 - - fuzzy-match = true - ''; - }; - wayland.windowManager.sway = { /* TODO: diff --git a/nixos/foxtrot.nix b/nixos/foxtrot.nix index dbb6cd3..faa2696 100644 --- a/nixos/foxtrot.nix +++ b/nixos/foxtrot.nix @@ -294,6 +294,20 @@ in # TODO: nixify this }; + services.hypridle = let + secondsPerMinute = 60; + lockSeconds = 10 * secondsPerMinute; + in { + settings = { + listener = [ + { + timeout = lockSeconds + 55; + on-timeout = ''systemctl suspend''; + } + ]; + }; + }; + wayland.windowManager.hyprland = { settings = { exec-once = [