nix-config/modules/desktops/hyprland.nix

290 lines
7.8 KiB
Nix
Raw Normal View History

2023-10-13 20:52:26 +02:00
#
# Hyprland Configuration
# Enable with "hyprland.enable = true;"
#
{
config,
lib,
system,
pkgs,
unstable,
hyprland,
vars,
host,
2023-10-14 18:53:32 +02:00
split-monitor-workspaces,
2023-10-13 20:52:26 +02:00
...
2023-10-15 14:28:18 +02:00
}: let
hyprlandconf = ''
monitor = DP-1,1920x1080@75,auto,auto
monitor = DP-3,2560x1440@144,auto,auto
monitor = ,preferred,auto,auto
source = ~/.config/hypr/mocha.conf
exec-once = waybar
exec-once = dunst
exec-once = swww init && swww img ~/.wallpapers/robot.jpg
exec-once = signal-desktop --start-in-tray
exec-once = webcord --start-minimized
env = XCURSOR_SIZE,24
env = LIBVA_DRIVER_NAME,nvidia
env = XDG_SESSION_TYPE,wayland
env = GBM_BACKEND,nvidia-drm
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = WLR_NO_HARDWARE_CURSORS,1
env = NIXOS_OZONE_WL,1 # for any ozone-based browser & electron apps to run on wayland
env = MOZ_ENABLE_WAYLAND,1 # for firefox to run on wayland
env = MOZ_WEBRENDER,1
plugin {
split-monitor-workspaces {
count = 9
}
}
input {
kb_layout = de
kb_variant =
kb_model =
kb_options =
kb_rules =
follow_mouse = 1
touchpad {
natural_scroll = no
}
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
}
general {
gaps_in = 5
gaps_out = 5
border_size = 2
col.active_border = $teal
col.inactive_border = $tealAlpha
layout = dwindle
}
misc {
disable_hyprland_logo = true
vrr = true
vfr = true
}
decoration {
screen_shader = ~/.config/hypr/shaders/nightlight.frag
rounding = 10
blur {
enabled = true
size = 3
passes = 1
}
drop_shadow = yes
shadow_range = 4
shadow_render_power = 3
col.shadow = rgba(1a1a1aee)
}
animations {
enabled = yes
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 7, myBezier
animation = windowsOut, 1, 7, default, popin 80%
animation = border, 1, 10, default
animation = borderangle, 1, 8, default
animation = fade, 1, 7, default
animation = workspaces, 1, 6, default
}
dwindle {
pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = yes # you probably want this
}
master {
new_is_master = true
}
gestures {
workspace_swipe = off
}
2023-10-13 20:52:26 +02:00
2023-10-15 14:28:18 +02:00
$mainMod = SUPER
bind = $mainMod, RETURN, exec, alacritty
bind = $mainMod, SPACE, exec, rofi -i -show drun -modi drun -show-icons
bind = SUPER_SHIFT, C, killactive,
bind = SUPER_SHIFT, Q, exit,
bind = $mainMod, V, togglefloating,
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, J, togglesplit, # dwindle
bind = $mainMod, O, split-changemonitorsilent,next
# 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, split-workspace, 1
bind = $mainMod, 2, split-workspace, 2
bind = $mainMod, 3, split-workspace, 3
bind = $mainMod, 4, split-workspace, 4
bind = $mainMod, 5, split-workspace, 5
bind = $mainMod, 6, split-workspace, 6
bind = $mainMod, 7, split-workspace, 7
bind = $mainMod, 8, split-workspace, 8
bind = $mainMod, 9, split-workspace, 9
bind = $mainMod, 0, split-workspace, 10
# Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mainMod SHIFT, 1, split-movetoworkspace, 1
bind = $mainMod SHIFT, 2, split-movetoworkspace, 2
bind = $mainMod SHIFT, 3, split-movetoworkspace, 3
bind = $mainMod SHIFT, 4, split-movetoworkspace, 4
bind = $mainMod SHIFT, 5, split-movetoworkspace, 5
bind = $mainMod SHIFT, 6, split-movetoworkspace, 6
bind = $mainMod SHIFT, 7, split-movetoworkspace, 7
bind = $mainMod SHIFT, 8, split-movetoworkspace, 8
bind = $mainMod SHIFT, 9, split-movetoworkspace, 9
bind = $mainMod SHIFT, 0, split-movetoworkspace, 10
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
bind = SUPERSHIFT, V, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy
bind = $mainMod, L, exec, librewolf
bind = $mainMod SHIFT, L, exec, librewolf --private-window
'';
in
with lib;
with host; {
options = {
2023-10-13 20:52:26 +02:00
hyprland = {
2023-10-15 14:28:18 +02:00
enable = mkOption {
type = types.bool;
default = false;
};
2023-10-13 20:52:26 +02:00
};
};
2023-10-15 14:28:18 +02:00
config = mkIf (config.hyprland.enable) {
environment = {
systemPackages = with pkgs;
[
grim # Grab Images
slurp # Region Selector
wl-clipboard # Clipboard
wlr-randr # Monitor Settings
dunst
cliphist
rofi-wayland
swww
]
++ (with unstable; [waybar]);
# sessionVariables = {
# "NIXOS_OZONE_WL" = "1"; # for any ozone-based browser & electron apps to run on wayland
# "MOZ_ENABLE_WAYLAND" = "1"; # for firefox to run on wayland
# "MOZ_WEBRENDER" = "1";
#
# # for hyprland with nvidia gpu, ref https://wiki.hyprland.org/Nvidia/
# "LIBVA_DRIVER_NAME" = "nvidia";
# "XDG_SESSION_TYPE" = "wayland";
# "GBM_BACKEND" = "nvidia-drm";
# "__GLX_VENDOR_LIBRARY_NAME" = "nvidia";
# "WLR_NO_HARDWARE_CURSORS" = "1";
# "WLR_EGL_NO_MODIFIRES" = "1";
# };
};
2023-10-14 18:53:32 +02:00
2023-10-15 14:28:18 +02:00
programs = {
hyprland = {
# Window Manager
enable = true;
xwayland.enable = true;
enableNvidiaPatches =
if hostName == "desktop"
then true
else false;
};
};
hardware = {
opengl = {
enable = true;
};
};
2023-10-14 18:53:32 +02:00
2023-10-15 14:28:18 +02:00
xdg.portal = {
2023-10-14 18:53:32 +02:00
enable = true;
2023-10-15 14:28:18 +02:00
extraPortals = with pkgs; [xdg-desktop-portal-gtk];
2023-10-14 18:53:32 +02:00
};
2023-10-15 14:28:18 +02:00
home-manager.users.${vars.user} = {
imports = [hyprland.homeManagerModules.default];
home.file.".config/hypr/" = {
source = ../../rsc/config/hypr;
recursive = true;
};
home.file.".config/waybar" = {
source = ../../rsc/config/waybar;
recursive = true;
};
home.file.".config/dunst" = {
source = ../../rsc/config/dunst;
recursive = true;
};
home.file.".config/rofi" = {
source = ../../rsc/config/rofi;
recursive = true;
};
home.file.".wallpapers" = {
source = ../../rsc/wallpaper;
recursive = true;
};
programs.waybar.package = pkgs.waybar.overrideAttrs (oa: {
mesonFlags = (oa.mesonFlags or []) ++ ["-Dexperimental=true"];
patches =
(oa.patches or [])
++ [
(pkgs.fetchpatch {
name = "fix waybar hyprctl";
url = "https://aur.archlinux.org/cgit/aur.git/plain/hyprctl.patch?h=waybar-hyprland-git";
sha256 = "sha256-pY3+9Dhi61Jo2cPnBdmn3NUTSA8bAbtgsk2ooj4y7aQ=";
})
];
});
wayland.windowManager.hyprland = {
enable = true;
systemdIntegration = true;
extraConfig = hyprlandconf;
plugins = [
split-monitor-workspaces.packages.${pkgs.system}.split-monitor-workspaces
];
};
};
nix.settings = {
substituters = ["https://hyprland.cachix.org"];
trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="];
}; # Cache
};
}