1
1
Fork 1
mirror of https://github.com/oddlama/nix-config.git synced 2025-10-10 14:50:40 +02:00
oddlama_nix-config/users/myuser/graphical/hyprland.nix
2025-04-27 10:46:36 +02:00

238 lines
7.1 KiB
Nix

# TODO: screencast button with notification
# TODO: better qr script: click button, freeze screen, highlight qrs, overlay preview detected text, click to copy.
# TODO ai speech indicator / toggle
{
config,
lib,
nixosConfig,
pkgs,
...
}:
let
inherit (lib)
concatMap
elem
flip
getExe
mkIf
mkMerge
optionals
;
in
{
home.packages = with pkgs; [
wl-clipboard
];
wayland.windowManager.hyprland = {
enable = true;
settings = mkMerge [
{
env =
optionals (elem "nvidia" nixosConfig.services.xserver.videoDrivers) [
# See https://wiki.hyprland.org/Nvidia/
"LIBVA_DRIVER_NAME,nvidia"
"GBM_BACKEND,nvidia-drm"
# "__GLX_VENDOR_LIBRARY_NAME,nvidia" breaks orcaslicer and doesn't seem like a good idea in general
]
++ [
"XDG_SESSION_TYPE,wayland"
"NIXOS_OZONE_WL,1"
"MOZ_ENABLE_WAYLAND,1"
"_JAVA_AWT_WM_NONREPARENTING,1"
"QT_WAYLAND_DISABLE_WINDOWDECORATION,1"
"QT_QPA_PLATFORM,wayland"
# "SDL_VIDEODRIVER,wayland"
"GDK_BACKEND,wayland"
];
bind =
[
"SUPER + CTRL + SHIFT,q,exec,uwsm stop"
# Applications
"SUPER,code:49,exec,fuzzel" # SUPER+^
",Menu,exec,fuzzel"
"SUPER,t,exec,kitty"
"SUPER,b,exec,uwsm app firefox"
"SUPER,c,exec,${getExe pkgs.scripts.clone-term}"
# Shortcuts & Actions
"SUPER + SHIFT,s,exec,${getExe pkgs.scripts.screenshot-area}"
"SUPER,F11,exec,${getExe pkgs.scripts.screenshot-area-scan-qr}"
"SUPER,F12,exec,${getExe pkgs.scripts.screenshot-screen}"
"SUPER,End,exec,${getExe config.lib.gpu-screen-recorder.save-replay}"
"SUPER,Prior,exec,systemctl --user restart gpu-screen-recorder.service"
"SUPER,Next,exec,systemctl --user stop gpu-screen-recorder.service"
# Per-window actions
"SUPER,q,killactive,"
"SUPER,return,fullscreen,"
"SUPER + SHIFT,return,fullscreenstate,0 2"
"SUPER,f,togglefloating"
"SUPER,tab,cyclenext,"
"ALT,tab,cyclenext,"
"SUPER + SHIFT,tab,cyclenext,prev"
"ALT + SHIFT,tab,cyclenext,prev"
"SUPER,r,submap,resize"
"SUPER,left,movefocus,l"
"SUPER,right,movefocus,r"
"SUPER,up,movefocus,u"
"SUPER,down,movefocus,d"
"SUPER + SHIFT,left,movewindow,l"
"SUPER + SHIFT,right,movewindow,r"
"SUPER + SHIFT,up,movewindow,u"
"SUPER + SHIFT,down,movewindow,d"
"SUPER,comma,workspace,-1"
"SUPER,period,workspace,+1"
"SUPER + SHIFT,comma,movetoworkspacesilent,-1"
"SUPER + SHIFT,period,movetoworkspacesilent,+1"
]
++ flip concatMap (map toString (lib.lists.range 1 9)) (x: [
"SUPER,${x},workspace,${x}"
"SUPER + SHIFT,${x},movetoworkspacesilent,${x}"
]);
bindm = [
# mouse movements
"SUPER, mouse:272, movewindow"
"SUPER, mouse:273, resizewindow"
"SUPER ALT, mouse:272, resizewindow"
];
animations = {
enabled = true;
animation = [
"windows, 1, 4, default, slide"
"windowsOut, 1, 4, default, slide"
"windowsMove, 1, 4, default"
"border, 1, 2, default"
"fade, 1, 4, default"
"fadeDim, 1, 4, default"
"workspaces, 1, 4, default"
];
};
decoration.rounding = 4;
exec-once = [
"uwsm finalize"
# "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
# "systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
# "systemctl --user restart xdg-desktop-portal.service"
];
input = {
kb_layout = "de";
kb_variant = "nodeadkeys";
follow_mouse = 2;
numlock_by_default = true;
repeat_rate = 60;
repeat_delay = 235;
# Only change focus on mouse click
float_switch_override_focus = 0;
accel_profile = "flat";
touchpad = {
natural_scroll = false;
disable_while_typing = true;
clickfinger_behavior = true;
scroll_factor = 0.7;
};
};
general = {
gaps_in = 1;
gaps_out = 0;
allow_tearing = true;
};
cursor.no_warps = true;
cursor.no_hardware_cursors = true;
debug.disable_logs = false;
misc = {
vrr = 1; # 1 = always on
disable_hyprland_logo = true;
mouse_move_focuses_monitor = false;
};
}
(mkIf (nixosConfig.node.name == "kroma") {
monitor = [
"DP-2, 3840x2160@120, 0x0, 1"
"DP-3, preferred, -3840x0, 1"
# Thank you NVIDIA for this generous, free-of-charge, extra monitor that
# doesn't exist and crashes yoru session sometimes when moving a window to it.
"Unknown-1, disable"
];
windowrulev2 = [
"workspace 1,class:^(firefox)$"
"workspace 5,class:^(bottles)$"
"workspace 5,class:^(steam)$"
"float, class:^(SDL Application)$, title:^(Friends List)$"
"workspace 5,class:^(SDL Application)$, title:^(Steam)$"
"workspace 5,class:^(prismlauncher)$"
"workspace 7,class:^(discord)$"
"workspace 7,class:^(WebCord)$"
"workspace 7,class:^(obsidian)$"
"workspace 7,class:^(signal)$"
"workspace 7,class:^(TelegramDesktop)$"
];
workspace = [
"1, monitor:DP-2, default:true"
"2, monitor:DP-2"
"3, monitor:DP-2"
"4, monitor:DP-2"
"5, monitor:DP-2"
"6, monitor:DP-2"
"7, monitor:DP-3, default:true"
"8, monitor:DP-3"
"9, monitor:DP-3"
];
})
(mkIf (nixosConfig.node.name == "nom") {
monitor = [
];
workspace = [
];
})
];
extraConfig = ''
submap=resize
binde=,right,resizeactive,80 0
binde=,left,resizeactive,-80 0
binde=,up,resizeactive,0 -80
binde=,down,resizeactive,0 80
binde=SHIFT,right,resizeactive,10 0
binde=SHIFT,left,resizeactive,-10 0
binde=SHIFT,up,resizeactive,0 -10
binde=SHIFT,down,resizeactive,0 10
bind=,return,submap,reset
bind=,escape,submap,reset
submap=reset
env=WLR_DRM_NO_ATOMIC,1
windowrulev2 = immediate, class:^(cs2)$
windowrulev2 = tag +apt, title:(Awakened PoE Trade)
windowrulev2 = float, tag:apt
windowrulev2 = noblur, tag:apt
windowrulev2 = nofocus, tag:apt # Disable auto-focus
windowrulev2 = noshadow, tag:apt
windowrulev2 = noborder, tag:apt
windowrulev2 = size 100% 100%, tag:apt
windowrulev2 = center, tag:apt
binds {
focus_preferred_method = 1
}
'';
};
}