System/home-manager/linux/programs/hyprland.nix

386 lines
13 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ config, lib, pkgs, inputs, ... }@args:
let nathan = config.nathan;
in with lib; {
imports = [ ./desktop/waybar.nix ./desktop/locking.nix ];
config = mkIf nathan.programs.hyprland.enable (let
fuzzel-command = config.nathan.config.desktop.fuzzel-command;
notif-package =
inputs.nixpkgs-unstable.legacyPackages.${pkgs.system}.swaynotificationcenter;
shortcuts = inputs.self.packages.${pkgs.system}.shortcuts;
in {
home.packages = with pkgs; [
# General
killall
# Display management
wdisplays
# Clipboard
wl-clipboard
cliphist
# Notifications
notif-package
# glib for sound stuff
glib
# Screenshots
(inputs.hyprland-contrib.packages.${pkgs.system}.grimblast.override {
hyprland = config.wayland.windowManager.hyprland.package;
})
# fuzzel for launcher
fuzzel
# for image viewing
inputs.self.packages.${pkgs.system}.swayimg
# For private browsing
tor-browser-bundle-bin
# For non-emacs pdf reading
evince
# Productivity
libreoffice-fresh
## Hyprland addons
font-awesome
inputs.nixpkgs-unstable.legacyPackages.${pkgs.system}.hyprpaper
swayosd
inputs.self.packages.${pkgs.system}.pyprland
# For fancy x11 scaling
sommelier
# Auto workspace renaming
inputs.self.packages.${pkgs.system}.hyprland-autoname-workspaces
];
#########################
## Hyprland
#########################
# Enable and configure hyperland
wayland.windowManager.hyprland = {
enable = true;
xwayland = {
enable = true;
hidpi = false;
};
recommendedEnvironment = true;
systemdIntegration = false;
extraConfig = ''
# Set environment variables to force wayland
env = XCURSOR_SIZE,24
env = GDK_BACKEND,wayland,x11
env = QT_QPA_PLATFORM,wayland;xcb
env = SDL_VIDEODRIVER,wayland
env = CLUTTER_BACKEND,wayland
input {
kb_layout = us
kb_variant =
kb_model =
kb_options =
kb_rules =
follow_mouse = 1
}
general {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
gaps_in = 5
gaps_out = 10
border_size = 3
col.active_border = rgba(3fc5b7ee) rgba(70b433ee) 45deg
col.inactive_border = rgba(252525aa)
layout = dwindle
}
decoration {
rounding = 10
blur = true
blur_size = 3
blur_passes = 1
blur_new_optimizations = true
drop_shadow = true
shadow_range = 4
shadow_render_power = 3
col.shadow = rgba(181818ee)
}
animations {
enabled = true;
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 {
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
pseudotile = true # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = true # you probably want this
}
gestures {
workspace_swipe = false
}
$mainMod = SUPER
bind = $mainMod, Q, exec, alacritty
bind = $mainMod, C, killactive,
# bind = $mainMod, M, exit,
bind = $mainMod, E, exec, dolphin
bind = $mainMod, V, togglefloating,
bind = $mainMod, R, exec, ${fuzzel-command} --prompt=' '
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, B, togglesplit, # dwindle
# Move focus with mainMod + arrow keys
bind = $mainMod, H, movefocus, l
bind = $mainMod, L, movefocus, r
bind = $mainMod, K, movefocus, u
bind = $mainMod, J, movefocus, d
# Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10
# Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
bind = $mainMod SHIFT, 5, movetoworkspace, 5
bind = $mainMod SHIFT, 6, movetoworkspace, 6
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10
# Scroll through existing workspaces with mainMod + scroll
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# Media key binds
bind = , xf86audioraisevolume, exec, swayosd --output-volume=raise
bind = SHIFT, xf86audioraisevolume, exec, swayosd --output-volume=+2
bind = , xf86audiolowervolume, exec, swayosd --output-volume=lower
bind = SHIFT, xf86audiolowervolume, exec, swayosd --output-volume=-2
bind = , xf86audiomute, exec, swayosd --output-volume mute-toggle
bind = , xf86audioplay, exec, playerctl play-pause
bind = , xf86audionext, exec, playerctl next
# Screenshots
bind = , print, exec, grimblast --scale 1 copysave area ~/Pictures/Screenshots/$(date -Iseconds).png
bind = SHIFT, print, exec, grimblast --scale 1 copysave output ~/Pictures/Screenshots/$(date -Iseconds).png
# Caps lock indicator
bindr = CAPS, caps_lock, exec, swayosd --caps-lock
# systemd integration
exec-once=dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY HYPRLAND_INSTANCE_SIGNATURE XDG_CURRENT_DESKTOP && sleep 2 && systemctl --user start hyprland-session.target
# Notif bind
bind = $mainMod, T, exec, swaync-client -t -sw
# Shortcut dispatcher
bind = $mainMod, W, exec, ${shortcuts}/bin/shortcuts ~/.config/shortcuts/shortcuts.toml
## Window rules
# Gamescope - vmware
windowrulev2 = float,class:^(.gamescope-wrapped)$,title:VMware Workstation
windowrulev2 = noborder,class:^(.gamescope-wrapped)$,title:VMware Workstation
windowrulev2 = rounding 0,class:^(.gamescope-wrapped)$,title:VMware Workstation
# Bluetooth manager
windowrulev2 = float,class:^(.blueman-manager-wrapped)$
windowrulev2 = center,class:^(.blueman-manager-wrapped)$
## Scratchpads
# Alacritty
bind = SUPER ALT, Q, exec, pypr toggle term
$dropterm = ^(alacritty-dropterm)$
windowrule = float,$dropterm
windowrule = size 40% 50%,$dropterm
windowrule = workspace special silent,$dropterm
windowrule = center,$dropterm
# Emacs
bind = SUPER ALT, W, exec, pypr toggle emacs
$scratchmacs = title:^(scratchmacs)$
windowrulev2 = float,$scratchmacs
windowrulev2 = size 40% 50%,$scratchmacs
windowrulev2 = workspace special silent,$scratchmacs
windowrulev2 = center,$scratchmacs
# Ario
bind = SUPER ALT, E, exec, pypr toggle ario
$dropario = class:^(ario)$
windowrulev2 = float,$dropario
windowrulev2 = size 50% 70%,$dropario
windowrulev2 = workspace special silent,$dropario
windowrulev2 = center,$dropario
# Spotify
bind = SUPER ALT, R, exec, pypr toggle spotify
$dropspotify = title:^(Spotify)$
windowrulev2 = float,$dropspotify
windowrulev2 = size 50% 70%,$dropspotify
windowrulev2 = workspace special silent,$dropspotify
windowrulev2 = center,$dropspotify
# Clipboard history management
exec-once=wl-paste --watch cliphist store
bind = $mainMod, X, exec, cliphist list | ${fuzzel-command} --prompt=' ' --dmenu | cliphist decode | wl-copy
'';
};
# systemd session target
# Specified manually so we can work around an issue with the loading
systemd.user.targets.hyprland-session = {
Unit = {
Description = "Hyprland compositor session";
Documentation = [ "man:systemd.special(7)" ];
BindsTo = [ "graphical-session.target" ];
Wants = [ "graphical-session-pre.target" ];
After = [ "graphical-session-pre.target" ];
};
};
#########################
## Hyprland Addons
#########################
# Setup swayosd as a service
systemd.user.services.swayosd = {
Unit = {
Description = "Swayosd";
After = [ "graphical-session.target" ];
};
Service = {
Type = "simple";
ExecStart = "${pkgs.swayosd}/bin/swayosd";
Restart = "on-failure";
};
Install = { WantedBy = [ "hyprland-session.target" ]; };
};
# Shortcut dispatcher
xdg.configFile."shortcuts/shortcuts.toml" = {
text = ''
directories = ["~/.config/shortcuts/shortcuts", "${shortcuts}/shortcuts"]
picker_command = "${
builtins.replaceStrings [ ''"'' ] [ ''\"'' ]
(fuzzel-command + " --prompt=' ' ")
} --dmenu"
'';
onChange = ''
mkdir -p ~/.config/shortcuts/shortcuts
'';
};
# Setup pyprland
systemd.user.services.pypr = {
Unit = {
Description = "pypr";
After = [ "tray.target" ];
};
Service = {
Type = "simple";
ExecStart = "${inputs.self.packages.${pkgs.system}.pyprland}/bin/pypr";
Restart = "on-failure";
};
Install = { WantedBy = [ "hyprland-session.target" ]; };
};
# And its config file
xdg.configFile."hypr/pyprland.json" = let
emacsStart = pkgs.writeShellScript "emacsStart.sh" ''
exec emacsclient -c --frame-parameters='(quote (name . "scratchmacs"))'
'';
# https://github.com/hyprland-community/pyprland/issues/6
# "emacs": {
# "command": "${emacsStart}",
# "animation": "",
# "unfocus": "hide"
# }
in {
text = ''
{
"pyprland": {
"plugins": [
"scratchpads"
]
},
"scratchpads": {
"term": {
"command": "alacritty --class alacritty-dropterm --working-directory ~ -e tmux new -A -s scratch",
"animation": "",
"unfocus": "hide"
},
"ario": {
"command": "ario",
"animation": "",
"unfocus": "hide"
},
"spotify": {
"command": "spotify",
"animation": "",
"unfocus": "hide"
}
}
}
'';
onChange = "systemctl --user restart pypr";
};
# Bluetooth applet
services.blueman-applet.enable = true;
#########################
## SwayNotificationCenter (notifications)
#########################
systemd.user.services.swaync = {
Unit = {
Description = "SwayNotificationCenter";
After = [ "graphical-session.target" ];
};
Service = {
Type = "simple";
ExecStart = "${notif-package}/bin/swaync";
Restart = "on-failure";
};
Install = { WantedBy = [ "hyprland-session.target" ]; };
};
#########################
## EasyEffects
#########################
services.easyeffects.enable = true;
#########################
## Create tray target to fix some things
#########################
systemd.user.targets.tray = {
Unit = {
Description = "Home Manager System Tray";
Requires = [ "graphical-session-pre.target" "waybar.service" ];
After = [ "waybar.service" ];
};
};
#########################
## Default applications
#########################
xdg.mimeApps.defaultApplications = {
# Make all supported images open in swayimg
"image/jpeg" = [ "swayimg.desktop" ];
"image/png" = [ "swayimg.desktop" ];
"image/gif" = [ "swayimg.desktop" ];
"image/svg+xml" = [ "swayimg.desktop" ];
"image/webp" = [ "swayimg.desktop" ];
"image/avif" = [ "swayimg.desktop" ];
"image/tiff" = [ "swayimg.desktop" ];
"image/bmp" = [ "swayimg.desktop" ];
"application/pdf" = [ "org.gnome.Evince.desktop" ];
"text/html" = [ "firefox.desktop" ];
};
});
}