mirror of
https://github.com/ItsDrike/nixdots
synced 2024-11-10 04:59:42 +00:00
Compare commits
5 commits
6180f89b72
...
c5074480ec
Author | SHA1 | Date | |
---|---|---|---|
ItsDrike | c5074480ec | ||
ItsDrike | 9d15387d5e | ||
ItsDrike | 54f1c40d61 | ||
ItsDrike | deee4df653 | ||
ItsDrike | d1e70957f2 |
|
@ -102,7 +102,15 @@
|
||||||
#
|
#
|
||||||
# Switch workspace (swapping to current monitor)
|
# Switch workspace (swapping to current monitor)
|
||||||
#
|
#
|
||||||
# TODO: requires script (swap-workspace)
|
"SUPER, 1, exec, hyprland-swap-workspace 1"
|
||||||
|
"SUPER, 2, exec, hyprland-swap-workspace 2"
|
||||||
|
"SUPER, 3, exec, hyprland-swap-workspace 3"
|
||||||
|
"SUPER, 4, exec, hyprland-swap-workspace 4"
|
||||||
|
"SUPER, 5, exec, hyprland-swap-workspace 5"
|
||||||
|
"SUPER, 6, exec, hyprland-swap-workspace 6"
|
||||||
|
"SUPER, 7, exec, hyprland-swap-workspace 7"
|
||||||
|
"SUPER, 8, exec, hyprland-swap-workspace 8"
|
||||||
|
"SUPER, 9, exec, hyprland-swap-workspace 9"
|
||||||
|
|
||||||
#
|
#
|
||||||
# Move window to workspace
|
# Move window to workspace
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
}: let
|
}: let
|
||||||
inherit (lib) mkIf;
|
inherit (lib) mkIf;
|
||||||
|
|
||||||
inherit (import ./packages {inherit pkgs;}) dbus-hyprland-env;
|
inherit (import ./packages {inherit pkgs;}) hyprland-swap-workspace;
|
||||||
|
|
||||||
cfg = osConfig.myOptions.home-manager.wms.hyprland;
|
cfg = osConfig.myOptions.home-manager.wms.hyprland;
|
||||||
in {
|
in {
|
||||||
|
@ -16,7 +16,7 @@ in {
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
dbus-hyprland-env
|
hyprland-swap-workspace
|
||||||
];
|
];
|
||||||
|
|
||||||
wayland.windowManager.hyprland = {
|
wayland.windowManager.hyprland = {
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
{pkgs, ...}:
|
|
||||||
pkgs.writeTextFile {
|
|
||||||
name = "dbus-hyprland-env";
|
|
||||||
destination = "/bin/dbus-hyprland-environment";
|
|
||||||
executable = true;
|
|
||||||
text = ''
|
|
||||||
dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=hyprland
|
|
||||||
systemctl --user stop pipewire pipewire-media-session xdg-desktop-portal xdg-desktop-portal-wlr
|
|
||||||
systemctl --user start pipewire wireplumber pipewire-media-session xdg-desktop-portal xdg-desktop-portal-hyprland
|
|
||||||
'';
|
|
||||||
}
|
|
|
@ -3,7 +3,7 @@
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
packages = {
|
packages = {
|
||||||
dbus-hyprland-env = pkgs.callPackage ./dbus-hyprland-env.nix {};
|
hyprland-swap-workspace = pkgs.callPackage ./hyprland-swap-workspace.nix {};
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
packages
|
packages
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
{pkgs, ...}:
|
||||||
|
pkgs.writeShellScriptBin "hyprland-swap-workspace" ''
|
||||||
|
${builtins.readFile ./hyprland-swap-workspace.sh}
|
||||||
|
''
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
WORKSPACE="$1"
|
||||||
|
|
||||||
|
monitors_out="$(hyprctl monitors -j)"
|
||||||
|
focused_mon="$(echo "$monitors_out" | jq '.[] | select(.focused==true) | .id')"
|
||||||
|
focused_wks="$(echo "$monitors_out" | jq '.[].activeWorkspace.id')"
|
||||||
|
|
||||||
|
# Workspace is already focused, check on which monitor
|
||||||
|
if echo "$focused_wks" | grep "$WORKSPACE" >/dev/null; then
|
||||||
|
mon_id="$(echo "$monitors_out" | jq ".[] | select(.activeWorkspace.id==$WORKSPACE) | .id")"
|
||||||
|
|
||||||
|
# If the workspace is focused on the active monitor, don't do anything (we're here).
|
||||||
|
# Otherwise, swap the workspaces.
|
||||||
|
if [ "$mon_id" -ne "$focused_mon" ]; then
|
||||||
|
hyprctl dispatch swapactiveworkspaces "$focused_mon" "$mon_id"
|
||||||
|
fi
|
||||||
|
# Switching to an unfocused workspace, always move it to focused monitor
|
||||||
|
else
|
||||||
|
hyprctl dispatch moveworkspacetomonitor "$WORKSPACE" "$focused_mon"
|
||||||
|
hyprctl dispatch workspace "$WORKSPACE"
|
||||||
|
fi
|
|
@ -26,8 +26,8 @@
|
||||||
source = pkgs.fetchFromGitHub {
|
source = pkgs.fetchFromGitHub {
|
||||||
owner = "ItsDrike";
|
owner = "ItsDrike";
|
||||||
repo = "AstroNvimUser";
|
repo = "AstroNvimUser";
|
||||||
rev = "v0.1.0";
|
rev = "v0.1.2";
|
||||||
sha256 = "sha256-2o25+2CHoDS90kDk5ixiQDE4MHybgvVLL7jr7AHWhqU=";
|
sha256 = "sha256-PPejIy8BGxilcFAvBZQVfVDwTNEm1Tu6e0AlzIZbYXY=";
|
||||||
};
|
};
|
||||||
recursive = true;
|
recursive = true;
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,7 +12,7 @@ fi
|
||||||
# Start graphical session automatically on tty1 if Hyprland or startx is available
|
# Start graphical session automatically on tty1 if Hyprland or startx is available
|
||||||
if [ "$(tty)" = "/dev/tty1" ] && [ "$UID" != 0 ]; then
|
if [ "$(tty)" = "/dev/tty1" ] && [ "$UID" != 0 ]; then
|
||||||
if command -v Hyprland >/dev/null; then
|
if command -v Hyprland >/dev/null; then
|
||||||
! pidof -s Hyprland >/dev/null 2>&1 && launch-hypr
|
! pidof -s Hyprland >/dev/null 2>&1 && Hyprland
|
||||||
elif command -v startx >/dev/null; then
|
elif command -v startx >/dev/null; then
|
||||||
! pidof -s Xorg >/dev/null 2>&1 && exec startx "$XINITRC"
|
! pidof -s Xorg >/dev/null 2>&1 && exec startx "$XINITRC"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -58,8 +58,8 @@
|
||||||
type = "laptop";
|
type = "laptop";
|
||||||
virtual-machine = false;
|
virtual-machine = false;
|
||||||
};
|
};
|
||||||
cpu.type = "intel";
|
cpu.type = "amd";
|
||||||
gpu.type = "nvidia";
|
gpu.type = "hybrid-nvidia";
|
||||||
hasTPM = true;
|
hasTPM = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -66,4 +66,11 @@
|
||||||
|
|
||||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
|
||||||
|
# Enable prime-offload
|
||||||
|
# This machine has AMD igpu + nvidia dgpu, so we need hybrid
|
||||||
|
hardware.nvidia.prime = {
|
||||||
|
nvidiaBusId = "PCI:1:0:0";
|
||||||
|
amdgpuBusId = "PCI:5:0:0";
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,12 +15,21 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
gpu.type = mkOption {
|
gpu.type = mkOption {
|
||||||
type = with types; nullOr (enum [ "nvidia" "amd" "intel" ]);
|
type = with types; nullOr (enum [ "nvidia" "amd" "intel" "hybrid-nvidia" "hybrid-amd" ]);
|
||||||
default = null;
|
default = null;
|
||||||
description = ''
|
description = ''
|
||||||
The manifaturer/type of the primary system GPU.
|
The manifaturer/type of the primary system GPU.
|
||||||
|
|
||||||
Allows the correct GPU drivers to be loaded, potentially optimizing video output performance.
|
Allows the correct GPU drivers to be loaded, potentially optimizing video output performance.
|
||||||
|
|
||||||
|
If you're on a hybrid system (intel/amd igpu + nvidia/amd dgpu) make sure to use
|
||||||
|
the hybrid options, only specifying the dgpu will not work properly.
|
||||||
|
|
||||||
|
Note that if using hybrid-nvidia, you will need to set `hardware.nvidia.prime.nvidiaBusId`
|
||||||
|
and `intelBusId` (or `amdgpuBusId`) to "PCI:x:y:z". To find the correct bus IDs, you can
|
||||||
|
use `sudo lshw -c display`. Note that you will need to convert the bus ID format from
|
||||||
|
hexadecimal to decimal, remove the padding (leading zeroes) and replace the dot with a
|
||||||
|
colon (so for example 0e:00.0 -> PCI:14:0:0).
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,29 +1,36 @@
|
||||||
{ config, lib, pkgs, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
let
|
let
|
||||||
dev = config.myOptions.device;
|
dev = config.myOptions.device;
|
||||||
|
isWayland = config.myOptions.home-manager.wms.isWayland;
|
||||||
|
|
||||||
|
inherit (lib) mkIf mkDefault mkMerge;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
config = lib.mkIf (dev.gpu.type == "nvidia") {
|
config = mkIf (builtins.elem dev.gpu.type ["nvidia" "hybrid-nvidia"]) {
|
||||||
# Nvidia drivers are unfree software
|
# Nvidia drivers are unfree software
|
||||||
nixpkgs.config.allowUnfree = true;
|
nixpkgs.config.allowUnfree = true;
|
||||||
|
|
||||||
# Enable nvidia driver for Xorg and Wayland
|
# Enable nvidia driver for Xorg and Wayland
|
||||||
services.xserver.videoDrivers = ["nvidia"];
|
services.xserver.videoDrivers = ["nvidia"];
|
||||||
|
|
||||||
|
# blacklist nouveau module so that it does not conflict with nvidia drm stuff
|
||||||
|
# also the nouveau performance is horrible in comparison.
|
||||||
|
boot.blacklistedKernelModules = ["nouveau"];
|
||||||
|
|
||||||
hardware = {
|
hardware = {
|
||||||
nvidia = {
|
nvidia = {
|
||||||
# modeestting is required
|
# modeestting is required
|
||||||
modesetting.enable = lib.mkDefault true;
|
modesetting.enable = mkDefault true;
|
||||||
|
|
||||||
# Nvidia power managerment. Experimental, and can cause sleep/suspend to fail.
|
# Nvidia power managerment. Experimental, and can cause sleep/suspend to fail.
|
||||||
# Enable this if you have graphical corruption issues or application crashes after waking
|
# 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
|
# up from sleep. This fixes it by saving the entire VRAM memory to /tmp/ instead of just
|
||||||
# the bare essentials
|
# the bare essentials
|
||||||
powerManagement.enable = lib.mkDefault true;
|
powerManagement.enable = mkDefault true;
|
||||||
|
|
||||||
# Fine-grained power management. Turns off GPU when not in use.
|
# Fine-grained power management. Turns off GPU when not in use.
|
||||||
# Experimental and only works on modern Nvidia GPUs (Turing or newer)
|
# Experimental and only works on modern Nvidia GPUs (Turing or newer)
|
||||||
powerManagement.finegrained = lib.mkDefault false;
|
powerManagement.finegrained = mkDefault false;
|
||||||
|
|
||||||
# Use the NVidia open source kernel module (not to be confused with the
|
# Use the NVidia open source kernel module (not to be confused with the
|
||||||
# independent third-party "nouveau" open source driver).
|
# independent third-party "nouveau" open source driver).
|
||||||
|
@ -32,14 +39,27 @@ in
|
||||||
#
|
#
|
||||||
# Enable this by default, hosts may override this option if their gpu is not
|
# Enable this by default, hosts may override this option if their gpu is not
|
||||||
# supported by the open source drivers
|
# supported by the open source drivers
|
||||||
open = lib.mkDefault true;
|
open = mkDefault true;
|
||||||
|
|
||||||
# Add the Nvidia settings package, accessible via `nvidia-settings`.
|
# Add the Nvidia settings package, accessible via `nvidia-settings`.
|
||||||
# (useless on NixOS)
|
# (useless on NixOS)
|
||||||
nvidiaSettings = false;
|
nvidiaSettings = mkDefault false;
|
||||||
|
|
||||||
# This ensures all GPUs stay awake even during headless mode.
|
# This ensures all GPUs stay awake even during headless mode.
|
||||||
nvidiaPersistenced = true;
|
nvidiaPersistenced = true;
|
||||||
|
|
||||||
|
# On Hybrid setups, using Nvidia Optimus PRIME is necessary
|
||||||
|
#
|
||||||
|
# There are various options/modes prime can work in, this will default to
|
||||||
|
# using the offload mode, which will default to running everything on igpu
|
||||||
|
# except apps that run with certain environmental variables set. To simplify
|
||||||
|
# things, this will also enable the `nvidia-offload` wrapper script/command.
|
||||||
|
prime.offload = let
|
||||||
|
isHybrid = dev.gpu.type == "hybrid-nvidia";
|
||||||
|
in {
|
||||||
|
enable = isHybrid;
|
||||||
|
enableOffloadCmd = isHybrid;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# Enable OpenGL
|
# Enable OpenGL
|
||||||
|
@ -52,10 +72,6 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# blacklist nouveau module so that it does not conflict with nvidia drm stuff
|
|
||||||
# also the nouveau performance is horrible in comparison.
|
|
||||||
boot.blacklistedKernelModules = ["nouveau"];
|
|
||||||
|
|
||||||
environment = {
|
environment = {
|
||||||
systemPackages = with pkgs; [
|
systemPackages = with pkgs; [
|
||||||
mesa
|
mesa
|
||||||
|
@ -67,12 +83,24 @@ in
|
||||||
|
|
||||||
libva
|
libva
|
||||||
libva-utils
|
libva-utils
|
||||||
|
|
||||||
|
glxinfo
|
||||||
];
|
];
|
||||||
|
|
||||||
sessionVariables = {
|
sessionVariables = mkMerge [
|
||||||
LIBVA_DRIVER_NAME = "nvidia";
|
{ LIBVA_DRIVER_NAME = "nvidia"; }
|
||||||
|
|
||||||
|
(mkIf isWayland {
|
||||||
WLR_NO_HARDWARE_CURSORS = "1";
|
WLR_NO_HARDWARE_CURSORS = "1";
|
||||||
};
|
})
|
||||||
|
|
||||||
|
# Run the compositor itself with nvidia GPU?
|
||||||
|
# Currently disabled
|
||||||
|
(mkIf (isWayland && (dev.gpu == "hybrid-nvidia")) {
|
||||||
|
#__NV_PRIME_RENDER_OFFLOAD = "1";
|
||||||
|
#WLR_DRM_DEVICES = mkDefault "/dev/dri/card1:/dev/dri/card0";
|
||||||
|
})
|
||||||
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue