mirror of
https://github.com/oddlama/nix-config.git
synced 2025-10-10 14:50:40 +02:00
238 lines
7.1 KiB
Nix
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
|
|
}
|
|
'';
|
|
};
|
|
}
|