config/modules/home/wms/hyprland/default.nix

271 lines
7.5 KiB
Nix
Raw Normal View History

2024-05-23 20:26:30 +00:00
{
options,
config,
lib,
inputs,
system,
pkgs,
...
}:
with lib;
with lib.custom; let
cfg = config.wms.hyprland;
mkService = recursiveUpdate {
2025-01-09 13:33:20 -05:00
Unit.PartOf = ["graphical-session.target"];
Unit.After = ["graphical-session.target"];
Install.WantedBy = ["graphical-session.target"];
2024-05-23 20:26:30 +00:00
};
mod = "SUPER";
modshift = "${mod}SHIFT";
# binds $mod + [shift +] {1..10} to [move to] workspace {1..10} (stolen from fufie)
workspaces = builtins.concatLists (builtins.genList (
x: let
ws = let
c = (x + 1) / 10;
in
builtins.toString (x + 1 - (c * 10));
in [
"${mod}, ${ws}, workspace, ${toString (x + 1)}"
"${mod} SHIFT, ${ws}, movetoworkspace, ${toString (x + 1)}"
]
)
10);
in {
options.wms.hyprland = with types; {
enable = mkBoolOpt false "Enable Hyprland";
};
config = mkIf cfg.enable {
wayland.windowManager.hyprland = {
enable = true;
2025-01-12 13:37:57 -05:00
package = inputs.hyprland.packages.${pkgs.system}.hyprland;
2024-09-12 14:09:39 -04:00
xwayland.enable = true;
2024-05-23 20:26:30 +00:00
2025-03-22 16:03:07 -04:00
# plugins = with pkgs.hyprlandPlugins; [hypr-dynamic-cursors];
2024-12-19 21:47:51 -05:00
systemd = {
2025-01-09 13:33:20 -05:00
enable = false;
enableXdgAutostart = true;
2024-12-19 21:47:51 -05:00
};
2024-05-23 20:26:30 +00:00
};
wayland.windowManager.hyprland.settings = with colors; {
exec-once = [
2025-04-07 13:07:15 -04:00
"zen"
2024-12-19 21:47:51 -05:00
"thunderbird"
2024-05-23 20:26:30 +00:00
"vesktop"
"spotify"
2025-03-22 16:03:07 -04:00
"${lib.getExe pkgs.bash} -c '(( $(date +%u) < 6 )) && ${lib.getExe pkgs.slack}'"
"signal-desktop"
2024-05-23 20:26:30 +00:00
];
2025-04-07 13:07:15 -04:00
# env = [
# "XDG_SESSION_TYPE,wayland"
# "XDG_SESSION_DESKTOP,Hyprland"
# "XDG_CURRENT_DESKTOP,Hyprland"
# ];
2024-10-17 02:05:02 -04:00
2024-05-23 20:26:30 +00:00
bind =
[
2025-04-07 13:07:15 -04:00
"${mod},RETURN,exec,${lib.getExe pkgs.alacritty}"
2024-05-23 20:26:30 +00:00
2024-12-19 21:47:51 -05:00
"${mod},D,exec,rofi -show drun"
2024-05-23 20:26:30 +00:00
"${mod},Q,killactive"
"${mod},M,exit"
"${mod},P,pseudo"
2025-04-07 13:07:15 -04:00
"${mod},Z,exec,${pkgs.writeShellScriptBin "zen-launcher" ''
ZEN_RESULT=$(${inputs.hyprland.packages.${pkgs.system}.default}/bin/hyprctl clients -j | ${lib.getExe pkgs.jq} '.[] | select(.class | contains("zen"))')
if [ -z "$ZEN_RESULT" ]; then
${lib.getExe inputs.zen-browser.packages.${pkgs.system}.beta} &
disown
else
ZEN_WORKSPACE=$(echo "$ZEN_RESULT" | ${lib.getExe pkgs.jq} '.workspace.id')
${pkgs.hyprland}/bin/hyprctl dispatch workspace "$ZEN_WORKSPACE"
fi
''}/bin/zen-launcher"
2024-05-23 20:26:30 +00:00
"${mod},J,togglesplit,"
"${mod},T,togglegroup," # group focused window
"${modshift},G,changegroupactive," # switch within the active group
"${mod},V,togglefloating," # toggle floating for the focused window
"${mod},F,fullscreen," # fullscreen focused window
# workspace controls
"${modshift},right,movetoworkspace,+1" # move focused window to the next ws
"${modshift},left,movetoworkspace,-1" # move focused window to the previous ws
"${mod},mouse_down,workspace,e+1" # move to the next ws
"${mod},mouse_up,workspace,e-1" # move to the previous ws
"${mod},X,exec, ags --toggle-window \"dashboard\""
2024-10-31 21:01:42 -04:00
"${mod},Print,exec,${lib.getExe pkgs.custom.sc}"
2025-03-22 16:03:07 -04:00
"${mod},S,exec,${lib.getExe pkgs.grim} -g \"$(${lib.getExe pkgs.slurp})\" - | ${pkgs.wl-clipboard}/bin/wl-copy -t image/png"
# grim -g "$(slurp)" | wl-copy
2024-05-23 20:26:30 +00:00
"${modshift},O,exec,wl-ocr"
2025-03-22 16:03:07 -04:00
"${mod},Period,exec,rofimoji"
2024-05-23 20:26:30 +00:00
"${modshift},L,exec,swaylock --grace 0" # lock screen
]
++ workspaces;
bindm = [
"${mod},mouse:272,movewindow"
"${mod},mouse:273,resizewindow"
];
general = {
# gaps
gaps_in = 4;
gaps_out = 8;
2024-05-23 20:26:30 +00:00
# border thiccness
2025-04-07 13:07:15 -04:00
border_size = 4;
2024-05-23 20:26:30 +00:00
2025-03-22 16:03:07 -04:00
allow_tearing = true;
2024-05-23 20:26:30 +00:00
# active border color
2025-04-07 13:07:15 -04:00
"col.active_border" = "rgb(${base})";
"col.inactive_border" = "rgb(${base})";
2024-05-23 20:26:30 +00:00
};
input = {
kb_layout = "us";
sensitivity = 0; # -1.0 - 1.0, 0 means no modification.
accel_profile = "flat";
2024-09-11 12:55:19 -04:00
force_no_accel = false;
2024-05-23 20:26:30 +00:00
};
dwindle = {
force_split = 2;
};
2024-05-23 20:26:30 +00:00
decoration = {
# fancy corners
2025-04-07 13:07:15 -04:00
rounding = 0;
2024-05-23 20:26:30 +00:00
# blur
blur = {
enabled = true;
2024-12-19 21:47:51 -05:00
size = 6;
passes = 2;
2024-05-23 20:26:30 +00:00
new_optimizations = 1;
contrast = 1;
brightness = 1;
2024-05-23 20:26:30 +00:00
};
2024-11-23 18:12:57 -05:00
shadow = {
# shadow config
2024-12-19 21:47:51 -05:00
enabled = false;
# range = 60;
# render_power = 5;
# color = "rgba(07061f29)";
2024-11-23 18:12:57 -05:00
};
2024-05-23 20:26:30 +00:00
};
misc = {
# disable redundant renders
disable_splash_rendering = true;
force_default_wallpaper = 0;
disable_hyprland_logo = true;
2025-01-12 13:37:57 -05:00
vfr = false;
vrr = 2;
2024-05-23 20:26:30 +00:00
# dpms
2024-12-19 21:47:51 -05:00
# mouse_move_enables_dpms = true; # enable dpms on mouse/touchpad action
# key_press_enables_dpms = true; # enable dpms on keyboard action
2024-05-23 20:26:30 +00:00
disable_autoreload = true; # autoreload is unnecessary on nixos, because the config is readonly anyway
};
xwayland = {
force_zero_scaling = true;
};
2025-03-22 16:03:07 -04:00
ecosystem = {
no_update_news = true;
no_donation_nag = true;
};
2025-01-12 13:37:57 -05:00
experimental = {
xx_color_management_v4 = true;
};
2024-10-16 15:40:35 -04:00
cursor = {
no_hardware_cursors = true;
};
2025-03-22 16:03:07 -04:00
# for 10 bit color: DP-3,2560x1440@240,0x0,1,bitdepth,10,cm,hdr,sdrbrightness,1.2,sdrsaturation,1.0
monitor = ["DP-3,2560x1440@240,0x0,1" "HDMI-A-1,disable" "DP-1,disable"];
2024-05-23 20:26:30 +00:00
layerrule = [
"blur, ^(gtk-layer-shell)$"
"blur, ^(launcher)$"
"ignorezero, ^(gtk-layer-shell)$"
"ignorezero, ^(launcher)$"
"blur, notifications"
"ignorezero, notifications"
"blur, bar"
"ignorezero, bar"
"ignorezero, ^(gtk-layer-shell|anyrun)$"
"blur, ^(gtk-layer-shell|anyrun)$"
"noanim, launcher"
"noanim, bar"
];
windowrulev2 = [
# only allow shadows for floating windows
"noshadow, floating:0"
"tile, title:Spotify"
"idleinhibit focus, class:^(mpv)$"
"float, title:^(Picture-in-Picture)$"
"pin, title:^(Picture-in-Picture)$"
"float,class:udiskie"
# "workspace special silent,class:^(pavucontrol)$"
"float, class:^(imv)$"
# throw sharing indicators away
"workspace special silent, title:^(Firefox Sharing Indicator)$"
"workspace special silent, title:^(.*is sharing (your screen|a window)\.)$"
"workspace 5, class:^(thunderbird)$"
"workspace 4, title:^(.*(Disc|WebC)ord.*)$"
"workspace 4, class:^(.*Slack.*)$"
"workspace 3, title:^(Spotify Premium)$"
2025-03-22 16:03:07 -04:00
"workspace 2, class:^(librewolf)$"
2024-05-23 20:26:30 +00:00
"opacity 0.0 override,class:^(xwaylandvideobridge)$"
"noanim,class:^(xwaylandvideobridge)$"
"noinitialfocus,class:^(xwaylandvideobridge)$"
"maxsize 1 1,class:^(xwaylandvideobridge)$"
"noblur,class:^(xwaylandvideobridge)$"
];
};
2024-09-21 18:49:15 -04:00
# # fake a tray to let apps start
# # https://github.com/nix-community/home-manager/issues/2064
2025-01-09 13:33:20 -05:00
# systemd.user.targets.tray = {
# Unit = {
# Description = "Home Manager System Tray";
# Requires = ["graphical-session-pre.target"];
# };
# };
2024-05-23 20:26:30 +00:00
systemd.user.services = {
swaybg = mkService {
Unit.Description = "Wallpaper chooser";
Service = {
ExecStart = "${getExe pkgs.swaybg} -i ${wallpaper}";
Restart = "always";
};
};
};
};
}