387 lines
13 KiB
Nix
387 lines
13 KiB
Nix
{ inputs, lib, config, pkgs, userName, ... }:
|
|
let
|
|
unstable = import inputs.nixpkgs-unstable { system = "x86_64-linux"; config.allowUnfree = true; };
|
|
isOnTheGo = builtins.elem "on-the-go" config.system.nixos.tags;
|
|
in
|
|
{
|
|
options.niriwm = {
|
|
enable = lib.mkEnableOption "Enable niri window manager.";
|
|
useNonFree = lib.mkOption {
|
|
default = false;
|
|
example = true;
|
|
description = "Whether to enable non-free software in the niri config";
|
|
};
|
|
systemPackages = lib.mkOption {
|
|
default = [];
|
|
description = "Add any additional packages desired. Merged with niri defaults.";
|
|
};
|
|
user = lib.mkOption {
|
|
type = lib.types.str;
|
|
};
|
|
|
|
};
|
|
|
|
###
|
|
## Configuration
|
|
###
|
|
config = lib.mkIf config.niriwm.enable {
|
|
|
|
nixpkgs.config.allowUnfree = config.niriwm.useNonFree;
|
|
|
|
###
|
|
## XDG portal setup
|
|
###
|
|
xdg.portal = {
|
|
config = {
|
|
common = {
|
|
default = [
|
|
"wlr"
|
|
];
|
|
};
|
|
};
|
|
extraPortals = with pkgs; [
|
|
xdg-desktop-portal-gnome
|
|
];
|
|
wlr.enable = true;
|
|
enable = true;
|
|
};
|
|
xdg.sounds.enable = true;
|
|
|
|
###
|
|
## System Packages
|
|
###
|
|
environment.systemPackages = with pkgs; lib.lists.flatten [
|
|
[
|
|
bash
|
|
egl-wayland
|
|
foot
|
|
unstable.ghostty
|
|
git
|
|
glib # gsettings
|
|
grim
|
|
libnotify
|
|
man-pages
|
|
man-pages-posix
|
|
nbfc-linux
|
|
nautilus
|
|
networkmanagerapplet
|
|
pavucontrol
|
|
slurp
|
|
syncthingtray
|
|
swaylock
|
|
wl-clipboard
|
|
waybar
|
|
wdisplays
|
|
wofi
|
|
xdg-utils
|
|
zsh
|
|
lxqt.lxqt-policykit
|
|
unstable.xwayland-satellite
|
|
kanshi
|
|
# Fonts
|
|
]
|
|
config.niriwm.systemPackages
|
|
];
|
|
environment.variables.QT_STYLE_OVERRIDE = "kvantum";
|
|
environment.sessionVariables = {
|
|
# use wayland
|
|
MOZ_ENABLE_WAYLAND = "1";
|
|
T_QPA_PLATFORM = "wayland";
|
|
GDK_BACKEND = "wayland";
|
|
WLR_NO_HARDWARE_CURSORS = "1";
|
|
ELECTRON_OZONE_PLATFORM_HINT = "auto";
|
|
NIXOS_OZONE_WL = "1";
|
|
# For NVIDIA - only enable if not using on-the-go
|
|
GBM_BACKEND = if isOnTheGo then "" else "nvidia-drm";
|
|
__GLX_VENDOR_LIBRARY_NAME = if isOnTheGo then "" else "nvidia";
|
|
};
|
|
|
|
# adds additional man pages
|
|
documentation.dev.enable = true;
|
|
|
|
programs.steam = {
|
|
enable = true;
|
|
gamescopeSession.enable = true;
|
|
};
|
|
programs.gamemode = {
|
|
enable = true;
|
|
settings = {
|
|
general = {
|
|
reaper_freq = 5;
|
|
desiredgov = "performance";
|
|
softrealtime = "auto";
|
|
};
|
|
};
|
|
};
|
|
programs.kdeconnect.enable = true;
|
|
programs.niri.enable = true;
|
|
programs.virt-manager.enable = true;
|
|
programs.xfconf.enable = true;
|
|
programs.regreet.enable = true;
|
|
programs.zsh.enable = true;
|
|
programs.ssh.startAgent = false; # Using GNOME Keyring's gcr-ssh-agent instead
|
|
|
|
# For nautilus
|
|
services.gnome.sushi.enable = true;
|
|
programs.nautilus-open-any-terminal = {
|
|
enable = true;
|
|
terminal = "ghostty";
|
|
};
|
|
|
|
services.syncthing = {
|
|
enable = true;
|
|
dataDir = "/home/${config.niriwm.user}/.syncthing";
|
|
openDefaultPorts = true;
|
|
user = config.niriwm.user;
|
|
};
|
|
systemd.services.syncthing.environment.STNODEFAULTFOLDER = "true"; # Don't create default ~/Sync folder
|
|
|
|
# Set zsh as the default shell system-wide
|
|
users.defaultUserShell = pkgs.zsh;
|
|
environment.shells = with pkgs; [ zsh bash ];
|
|
|
|
###
|
|
## Services
|
|
###
|
|
virtualisation = {
|
|
docker = {
|
|
enable = true;
|
|
enableOnBoot = true;
|
|
package = unstable.docker_25;
|
|
};
|
|
libvirtd = {
|
|
enable = true;
|
|
qemu = {
|
|
swtpm.enable = true;
|
|
};
|
|
};
|
|
spiceUSBRedirection.enable = true;
|
|
};
|
|
boot.initrd.supportedFilesystems = { nfs = true; };
|
|
users.groups.libvirtd.members = ["nate"];
|
|
|
|
services.blueman.enable = true;
|
|
services.gvfs.enable = true; # file manager mount, trash, etc
|
|
services.tumbler.enable = true; # thunar thumbnails
|
|
services.openssh.enable = true;
|
|
services.dbus.enable = true;
|
|
services.gnome.gnome-keyring.enable = true;
|
|
services.flatpak.enable = true;
|
|
services.usbmuxd.enable = true;
|
|
|
|
# For yubioath desktop
|
|
services.pcscd.enable = true;
|
|
|
|
# Printing
|
|
services.printing = {
|
|
enable = true;
|
|
browsing = true;
|
|
drivers = [ pkgs.brlaser ];
|
|
};
|
|
|
|
services.avahi = {
|
|
enable = true;
|
|
nssmdns4 = true;
|
|
openFirewall = true;
|
|
};
|
|
|
|
services.fprintd.enable = true;
|
|
services.greetd = {
|
|
enable = true;
|
|
settings = rec {
|
|
initial_session = {
|
|
command = "${pkgs.niri}/bin/niri-session";
|
|
user = config.niriwm.user;
|
|
};
|
|
default_session = initial_session;
|
|
};
|
|
};
|
|
# disable lid switch sleep when plugged into power, laptop docked
|
|
services.logind.settings.Login.HandleLidSwitchExternalPower = "ignore";
|
|
|
|
# Keyring setup
|
|
security.pam.services.greetd.enableGnomeKeyring = true;
|
|
security.pam.services.login.enableGnomeKeyring = true;
|
|
|
|
# Audio - Modern PipeWire setup for Framework laptop
|
|
# Disable PulseAudio in favor of PipeWire
|
|
services.pulseaudio.enable = false;
|
|
security.rtkit.enable = true;
|
|
services.pipewire = {
|
|
enable = true;
|
|
audio.enable = true;
|
|
alsa.enable = true;
|
|
alsa.support32Bit = true;
|
|
pulse.enable = true;
|
|
wireplumber.enable = true;
|
|
wireplumber.extraConfig = {
|
|
"wireplumber.settings" = {
|
|
bluetooth.autoswitch-to-headset-profile = false;
|
|
};
|
|
bluetoothEnhancements = {
|
|
"monitor.bluez.properties" = {
|
|
"bluez5.enable-sbc-xq" = true;
|
|
"bluez5.enable-msbc" = true;
|
|
"bluez5.enable-hw-volume" = true;
|
|
# Default roles: https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration/bluetooth.html#monitor-properties
|
|
"bluez5.roles" = [ "a2dp_sink" "a2dp_source" "bap_sink" "bap_source" "hfp_hf" "hfp_ag" ];
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
###
|
|
## Misc
|
|
###
|
|
# Necessary for home-manager niri setup
|
|
security.polkit.enable = true;
|
|
|
|
hardware.bluetooth = {
|
|
enable = true;
|
|
powerOnBoot = true; # powers up the default Bluetooth controller on boot
|
|
settings = {
|
|
General = {
|
|
Name = "Nate-Vasion";
|
|
ControllerMode = "dual";
|
|
FastConnectable = "true";
|
|
Experimental = "true";
|
|
};
|
|
Policy = { AutoEnable = "true"; };
|
|
LE = { EnableAdvMonInterleaveScan = 1; };
|
|
};
|
|
};
|
|
|
|
#
|
|
# Hardware scanning support
|
|
#
|
|
hardware.sane = {
|
|
enable = true;
|
|
brscan5.enable = true;
|
|
};
|
|
|
|
#
|
|
# Nvidia Setup
|
|
#
|
|
|
|
services.udev.extraRules = ''
|
|
# For betaflight configurator
|
|
# DFU (Internal bootloader for STM32 and AT32 MCUs)
|
|
SUBSYSTEM=="usb", ATTRS{idVendor}=="2e3c", ATTRS{idProduct}=="df11", MODE="0664", GROUP="dialout"
|
|
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="0664", GROUP="dialout"
|
|
# For ddcutil monitor controls
|
|
KERNEL=="i2c-[0-9]*", GROUP="i2c", MODE="0660"
|
|
'';
|
|
|
|
services.xserver.videoDrivers = [ "nvidia" ];
|
|
hardware = {
|
|
graphics = {
|
|
enable = true;
|
|
enable32Bit = true;
|
|
extraPackages = with pkgs; [
|
|
intel-vaapi-driver
|
|
intel-media-driver
|
|
vpl-gpu-rt
|
|
];
|
|
};
|
|
nvidia = {
|
|
# Modesetting is required.
|
|
modesetting.enable = true;
|
|
# Nvidia power management. Experimental, and can cause sleep/suspend to fail.
|
|
# Enable this if you have graphical corruption issues or application crashes after waking
|
|
# up from sleep. This fixes it by saving the entire VRAM memory to /tmp/ instead
|
|
# of just the bare essentials.
|
|
powerManagement.enable = false;
|
|
|
|
# Fine-grained power management. Turns off GPU when not in use.
|
|
# Experimental and only works on modern Nvidia GPUs (Turing or newer).
|
|
powerManagement.finegrained = true;
|
|
|
|
# Use the NVidia open source kernel module (not to be confused with the
|
|
# independent third-party "nouveau" open source driver).
|
|
# Support is limited to the Turing and later architectures. Full list of
|
|
# supported GPUs is at:
|
|
# https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus
|
|
# Only available from driver 515.43.04+
|
|
# Currently alpha-quality/buggy, so false is currently the recommended setting.
|
|
open = true;
|
|
|
|
# Enable the Nvidia settings menu,
|
|
# accessible via `nvidia-settings`.
|
|
nvidiaSettings = true;
|
|
|
|
# Optionally, you may need to select the appropriate driver version for your specific GPU.
|
|
package = config.boot.kernelPackages.nvidiaPackages.stable;
|
|
prime = {
|
|
# sync.enable = true;
|
|
offload.enable = true;
|
|
offload.enableOffloadCmd = true; # adds `nvidia-offload` command to env
|
|
intelBusId = "PCI:0:2:0";
|
|
nvidiaBusId = "PCI:1:0:0";
|
|
};
|
|
};
|
|
};
|
|
# Create special on the go boot entry for battery saving
|
|
# This disables NVIDIA GPU completely and uses Intel integrated graphics only
|
|
specialisation = {
|
|
on-the-go.configuration = {
|
|
system.nixos.tags = [ "on-the-go" ];
|
|
|
|
# Blacklist all NVIDIA kernel modules
|
|
boot.blacklistedKernelModules = [ "nouveau" "nvidia" "nvidia_drm" "nvidia_modeset" "nvidia_uvm" ];
|
|
|
|
# Force Intel i915 driver for 13th gen (Raptor Lake) integrated graphics
|
|
# Device IDs: a7a0 or a7a8 for i7-13700H
|
|
boot.kernelParams = [
|
|
"i915.force_probe=a7a0"
|
|
"module_blacklist=nvidia,nvidia_drm,nvidia_modeset,nvidia_uvm"
|
|
];
|
|
|
|
boot.extraModprobeConfig = ''
|
|
blacklist nouveau
|
|
blacklist nvidia
|
|
blacklist nvidia_drm
|
|
blacklist nvidia_modeset
|
|
blacklist nvidia_uvm
|
|
options nouveau modeset=0
|
|
'';
|
|
|
|
# Remove NVIDIA devices from PCI bus to save power
|
|
services.udev.extraRules = ''
|
|
# Remove NVIDIA USB xHCI Host Controller devices, if present
|
|
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{power/control}="auto", ATTR{remove}="1"
|
|
# Remove NVIDIA USB Type-C UCSI devices, if present
|
|
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{power/control}="auto", ATTR{remove}="1"
|
|
# Remove NVIDIA Audio devices, if present
|
|
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{power/control}="auto", ATTR{remove}="1"
|
|
# Remove NVIDIA VGA/3D controller devices
|
|
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", ATTR{power/control}="auto", ATTR{remove}="1"
|
|
'';
|
|
|
|
# Use Intel modesetting driver only
|
|
services.xserver.videoDrivers = lib.mkForce [ "modesetting" ];
|
|
|
|
# Disable all NVIDIA hardware configurations
|
|
hardware.nvidia = {
|
|
prime.offload.enable = lib.mkForce false;
|
|
prime.offload.enableOffloadCmd = lib.mkForce false;
|
|
powerManagement.finegrained = lib.mkForce false;
|
|
prime.sync.enable = lib.mkForce false;
|
|
};
|
|
|
|
# Ensure Intel graphics packages are available
|
|
hardware.graphics.extraPackages = lib.mkForce (with pkgs; [
|
|
intel-vaapi-driver
|
|
intel-media-driver
|
|
vpl-gpu-rt
|
|
]);
|
|
|
|
# Clear NVIDIA-specific environment variables
|
|
environment.sessionVariables = {
|
|
GBM_BACKEND = lib.mkForce "";
|
|
__GLX_VENDOR_LIBRARY_NAME = lib.mkForce "";
|
|
};
|
|
};
|
|
};
|
|
};
|
|
}
|