diff --git a/config/common.nix b/config/common.nix index 5f142c2..fed5d2e 100644 --- a/config/common.nix +++ b/config/common.nix @@ -100,4 +100,5 @@ "lsa" = "ls -al"; }; + environment.pathsToLink = [ "/share/applications" "/share/xdg-desktop-portal" ]; } diff --git a/config/desktop.nix b/config/desktop.nix index 8b4e6d7..183bdc9 100644 --- a/config/desktop.nix +++ b/config/desktop.nix @@ -8,19 +8,13 @@ enable = true; }; - # Enable the X11 windowing system. - services.xserver.enable = true; - # Enable the GNOME Desktop Environment. - services.displayManager.gdm.enable = false; # use sddm until gnome 50 due to https://github.com/systemd/systemd/issues/39259 - services.displayManager.sddm.enable = true; - services.desktopManager.gnome.enable = true; - - # Configure keymap in X11 - services.xserver.xkb = { - layout = "us"; - variant = ""; - }; + services.displayManager.gdm.enable = true; # use sddm until gnome 50 due to https://github.com/systemd/systemd/issues/39259 + services.displayManager.sddm.enable = false; + services.displayManager.sddm.wayland.enable = false; + services.desktopManager.gnome.enable = false; + programs.hyprland.enable = true; + security.pam.services.hyprlock = {}; hardware.bluetooth.enable = true; hardware.bluetooth.powerOnBoot = true; @@ -55,8 +49,8 @@ openFirewall = true; host = "0.0.0.0"; # Optional: preload models, see https://ollama.com/library - loadModels = [ "gemma3:4b-it-qat" ]; - package = pkgs.unstable.ollama-cuda; + loadModels = [ "gemma4" ]; + package = pkgs.unstable.ollama; }; @@ -105,6 +99,7 @@ gnomeExtensions.blur-my-shell gnomeExtensions.caffeine gnomeExtensions.dash-to-dock + gnomeExtensions.pop-shell inkscape bitwarden-desktop bitwarden-cli @@ -136,6 +131,7 @@ restic-browser # games + webcord heroic lutris cataclysm-dda @@ -175,6 +171,7 @@ noto-fonts-color-emoji corefonts fira-mono + font-awesome_5 ]; fonts.fontconfig = { antialias = true; @@ -322,5 +319,5 @@ }; virtualisation.spiceUSBRedirection.enable = true; - services.flatpak.enable = true; + #services.flatpak.enable = true; } diff --git a/flake.nix b/flake.nix index d883ad5..787b1ff 100644 --- a/flake.nix +++ b/flake.nix @@ -17,7 +17,10 @@ { self, nixpkgs, home-manager, home-manager-unstable, nix-darwin, ... }@inputs: { nixosConfigurations.desktop = nixpkgs.lib.nixosSystem { - specialArgs = {inherit inputs;}; + specialArgs = { + inherit self inputs; + hostname = "nixos-desktop"; + }; #inherit system; modules = [ ./config/common.nix @@ -29,6 +32,10 @@ { home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; + home-manager.extraSpecialArgs = { + inherit inputs; + hostname = "nixos-desktop"; + }; home-manager.users.admin = { imports = [ ./home/common.nix diff --git a/home/desktop.nix b/home/desktop.nix index 853dcef..95ce944 100644 --- a/home/desktop.nix +++ b/home/desktop.nix @@ -1,4 +1,4 @@ -{ pkgs, ... }: +{ pkgs, hostname, ... }: { @@ -13,7 +13,551 @@ ''; }; - + home.pointerCursor = { + gtk.enable = true; + # x11.enable = true; + package = pkgs.apple-cursor; + name = "macOS"; + size = 20; + }; + +# gtk = { +# enable = true; +# theme = { +# package = pkgs.flat-remix-gtk; +# name = "Flat-Remix-GTK-Grey-Darkest"; +# }; +# +# iconTheme = { +# package = pkgs.adwaita-icon-theme; +# name = "Adwaita"; +# }; +# +# font = { +# name = "Sans"; +# size = 11; +# }; +# }; + + home.packages = with pkgs; [ + grim #screenshots + slurp #screenshot selection + wl-clipboard # copy to clipboard + glib # gsettings + gsettings-desktop-schemas # gsettings + ]; + + programs.kitty.enable = true; + + services.mako.enable = true; + + dconf.settings = { + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + }; + }; + programs.waybar = { + #systemd.enable = true; + #systemd.target = "hyprland-session.target"; + enable = true; + style = '' + @define-color background #1a1a2e; + @define-color foreground #e0e0e0; + * { + /* background-color: @background; */ + /* color: @foreground; */ + + border: none; + padding: 0px; + min-height: 0; + font-family: "DejaVu Sans", "Font Awesome 5 Free"; + font-weight: normal; + font-size: 12px; + } + #waybar > .horizontal { + padding-top: 2px; + } + + window#waybar { + background-color: @background; + color: @foreground; + border-bottom: 2px solid alpha(@foreground, 0.9); + transition-property: background-color; + transition-duration: .5s; + border-left: 2px solid alpha(@foreground, 0.9); + border-right: 2px solid alpha(@foreground, 0.9); + border-radius: 2px; + } + + #window { + text-shadow: 0px 0px 2px alpha(@foreground, 0.4); + } + + + #workspaces { + background: transparent; + margin: 3px 0px; + padding: 10px 6px; + margin-left: -6px; + margin-top: 0px; + margin-bottom: 0px; + } + + #workspaces button { + min-width: 8px; + min-height: 8px; + padding: 1; + margin: 0 6px; + border-radius: 2px; + background-color: alpha(@foreground, 0.75); + transition: all 0.15s ease-in-out; + } + + #workspaces button.active, + #workspaces button:hover { + background-color: @foreground; + min-width: 25px; + border-radius: 2px; + transition: all 0.15s ease-in-out; + } + #workspaces button.empty { + opacity: 0.45; + } + + + #workspaces button label { + font-size: 0px; + } + + #workspaces button { + /* margin-top: 1px; */ + /* margin-bottom: -1px; */ + font-size: 12.5px; + background: @foreground; + font-weight: 800; + } + ''; + settings = { + mainBar = { + modules-left = [ "hyprland/workspaces" ]; + modules-center = [ "hyprland/window" ]; + modules-right = [ "tray" "idle_inhibitor" "privacy" "pulseaudio" "clock" ]; + + clock = { + format = "{:%a %b %d %H:%M}"; + }; + + idle_inhibitor = { + format = "{icon}"; + format-icons = { + activated = ""; + deactivated = ""; + }; + }; + + pulseaudio = { + format = "{icon}"; + format-muted = ""; + format-icons = { + default = ["" ""]; + }; + on-scroll-up = "wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 10%+"; + on-scroll-down = "wpctl set-volume @DEFAULT_AUDIO_SINK@ 10%-"; + on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; + }; + }; + }; + }; + programs.wofi.enable = true; + programs.hyprlock.enable = true; + + services.hypridle = { + enable = true; + settings = { + general = { + lock_cmd = "pidof hyprlock || hyprlock"; + }; + + listener = [ + { + timeout = 300; + on-timeout = "loginctl lock-session & hyprctl dispatch dpms off"; + on-resume = "hyprctl dispatch dpms on"; + } + { + timeout = 900; + on-timeout = "systemctl suspend"; + on-resume = "hyprctl dispatch dpms on"; + } + ]; + }; + }; + + wayland.windowManager.hyprland = { + enable = true; + plugins = [ + pkgs.hyprlandPlugins.hyprbars + ]; + settings = { + # This is an example Hyprland config file for Nix. + # Refer to the wiki for more information. + # https://wiki.hypr.land/Configuring/ + # https://wiki.hypr.land/Nix/ + # https://wiki.hypr.land/Nix/Hyprland-on-NixOS/ + # https://wiki.hypr.land/Nix/Hyprland-on-Home-Manager/ + + # Please note not all available settings / options are set here. + # For a full list, see the wiki + + # You can split this configuration into multiple files + # Create your files separately and then link them to this file like this: + # source = ~/.config/hypr/myColors.conf + # todo: make the line above nix-ish + + + ################ + ### MONITORS ### + ################ + + # See https://wiki.hypr.land/Configuring/Monitors/ + #monitor = ",preferred,auto,auto"; + monitor = + if ( hostname == "nixos-desktop" ) + then [ + "DP-2, 2560x1440@180,0x0,1,vrr,1,bitdepth,10" + "HDMI-A-1, 1920x1080@75,2560x0,1,vrr,1" + ] + else [ + ",preferred,auto,auto" + ]; + + + + ################### + ### MY PROGRAMS ### + ################### + + # See https://wiki.hypr.land/Configuring/Keywords/ + + # Set programs that you use + + "$terminal" = "kitty"; + "$fileManager" = "dolphin"; + "$menu" = "wofi --show drun"; + "$browser" = "brave"; + + + ################# + ### AUTOSTART ### + ################# + + # Autostart necessary processes (like notifications daemons, status bars, etc.) + # Or execute your favorite apps at launch like this: + + exec-once = [ + "waybar" + "steam -silent" + + #"[workspace 1 silent]$browser" + #"[workspace 3 silent]proton-mail" + #"[workspace 2 silent]signal-desktop" + #"[workspace 2 silent]steam" + ]; + + + ############################# + ### ENVIRONMENT VARIABLES ### + ############################# + + # See https://wiki.hypr.land/Configuring/Environment-variables/ + + env = [ + "XCURSOR_SIZE,24" + "HYPRCURSOR_SIZE,24" + ]; + + + ################### + ### PERMISSIONS ### + ################### + + # See https://wiki.hypr.land/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" + "/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow" + # "/usr/(bin|local/bin)/hyprpm, plugin, allow" + ]; + + + ##################### + ### LOOK AND FEEL ### + ##################### + + # Refer to https://wiki.hypr.land/Configuring/Variables/ + + # https://wiki.hypr.land/Configuring/Variables/#general + general = { + gaps_in = 5; + gaps_out = 20; + + border_size = 2; + + "col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg"; + "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.hypr.land/Configuring/Tearing/ before you turn this on + allow_tearing = false; + + layout = "dwindle"; + }; + + # https://wiki.hypr.land/Configuring/Variables/#decoration + decoration = { + rounding = 10; + 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.hypr.land/Configuring/Variables/#blur + blur = { + enabled = true; + size = 3; + passes = 1; + + vibrancy = 0.1696; + }; + }; + + # https://wiki.hypr.land/Configuring/Variables/#animations + animations = { + enabled = "yes, please :)"; + + # Default animations, see https://wiki.hypr.land/Configuring/Animations/ for more + + bezier = [ + "easeOutQuint,0.23,1,0.32,1" + "easeInOutCubic,0.65,0.05,0.36,1" + "linear,0,0,1,1" + "almostLinear,0.5,0.5,0.75,1.0" + "quick,0.15,0,0.1,1" + ]; + + animation = [ + "global, 1, 10, default" + "border, 1, 5.39, easeOutQuint" + "windows, 1, 4.79, easeOutQuint" + "windowsIn, 1, 4.1, easeOutQuint, popin 87%" + "windowsOut, 1, 1.49, linear, popin 87%" + "fadeIn, 1, 1.73, almostLinear" + "fadeOut, 1, 1.46, almostLinear" + "fade, 1, 3.03, quick" + "layers, 1, 3.81, easeOutQuint" + "layersIn, 1, 4, easeOutQuint, fade" + "layersOut, 1, 1.5, linear, fade" + "fadeLayersIn, 1, 1.79, almostLinear" + "fadeLayersOut, 1, 1.39, almostLinear" + "workspaces, 1, 1.94, almostLinear, fade" + "workspacesIn, 1, 1.21, almostLinear, fade" + "workspacesOut, 1, 1.94, almostLinear, fade" + "zoomFactor, 1, 7, quick" + ]; + }; + + # Ref https://wiki.hypr.land/Configuring/Workspace-Rules/ + # "Smart gaps" / "No gaps when only" + # uncomment all if you wish to use that. + # workspace = [ + # "w[tv1], gapsout:0, gapsin:0" + # "f[1], gapsout:0, gapsin:0" + # ]; + # windowrule = [ + # "bordersize 0, floating:0, onworkspace:w[tv1]" + # "rounding 0, floating:0, onworkspace:w[tv1]" + # "bordersize 0, floating:0, onworkspace:f[1]" + # "rounding 0, floating:0, onworkspace:f[1]" + # ]; + + # See https://wiki.hypr.land/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.hypr.land/Configuring/Master-Layout/ for more + master = { + new_status = "master"; + }; + + # https://wiki.hypr.land/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.hypr.land/Configuring/Variables/#input + input = { + kb_layout = "us"; + kb_variant = ""; + kb_model = ""; + kb_options = ""; + kb_rules = ""; + + follow_mouse = 1; + + sensitivity = 0; # -1.0 - 1.0, 0 means no modification. + + touchpad = { + disable_while_typing = false; + natural_scroll = false; + }; + }; + + # https://wiki.hypr.land/Configuring/Variables/#gestures + #gestures = { + # workspace_swipe = false; + #}; + + # Example per-device config + # See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more + device = { + name = "epic-mouse-v1"; + sensitivity = -0.5; + }; + + + ################### + ### KEYBINDINGS ### + ################### + + # See https://wiki.hypr.land/Configuring/Keywords/ + "$mainMod" = "SUPER"; # Sets "Windows" key as main modifier + + bind = [ + # Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more + "$mainMod, Return, exec, $terminal" + "$mainMod, Q, killactive," + "alt, F4, killactive," + "$mainMod SHIFT, Q, exit," + "$mainMod, E, exec, $fileManager" + "$mainMod, V, togglefloating," + "$mainMod, F, fullscreen, 1" + "$mainMod, W, exec, $browser" + "$mainMod, space, exec, $menu" + #"$mainMod, P, pseudo," # dwindle + "$mainMod, T, togglesplit," # dwindle + "$mainMod SHIFT, L, exec, hyprlock" + "$mainMod SHIFT, F, workspaceopt, allfloat" + "$mainMod, M, togglegroup," + "$mainMod SHIFT, S, exec, grim -g \"$(slurp)\" - | wl-copy" + + # Move focus with mainMod + arrow keys + "$mainMod, h, movefocus, l" + "$mainMod, l, movefocus, r" + "$mainMod, k, movefocus, u" + "$mainMod, j, movefocus, d" + "$mainMod, Tab, cyclenext" + "$mainMod, Tab, bringactivetotop" + + # Switch workspaces with mainMod + [0-9] + "$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" + + # Move active window to a workspace with mainMod + SHIFT + [0-9] + "$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" + + # Example special workspace (scratchpad) + "$mainMod, N, togglespecialworkspace, notes" + "$mainMod SHIFT, N, movetoworkspace, special:notes" + + # Scroll through existing workspaces with mainMod + scroll + "$mainMod, mouse_down, workspace, e+1" + "$mainMod, mouse_up, workspace, e-1" + ]; + + # Move/resize windows with mainMod + LMB/RMB and dragging + bindm = [ + "$mainMod, mouse:272, movewindow" + "$mainMod, mouse:273, resizewindow" + ]; + + # Laptop multimedia keys for volume and LCD brightness + bindel = [ + ",XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+" + ",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + ",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" + ",XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+" + ",XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%-" + ]; + + # Requires playerctl + bindl = [ + ", XF86AudioNext, exec, playerctl next" + ", XF86AudioPause, exec, playerctl play-pause" + ", XF86AudioPlay, exec, playerctl play-pause" + ", XF86AudioPrev, exec, playerctl previous" + ]; + + ############################## + ### WINDOWS AND WORKSPACES ### + ############################## + + # See https://wiki.hypr.land/Configuring/Window-Rules/ for more + # See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules + + windowrule = [ + # Example windowrule + # "float,class:^(kitty)$,title:^(kitty)$" + # Ignore maximize requests from apps. You'll probably like this. + "suppressevent maximize, class:.*" + + # Fix some dragging issues with XWayland + "nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0" + ]; + workspace = "name:1,monitor:DP-2"; + }; + }; # Don't touch home.stateVersion = "24.11"; diff --git a/hosts/desktop/settings.nix b/hosts/desktop/settings.nix index 3d80787..b02b604 100644 --- a/hosts/desktop/settings.nix +++ b/hosts/desktop/settings.nix @@ -3,6 +3,7 @@ { boot.loader.systemd-boot.enable = true; + boot.loader.systemd-boot.configurationLimit = 10; boot.loader.efi.canTouchEfiVariables = true; services.pipewire = { @@ -11,8 +12,6 @@ services.pipewire = { pulse.enable = true; wireplumber.enable = true; }; -services.displayManager.gdm.enable = false; -services.displayManager.sddm.enable = true; boot = { initrd.luks.devices."luks-cbf20b12-90f7-4fbb-95d3-1320eece4d89".device = "/dev/disk/by-uuid/cbf20b12-90f7-4fbb-95d3-1320eece4d89";