nix-config/home/hyprland.nix
Donovan Glover 2caaa661d9
meta(hyprland): Add hycov plugin
This cool plugin makes it possible to press "alt+tab" in order to switch
between all windows in Hyprland, particularly useful if a certain window
you want to focus is a few workspaces away from your current one.

It's also possible to swipe up with 4 fingers to show hycov, from which
you can then use 3 finger motions to switch between the shown windows.

Finally, it's possible to show hycov by simply hovering over the bottom
right part of the screen, similar to the "show desktop" functionality in
certain desktop environments and GNOME's hot corner feature.
2024-03-29 14:54:59 -04:00

404 lines
12 KiB
Nix

{ pkgs, config, lib, ... }:
let
opacity = lib.strings.floatToString config.stylix.opacity.terminal;
modifier = "SUPER";
in
{
home.packages = with pkgs; [
hyprnome
hypridle
hyprlock
];
wayland.windowManager.hyprland = {
enable = true;
plugins = [
(pkgs.callPackage ../packages/hycov.nix { })
];
};
xdg.configFile."hypr/gaps.sh" = {
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 $((4 - $(hyprctl getoption general:border_size -j | jq -r ".int")))
hyprctl keyword decoration:rounding $((8 - $(hyprctl getoption decoration:rounding -j | jq -r ".int")))
'';
};
xdg.configFile."hypr/raise-volume.fish" = {
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."hypr/lower-volume.fish" = {
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."hypr/set-bg.fish" = {
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."hypr/random-bg.fish" = {
executable = true;
text = /* fish */ ''
#!/usr/bin/env fish
cd ~/.config/hypr
for monitor in (hyprctl monitors -j | jq -r '.[].name')
./set-bg.fish "$monitor" "$(random choice $(fd . /run/current-system/sw/share/backgrounds --follow -e jpg -e png))"
end
'';
};
xdg.configFile."hypr/swap-bg.fish" = {
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)"
cd ~/.config/hypr
./set-bg.fish "$(swww query | choose 0 | choose -c 0..-1 | tail -n 1)" $M1
./set-bg.fish "$(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
}
'';
xdg.configFile."hypr/hyprland.conf".text = with config.lib.stylix.colors; /* bash */ ''
env=XCURSOR_SIZE,24
env=BROWSER,librewolf
env=QT_IM_MODULE,fcitx
env=XMODIFIERS,@im=fcitx
env=SDL_IM_MODULE,fcitx
env=GLFW_IM_MODULE,ibus
env=SWWW_TRANSITION,grow
env=SWWW_TRANSITION_STEP,200
env=SWWW_TRANSITION_DURATION,1.5
env=SWWW_TRANSITION_FPS,240
env=SWWW_TRANSITION_WAVE,80,40
env=QT_AUTO_SCREEN_SCALE_FACTOR,1
env=QT_QPA_PLATFORM,wayland;xcb
env=QT_WAYLAND_DISABLE_WINDOWDECORATION,1
env=QT_QPA_PLATFORMTHEME,qt5ct
env=QT_STYLE_OVERRIDE,kvantum
monitor=,preferred,auto,1
exec-once = sleep 0.1; swww init
exec-once = wpctl set-volume @DEFAULT_AUDIO_SINK@ 20%
exec-once = ironbar
exec-once = fcitx5
exec-once = hyprctl dispatch workspace 5000000
exec-once = ${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1
exec-once = hyprdim --no-dim-when-only --persist --ignore-leaving-special --dialog-dim
exec-once = hypridle
exec-once = sleep 1 && eww open desktop-icons
exec-once = ~/.config/hypr/random-bg.fish
input {
kb_layout = us
accel_profile = flat
follow_mouse = 1
mouse_refocus = 0
sensitivity = 0
touchpad {
natural_scroll = yes
disable_while_typing = no
}
repeat_rate = 50
repeat_delay = 300
}
general {
gaps_in = 5
gaps_out = 10
border_size = 4
col.active_border = rgb(${base04}) rgb(${base05}) 45deg
col.inactive_border = rgb(${base02})
layout = master
}
decoration {
rounding = 8
drop_shadow = yes
shadow_range = 4
shadow_render_power = 3
col.shadow = rgba(1a1a1aee)
blur {
enabled = yes
size = 4
passes = 2
}
}
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, slidevert
animation = specialWorkspace, 1, 6, default, fade
}
dwindle {
preserve_split = yes
special_scale_factor = 1
}
master {
new_is_master = no
new_on_top = no
no_gaps_when_only = yes
mfact = 0.65
special_scale_factor = 1
}
gestures {
workspace_swipe = yes
}
device {
name = synps/2-synaptics-touchpad
sensitivity = 0.75
accel_profile = flat
natural_scroll = yes
disable_while_typing = no
}
device {
name = tpps/2-elan-trackpoint
sensitivity = 0.5
accel_profile = flat
}
binds {
allow_workspace_cycles = yes
}
$SUPER = ${modifier}
$SUPER_SHIFT = ${modifier}_SHIFT
$SUPER_ALT = ${modifier}_ALT
bind = $SUPER_SHIFT, Return, exec, kitty
bind = $SUPER_SHIFT, Q, killactive
bind = $SUPER, W, exec, ~/.config/hypr/random-bg.fish
bind = $SUPER_SHIFT, W, exec, ~/.config/hypr/swap-bg.fish
bind = $SUPER, P, exec, dunstify --icon=$(grimblast save screen) Screenshot Captured.
bind = , Print, exec, grimblast --freeze copy area
bind = $SUPER_ALT, delete, exit
bind = $SUPER, T, exec, tessen
bind = $SUPER, V, togglefloating
bind = $SUPER, B, centerwindow
bind = $SUPER, U, exec, ~/.config/hypr/gaps.sh
bind = $SUPER, X, pin
bind = $SUPER, F, fullscreen
bind = $SUPER, S, swapactiveworkspaces, 0 1
bind = $SUPER_SHIFT, S, movetoworkspace, special
bind = $SUPER, O, exec, killall .ironbar-wrapper || ironbar
bind = $SUPER_SHIFT, O, exec, eww close overlay || eww open overlay
bind = $SUPER, F1, exec, killall rofi || rofi -show drun
bind = $SUPER, F2, togglespecialworkspace
bind = $SUPER, comma, exec, playerctl -p mpv position "5-" && notify-send -t 2000 "Minus 5 seconds" "$(playerctl -p mpv position)"
bind = $SUPER, period, exec, playerctl -p mpv position "5+" && notify-send -t 2000 "Plus 5 seconds" "$(playerctl -p mpv position)"
bind = $SUPER_SHIFT, comma, exec, playerctl -p mpv previous && notify-send -t 2000 "Previous track" "$(playerctl -p mpv metadata xesam:title)"
bind = $SUPER_SHIFT, period, exec, playerctl -p mpv next && notify-send -t 2000 "Next track" "$(playerctl -p mpv metadata xesam:title)"
bind = $SUPER, slash, exec, playerctl -p mpv play-pause && notify-send -t 2000 "mpv" "$(playerctl -p mpv status)"
bind = $SUPER, M, focusmonitor, +1
bind = $SUPER_SHIFT, M, focusmonitor, -1
bind = $SUPER, Return, layoutmsg, swapwithmaster master
bind = $SUPER, J, layoutmsg, cyclenext
bind = $SUPER, K, layoutmsg, cycleprev
bind = $SUPER_SHIFT, J, layoutmsg, swapnext
bind = $SUPER_SHIFT, K, layoutmsg, swapprev
bind = $SUPER, C, splitratio, exact 0.80
bind = $SUPER, C, layoutmsg, orientationtop
bind = $SUPER_SHIFT, C, splitratio, exact 0.65
bind = $SUPER_SHIFT, C, layoutmsg, orientationleft
bind = $SUPER, H, layoutmsg, addmaster
bind = $SUPER, L, layoutmsg, removemaster
bind = $SUPER_SHIFT, H, splitratio, -0.05
bind = $SUPER_SHIFT, L, splitratio, +0.05
bind = $SUPER_ALT, L, exec, hyprlock
bind = $SUPER, 1, exec, hyprnome --previous
bind = $SUPER, 2, exec, hyprnome
bind = $SUPER, F11, exec, hyprnome --previous
bind = $SUPER, F12, exec, hyprnome
bind = $SUPER_SHIFT, 1, exec, hyprnome --previous --move
bind = $SUPER_SHIFT, 2, exec, hyprnome --move
bind = ALT, tab, hycov:toggleoverview
bind = ALT, h, hycov:movefocus,l
bind = ALT, l, hycov:movefocus,r
bind = ALT, k, hycov:movefocus,u
bind = ALT, j, hycov:movefocus,d
plugin {
hycov {
hotarea_pos = 2
enable_gesture = 1
enable_alt_release_exit = 1
alt_toggle_auto_next = 1
}
}
bind = CTRL, Alt_L, submap, passthrough
submap = passthrough
bind = CTRL, Alt_L, submap, reset
submap = reset
layerrule = blur,ironbar
layerrule = blur,rofi
layerrule = blur,notifications
windowrulev2 = nomaxsize,class:^(winecfg\.exe)$
windowrulev2 = nomaxsize,class:^(osu\.exe)$
windowrulev2 = opaque,class:^(kitty)$
windowrulev2 = noblur,class:^(kitty)$
windowrulev2 = nodim,title:^(Picture-in-Picture)$
windowrulev2 = nodim,title:^()$
windowrulev2 = nodim,class:^(mpv)$
windowrulev2 = tile,class:^(.qemu-system-x86_64-wrapped)$
windowrulev2 = opacity ${opacity} ${opacity},class:^(thunar)$
windowrulev2 = float,class:^(librewolf)$
windowrulev2 = center 1,class:^(librewolf)$
# Scroll through existing workspaces with super + scroll
bind = $SUPER, mouse_down, workspace, e+1
bind = $SUPER, mouse_up, workspace, e-1
# Move/resize windows with super + LMB/RMB and dragging
bindm = $SUPER, mouse:272, movewindow
bindm = $SUPER, mouse:273, resizewindow
# Change volume with keys
bindl=, XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && notify-send -t 2000 "Muted" "$(wpctl get-volume @DEFAULT_AUDIO_SINK@)"
bindl=, XF86AudioRaiseVolume, exec, ~/.config/hypr/raise-volume.fish
bindl=, XF86AudioLowerVolume, exec, ~/.config/hypr/lower-volume.fish
bindl=, XF86MonBrightnessDown, exec, brightnessctl set 5%- && notify-send -t 2000 "Decreased brightness to" "$(brightnessctl get)"
bindl=, XF86MonBrightnessUp, exec, brightnessctl set +5% && notify-send -t 2000 "Increased brightness to" "$(brightnessctl get)"
misc {
disable_hyprland_logo = yes
animate_manual_resizes = yes
animate_mouse_windowdragging = yes
disable_autoreload = yes
}
'';
}