nix-config/home/hyprland.nix
2024-04-13 09:04:04 -04:00

442 lines
13 KiB
Nix

{ pkgs, ... }:
let
inherit (pkgs) polkit_gnome callPackage;
opacity = "0.95";
super = "SUPER";
hycov = callPackage ../packages/hycov.nix { };
osu-backgrounds = callPackage ../packages/osu-backgrounds.nix { };
raiseVolumeScript = "hypr/raise-volume.fish";
lowerVolumeScript = "hypr/lower-volume.fish";
gapsScript = "hypr/gaps.sh";
randomBackgroundScript = "hypr/random-bg.fish";
swapBackgroundScript = "hypr/swap-bg.fish";
setBackgroundScript = "hypr/set-bg.fish";
in
{
home.packages = with pkgs; [
hyprdim
hyprnome
hypridle
hyprlock
hyprshade
swww
grimblast
brightnessctl
playerctl
mpvpaper
lnch
wev
tessen
wtype
dmenu-wayland
thud
python311Packages.icoextract
wallust
activate-linux
wl-clipboard-rs
wf-recorder
lutgen
];
wayland.windowManager.hyprland = {
enable = true;
plugins = [
hycov
];
settings = {
env = [
"XCURSOR_SIZE,24"
"BROWSER,librewolf"
"QT_IM_MODULE,fcitx"
"XMODIFIERS,@im=fcitx"
"SDL_IM_MODULE,fcitx"
"GLFW_IM_MODULE,ibus"
"SWWW_TRANSITION,grow"
"SWWW_TRANSITION_STEP,200"
"SWWW_TRANSITION_DURATION,1.5"
"SWWW_TRANSITION_FPS,240"
"SWWW_TRANSITION_WAVE,80,40"
"QT_AUTO_SCREEN_SCALE_FACTOR,1"
"QT_QPA_PLATFORM,wayland;xcb"
"QT_WAYLAND_DISABLE_WINDOWDECORATION,1"
"QT_QPA_PLATFORMTHEME,qt5ct"
"QT_STYLE_OVERRIDE,kvantum"
];
monitor = ",preferred,auto,1";
exec-once = [
"sleep 0.1; swww init"
"wpctl set-volume @DEFAULT_AUDIO_SINK@ 20%"
"ironbar"
"fcitx5"
"hyprctl dispatch workspace 5000000"
"${polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"
"hyprdim --no-dim-when-only --persist --ignore-leaving-special --dialog-dim"
"hypridle"
"sleep 1 && eww open desktop-icons"
"~/.config/${randomBackgroundScript}"
];
input = {
kb_layout = "us";
repeat_rate = 50;
repeat_delay = 300;
accel_profile = "flat";
follow_mouse = 1;
sensitivity = 0;
mouse_refocus = false;
touchpad = {
natural_scroll = true;
disable_while_typing = false;
};
};
general = {
gaps_in = 0;
gaps_out = 0;
border_size = 0;
layout = "master";
};
decoration = {
rounding = 0;
drop_shadow = true;
shadow_range = 4;
shadow_render_power = 3;
blur = {
enabled = true;
size = 4;
passes = 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, slidevert"
"specialWorkspace, 1, 6, default, fade"
];
};
dwindle = {
preserve_split = true;
special_scale_factor = 1;
};
master = {
new_is_master = false;
new_on_top = false;
mfact = 0.65;
special_scale_factor = 1;
};
gestures = {
workspace_swipe = true;
};
device = [
{
name = "synps/2-synaptics-touchpad";
sensitivity = 0.75;
accel_profile = "flat";
natural_scroll = true;
disable_while_typing = false;
}
{
name = "tpps/2-elan-trackpoint";
sensitivity = 0.5;
accel_profile = "flat";
}
];
binds = {
allow_workspace_cycles = true;
};
plugin = {
hycov = {
hotarea_size = 0;
enable_gesture = 1;
};
};
layerrule = [
"blur,ironbar"
"blur,rofi"
"blur,notifications"
];
windowrulev2 = [
"nomaxsize,class:^(winecfg\.exe)$"
"nomaxsize,class:^(osu\.exe)$"
"opaque,class:^(kitty)$"
"noblur,class:^(kitty)$"
"nodim,title:^(Picture-in-Picture)$"
"nodim,title:^()$"
"nodim,class:^(mpv)$"
"tile,class:^(.qemu-system-x86_64-wrapped)$"
"opacity ${opacity} ${opacity},class:^(thunar)$"
"float,class:^(librewolf)$"
"center 1,class:^(librewolf)$"
];
misc = {
disable_hyprland_logo = true;
animate_manual_resizes = true;
animate_mouse_windowdragging = true;
disable_autoreload = true;
new_window_takes_over_fullscreen = 1;
};
bind = [
"${super}_SHIFT, Return, exec, kitty"
"${super}_SHIFT, Q, killactive"
"${super}, W, exec, ~/.config/${randomBackgroundScript}"
"${super}_SHIFT, W, exec, ~/.config/${swapBackgroundScript}"
"${super}, P, exec, dunstify --icon=$(grimblast save screen) Screenshot Captured."
", Print, exec, grimblast --freeze copy area"
"${super}_ALT, delete, exit"
"${super}, T, exec, tessen"
"${super}, V, togglefloating"
"${super}, B, centerwindow"
"${super}, U, exec, ~/.config/${gapsScript}"
"${super}, X, pin"
"${super}, F, fullscreen"
"${super}, S, swapactiveworkspaces, 0 1"
"${super}_SHIFT, S, movetoworkspace, special"
"${super}_SHIFT, A, exec, killall activate-linux || activate-linux -s 1.15 -x 412 -y 120 -c 1-1-1-0.05"
"${super}, O, exec, killall .ironbar-wrapper inotifywait pactl || ironbar"
"${super}_SHIFT, O, exec, eww close overlay || eww open overlay"
"${super}, F1, exec, killall rofi || rofi -show drun"
"${super}, F2, togglespecialworkspace"
"${super}, comma, exec, playerctl -p mpv position \"5-\" && notify-send -t 2000 \"Minus 5 seconds\" \"$(playerctl -p mpv position)\""
"${super}, period, exec, playerctl -p mpv position \"5+\" && notify-send -t 2000 \"Plus 5 seconds\" \"$(playerctl -p mpv position)\""
"${super}_SHIFT, comma, exec, playerctl -p mpv previous && notify-send -t 2000 \"Previous track\" \"$(playerctl -p mpv metadata xesam:title)\""
"${super}_SHIFT, period, exec, playerctl -p mpv next && notify-send -t 2000 \"Next track\" \"$(playerctl -p mpv metadata xesam:title)\""
"${super}, slash, exec, playerctl -p mpv play-pause && notify-send -t 2000 \"mpv\" \"$(playerctl -p mpv status)\""
"${super}, M, focusmonitor, +1"
"${super}_SHIFT, M, focusmonitor, -1"
"${super}, Return, layoutmsg, swapwithmaster master"
"${super}, J, layoutmsg, cyclenext"
"${super}, K, layoutmsg, cycleprev"
"${super}_SHIFT, J, layoutmsg, swapnext"
"${super}_SHIFT, K, layoutmsg, swapprev"
"${super}, C, splitratio, exact 0.80"
"${super}, C, layoutmsg, orientationtop"
"${super}_SHIFT, C, splitratio, exact 0.65"
"${super}_SHIFT, C, layoutmsg, orientationleft"
"${super}, H, layoutmsg, addmaster"
"${super}, L, layoutmsg, removemaster"
"${super}_SHIFT, H, splitratio, -0.05"
"${super}_SHIFT, L, splitratio, +0.05"
"${super}_ALT, L, exec, hyprlock"
"${super}, 1, exec, hyprnome --previous"
"${super}, 2, exec, hyprnome"
"${super}, F11, exec, hyprnome --previous"
"${super}, F12, exec, hyprnome"
"${super}_SHIFT, 1, exec, hyprnome --previous --move"
"${super}_SHIFT, 2, exec, hyprnome --move"
"${super}, Tab, hycov:toggleoverview"
"${super}, Left, hycov:movefocus,l"
"${super}, Right, hycov:movefocus,r"
"${super}, Up, hycov:movefocus,u"
"${super}, Down, hycov:movefocus,d"
"${super}, mouse_down, workspace, e+1"
"${super}, mouse_up, workspace, e-1"
];
bindm = [
"${super}, mouse:272, movewindow"
"${super}, mouse:273, resizewindow"
];
bindl = [
", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && notify-send -t 2000 \"Muted\" \"$(wpctl get-volume @DEFAULT_AUDIO_SINK@)\""
", XF86AudioRaiseVolume, exec, ~/.config/${raiseVolumeScript}"
", XF86AudioLowerVolume, exec, ~/.config/${lowerVolumeScript}"
", XF86MonBrightnessDown, exec, brightnessctl set 5%- && notify-send -t 2000 \"Decreased brightness to\" \"$(brightnessctl get)\""
", XF86MonBrightnessUp, exec, brightnessctl set +5% && notify-send -t 2000 \"Increased brightness to\" \"$(brightnessctl get)\""
];
};
extraConfig = /* bash */ ''
bind = CTRL, Alt_L, submap, passthrough
submap = passthrough
bind = CTRL, Alt_L, submap, reset
submap = reset
'';
};
xdg.configFile.${gapsScript} = {
executable = true;
text = /* bash */ ''
#!/usr/bin/env bash
hyprctl keyword general:gaps_out $((10 - $(hyprctl getoption general:gaps_out -j | jq -r ".custom" | choose 1)))
hyprctl keyword general:gaps_in $((5 - $(hyprctl getoption general:gaps_in -j | jq -r ".custom" | choose 1)))
hyprctl keyword general:border_size $((2 - $(hyprctl getoption general:border_size -j | jq -r ".int")))
hyprctl keyword decoration:rounding $((8 - $(hyprctl getoption decoration:rounding -j | jq -r ".int")))
'';
};
xdg.configFile.${raiseVolumeScript} = {
executable = true;
text = /* fish */ ''
#!/usr/bin/env fish
wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
set VOL $(math "$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | choose 1) * 100")
notify-send -t 2000 "Raised volume to" "$VOL%"
'';
};
xdg.configFile.${lowerVolumeScript} = {
executable = true;
text = /* fish */ ''
#!/usr/bin/env fish
wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
set VOL $(math "$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | choose 1) * 100")
notify-send -t 2000 "Lowered volume to" "$VOL%"
'';
};
xdg.configFile.${setBackgroundScript} = {
executable = true;
text = /* fish */ ''
#!/usr/bin/env fish
if [ (hyprctl getoption animations:enabled -j | jq -r ".int") = "1" ]
swww img \
--transition-type $(random choice grow wave outer) \
--transition-wave 80,40 \
--transition-angle $(random choice 45 90 135 225 270 315) \
--transition-pos $(random choice center top left right bottom top-left top-right bottom-left bottom-right) \
--transition-step 200 \
--transition-duration 1.5 \
--transition-fps 240 \
--outputs "$argv[1]" \
"$argv[2]"
else
swww img \
--transition-type simple \
--transition-step 255 \
--outputs "$argv[1]" \
"$argv[2]"
end
'';
};
xdg.configFile.${randomBackgroundScript} = {
executable = true;
text = /* fish */ ''
#!/usr/bin/env fish
for monitor in (hyprctl monitors -j | jq -r '.[].name')
~/.config/${setBackgroundScript} "$monitor" "$(random choice $(fd . ${osu-backgrounds}/2024-03-30-Spring-2024-Fanart-Contest-All-Entries --follow -e jpg -e png))"
end
'';
};
xdg.configFile.${swapBackgroundScript} = {
executable = true;
text = /* fish */ ''
#!/usr/bin/env fish
set M "$(swww query | choose -1)"
set M1 "$(echo "$M" | head -n 1)"
set M2 "$(echo "$M" | tail -n 1)"
~/.config/${setBackgroundScript} "$(swww query | choose 0 | choose -c 0..-1 | tail -n 1)" $M1
~/.config/${setBackgroundScript} "$(swww query | choose 0 | choose -c 0..-1 | head -n 1)" $M2
'';
};
xdg.configFile."hypr/hyprlock.conf".text = /* bash */ ''
general {
hide_cursor = true
grace = 2
}
background {
color = rgba(25, 20, 20, 1.0)
path = screenshot
blur_passes = 2
brightness = 0.5
}
label {
text =
color = rgba(222, 222, 222, 1.0)
font_size = 50
font_family = Noto Sans CJK JP
position = 0, 70
halign = center
valign = center
}
input-field {
size = 50, 50
dots_size = 0.33
dots_spacing = 0.15
outer_color = rgba(25, 20, 20, 0)
inner_color = rgba(25, 20, 20, 0)
font_color = rgba(222, 222, 222, 1.0)
placeholder_text =
}
'';
xdg.configFile."hypr/hypridle.conf".text = /* bash */ ''
general {
lock_cmd = pidof hyprlock || hyprlock
before_sleep_cmd = loginctl lock-session
after_sleep_cmd = hyprctl dispatch dpms on
}
listener {
timeout = 150
on-timeout = brightnessctl -s set 10
on-resume = brightnessctl -r
}
listener {
timeout = 300
on-timeout = loginctl lock-session
}
listener {
timeout = 380
on-timeout = hyprctl dispatch dpms off
on-resume = hyprctl dispatch dpms on
}
listener {
timeout = 1800
on-timeout = systemctl suspend
}
'';
}