diff --git a/flake.lock b/flake.lock index 94a81d1..af80eb1 100644 --- a/flake.lock +++ b/flake.lock @@ -18,6 +18,28 @@ "type": "github" } }, + "hjem": { + "inputs": { + "nix-darwin": "nix-darwin", + "nixpkgs": [ + "nixpkgs" + ], + "smfh": "smfh" + }, + "locked": { + "lastModified": 1773801621, + "narHash": "sha256-hOweDMc/uNFeliSVuNXZ4qa6WC8AbmRV8pNSAD/h4S0=", + "owner": "feel-co", + "repo": "hjem", + "rev": "d51b2e524794a61762453be5bf7b4fe259150191", + "type": "github" + }, + "original": { + "owner": "feel-co", + "repo": "hjem", + "type": "github" + } + }, "import-tree": { "locked": { "lastModified": 1773693634, @@ -33,6 +55,27 @@ "type": "github" } }, + "nix-darwin": { + "inputs": { + "nixpkgs": [ + "hjem", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770922915, + "narHash": "sha256-6J/JoK9iL7sHvKJcGW2KId2agaKv1OGypsa7kN+ZBD4=", + "owner": "nix-darwin", + "repo": "nix-darwin", + "rev": "6c5a56295d2a24e43bcd8af838def1b9a95746b2", + "type": "github" + }, + "original": { + "owner": "nix-darwin", + "repo": "nix-darwin", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1774106199, @@ -83,21 +126,82 @@ "root": { "inputs": { "flake-parts": "flake-parts", + "hjem": "hjem", "import-tree": "import-tree", "nixpkgs": "nixpkgs", "wrapper-modules": "wrapper-modules" } }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "hjem", + "smfh", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1771125043, + "narHash": "sha256-ldf/s49n6rOAxl7pYLJGGS1N/assoHkCOWdEdLyNZkc=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "4912f951a26dc8142b176be2c2ad834319dc06e8", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "smfh": { + "inputs": { + "nixpkgs": [ + "hjem", + "nixpkgs" + ], + "rust-overlay": "rust-overlay", + "systems": "systems" + }, + "locked": { + "lastModified": 1771208268, + "narHash": "sha256-6zMgOPzBbTSm8jzPqmGcotjvkN3HzxcnMM8pW64JpZQ=", + "owner": "feel-co", + "repo": "smfh", + "rev": "dd0a33fc9d1fe7c29da86225af4b4a47b1714839", + "type": "github" + }, + "original": { + "owner": "feel-co", + "repo": "smfh", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, "wrapper-modules": { "inputs": { "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1774400689, - "narHash": "sha256-hHABVYL0rxhVIzc7hZEpvE0eiCKPnevte73Tn6FRolo=", + "lastModified": 1774538285, + "narHash": "sha256-KRDNQDEWjB2O5SRH/oUTzi34cNxlIT8sab0FK2uqZ2g=", "owner": "BirdeeHub", "repo": "nix-wrapper-modules", - "rev": "54645978682ff99594a1d1666dde6fac6a8134f2", + "rev": "15d740b2bfc545189a569147da7718457c12758e", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 653c0d2..944d8a1 100644 --- a/flake.nix +++ b/flake.nix @@ -5,6 +5,11 @@ flake-parts.url = "github:hercules-ci/flake-parts"; import-tree.url = "github:vic/import-tree"; + hjem = { + url = "github:feel-co/hjem"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + wrapper-modules.url = "github:BirdeeHub/nix-wrapper-modules"; }; diff --git a/modules/features/hyprland/default.nix b/modules/features/hyprland/default.nix new file mode 100644 index 0000000..aa32bc5 --- /dev/null +++ b/modules/features/hyprland/default.nix @@ -0,0 +1,60 @@ +{ self, inputs, ... }: { + flake.nixosModules.hyprland = { pkgs, lib, config, ... }: { + imports = [ self.nixosModules.cursors ]; + + options.hyprland-users = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = []; + description = "List of users to configure hyprland for"; + }; + + config = { + # System-level configuration + programs.hyprland.enable = true; + + environment.systemPackages = with pkgs; [ + waybar + hyprpaper + wofi + kitty + firefox + dolphin + wl-clipboard + brightnessctl + playerctl + grim + xdg-desktop-portal-hyprland + xdg-desktop-portal-gtk + gnome-keyring + seahorse + ]; + + services.gnome.gnome-keyring.enable = true; + services.dbus.packages = [ pkgs.gnome-keyring pkgs.gcr ]; + programs.seahorse.enable = true; + + xdg.portal = { + enable = true; + extraPortals = [ + pkgs.xdg-desktop-portal-gtk + pkgs.xdg-desktop-portal-hyprland + ]; + configPackages = [ pkgs.xdg-desktop-portal-gnome ]; + }; + + # Configure hjem for specified users + hjem = lib.mkIf (config.hyprland-users != []) { + users = lib.genAttrs config.hyprland-users (username: { + enable = true; + files = { + ".config/hypr/hyprland.conf".source = ./hyprland.conf; + ".config/hypr/hyprpaper.conf".source = ./hyprpaper.conf; + }; + }); + }; + + # Enable cursors for hyprland users + cursor-users = lib.mkDefault config.hyprland-users; + }; + }; +} diff --git a/modules/features/hyprland/hyprland.conf b/modules/features/hyprland/hyprland.conf new file mode 100644 index 0000000..ebd5316 --- /dev/null +++ b/modules/features/hyprland/hyprland.conf @@ -0,0 +1,301 @@ +################ +### MONITORS ### +################ + +# See https://wiki.hyprland.org/Configuring/Monitors/ +monitor=,preferred,auto,1 + +# set the cursor theme +env = HYPRCURSOR_THEME,Bibata-Modern-Ice + + +################### +### MY PROGRAMS ### +################### + +# See https://wiki.hyprland.org/Configuring/Keywords/ + +# Set programs that you use +$terminal = kitty +$browser = firefox +$fileManager = dolphin +$menu = wofi --show drun + + +################# +### AUTOSTART ### +################# + +# Autostart necessary processes (like notifications daemons, status bars, etc.) +# Or execute your favorite apps at launch like this: + +# exec-once = $terminal +# exec-once = nm-applet & +exec-once = hyprctl setcursor Bibata-Modern-Ice 24 +exec-once = waybar & hyprpaper +# This exports the necessary variables for Electron to find the Keyring +exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP +# This starts the daemon and makes it the "Secret Service" provider +exec-once = gnome-keyring-daemon --start --components=secrets + + +############################# +### ENVIRONMENT VARIABLES ### +############################# + +# See https://wiki.hyprland.org/Configuring/Environment-variables/ + +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 + + +################### +### PERMISSIONS ### +################### + +# See https://wiki.hyprland.org/Configuring/Permissions/ +# Please note permission changes here require a Hyprland restart and are not applied on-the-fly +# for security reasons + +# ecosystem { +# enforce_permissions = 1 +# } + +# permission = /usr/(bin|local/bin)/grim, screencopy, allow +# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow +# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow + + +##################### +### LOOK AND FEEL ### +##################### + +# Refer to https://wiki.hyprland.org/Configuring/Variables/ + +# https://wiki.hyprland.org/Configuring/Variables/#general +general { + gaps_in = 5 + gaps_out = 20 + + border_size = 2 + + # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors + col.active_border = rgb(f9e2af) + col.inactive_border = rgba(595959aa) + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false + + # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + allow_tearing = false + + layout = dwindle +} + +# https://wiki.hyprland.org/Configuring/Variables/#decoration +decoration { + rounding = 0 + # rounding_power = 2 + + # Change transparency of focused and unfocused windows + active_opacity = 1.0 + inactive_opacity = 1.0 + + shadow { + enabled = true + range = 4 + render_power = 3 + color = rgba(1a1a1aee) + } + + # https://wiki.hyprland.org/Configuring/Variables/#blur + blur { + enabled = true + size = 3 + passes = 1 + + vibrancy = 0.1696 + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#animations +animations { + enabled = yes, please :) + + # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + + bezier = easeOutQuint,0.23,1,0.32,1 + bezier = easeInOutCubic,0.65,0.05,0.36,1 + bezier = linear,0,0,1,1 + bezier = almostLinear,0.5,0.5,0.75,1.0 + bezier = quick,0.15,0,0.1,1 + + animation = global, 1, 10, default + animation = border, 1, 5.39, easeOutQuint + animation = windows, 1, 4.79, easeOutQuint + animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% + animation = windowsOut, 1, 1.49, linear, popin 87% + animation = fadeIn, 1, 1.73, almostLinear + animation = fadeOut, 1, 1.46, almostLinear + animation = fade, 1, 3.03, quick + animation = layers, 1, 3.81, easeOutQuint + animation = layersIn, 1, 4, easeOutQuint, fade + animation = layersOut, 1, 1.5, linear, fade + animation = fadeLayersIn, 1, 1.79, almostLinear + animation = fadeLayersOut, 1, 1.39, almostLinear + animation = workspaces, 1, 1.94, almostLinear, fade + animation = workspacesIn, 1, 1.21, almostLinear, fade + animation = workspacesOut, 1, 1.94, almostLinear, fade +} + +# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/ +# "Smart gaps" / "No gaps when only" +# uncomment all if you wish to use that. +# workspace = w[tv1], gapsout:0, gapsin:0 +# workspace = f[1], gapsout:0, gapsin:0 +# windowrule = bordersize 0, floating:0, onworkspace:w[tv1] +# windowrule = rounding 0, floating:0, onworkspace:w[tv1] +# windowrule = bordersize 0, floating:0, onworkspace:f[1] +# windowrule = rounding 0, floating:0, onworkspace:f[1] + +# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more +dwindle { + pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = true # You probably want this +} + +# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more +master { + new_status = master +} + +# https://wiki.hyprland.org/Configuring/Variables/#misc +misc { + force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( +} + + +############# +### INPUT ### +############# + +# https://wiki.hyprland.org/Configuring/Variables/#input +input { + kb_options = caps:escape, compose:ralt + kb_variant = + kb_model = + kb_rules = + + follow_mouse = 1 + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + + touchpad { + natural_scroll = true + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#gestures +gestures { + workspace_swipe = false +} + +# Example per-device config +# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more +device { + name = epic-mouse-v1 + sensitivity = -0.5 +} + + +################### +### KEYBINDINGS ### +################### + +# See https://wiki.hyprland.org/Configuring/Keywords/ +$mainMod = SUPER # Sets "Windows" key as main modifier + +# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more +bind = $mainMod, RETURN, exec, $terminal +bind = $mainMod SHIFT, W, exec, $browser +bind = $mainMod SHIFT, C, killactive, +bind = $mainMod, M, exit, +bind = $mainMod, E, exec, $fileManager +bind = $mainMod, V, togglefloating, +bind = $mainMod, R, exec, $menu +bind = $mainMod, P, pseudo, # dwindle +bind = $mainMod, J, togglesplit, # dwindle + +# Move focus with mainMod + arrow keys +bind = $mainMod, left, movefocus, l +bind = $mainMod, right, movefocus, r +bind = $mainMod, up, movefocus, u +bind = $mainMod, down, movefocus, d + +# Switch workspaces with mainMod + [0-9] +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 + +# Move active window to a workspace with mainMod + SHIFT + [0-9] +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 + +# Example special workspace (scratchpad) +bind = $mainMod, S, togglespecialworkspace, magic +bind = $mainMod SHIFT, S, movetoworkspace, special:magic + +# Scroll through existing workspaces with mainMod + scroll +bind = $mainMod, mouse_down, workspace, e+1 +bind = $mainMod, mouse_up, workspace, e-1 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod SHIFt, mouse:272, resizewindow + +# Laptop multimedia keys for volume and LCD brightness +bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ +bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle +bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+ +bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%- + +# Requires playerctl +bindl = , XF86AudioNext, exec, playerctl next +bindl = , XF86AudioPause, exec, playerctl play-pause +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPrev, exec, playerctl previous + +############################## +### WINDOWS AND WORKSPACES ### +############################## + +# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more +# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules + +# Example windowrule +windowrulev2 = workspace 2, class:^(firefox)$ +windowrulev2 = workspace 4, class:^(vesktop)$ + +# Ignore maximize requests from apps. You'll probably like this. +windowrule = suppressevent maximize, class:.* + +# Fix some dragging issues with XWayland +windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 diff --git a/modules/features/hyprland/hyprpaper.conf b/modules/features/hyprland/hyprpaper.conf new file mode 100644 index 0000000..8e1493e --- /dev/null +++ b/modules/features/hyprland/hyprpaper.conf @@ -0,0 +1,9 @@ +wallpaper { + monitor = eDP-1 + path = /home/jingo/dev/dotfiles/wallpapers/Augustine/Augustine-catppuccin-mocha.png + fit_mode = cover +} + +ipc=on +splash=false +splash_offset=2 diff --git a/modules/features/layers/base.nix b/modules/features/layers/base.nix index bb36e4b..1f8e556 100644 --- a/modules/features/layers/base.nix +++ b/modules/features/layers/base.nix @@ -1,5 +1,6 @@ { self, inputs, ... }: { flake.nixosModules.base = { pkgs, lib, ... }: { + imports = [ inputs.hjem.nixosModules.default ]; # Set your time zone. time.timeZone = "America/Chicago"; diff --git a/modules/features/layers/cursors.nix b/modules/features/layers/cursors.nix new file mode 100644 index 0000000..1d02ca5 --- /dev/null +++ b/modules/features/layers/cursors.nix @@ -0,0 +1,41 @@ +{ self, inputs, ... }: { + flake.nixosModules.cursors = { pkgs, lib, config, ... }: { + options.cursor-users = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = []; + description = "List of users to configure cursors for"; + }; + + config = { + # Install cursor packages system-wide + environment.systemPackages = with pkgs; [ + bibata-cursors + ]; + + # Set up XDG data directories for cursor themes + environment.pathsToLink = [ "/share/icons" ]; + + # Configure hjem for specified users - set cursor theme in user config + hjem = lib.mkIf (config.cursor-users != []) { + users = lib.genAttrs config.cursor-users (username: { + enable = true; + files = { + # GTK cursor settings + ".config/gtk-3.0/settings.ini".text = '' + [Settings] + gtk-cursor-theme-name=Bibata-Modern-Ice + gtk-cursor-theme-size=24 + ''; + # X11/Wayland cursor environment + ".config/environment.d/cursor.conf".text = '' + XCURSOR_THEME=Bibata-Modern-Ice + XCURSOR_SIZE=24 + HYPRCURSOR_THEME=Bibata-Modern-Ice + HYPRCURSOR_SIZE=24 + ''; + }; + }); + }; + }; + }; +} diff --git a/modules/features/layers/hyprland.nix b/modules/features/layers/hyprland.nix deleted file mode 100644 index 77c05c6..0000000 --- a/modules/features/layers/hyprland.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ self, inputs, ... }: { - flake.nixosModules.hyprland = { pkgs, lib, ... }: { - programs.hyprland.enable = true; - }; -} diff --git a/modules/features/layers/users/jingo.nix b/modules/features/layers/users/jingo.nix new file mode 100644 index 0000000..19ec2ac --- /dev/null +++ b/modules/features/layers/users/jingo.nix @@ -0,0 +1,5 @@ +{ self, inputs, ... }: { + flake.nixosModules.user-jingo = { ... }: { + hyprland-users = [ "jingo" ]; + }; +} diff --git a/modules/features/layers/users/jingus.nix b/modules/features/layers/users/jingus.nix new file mode 100644 index 0000000..2d4dfd2 --- /dev/null +++ b/modules/features/layers/users/jingus.nix @@ -0,0 +1,5 @@ +{ self, inputs, ... }: { + flake.nixosModules.user-jingus = { ... }: { + niri-users = [ "jingus" ]; + }; +} diff --git a/modules/features/niri.nix b/modules/features/niri.nix index a5c33d9..98e7749 100644 --- a/modules/features/niri.nix +++ b/modules/features/niri.nix @@ -1,10 +1,24 @@ { self, inputs, ... }: { - flake.nixosModules.niri = { pkgs, lib, ... }: { - programs.niri = { - enable = true; - package = self.packages.${pkgs.stdenv.hostPlatform.system}.myNiri; + flake.nixosModules.niri = { pkgs, lib, config, ... }: { + imports = [ self.nixosModules.cursors ]; + + options.niri-users = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = []; + description = "List of users to configure niri for"; + }; + + config = { + programs.niri = { + enable = true; + package = self.packages.${pkgs.stdenv.hostPlatform.system}.myNiri; + }; + + # Enable cursors for niri users + cursor-users = lib.mkDefault config.niri-users; }; }; + perSystem = { pkgs, lib, self', ... }: { packages.myNiri = inputs.wrapper-modules.wrappers.niri.wrap { inherit pkgs; diff --git a/modules/hosts/desktop/configuration.nix b/modules/hosts/desktop/configuration.nix index 93d74b2..915404c 100644 --- a/modules/hosts/desktop/configuration.nix +++ b/modules/hosts/desktop/configuration.nix @@ -11,6 +11,8 @@ self.nixosModules.desktopHardware self.nixosModules.niri self.nixosModules.librewolf + self.nixosModules.user + self.nixosModules.user-jingus ]; programs.firefox.enable = true; diff --git a/modules/hosts/laptop/configuration.nix b/modules/hosts/laptop/configuration.nix index 4935524..0fd636e 100644 --- a/modules/hosts/laptop/configuration.nix +++ b/modules/hosts/laptop/configuration.nix @@ -9,6 +9,8 @@ self.nixosModules.pipewire self.nixosModules.development self.nixosModules.librewolf + self.nixosModules.hyprland + self.nixosModules.user-jingo ]; # Bootloader. @@ -80,7 +82,6 @@ # enable = true; # enableSSHSupport = true; # }; - programs.hyprland.enable = true; virtualisation.docker.enable = true; # enable emulation for ARM (for cross-compiling for RaspberryPi)