360 lines
13 KiB
Nix
360 lines
13 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
accentColour ? "base07",
|
|
catppuccinVariant ? "Mocha",
|
|
...
|
|
}: {
|
|
stylix.targets.xresources.enable = true;
|
|
imports = [
|
|
../default.nix
|
|
../email/default.nix
|
|
../password-store/default.nix
|
|
../swaylock/default.nix
|
|
../waybar/default.nix
|
|
../rofi/default.nix
|
|
../swaync/default.nix
|
|
../avizo/default.nix
|
|
../alacritty/default.nix
|
|
../emacs/default.nix
|
|
../nyxt/default.nix
|
|
../obs/default.nix
|
|
../cava/default.nix
|
|
];
|
|
home.packages = with pkgs; [
|
|
candy-icons
|
|
(writeShellScriptBin "protonmail-setup-bridge" ''
|
|
pkill -9 -f protonmail-bridge
|
|
${protonmail-bridge}/bin/protonmail-bridge -c
|
|
${config.wayland.windowManager.hyprland.finalPackage}/bin/hyprctl dispatch exec "${protonmail-bridge}/bin/protonmail-bridge -n"
|
|
'')
|
|
];
|
|
programs = {
|
|
rofi = with pkgs; {
|
|
package = rofi-wayland;
|
|
terminal = "${alacritty}/bin/alacritty";
|
|
pass.package = rofi-pass-wayland;
|
|
};
|
|
zellij.settings.copy_command = "wl-copy";
|
|
};
|
|
services = {
|
|
gpg-agent.pinentryFlavor = "gnome3";
|
|
avizo.enable = true;
|
|
syncthing.enable = true;
|
|
udiskie = {
|
|
enable = true;
|
|
notify = true;
|
|
automount = true;
|
|
tray = "never";
|
|
};
|
|
};
|
|
gtk = {
|
|
enable = true;
|
|
iconTheme = {
|
|
package = pkgs.sweet-folders;
|
|
name = "Sweet-Rainbow";
|
|
};
|
|
theme = let
|
|
accent = "Lavender";
|
|
size = "Standard";
|
|
in {
|
|
package = with lib.strings;
|
|
pkgs.catppuccin-gtk.override {
|
|
accents = [(toLower accent)];
|
|
size = toLower size;
|
|
variant = toLower catppuccinVariant;
|
|
};
|
|
name = "Catppuccin-${catppuccinVariant}-${size}-${accent}-Dark";
|
|
};
|
|
};
|
|
xdg.configFile."hypr/hyprpaper.conf".text = ''
|
|
preload = ${config.stylix.image}
|
|
wallpaper = ,${config.stylix.image}
|
|
'';
|
|
systemd.user.services.hyprpaper = {
|
|
Unit = {
|
|
Description = "Hyprland wallpaper utility";
|
|
Wants = ["hyprland-session.target"];
|
|
After = ["hyprland-session.target"];
|
|
};
|
|
Service = {
|
|
Environment = ["PATH=/run/current-system/sw/bin/:$PATH"];
|
|
Restart = "always";
|
|
ExecStart = "${pkgs.hyprpaper}/bin/hyprpaper";
|
|
};
|
|
Install.WantedBy = ["default.target"];
|
|
};
|
|
wayland.windowManager.hyprland = {
|
|
enable = true;
|
|
xwayland.enable = true;
|
|
systemd.enable = true;
|
|
settings = {
|
|
monitor = [",preferred,auto,auto"];
|
|
env = with config; [
|
|
"XDG_CURRENT_DESKTOP=Hyprland"
|
|
"XDG_SESSION_TYPE=wayland"
|
|
"XDG_SESSION_DESKTOP=Hyprland"
|
|
"GDK_BACKEND=wayland,x11"
|
|
"GTK_THEME,${gtk.theme.name}"
|
|
"XCURSOR_THEME,${stylix.cursor.name}"
|
|
"XCURSOR_SIZE,${toString stylix.cursor.size}"
|
|
"QT_AUTO_SCREEN_SCALE_FACTOR,1"
|
|
"QT_QPA_PLATFORM,wayland"
|
|
"QT_WAYLAND_DISABLE_WINDOWDECORATION,1"
|
|
"MOZ_ENABLE_WAYLAND,1"
|
|
"GRIM_DEFAULT_DIR=${xdg.userDirs.pictures}/Grim"
|
|
];
|
|
exec-once = with config; [
|
|
"${wayland.windowManager.hyprland.finalPackage}/bin/hyprctl setcursor ${stylix.cursor.name} ${toString stylix.cursor.name}"
|
|
"${pkgs.swaynotificationcenter}/bin/swaync"
|
|
"${pkgs.libsForQt5.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1"
|
|
"${pkgs.protonmail-bridge}/bin/protonmail-bridge -n"
|
|
];
|
|
gestures.workspace_swipe = true;
|
|
input = {
|
|
kb_layout = "gb";
|
|
kb_options = "ctrl:nocaps";
|
|
follow_mouse = 1;
|
|
touchpad.natural_scroll = "yes";
|
|
};
|
|
dwindle = {
|
|
force_split = 2;
|
|
preserve_split = false;
|
|
smart_split = false;
|
|
smart_resizing = false;
|
|
special_scale_factor = 0.95;
|
|
no_gaps_when_only = 0;
|
|
use_active_for_splits = true;
|
|
default_split_ratio = 1.0;
|
|
};
|
|
master = {
|
|
allow_small_split = true;
|
|
special_scale_factor = 0.95;
|
|
mfact = 0.5;
|
|
new_is_master = false;
|
|
new_on_top = false;
|
|
no_gaps_when_only = 0;
|
|
orientation = "left";
|
|
inherit_fullscreen = false;
|
|
smart_resizing = false;
|
|
drop_at_cursor = true;
|
|
};
|
|
general = with config.lib.stylix;
|
|
with colors; {
|
|
"col.active_border" = "rgb(${colors.${accentColour}})";
|
|
"col.inactive_border" = "rgb(${base03})";
|
|
gaps_in = 5;
|
|
gaps_out = 10;
|
|
border_size = 1;
|
|
cursor_inactive_timeout = 5;
|
|
layout = "dwindle";
|
|
};
|
|
decoration = with config.lib.stylix.colors; {
|
|
rounding = 10;
|
|
"col.shadow" = "rgba(0d${base00})";
|
|
drop_shadow = "yes";
|
|
shadow_ignore_window = true;
|
|
shadow_range = 4;
|
|
shadow_render_power = 3;
|
|
blur = {
|
|
enabled = true;
|
|
size = 5;
|
|
passes = 3;
|
|
new_optimizations = true;
|
|
brightness = 1.0;
|
|
noise = 2.0e-2;
|
|
};
|
|
};
|
|
animations = {
|
|
enabled = true;
|
|
bezier = "myBezier, 0.05, 0.9, 0.1, 1.05";
|
|
animation = [
|
|
"windows, 1, 7, myBezier"
|
|
"windowsOut, 1, 7, default, popin 80%"
|
|
"border, 1, 10, default"
|
|
"borderangle, 1, 8, default"
|
|
"fade, 1, 7, default"
|
|
"workspaces, 1, 6, default"
|
|
];
|
|
};
|
|
misc = {
|
|
disable_splash_rendering = true;
|
|
disable_autoreload = true;
|
|
mouse_move_enables_dpms = true;
|
|
key_press_enables_dpms = true;
|
|
};
|
|
xwayland.force_zero_scaling = true;
|
|
layerrule = let
|
|
blur = x: "blur, ^(${x})$";
|
|
ignorealpha = x: "ignorealpha 0.3, ^(${x})$";
|
|
layers = [
|
|
"waybar"
|
|
"system-menu"
|
|
"rofi"
|
|
"gtk-layer-shell"
|
|
"notifications"
|
|
"swaync-.*"
|
|
"avizo"
|
|
];
|
|
in
|
|
(lib.lists.forEach layers blur)
|
|
++ (lib.lists.forEach layers ignorealpha);
|
|
windowrule = [
|
|
# Float + move system windows
|
|
"float,org.kde.polkit-kde-authentication-agent-1|Pinentry"
|
|
"center,org.kde.polkit-kde-authentication-agent-1|Pinentry"
|
|
"pin,org.kde.polkit-kde-authentication-agent-1|Pinentry"
|
|
"dimaround,org.kde.polkit-kde-authentication-agent-1|Pinentry"
|
|
"stayfocused,org.kde.polkit-kde-authentication-agent-1|Pinentry"
|
|
"float,pavucontrol|.blueman-manager-wrapped|nm-connection-editor"
|
|
"size 800 600,pavucontrol|.blueman-manager-wrapped|nm-connection-editor"
|
|
"move onscreen 100%-820 60,pavucontrol|.blueman-manager-wrapped|nm-connection-editor"
|
|
|
|
# LibreOffice
|
|
"nomaximizerequest, (libreoffice|soffice)(.*)"
|
|
"nofullscreenrequest, (libreoffice|soffice)(.*)"
|
|
|
|
# Remmina / NoMachine
|
|
"nofullscreenrequest,org.remmina.Remmina|Nxplayer.bin"
|
|
"nomaximizerequest,org.remmina.Remmina|Nxplayer.bin"
|
|
];
|
|
windowrulev2 = [
|
|
# Firefox PIP
|
|
"float,title:Picture-in-Picture|Library,class:firefox"
|
|
"size 750 400,title:Picture-in-Picture,class:firefox"
|
|
"size 800 800,title:Library,class:firefox"
|
|
"move onscreen 100%-775 100%-425,title:Picture-in-Picture,class:firefox"
|
|
"center,title:Library,class:firefox"
|
|
"pin,title:Picture-in-Picture,class:firefox"
|
|
|
|
# LibreOffice
|
|
"float,title:Open,class:(libreoffice|soffice)(.*)"
|
|
|
|
# Steam
|
|
"float,title:Friends List,class:steam"
|
|
"float,title:Steam Settings,class:steam"
|
|
|
|
# Remmina / NoMachine
|
|
"float,title:Remmina Remote Desktop Client|Remmina Preferences,class:org.remmina.Remmina"
|
|
"size 800 600,title:Remmina Remote Desktop Client|Remmina Preferences,class:org.remmina.Remmina"
|
|
"move onscreen 100%-820 60,title:Remmina Remote Desktop Client|Remmina Preferences,class:org.remmina.Remmina"
|
|
];
|
|
bind = let
|
|
withTerm = {
|
|
term ? "alacritty",
|
|
package ? config.programs.${term}.package,
|
|
progname,
|
|
args ? "",
|
|
}: "${package}/bin/${term} -T ${progname} -e ${progname} ${args}";
|
|
workspace = w: [
|
|
"SUPER, ${toString w}, moveworkspacetomonitor, ${toString w} current"
|
|
"SUPER, ${toString w}, workspace, ${toString w}"
|
|
"SUPER SHIFT, ${toString w}, movetoworkspace, ${toString w}"
|
|
];
|
|
in
|
|
with config.programs;
|
|
with lib.lists;
|
|
flatten (forEach (range 1 9) workspace)
|
|
++ (let
|
|
btm_args = "--autohide_time --battery --celsius --enable_cache_memory --enable_gpu_memory --group --hide_avg_cpu --hide_table_gap --retention=3m --show_table_scroll_position";
|
|
in [
|
|
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
|
|
"SUPER, F1, exec, ${swaylock.package}/bin/swaylock --screenshots --clock --indicator --grace-no-mouse"
|
|
"SUPER, Q, killactive,"
|
|
"SUPER SHIFT, Q, exec, pkill rofi || ${rofi.finalPackage}/bin/rofi -show powermenu -modi powermenu:${pkgs.rofi-power-menu}/bin/rofi-power-menu"
|
|
"SUPER, V, togglefloating"
|
|
"SUPER, F, fullscreen, 0" # Actual fullscreen
|
|
"SUPER, M, fullscreen, 1" # Maximise window
|
|
"SUPER, Z, exec, ${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw"
|
|
"SUPER SHIFT, Z, exec, ${pkgs.swaynotificationcenter}/bin/swaync-client -d -sw"
|
|
|
|
# Common program shortcuts
|
|
"SUPER, Return, exec, ${alacritty.package}/bin/alacritty"
|
|
"SUPER, E, exec, ${emacs.finalPackage}/bin/emacsclient -c"
|
|
"SUPER, W, exec, ${pkgs.nyxt}/bin/nyxt --no-socket"
|
|
|
|
# Rofi binds
|
|
"SUPER, Space, exec, pkill rofi || ${rofi.finalPackage}/bin/rofi -show drun"
|
|
"SUPER, tab, exec, pkill rofi || ${rofi.finalPackage}/bin/rofi -show window"
|
|
"SUPER SHIFT, Return, exec, pkill rofi || ${rofi.finalPackage}/bin/rofi -show ssh"
|
|
|
|
# rofi-pass binds
|
|
"SUPER, P, exec, pkill rofi || ${rofi.pass.package}/bin/rofi-pass"
|
|
"SUPER SHIFT, P, exec, pkill rofi || ${rofi.pass.package}/bin/rofi-pass --last-used"
|
|
"SUPER ALT, P, exec, pkill rofi || ${rofi.pass.package}/bin/rofi-pass --insert"
|
|
|
|
# Terminal utilities
|
|
"SUPER, S, exec, ${withTerm {
|
|
progname = "btm";
|
|
args = btm_args;
|
|
}}"
|
|
"SUPER SHIFT, S, exec, ${withTerm {
|
|
progname = "btm";
|
|
args = btm_args + " --basic";
|
|
}}"
|
|
"SUPER, C, exec, ${withTerm {progname = "cava";}}"
|
|
|
|
# Misc useful binds
|
|
'',Print,exec,${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)"''
|
|
",XF86Calculator,exec,pkill rofi || ${rofi.finalPackage}/bin/rofi -show calc"
|
|
|
|
# Movement binds
|
|
"SUPER, H, movefocus, l"
|
|
"SUPER, L, movefocus, r"
|
|
"SUPER, K, movefocus, u"
|
|
"SUPER, J, movefocus, d"
|
|
"SUPER SHIFT, H, movewindow, l"
|
|
"SUPER SHIFT, L, movewindow, r"
|
|
"SUPER SHIFT, K, movewindow, u"
|
|
"SUPER SHIFT, J, movewindow, d"
|
|
|
|
# Special workspaces
|
|
"SUPER, comma, workspace, r-1"
|
|
"SUPER SHIFT, comma, movetoworkspace, r-1"
|
|
"SUPER, period, workspace, r+1"
|
|
"SUPER SHIFT, period, movetoworkspace, r+1"
|
|
"SUPER, N, workspace, empty"
|
|
"SUPER SHIFT, N, movetoworkspace, empty"
|
|
"SUPER, minus, togglespecialworkspace"
|
|
"SUPER SHIFT, minus, movetoworkspace, special"
|
|
"SUPER, bracketright, focusmonitor, +1"
|
|
"SUPER SHIFT, bracketright, movecurrentworkspacetomonitor, +1"
|
|
"SUPER, bracketleft, focusmonitor, -1"
|
|
"SUPER SHIFT, bracketleft, movecurrentworkspacetomonitor, -1"
|
|
"SUPER, O, focusurgentorlast"
|
|
]);
|
|
bindl = with config.services; [
|
|
# Sound
|
|
",XF86AudioMute,exec,${avizo.package}/bin/volumectl %"
|
|
",XF86AudioMicMute,exec,${avizo.package}/bin/volumectl -m %"
|
|
|
|
# Playback
|
|
",XF86AudioPlay,exec,${pkgs.playerctl}/bin/playerctl play-pause"
|
|
",XF86AudioStop,exec,${pkgs.playerctl}/bin/playerctl play-pause"
|
|
",XF86AudioPrev,exec,${pkgs.playerctl}/bin/playerctl previous"
|
|
",XF86AudioNext,exec,${pkgs.playerctl}/bin/playerctl next"
|
|
];
|
|
bindle = with config.services; [
|
|
# Sound
|
|
",XF86AudioRaiseVolume,exec,${avizo.package}/bin/volumectl -u + 5"
|
|
",XF86AudioLowerVolume,exec,${avizo.package}/bin/volumectl -u - 5"
|
|
|
|
# Brightness
|
|
",XF86MonBrightnessUp,exec,${avizo.package}/bin/lightctl + 5"
|
|
",XF86MonBrightnessDown,exec,${avizo.package}/bin/lightctl - 5"
|
|
];
|
|
bindm = [
|
|
# Move/resize windows with mainMod + LMB/RMB and dragging
|
|
"SUPER, mouse:272, movewindow"
|
|
"SUPER, mouse:273, resizewindow"
|
|
];
|
|
};
|
|
extraConfig = ''
|
|
exec-once = systemctl --user import-environment WAYLAND_DISPLAY QT_QPA_PLATFORMTHEME
|
|
exec-once = systemctl --user restart "xdg-desktop-portal*"
|
|
exec-once = ${pkgs.git}/bin/git -C ${config.xdg.configHome}/emacs pull --ff-only
|
|
'';
|
|
};
|
|
}
|