343 lines
10 KiB
Nix
343 lines
10 KiB
Nix
{ config, pkgs, lib, ... }:
|
|
let
|
|
cfg = config.wayland.windowManager.hyprland;
|
|
in
|
|
{
|
|
home.sessionVariables = {
|
|
WLR_NO_HARDWARE_CURSORS = "1";
|
|
WLR_RENDERER_ALLOW_SOFTWARE = "1";
|
|
XDG_CURRENT_DESKTOP = "Hyprland";
|
|
XDG_SESSION_DESKTOP = "Hyprland";
|
|
XDG_SESSION_TYPE = "wayland";
|
|
GDK_BACKEND = "wayland,x11,*";
|
|
QT_QPA_PLATFORM = "wayland;xcb";
|
|
NIXOS_OZONE_WL = "1";
|
|
MOZ_ENABLE_WAYLAND = "1";
|
|
SDL_VIDEODRIVER = "wayland";
|
|
OZONE_PLATFORM = "wayland";
|
|
CLUTTER_BACKEND = "wayland";
|
|
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
|
|
# QT_QPA_PLATFORMTHEME = "qt6ct";
|
|
QT_AUTO_SCREEN_SCALE_FACTOR = "1";
|
|
|
|
LIBVA_DRIVER_NAME = "nvidia";
|
|
GBM_BACKEND = "nvidia-drm";
|
|
__GLX_VENDOR_LIBRARY_NAME = "nvidia";
|
|
};
|
|
|
|
home.packages = with pkgs; [
|
|
wl-clipboard-rs
|
|
];
|
|
|
|
programs.hyprlock = {
|
|
enable = true;
|
|
settings = {
|
|
general = {
|
|
disable_loading_bar = true;
|
|
grace = 300;
|
|
hide_cursor = true;
|
|
no_fade_in = false;
|
|
};
|
|
|
|
background = [
|
|
{
|
|
path = "screenshot";
|
|
blur_passes = 3;
|
|
blur_size = 8;
|
|
}
|
|
];
|
|
|
|
input-field = [
|
|
{
|
|
size = "200, 50";
|
|
position = "0, -80";
|
|
monitor = "";
|
|
dots_center = true;
|
|
fade_on_empty = false;
|
|
font_color = "rgb(202, 211, 245)";
|
|
inner_color = "rgb(91, 96, 120)";
|
|
outer_color = "rgb(24, 25, 38)";
|
|
outline_thickness = 5;
|
|
placeholder_text = ''Password...'';
|
|
shadow_passes = 2;
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
services.hypridle = {
|
|
enable = true;
|
|
settings = {
|
|
general = {
|
|
ignore_dbus_inhibit = false;
|
|
lock_cmd = "pidof hyprlock || hyprlock";
|
|
before_sleep_cmd = "loginctl lock-session";
|
|
after_sleep_cmd = "hyprctl dispatch dpms on";
|
|
};
|
|
|
|
listener = [
|
|
{
|
|
timeout = 900;
|
|
on-timeout = "hyprlock";
|
|
}
|
|
{
|
|
timeout = 1200;
|
|
on-timeout = "hyprctl dispatch dpms off";
|
|
on-resume = "hyprctl dispatch dpms on";
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
wayland.windowManager.hyprland = {
|
|
enable = true;
|
|
|
|
settings = let
|
|
scratchpads = [
|
|
(rec {
|
|
title = "Floating terminal";
|
|
class = "floatingTerminal";
|
|
command = "alacritty --class ${class} -e tmux new-session -A -s f";
|
|
size = { h = 90; w = 95; };
|
|
keys = [
|
|
"$mod, RETURN"
|
|
"$mod, SPACE"
|
|
];
|
|
})
|
|
(rec {
|
|
title = "Ncmpcpp";
|
|
class = "floatingNcmpcpp";
|
|
command = "alacritty --class ${class} -e ncmpcpp";
|
|
size = { h = 95; w = 95; };
|
|
keys = [ "$mod, Q" ];
|
|
})
|
|
# "$mod, W, emacs"
|
|
# "$mod, E, filebrowser"
|
|
# "$mod, X, taskwarriortui"
|
|
];
|
|
in {
|
|
"$mod" = "SUPER";
|
|
|
|
# https://github.com/xkbcommon/libxkbcommon/blob/master/include/xkbcommon/xkbcommon-keysyms.h
|
|
bind = [
|
|
"$mod SHIFT, Q, exit"
|
|
"$mod, R, exec, ${pkgs.rofi}/bin/rofi -show drun"
|
|
"$mod, T, togglefloating"
|
|
|
|
# TODO: fix this for upcoming releases
|
|
"$mod, F, fullscreen, 2"
|
|
"$mod, C, exec, hyprctl reload"
|
|
|
|
"$mod, BACKSPACE, exec, ${lib.getExe (pkgs.writeShellApplication {
|
|
name = "hyprland-kill-windows-except-scratchpads";
|
|
runtimeInputs = [ cfg.package pkgs.jq ];
|
|
text = ''
|
|
ACTIVE_WINDOW_CLASS=$(hyprctl activewindow -j | jq -r '.class')
|
|
|
|
case "$ACTIVE_WINDOW_CLASS" in
|
|
${lib.pipe scratchpads [
|
|
(map ({ class , ... }: ''
|
|
'${class}')
|
|
hyprctl dispatch togglespecialworkspace '${class}Ws'
|
|
;;
|
|
''))
|
|
(map (lib.splitString "\n"))
|
|
(lib.flatten)
|
|
(map (x: " " + x))
|
|
(lib.concatStringsSep "\n")
|
|
]}
|
|
*)
|
|
hyprctl dispatch killactive
|
|
;;
|
|
esac
|
|
'';
|
|
})}"
|
|
|
|
"$mod SHIFT, RETURN, exec, alacritty --class termTerminal -e tmux new-session -A -s term"
|
|
"$mod SHIFT, SPACE, exec, alacritty --class termTerminal -e tmux new-session -A -s term"
|
|
|
|
"$mod, j, layoutmsg,cyclenext"
|
|
"$mod, k, layoutmsg,cycleprev"
|
|
"$mod SHIFT, j, layoutmsg, swapnext"
|
|
"$mod SHIFT, k, layoutmsg, swapprev"
|
|
|
|
"$mod, 1, focusworkspaceoncurrentmonitor, 1"
|
|
"$mod, 2, focusworkspaceoncurrentmonitor, 2"
|
|
"$mod, 3, focusworkspaceoncurrentmonitor, 3"
|
|
"$mod, 4, focusworkspaceoncurrentmonitor, 4"
|
|
"$mod, 5, focusworkspaceoncurrentmonitor, 5"
|
|
"$mod, 6, focusworkspaceoncurrentmonitor, 6"
|
|
"$mod, 7, focusworkspaceoncurrentmonitor, 7"
|
|
"$mod, 8, focusworkspaceoncurrentmonitor, 8"
|
|
"$mod, 9, focusworkspaceoncurrentmonitor, 9"
|
|
|
|
"$mod SHIFT, 1, movetoworkspacesilent, 1"
|
|
"$mod SHIFT, 2, movetoworkspacesilent, 2"
|
|
"$mod SHIFT, 3, movetoworkspacesilent, 3"
|
|
"$mod SHIFT, 4, movetoworkspacesilent, 4"
|
|
"$mod SHIFT, 5, movetoworkspacesilent, 5"
|
|
"$mod SHIFT, 6, movetoworkspacesilent, 6"
|
|
"$mod SHIFT, 7, movetoworkspacesilent, 7"
|
|
"$mod SHIFT, 8, movetoworkspacesilent, 8"
|
|
"$mod SHIFT, 9, movetoworkspacesilent, 9"
|
|
|
|
"$mod, b, exec, ${pkgs.fcitx5}/bin/fcitx5-remote -s mozc"
|
|
"$mod, n, exec, ${pkgs.fcitx5}/bin/fcitx5-remote -s keyboard-no"
|
|
"$mod, m, exec, ${pkgs.fcitx5}/bin/fcitx5-remote -s keyboard-us"
|
|
|
|
# TODO: ensure exists in environment
|
|
"$mod, l, exec, loginctl lock-session"
|
|
|
|
# TODO: fix
|
|
# "super + minus" = "${pkgs.xcalib}/bin/xcalib -invert -alter"
|
|
|
|
# TODO: fix
|
|
", Print, exec, ${lib.getExe pkgs.grimblast} copy area"
|
|
|
|
# "SHIFT, Print, exec, ${lib.getExe pkgs.grimblast} copy area"
|
|
# "shift + @Print" = "${pkgs.maim}/bin/maim --hidecursor --nokeyboard $SCREENSHOT_DIR/$(date +%s).png"
|
|
|
|
# TODO: Add boomer as package
|
|
# "super + @Print" = "boomer"
|
|
]
|
|
++
|
|
(lib.pipe scratchpads [
|
|
(map ({ keys, command, class, ... }:
|
|
(map (key: let
|
|
# TODO: rewrite the scratchpad logic to move windows back and forth
|
|
# from the special workspaces, rather than overlay the workspaces.
|
|
#
|
|
# TODO: don't invoke the program upon close toggling the scratchpad
|
|
#
|
|
# TODO: ensure program becomes in focus upon open toggling the scratchpad
|
|
invokeIfNotRunningAndToggleWorkspace = pkgs.writeShellApplication {
|
|
name = "hyprland-toggle-scratchpad-${class}";
|
|
runtimeInputs = [ cfg.package pkgs.jq ];
|
|
text = ''
|
|
SCRATCHPAD_EXISTS=$(hyprctl clients -j | jq -r '[.[].class]|any(. == "${class}")')
|
|
|
|
if [ "$SCRATCHPAD_EXISTS" != "true" ]; then
|
|
${command} &
|
|
fi
|
|
|
|
hyprctl dispatch togglespecialworkspace '${class}Ws'
|
|
'';
|
|
};
|
|
in "${key}, exec, ${lib.getExe invokeIfNotRunningAndToggleWorkspace}"
|
|
) keys)
|
|
))
|
|
lib.flatten
|
|
]);
|
|
|
|
bindl = [
|
|
"$mod, p, exec, ${pkgs.mpc_cli}/bin/mpc toggle"
|
|
",XF86AudioPlay, exec, ${pkgs.mpc_cli}/bin/mpc toggle"
|
|
",XF86AudioPrev, exec, ${pkgs.mpc_cli}/bin/mpc prev"
|
|
",XF86AudioNext, exec, ${pkgs.mpc_cli}/bin/mpc next"
|
|
];
|
|
|
|
bindle = [
|
|
",XF86MonBrightnessUp, exec, ${lib.getExe pkgs.brightnessctl} s +5%"
|
|
",XF86MonBrightnessDown, exec, ${lib.getExe pkgs.brightnessctl} s 5%-"
|
|
",XF86AudioLowerVolume, exec, ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SINK@ 2%-"
|
|
",XF86AudioRaiseVolume, exec, ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SINK@ 2%+"
|
|
"$mod ,F7, exec, ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SINK@ 2%-"
|
|
"$mod ,F8, exec, ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SINK@ 2%+"
|
|
];
|
|
|
|
windowrulev2 = [
|
|
"float,class:(Rofi)"
|
|
|
|
"workspace 2,class:(firefox)"
|
|
"workspace 2,class:(google-chrome)"
|
|
|
|
"workspace 3,class:(Emacs)"
|
|
"workspace 3,class:(Code)"
|
|
"workspace 3,class:(code-url-handler)"
|
|
|
|
"workspace 5,class:(discord)"
|
|
"workspace 5,class:(Element)"
|
|
]
|
|
++
|
|
(lib.pipe scratchpads [
|
|
(map ({ class, size, ... }: [
|
|
"workspace special:${class}Ws, class:^${class}$"
|
|
"float, class:^${class}$"
|
|
"size ${toString size.w}% ${toString size.h}%, class:^${class}$"
|
|
"move ${toString ((100 - size.w) / 2)}% ${toString ((100 - size.h) / 2)}%, class:^${class}$"
|
|
]))
|
|
lib.flatten
|
|
]);
|
|
|
|
monitor = [
|
|
"DP-2, 1920x1080@144.00Hz, 0x0, 1"
|
|
"DVI-D-1, 1920x1080@144.00Hz, 1920x0, 1"
|
|
",preferred,auto,1"
|
|
];
|
|
|
|
general = {
|
|
gaps_in = 5;
|
|
gaps_out = 15;
|
|
|
|
border_size = 2;
|
|
|
|
"col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg";
|
|
"col.inactive_border" = "rgba(595959aa)";
|
|
|
|
resize_on_border = false;
|
|
allow_tearing = false;
|
|
layout = "master";
|
|
};
|
|
|
|
decoration = {
|
|
rounding = 10;
|
|
|
|
# Change transparency of focused and unfocused windows
|
|
active_opacity = 1.0;
|
|
inactive_opacity = 1.0;
|
|
|
|
drop_shadow = true;
|
|
shadow_range = 4;
|
|
shadow_render_power = 3;
|
|
"col.shadow" = "rgba(1a1a1aee)";
|
|
|
|
# https://wiki.hyprland.org/Configuring/Variables/#blur
|
|
blur = {
|
|
enabled = true;
|
|
size = 3;
|
|
passes = 1;
|
|
|
|
vibrancy = 0.1696;
|
|
};
|
|
};
|
|
|
|
animations.enabled = false;
|
|
|
|
master = {
|
|
new_status = "slave";
|
|
};
|
|
|
|
misc = {
|
|
force_default_wallpaper = 0; # Set to 0 or 1 to disable the anime mascot wallpapers
|
|
disable_hyprland_logo = false; # If true disables the random hyprland logo / anime girl background. :(
|
|
};
|
|
|
|
input ={
|
|
kb_layout = "us";
|
|
kb_variant = "";
|
|
kb_model = "";
|
|
kb_options = "";
|
|
kb_rules = "";
|
|
|
|
follow_mouse = 1;
|
|
|
|
sensitivity = 0; # -1.0 - 1.0, 0 means no modification.
|
|
|
|
touchpad = {
|
|
natural_scroll = false;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
}
|