diff --git a/flake.lock b/flake.lock
index 4e5c74d..05c8517 100644
--- a/flake.lock
+++ b/flake.lock
@@ -78,11 +78,11 @@
]
},
"locked": {
- "lastModified": 1746798521,
- "narHash": "sha256-axfz/jBEH9XHpS7YSumstV7b2PrPf7L8bhWUtLBv3nA=",
+ "lastModified": 1747279714,
+ "narHash": "sha256-UdxlE8yyrKiGq3bgGyJ78AdFwh+fuRAruKtyFY5Zq5I=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "e95a7c5b6fa93304cd2fd78cf676c4f6d23c422c",
+ "rev": "954615c510c9faa3ee7fb6607ff72e55905e69f2",
"type": "github"
},
"original": {
@@ -165,11 +165,11 @@
"xdph": "xdph"
},
"locked": {
- "lastModified": 1746794848,
- "narHash": "sha256-p765AZ0h8NaMIqNr3WJav20UMTd/K5arw/N0Yb9jn3c=",
+ "lastModified": 1747301504,
+ "narHash": "sha256-GAI36RNzF9yC0JOauS1+h681ElwdbD9q/qxxuIqcejQ=",
"owner": "hyprwm",
"repo": "Hyprland",
- "rev": "25cf06f6cfe1b23b97d9beae91247413a3683803",
+ "rev": "a5c9b3e49047b4f03f79c5146d8925363eab3072",
"type": "github"
},
"original": {
@@ -628,11 +628,11 @@
},
"nixpkgs_2": {
"locked": {
- "lastModified": 1746663147,
- "narHash": "sha256-Ua0drDHawlzNqJnclTJGf87dBmaO/tn7iZ+TCkTRpRc=",
+ "lastModified": 1747179050,
+ "narHash": "sha256-qhFMmDkeJX9KJwr5H32f1r7Prs7XbQWtO0h3V0a0rFY=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "dda3dcd3fe03e991015e9a74b22d35950f264a54",
+ "rev": "adaa24fbf46737f3f1b5497bf64bae750f82942e",
"type": "github"
},
"original": {
diff --git a/hosts/darp8/file.nix b/hosts/darp8/file.nix
new file mode 100644
index 0000000..89afda2
--- /dev/null
+++ b/hosts/darp8/file.nix
@@ -0,0 +1,52 @@
+{ config, pkgs, cfg, ... }:
+
+let
+ inherit (config.home) username homeDirectory;
+
+ mkSymlinkAttrs = import ../../utils/mkSymlinkAttrs.nix {
+ inherit pkgs;
+ inherit (cfg) context runtimeRoot;
+ hm = config.lib; # same as: cfg.context.inputs.home-manager.lib.hm;
+ };
+
+in
+{
+ # Symlink dotfiles
+ home.file = mkSymlinkAttrs {
+ ".config/hypr" = {
+ source = ../../modules/non-nix_configs/hypr;
+ outOfStoreSymlink = true;
+ recursive = true;
+ };
+
+ ".config/emacs" = {
+ source = ../../modules/non-nix_configs/emacs;
+ outOfStoreSymlink = true;
+ recursive = true;
+ };
+
+ ".config/ghostty" = {
+ source = ../../modules/non-nix_configs/ghostty;
+ outOfStoreSymlink = true;
+ recursive = true;
+ };
+
+ ".config/kitty" = {
+ source = ../../modules/non-nix_configs/kitty;
+ outOfStoreSymlink = true;
+ recursive = true;
+ };
+
+ ".config/nvim" = {
+ source = ../../modules/non-nix_configs/nvim;
+ outOfStoreSymlink = true;
+ recursive = true;
+ };
+
+ ".config/wofi" = {
+ source = ../../modules/non-nix_configs/wofi;
+ outOfStoreSymlink = true;
+ recursive = true;
+ };
+ };
+}
diff --git a/hosts/darp8/home.nix b/hosts/darp8/home.nix
index d063359..1348009 100644
--- a/hosts/darp8/home.nix
+++ b/hosts/darp8/home.nix
@@ -5,6 +5,9 @@
home.homeDirectory = "/home/liamm";
imports = [
+ # home.file imports
+ ./file.nix
+
# general modules
../../modules/home-manager/dunst.nix
../../modules/home-manager/tmux.nix
@@ -70,8 +73,6 @@
zip
];
- home.file = {};
-
home.sessionVariables = {
EDITOR = "emacsclient";
GIT_EDITOR = "nvim";
@@ -121,26 +122,6 @@
xdg.enable = true;
xdg.configFile = {
- "emacs" = {
- recursive = true;
- source = ../../modules/non-nix_configs/emacs;
- };
- "ghostty" = {
- recursive = true;
- source = ../../modules/non-nix_configs/ghostty;
- };
- "kitty" = {
- recursive = true;
- source = ../../modules/non-nix_configs/kitty;
- };
- "nvim" = {
- recursive = true;
- source = ../../modules/non-nix_configs/nvim;
- };
- "wofi" = {
- recursive = true;
- source = ../../modules/non-nix_configs/wofi;
- };
"user-dirs.dirs".source = ../../modules/non-nix_configs/user-dirs.dirs;
"user-dirs.locale".source = ../../modules/non-nix_configs/user-dirs.locale;
};
diff --git a/modules/desktop/hyprland.nix b/modules/desktop/hyprland.nix
index 85b9718..97fc907 100644
--- a/modules/desktop/hyprland.nix
+++ b/modules/desktop/hyprland.nix
@@ -33,321 +33,6 @@
"--all"
];
};
- settings = {
- monitor = [
- "eDP-1,1920x1080@60,0x0,1"
- "HDMI-A-1,2550x1440@144,auto,1,mirror,eDP-1 "
- ",preferred,auto,1,mirror,eDP-1"
- ];
- exec-once = [
- "wl-clipboard-history -t"
- "wl-paste -p --watch wl-copy -p ''"
- "fcitx5 -d"
- ];
- env = [
- "WLR_NO_HARDWARE_CURSORS,1"
- "HYPRCURSOR_THEME,${config.gtk.cursorTheme.name}"
- "HYPRCURSOR_SIZE,24"
- "XDG_CURRENT_DESKTOP,Hyprland"
- "XDG_SESSION_TYPE,wayland"
- "XDG_SESSION_DESKTOP,Hyprland"
- "GTK_THEME,${config.gtk.theme.name}"
- "QT_QPA_PLATFORM,xcb;Hyprland"
- "XCURSOR_THEME,${config.gtk.cursorTheme.name}"
- "XCURSOR_SIZE,24"
- ];
- input = {
- kb_layout = "us";
- kb_variant = "";
- kb_model = "";
- kb_options = "";
- kb_rules = "";
-
- follow_mouse = 1;
- numlock_by_default = true;
-
- touchpad = {
- disable_while_typing = true;
- natural_scroll = true;
- middle_button_emulation = true;
- scroll_factor = 0.5;
- drag_lock = false;
- tap-to-click = true;
- };
- sensitivity = 0;
- };
- general = {
- gaps_in = 2;
- gaps_out = 4;
- border_size = 2;
- "col.active_border" = "rgba(881798FF)";
- "col.inactive_border" = "rgba(471520FF)";
- layout = "dwindle";
- };
-
- debug = {
- disable_logs = false;
- };
-
- misc = {
- disable_hyprland_logo = false;
- disable_splash_rendering = false;
- mouse_move_enables_dpms = true;
- key_press_enables_dpms = true;
- };
-
- ecosystem = {
- no_update_news = true;
- no_donation_nag = true;
- };
-
- experimental = {
- xx_color_management_v4 = true;
- };
-
- decoration = {
- rounding = 10;
- blur = {
- enabled = true;
- size = 3;
- passes = 1;
- xray = true;
- new_optimizations = "on";
- };
-
- shadow = {
- enabled = true; # formerly drop_shadow
- range = 4;
- render_power = 3;
- color = "rgba(1a1a1aee)";
- };
- };
-
- animations = {
- enabled = true;
-
- bezier = "myBezier, 0.05, 0.9, 0.1, 1.05";
- animation = [
- "windows, 1, 7, myBezier"
- "windowsOut, 1, 7, default, popin 80%"
- "border, 1, 10, default"
- "borderangle, 1, 8, default"
- "fade, 1, 7, default"
- "workspaces, 1, 6, default"
- ];
- };
-
- dwindle = {
- pseudotile = true;
- preserve_split = true;
- };
-
- gestures = {
- workspace_swipe = true;
- workspace_swipe_forever = true;
- };
-
- windowrule = [
- "idleinhibit fullscreen, class:firefox"
- "idleinhibit fullscreen, class:floorp"
- "idleinhibit fullscreen, class:ghostty"
- "idleinhibit focus, class:firefox"
- "idleinhibit focus, class:floorp"
- "idleinhibit focus, class:mpv"
- "idleinhibit focus, class:^(emacs)$"
- "idleinhibit focus, class:^(Emacs)$"
- "idleinhibit focus, class:^(discord)$"
- "idleinhibit focus, class:^(Discord)$"
- "idleinhibit focus, class:^(spotify)$"
- "float, class:polkit-kde-authentication-agent-1"
- "float, class:^(praat)$"
- "float, class:^(network)$"
- "float, class:^(nm-)$"
- "float, class:^(Network)$"
- "float, class:Rofi"
- "float, class:Gimp"
- "float, class:Nautilus"
- "float, class:notification"
- "float, class:^(launcher)$"
- "tile, class:Spotify"
- "tile, title:Minecraft"
- "workspace 2, class:KeePassXC"
- "workspace 3, class:firefox"
- "workspace 3, class:floorp"
- "workspace 4, class:Spotify"
- "workspace 6, class:discord"
- "workspace 6, class:Signal"
- "workspace 10, title:Minecraft"
- ];
-
- "$mainMod" = "SUPER";
- "$altMod" = "ALT";
- "$ctrlMod" = "CTRL";
-
-
- # used for screenshots
- "$screenshotarea" = "hyprctl keyword animation 'fadeOut,0,0,default'; grimblast --notify copy area; hyprctl keyword animation 'fadeOut,1,4,default'";
- # for locking screen
- "$lock" = "hyprlock";
-
- bind = [
- # Program binds
- "$altMod, Return, exec, ghostty"
- "$altMod SHIFT, Return, exec, alacritty"
- "$mainMod SHIFT, D, exec, discord --enable-blink-features=MiddleClickAutoscroll"
- "$mainMod SHIFT, E, exec, emacsclient -c -a 'emacs'"
- "$mainMode SHIFT, F, exec, focus-linux"
- "$mainMod, SPACE, exec, pkill wofi || wofi"
- "$mainMod, E, exec, nautilus"
- "$mainMod, S, exec, spotify"
- "$mainMod, P, exec, hyprpicker -a -f hex"
-
- # Screenshot
- ", Print, exec, $screenshotarea"
- "SHIFT, Print, exec, grimblast --notify --cursor copy output"
-
- # WM management binds
- "$mainMod SHIFT, P, pseudo," # dwindle
- "$mainMod, C, killactive,"
- "$mainMod control, Q, exec, $lock"
- "$mainMod, F4, exit,"
- "$mainMod, V, togglefloating, "
- "$mainMod SHIFT, S, togglesplit," # dwindle
- "$mainMod, F, fullscreen,"
-
-
- "$mainMod, H, movefocus, l"
- "$mainMod, L, movefocus, r"
- "$mainMod, K, movefocus, u"
- "$mainMod, J, movefocus, d"
- "$mainMod, comma, focusmonitor, -1"
- "$mainMod, period, focusmonitor, +1"
-
- "$mainMod SHIFT, H, movewindow, l"
- "$mainMod SHIFT, L, movewindow, r"
- "$mainMod SHIFT, K, movewindow, u"
- "$mainMod SHIFT, J, movewindow, d"
- "$mainMod SHIFT, comma, movecurrentworkspacetomonitor, -1"
- "$mainMod SHIFT, period, movecurrentworkspacetomonitor, +1"
-
- "$mainMod, right, resizeactive, 10 0"
- "$mainMod, left, resizeactive, -10 0"
- "$mainMod, up, resizeactive, 0 -10"
- "$mainMod, down, resizeactive, 0 10"
-
- "$mainMod, 1, workspace, 1"
- "$mainMod, 2, workspace, 2"
- "$mainMod, 3, workspace, 3"
- "$mainMod, 4, workspace, 4"
- "$mainMod, 5, workspace, 5"
- "$mainMod, 6, workspace, 6"
- "$mainMod, 7, workspace, 7"
- "$mainMod, 8, workspace, 8"
- "$mainMod, 9, workspace, 9"
- "$mainMod, 0, workspace, 10"
-
- "$mainMod SHIFT, 1, movetoworkspace, 1"
- "$mainMod SHIFT, 2, movetoworkspace, 2"
- "$mainMod SHIFT, 3, movetoworkspace, 3"
- "$mainMod SHIFT, 4, movetoworkspace, 4"
- "$mainMod SHIFT, 5, movetoworkspace, 5"
- "$mainMod SHIFT, 6, movetoworkspace, 6"
- "$mainMod SHIFT, 7, movetoworkspace, 7"
- "$mainMod SHIFT, 8, movetoworkspace, 8"
- "$mainMod SHIFT, 9, movetoworkspace, 9"
- "$mainMod SHIFT, 0, movetoworkspace, 10"
- "$mainMod SHIFT CTRL, right, movetoworkspace, +1"
- "$mainMod SHIFT CTRL, left, movetoworkspace, -1"
-
- # Scroll through existing workspaces with mainMod + scroll
- "$mainMod, mouse_down, workspace, e+1"
- "$mainMod, mouse_up, workspace, e-1"
-
- # Tab through existing workspaces
- "$mainMod, Tab, workspace, e+1"
- "$mainMod SHIFT, Tab, workspace, e-1"
-
- "$mainMod CTRL, right, workspace, +1"
- "$mainMod CTRL, left, workspace, -1"
- ];
-
- bindl = [
- ", XF86AudioPlay, exec, playerctl play-pause"
- ", XF86AudioNext, exec, playerctl next"
- ", XF86AudioPrev, exec, playerctl previous"
- ];
-
- bindel = [
- ", XF86AudioRaiseVolume, exec, pamixer -i 5 && ${../scripts/progress-notify.sh} audio"
- ", XF86AudioLowerVolume, exec, pamixer -d 5 && ${../scripts/progress-notify.sh} audio"
- ", XF86AudioMute, exec, pamixer -t && ${../scripts/progress-notify.sh} mute"
- ];
-
- binde = [
- ", XF86MonBrightnessDown, exec, brightnessctl set 10%- && ${../scripts/progress-notify.sh} brightness"
- ", XF86MonBrightnessUp, exec, brightnessctl set 10%+ && ${../scripts/progress-notify.sh} brightness"
- ];
-
- # Move/resize windows with mainMod + LMB/RMB and dragging
- bindm = [
- "$mainMod, mouse:272, movewindow"
- "$mainMod, mouse:273, resizewindow"
- ];
-
- };
- extraConfig = ''
- bind = $mainMod, R, submap, resize
- submap = resize
- bind=, escape,submap,reset
-
- binde=, left, resizeactive, -10 0
- bindr=, left, submap, reset
- binde=, right, resizeactive, 10 0
- bindr=, right, submap, reset
- binde=, up, resizeactive, 0 10
- bindr=, up, submap, reset
- binde=, down, resizeactive, 0 -10
- bindr=, down, submap, reset
-
- binde=, H, resizeactive, -10 0
- bindr=, H, submap, reset
- binde=, J, resizeactive, 0 -10
- bindr=, J, submap, reset
- binde=, K, resizeactive, 0 10
- bindr=, K, submap, reset
- binde=, L, resizeactive, 10 0
- bindr=, L, submap, reset
-
- submap=reset
-
- bind = $mainMod, B, submap, browser_select
- submap = browser_select
-
- bind =, B, exec, brave
- bind =, B, submap, reset
-
- bind = SHIFT, F, exec, firefox
- bind = SHIFT, F, submap, reset
-
- bind =, F, exec, floorp
- bind =, F, submap, reset
-
- bind =, C, exec, floorp -p limalone -no-remote
- bind =, C, submap, reset
-
- bind=, escape,submap,reset
- submap=reset
-
- bind = $mainMod SHIFT, V, submap, video_stuff
- submap = video_stuff
- bind = , O, exec, obs
- bind = , O, submap, reset
- bind = , V, exec , kdenlive
- bind = , V, submap, reset
-
- bind=, escape,submap,reset
- submap = reset
- '';
};
lib.inputMethod.fcitx5.waylandFrontend = true;
@@ -355,129 +40,15 @@
programs = {
hyprlock = {
enable = true;
- settings = {
- general = {
- disable_loading_bar = true;
- hide_cursor = true;
- no_fade_in = false;
- };
- background = [
- {
- path = "~/pictures/.wallpapers/bloody_snow.jpg";
- blur_passes = 2;
- blur_size = 8;
- }
- ];
- input-field = [
- {
- monitor = "";
- size = "200, 30";
- outline_thickness = 3;
- dots_size = 0.33;
- dots_spacing = 0.15;
- dots_center = false;
- outer_color = "#fe0b00";
- inner_color = "#0c0c0c";
- font_color = "#efefef";
- fade_on_empty = true;
- check_color = "#0eff0d";
- fail_color = "#ff009e";
- capslock_color = "#bb00ee";
- placeholder_text = "Input Password...";
- fail_text = "$FAIL ($ATTEMPTS)";
- }
- ];
- label = [
- {
- monitor = "";
- text = "$TIME";
- text_align = "center";
- color = "#ffffee";
- font_size = 28;
- font_family = builtins.head osConfig.fonts.fontconfig.defaultFonts.sansSerif;
-
- position = "0, 80";
- halign = "center";
- valign = "center";
- }
- {
- monitor = "";
- text = "cmd[update:1000] echo \" $(date +'%A, %b %d %Y')\"";
- text_align = "center";
- color = "#ffffee";
- font_size = 18;
- font_family = builtins.head osConfig.fonts.fontconfig.defaultFonts.sansSerif;
-
- position = "80, 80";
- halign = "left";
- valign = "bottom";
- }
- {
- monitor = "";
- text = "cmd[update:1000] echo \"$(cat /sys/class/power_supply/BAT0/capacity)\"";
- text_align = "center";
- color = "#ffffee";
- font_size = 18;
- font_family = builtins.head osConfig.fonts.fontconfig.defaultFonts.sansSerif;
-
- position = "80, 80";
- halign = "right";
- valign = "bottom";
- }
- ];
- };
};
};
services = {
hyprpaper = {
enable = true;
- settings = {
- ipc = "on";
- splash = false;
- preload = [
- "~/pictures/.wallpapers/skyline-view.png"
- "~/pictures/.wallpapers/iceland-winter-mountains.jpg"
- ];
- wallpaper = [
- "eDP-1,~/pictures/.wallpapers/iceland-winter-mountains.jpg"
- ];
- };
};
hypridle = {
enable = true;
- settings = {
- general = {
- lock_cmd = "${pkgs.procps}/bin/pidof hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; # avoid starting multiple sessions
- before_sleep_cmd = "${pkgs.systemd}/bin/loginctl lock-session"; # lock before suspend.
- after_sleep_cmd = "${pkgs.hyprland}/bin/hyprctl dispatch dpms on"; # to avoid having to hit key twice to turn on display
- };
- listeners = [
- {
- timeout = 120;
- on-timeout = "${pkgs.brightnessctl}/bin/brightnessctl -s set 10"; # set monitor backlight to minimum, avoid 0 on OLED monitor.
- on-resume = "${pkgs.brightnessctl}/bin/brightnessctl -r"; # monitor backlight restor.
- }
- {
- timeout = 120;
- on-timeout = "${pkgs.brightnessctl}/bin/brightnessctl -sd rgb:kbd_backlight set 0"; # turn off keyboard backlight.
- on-resume = "${pkgs.brightnessctl}/bin/brightnessctl -rd rgb:kbd_backlight"; # turn on keyboard backlight.
- }
- {
- timeout = 180;
- on-timeout = "${pkgs.systemd}/bin/loginctl lock-session"; # lock screen when timeout has passed
- }
- {
- timeout = 300;
- on-timeout = "${pkgs.hyprland}/bin/hyprctl dispatch dpms off"; # screen off when timeout has passed
- on-resume = "${pkgs.hyprland}/bin/hyprctl dispatch dpms on"; # screen on when activity is detected after timeout has fired.
- }
- {
- timeout = 300;
- on-timeout = "${pkgs.systemd}/bin/systemctl suspend"; # suspend pc
- }
- ];
- };
};
};
}
diff --git a/modules/non-nix_configs/ghostty/config b/modules/non-nix_configs/ghostty/config
index dfad3d5..beb4117 100644
--- a/modules/non-nix_configs/ghostty/config
+++ b/modules/non-nix_configs/ghostty/config
@@ -21,6 +21,7 @@ gtk-wide-tabs = true
# Font
font-size = 14
+font-family = JetBrainsMono NF
# Theme
# theme = Grape
diff --git a/modules/non-nix_configs/hypr/hypridle.conf b/modules/non-nix_configs/hypr/hypridle.conf
new file mode 100644
index 0000000..409d0a9
--- /dev/null
+++ b/modules/non-nix_configs/hypr/hypridle.conf
@@ -0,0 +1,33 @@
+general {
+ after_sleep_cmd=hyprctl dispatch dpms on
+ before_sleep_cmd=loginctl lock-session
+ lock_cmd=pidof hyprlock || hyprlock
+}
+
+listeners {
+ on-resume=brightnessctl -r
+ on-timeout=brightnessctl -s set 10
+ timeout=120
+}
+
+listeners {
+ on-resume=brightnessctl -rd rgb:kbd_backlight
+ on-timeout=brightnessctl -sd rgb:kbd_backlight set 0
+ timeout=120
+}
+
+listeners {
+ on-timeout=loginctl lock-session
+ timeout=180
+}
+
+listeners {
+ on-resume=hyprctl dispatch dpms on
+ on-timeout=hyprctl dispatch dpms off
+ timeout=300
+}
+
+listeners {
+ on-timeout=systemctl suspend
+ timeout=300
+}
diff --git a/modules/non-nix_configs/hypr/hyprland.conf b/modules/non-nix_configs/hypr/hyprland.conf
new file mode 100644
index 0000000..cfde284
--- /dev/null
+++ b/modules/non-nix_configs/hypr/hyprland.conf
@@ -0,0 +1,291 @@
+# Startup
+exec-once = dbus-update-activation-environment --systemd --all && systemctl --user stop hyprland-session.target && systemctl --user start hyprland-session.target
+exec-once=wl-clipboard-history -t
+exec-once=wl-paste -p --watch wl-copy -p ''
+exec-once=fcitx5 -d
+
+# Monitors
+
+monitor=eDP-1,1920x1080@60,0x0,1
+monitor=HDMI-A-1,2550x1440@144,auto,1,mirror,eDP-1
+monitor=,preferred,auto,1,mirror,eDP-1
+
+# Environment
+
+env=WLR_NO_HARDWARE_CURSORS,1
+env=HYPRCURSOR_THEME,Bibata-Modern-Ice
+env=HYPRCURSOR_SIZE,24
+env=XDG_CURRENT_DESKTOP,Hyprland
+env=XDG_SESSION_TYPE,wayland
+env=XDG_SESSION_DESKTOP,Hyprland
+env=GTK_THEME,Materia-dark
+env=QT_QPA_PLATFORM,xcb;Hyprland
+env=XCURSOR_THEME,Bibata-Modern-Ice
+env=XCURSOR_SIZE,24
+
+animations {
+ bezier=myBezier, 0.05, 0.9, 0.1, 1.05
+ animation=windows, 1, 7, myBezier
+ animation=windowsOut, 1, 7, default, popin 80%
+ animation=border, 1, 10, default
+ animation=borderangle, 1, 8, default
+ animation=fade, 1, 7, default
+ animation=workspaces, 1, 6, default
+ enabled=true
+}
+
+debug {
+ disable_logs=true
+}
+
+decoration {
+ blur {
+ enabled=true
+ new_optimizations=on
+ passes=1
+ size=3
+ xray=true
+ }
+
+ shadow {
+ color=rgba(1a1a1aee)
+ enabled=true
+ range=4
+ render_power=3
+ }
+ rounding=10
+}
+
+dwindle {
+ preserve_split=true
+ pseudotile=true
+}
+
+ecosystem {
+ no_donation_nag=true
+ no_update_news=true
+}
+
+experimental {
+ xx_color_management_v4=true
+}
+
+$purple=rgba(881798FF)
+$crimson=rgba(471520FF)
+
+general {
+ border_size=2
+ col.active_border=$purple
+ col.inactive_border=$crimson
+ gaps_in=2
+ gaps_out=4
+ layout=dwindle
+}
+
+gestures {
+ workspace_swipe=true
+ workspace_swipe_forever=true
+}
+
+input {
+ touchpad {
+ disable_while_typing=true
+ drag_lock=false
+ middle_button_emulation=true
+ natural_scroll=true
+ scroll_factor=0.500000
+ tap-to-click=true
+ }
+ follow_mouse=1
+ kb_layout=us
+ kb_model=
+ kb_options=
+ kb_rules=
+ kb_variant=
+ numlock_by_default=true
+ sensitivity=0
+}
+
+misc {
+ disable_hyprland_logo=false
+ disable_splash_rendering=false
+ key_press_enables_dpms=true
+ mouse_move_enables_dpms=true
+}
+
+# Window Rules
+
+windowrule=idleinhibit fullscreen, class:firefox
+windowrule=idleinhibit fullscreen, class:floorp
+windowrule=idleinhibit fullscreen, class:ghostty
+windowrule=idleinhibit focus, class:firefox
+windowrule=idleinhibit focus, class:floorp
+windowrule=idleinhibit focus, class:mpv
+windowrule=idleinhibit focus, class:^(emacs)$
+windowrule=idleinhibit focus, class:^(Emacs)$
+windowrule=idleinhibit focus, class:^(discord)$
+windowrule=idleinhibit focus, class:^(Discord)$
+windowrule=idleinhibit focus, class:^(spotify)$
+windowrule=float, class:polkit-kde-authentication-agent-1
+windowrule=float, class:^(praat)$
+windowrule=float, class:^(network)$
+windowrule=float, class:^(nm-)$
+windowrule=float, class:^(Network)$
+windowrule=float, class:Rofi
+windowrule=float, class:Gimp
+windowrule=float, class:Nautilus
+windowrule=float, class:notification
+windowrule=float, class:^(launcher)$
+windowrule=tile, class:Spotify
+windowrule=tile, title:Minecraft
+windowrule=workspace 2, class:KeePassXC
+windowrule=workspace 3, class:firefox
+windowrule=workspace 3, class:floorp
+windowrule=workspace 4, class:Spotify
+windowrule=workspace 6, class:discord
+windowrule=workspace 6, class:Signal
+windowrule=workspace 10, title:Minecraft
+
+# Binds
+
+$altMod=ALT
+$ctrlMod=CTRL
+$lock=hyprlock
+$mainMod=SUPER
+$screenshotarea=hyprctl keyword animation 'fadeOut,0,0,default'; grimblast --notify copy area; hyprctl keyword animation 'fadeOut,1,4,default'
+
+# Binds :: Programs
+
+bind=$altMod, Return, exec, ghostty
+bind=$altMod SHIFT, Return, exec, alacritty
+bind=$mainMod SHIFT, D, exec, discord --enable-blink-features=MiddleClickAutoscroll
+bind=$mainMod SHIFT, E, exec, emacsclient -c -a 'emacs'
+bind=$mainMode SHIFT, F, exec, focus-linux
+bind=$mainMod, SPACE, exec, pkill wofi || wofi
+bind=$mainMod, E, exec, nautilus
+bind=$mainMod, S, exec, spotify
+bind=$mainMod, P, exec, hyprpicker -a -f hex
+bind=, Print, exec, $screenshotarea
+bind=SHIFT, Print, exec, grimblast --notify --cursor copy output
+bind=$mainMod SHIFT, P, pseudo,
+bind=$mainMod, C, killactive,
+bind=$mainMod control, Q, exec, $lock
+bind=$mainMod, F4, exit,
+bind=$mainMod, V, togglefloating,
+bind=$mainMod SHIFT, S, togglesplit,
+
+# Binds :: Navigation
+
+bind=$mainMod, F, fullscreen,
+bind=$mainMod, H, movefocus, l
+bind=$mainMod, L, movefocus, r
+bind=$mainMod, K, movefocus, u
+bind=$mainMod, J, movefocus, d
+bind=$mainMod, comma, focusmonitor, -1
+bind=$mainMod, period, focusmonitor, +1
+bind=$mainMod SHIFT, H, movewindow, l
+bind=$mainMod SHIFT, L, movewindow, r
+bind=$mainMod SHIFT, K, movewindow, u
+bind=$mainMod SHIFT, J, movewindow, d
+bind=$mainMod SHIFT, comma, movecurrentworkspacetomonitor, -1
+bind=$mainMod SHIFT, period, movecurrentworkspacetomonitor, +1
+bind=$mainMod, right, resizeactive, 10 0
+bind=$mainMod, left, resizeactive, -10 0
+bind=$mainMod, up, resizeactive, 0 -10
+bind=$mainMod, down, resizeactive, 0 10
+bind=$mainMod, 1, workspace, 1
+bind=$mainMod, 2, workspace, 2
+bind=$mainMod, 3, workspace, 3
+bind=$mainMod, 4, workspace, 4
+bind=$mainMod, 5, workspace, 5
+bind=$mainMod, 6, workspace, 6
+bind=$mainMod, 7, workspace, 7
+bind=$mainMod, 8, workspace, 8
+bind=$mainMod, 9, workspace, 9
+bind=$mainMod, 0, workspace, 10
+bind=$mainMod SHIFT, 1, movetoworkspace, 1
+bind=$mainMod SHIFT, 2, movetoworkspace, 2
+bind=$mainMod SHIFT, 3, movetoworkspace, 3
+bind=$mainMod SHIFT, 4, movetoworkspace, 4
+bind=$mainMod SHIFT, 5, movetoworkspace, 5
+bind=$mainMod SHIFT, 6, movetoworkspace, 6
+bind=$mainMod SHIFT, 7, movetoworkspace, 7
+bind=$mainMod SHIFT, 8, movetoworkspace, 8
+bind=$mainMod SHIFT, 9, movetoworkspace, 9
+bind=$mainMod SHIFT, 0, movetoworkspace, 10
+bind=$mainMod SHIFT CTRL, right, movetoworkspace, +1
+bind=$mainMod SHIFT CTRL, left, movetoworkspace, -1
+bind=$mainMod, mouse_down, workspace, e+1
+bind=$mainMod, mouse_up, workspace, e-1
+bind=$mainMod, Tab, workspace, e+1
+bind=$mainMod SHIFT, Tab, workspace, e-1
+bind=$mainMod CTRL, right, workspace, +1
+bind=$mainMod CTRL, left, workspace, -1
+
+bindm=$mainMod, mouse:272, movewindow
+bindm=$mainMod, mouse:273, resizewindow
+
+# Binds :: MultiMedia
+
+binde=, XF86MonBrightnessDown, exec, brightnessctl set 10%- && $HOME/personal/nixos/modules/scripts/progress-notify.sh brightness
+binde=, XF86MonBrightnessUp, exec, brightnessctl set 10%+ && $HOME/personal/nixos/modules/scripts/progress-notify.sh brightness
+bindel=, XF86AudioRaiseVolume, exec, pamixer -i 5 && $HOME/personal/nixos/modules/scripts/progress-notify.sh audio
+bindel=, XF86AudioLowerVolume, exec, pamixer -d 5 && $HOME/personal/nixos/modules/scripts/progress-notify.sh audio
+bindel=, XF86AudioMute, exec, pamixer -t && $HOME/personal/nixos/modules/scripts/progress-notify.sh mute
+bindl=, XF86AudioPlay, exec, playerctl play-pause
+bindl=, XF86AudioNext, exec, playerctl next
+bindl=, XF86AudioPrev, exec, playerctl previous
+
+# Binds :: Submaps
+
+bind = $mainMod, R, submap, resize
+submap = resize
+bind=, escape,submap,reset
+
+binde=, left, resizeactive, -10 0
+bindr=, left, submap, reset
+binde=, right, resizeactive, 10 0
+bindr=, right, submap, reset
+binde=, up, resizeactive, 0 10
+bindr=, up, submap, reset
+binde=, down, resizeactive, 0 -10
+bindr=, down, submap, reset
+
+binde=, H, resizeactive, -10 0
+bindr=, H, submap, reset
+binde=, J, resizeactive, 0 -10
+bindr=, J, submap, reset
+binde=, K, resizeactive, 0 10
+bindr=, K, submap, reset
+binde=, L, resizeactive, 10 0
+bindr=, L, submap, reset
+
+submap=reset
+
+bind = $mainMod, B, submap, browser_select
+submap = browser_select
+
+bind =, B, exec, brave
+bind =, B, submap, reset
+
+bind = SHIFT, F, exec, firefox
+bind = SHIFT, F, submap, reset
+
+bind =, F, exec, floorp
+bind =, F, submap, reset
+
+bind =, C, exec, floorp -p limalone -no-remote
+bind =, C, submap, reset
+
+bind=, escape,submap,reset
+submap=reset
+
+bind = $mainMod SHIFT, V, submap, video_stuff
+submap = video_stuff
+bind = , O, exec, obs
+bind = , O, submap, reset
+bind = , V, exec , kdenlive
+bind = , V, submap, reset
+
+bind=, escape,submap,reset
+submap = reset
diff --git a/modules/non-nix_configs/hypr/hyprlock.conf b/modules/non-nix_configs/hypr/hyprlock.conf
new file mode 100644
index 0000000..03c8f63
--- /dev/null
+++ b/modules/non-nix_configs/hypr/hyprlock.conf
@@ -0,0 +1,65 @@
+background {
+ blur_passes=2
+ blur_size=8
+ path=$HOME/pictures/.wallpapers/bloody_snow.jpg
+}
+
+general {
+ disable_loading_bar=true
+ hide_cursor=true
+ no_fade_in=false
+}
+
+input-field {
+ monitor=
+ size=200, 30
+ capslock_color=#bb00ee
+ check_color=#0eff0d
+ dots_center=false
+ dots_size=0.330000
+ dots_spacing=0.150000
+ fade_on_empty=true
+ fail_color=#ff009e
+ fail_text=$FAIL ($ATTEMPTS)
+ font_color=#efefef
+ inner_color=#0c0c0c
+ outer_color=#fe0b00
+ outline_thickness=3
+ placeholder_text=Enter Password...
+}
+
+label {
+ monitor=
+ color=#ffffee
+ font_family=DejaVu Sans
+ font_size=28
+ halign=center
+ position=0, 80
+ text=$TIME
+ text_align=center
+ valign=center
+}
+
+label {
+ monitor=
+ color=#ffffee
+ font_family=DejaVu Sans
+ font_size=18
+ halign=left
+ position=80, 80
+ text=cmd[update:1000] echo " $(date +'%A, %b %d %Y')"
+ text_align=center
+ valign=bottom
+}
+
+label {
+ monitor=
+ color=#ffffee
+ font_family=DejaVu Sans
+ font_size=18
+ halign=right
+ position=80, 80
+ text=cmd[update:1000] echo "$(cat /sys/class/power_supply/BAT0/capacity)"
+ text_align=center
+ valign=bottom
+}
diff --git a/modules/non-nix_configs/hypr/hyprpaper.conf b/modules/non-nix_configs/hypr/hyprpaper.conf
new file mode 100644
index 0000000..b4e4d20
--- /dev/null
+++ b/modules/non-nix_configs/hypr/hyprpaper.conf
@@ -0,0 +1,5 @@
+ipc=on
+preload=$HOME/pictures/.wallpapers/skyline-view.png
+preload=$HOME/pictures/.wallpapers/iceland-winter-mountains.jpg
+splash=false
+wallpaper=eDP-1,$HOME/pictures/.wallpapers/iceland-winter-mountains.jpg
diff --git a/utils/mkSymlinkAttrs.nix b/utils/mkSymlinkAttrs.nix
new file mode 100644
index 0000000..e1ecb90
--- /dev/null
+++ b/utils/mkSymlinkAttrs.nix
@@ -0,0 +1,69 @@
+# Taken from: https://github.com/urob/dotfiles/blob/main/lib/mkSymlinkAttrs.nix
+
+# This function adds and interpretes outOfStoreSymlink option to home.file attribute sets.
+#
+# Usage:
+# home.file = mkSymlinkAttrs {
+# .foo = { source = "foo"; outOfStoreSymlink = true; recursive = true; };
+# .bar = { source = "foo/bar"; outOfStoreSymlink = true; };
+# };
+{ pkgs, hm, context, runtimeRoot, ... }:
+
+let
+ inherit (pkgs) lib;
+
+ # Swap a path inside the nix store with the same path in runtimeRoot
+ runtimePath = path:
+ let
+ rootStr = toString context; # context is the `self` passed to flake outputs
+ pathStr = toString path;
+ in
+ assert lib.assertMsg (lib.hasPrefix rootStr pathStr)
+ "${pathStr} does not start with ${rootStr}";
+ runtimeRoot + lib.removePrefix rootStr pathStr;
+
+ # Make outOfStoreSymlink against runtimeRoot. This replicates
+ # config.lib.file.mkOutOfStoreSymlink as_mkOutOfStoreSymlink and wraps it to
+ # replace the target path in the nix store with the original target path
+ # inside runtimeRoot. This is necessary because flakes live in the nix store.
+ mkOutOfStoreSymlink =
+ let
+ _mkOutOfStoreSymlink = path:
+ let
+ pathStr = toString path;
+ name = hm.strings.storeFileName (baseNameOf pathStr);
+ in
+ pkgs.runCommandLocal name { } ''ln -s ${lib.strings.escapeShellArg pathStr} $out'';
+ in
+ file: _mkOutOfStoreSymlink (runtimePath file);
+
+ # Recursively make OutOfStoreSymlinks for all files inside path.
+ mkRecursiveOutOfStoreSymlink = path: link:
+ builtins.listToAttrs (
+ map
+ (file: {
+ name = link + "${lib.removePrefix (toString path) (toString file)}";
+ value = { source = mkOutOfStoreSymlink file; };
+ })
+ (lib.filesystem.listFilesRecursive path)
+ );
+
+ # Remove custom attributes from attribute set.
+ rmopts = attrs: builtins.removeAttrs attrs [ "source" "recursive" "outOfStoreSymlink" ];
+
+in fileAttrs: lib.attrsets.concatMapAttrs
+ (
+ name: value:
+ # Make outOfStoreSymlinks
+ if value.outOfStoreSymlink or false
+ then
+ if value.recursive or false
+ then
+ lib.attrsets.mapAttrs
+ (_: attrs: attrs // rmopts value)
+ (mkRecursiveOutOfStoreSymlink value.source name)
+ else { "${name}" = { source = mkOutOfStoreSymlink value.source; } // rmopts value; }
+ # Handle all other cases as usual
+ else { "${name}" = value; }
+ )
+ fileAttrs