Compare commits

...

5 commits

Author SHA1 Message Date
ItsDrike c5074480ec
Update nvim config 2024-06-10 14:17:48 +02:00
ItsDrike 9d15387d5e
Add script to swap Hyprland workspaces across monitors
This introduces xmonad like workspace swapping, i.e. if the workspaces
is already focused on another monitor, a swap will occur, moving the
workspace from the other monitor to the currently focused monitor and
replacing it with the workspace originally focused on this monitor (i.e.
swapping them).

If we're only using 1 monitor, or the workspace isn't focused on any
monitor, this will behave exactly like regular workspace focus command.
2024-06-10 14:13:39 +02:00
ItsDrike 54f1c40d61
Run hyprland from profile (without wrapper script) 2024-06-10 14:00:02 +02:00
ItsDrike deee4df653
Fix nvidia on hybrid setups 2024-06-10 13:57:23 +02:00
ItsDrike d1e70957f2
Fix mistake in cpu type of herugrim host 2024-06-10 13:53:12 +02:00
12 changed files with 102 additions and 35 deletions

View file

@ -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

View file

@ -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 = {

View file

@ -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
'';
}

View file

@ -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

View file

@ -0,0 +1,4 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "hyprland-swap-workspace" ''
${builtins.readFile ./hyprland-swap-workspace.sh}
''

View file

@ -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

View file

@ -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;
}; };

View file

@ -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

View file

@ -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;
}; };

View file

@ -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";
};
} }

View file

@ -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).
''; '';
}; };

View file

@ -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"; }
WLR_NO_HARDWARE_CURSORS = "1";
}; (mkIf isWayland {
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";
})
];
}; };
}; };
} }