333 lines
13 KiB
Nix
333 lines
13 KiB
Nix
{ lib, config, pkgs, ... }: let
|
|
lua = lib.generators.mkLuaInline;
|
|
|
|
bind = keys: dispatcher: { _args = [ keys dispatcher ]; };
|
|
bindOpts = keys: dispatcher: opts: { _args = [ keys dispatcher opts ]; };
|
|
|
|
dsp = {
|
|
exec = cmd: lua ''hl.dsp.exec_cmd("${cmd}")'';
|
|
close = lua "hl.dsp.window.close()";
|
|
exit = lua "hl.dsp.exit()";
|
|
float = lua ''hl.dsp.window.float({ action = "toggle" })'';
|
|
fullscreen = lua "hl.dsp.window.fullscreen()";
|
|
pseudo = lua "hl.dsp.window.pseudo()";
|
|
layout = msg: lua ''hl.dsp.layout("${msg}")'';
|
|
focus = dir: lua ''hl.dsp.focus({ direction = "${dir}" })'';
|
|
swap = dir: lua ''hl.dsp.window.swap({ direction = "${dir}" })'';
|
|
toggleSpecial = name: lua ''hl.dsp.workspace.toggle_special("${name}")'';
|
|
moveToSpecial = name: lua ''hl.dsp.window.move({ workspace = "special:${name}" })'';
|
|
focusWorkspace = ws: lua ''hl.dsp.focus({ workspace = "${toString ws}" })'';
|
|
moveToWorkspace = ws: lua ''hl.dsp.window.move({ workspace = "${toString ws}", follow = false})'';
|
|
drag = lua "hl.dsp.window.drag()";
|
|
resize = lua "hl.dsp.window.resize()";
|
|
};
|
|
|
|
|
|
startupScript = pkgs.writeShellScriptBin "hyprland-start" ''
|
|
eww-open-on-current-screen bar &
|
|
awww-daemon &
|
|
|
|
sleep 2
|
|
keepassxc &
|
|
firefox &
|
|
jellyfin-mpv-shim &
|
|
easyeffects --gapplication-service &
|
|
|
|
sleep 2
|
|
nextcloud &
|
|
# telegram-desktop &
|
|
# discord &
|
|
'';
|
|
in {
|
|
config = lib.mkIf (config.usercfg.wm == "Wayland") {
|
|
wayland.windowManager.hyprland = {
|
|
enable = true;
|
|
xwayland.enable = true;
|
|
configType = "lua";
|
|
settings = {
|
|
on = {
|
|
_args = [
|
|
"hyprland.start"
|
|
(lua ''
|
|
function()
|
|
hl.exec_cmd("dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP")
|
|
hl.exec_cmd("${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1")
|
|
hl.exec_cmd("wl-paste --type text --watch cliphist store")
|
|
hl.exec_cmd("wl-paste --type image --watch cliphist store")
|
|
hl.exec_cmd("swayidle -w timeout 600 'swaylock' before-sleep 'swaylock'")
|
|
hl.exec_cmd("${lib.getExe startupScript}")
|
|
hl.exec_cmd("[workspace special:magic silent] kitty --title flying_kitty")
|
|
end'')
|
|
];
|
|
};
|
|
|
|
monitor = [{
|
|
output = "";
|
|
mode = "preferred";
|
|
position = "auto";
|
|
scale = "auto";
|
|
bitdepth = 10;
|
|
}];
|
|
#Fullscreen HDR is possible without the hdr cm setting if "render:cm_auto_hdr" is enabled.
|
|
|
|
config = {
|
|
input = {
|
|
kb_layout = "us";
|
|
kb_variant = "intl";#, phonetic";
|
|
kb_options = "grp:alt_shift_toggle";
|
|
follow_mouse = 1;
|
|
sensitivity = 0;
|
|
|
|
touchpad = {
|
|
natural_scroll = false;
|
|
scroll_factor = 1;
|
|
disable_while_typing = false;
|
|
tap_to_click = false;
|
|
};
|
|
};
|
|
|
|
misc = {
|
|
force_default_wallpaper = -1;
|
|
disable_hyprland_logo = true;
|
|
animate_mouse_windowdragging = false;
|
|
animate_manual_resizes = false;
|
|
vrr = 1;
|
|
};
|
|
general = {
|
|
gaps_in = config.colorScheme.palette.gaps-window;
|
|
gaps_out = config.colorScheme.palette.gaps-screen;
|
|
border_size = lib.toInt config.colorScheme.palette.border-width;
|
|
col = {
|
|
active_border = "rgb(${config.colorScheme.palette.base04})";
|
|
inactive_border = "rgb(${config.colorScheme.palette.base03})";
|
|
};
|
|
layout = "dwindle";
|
|
};
|
|
|
|
decoration = {
|
|
rounding = lib.toInt config.colorScheme.palette.border-radius;
|
|
inactive_opacity = 1.0;
|
|
active_opacity = 1.0;
|
|
fullscreen_opacity = 1.0;
|
|
|
|
blur = {
|
|
enabled = true;
|
|
size = 2;
|
|
passes = 1;
|
|
new_optimizations = true;
|
|
};
|
|
};
|
|
|
|
dwindle = {
|
|
#pseudotile = true;
|
|
preserve_split = true;
|
|
};
|
|
animations = {
|
|
enabled = true;
|
|
};
|
|
|
|
master = {
|
|
new_status = "master";
|
|
};
|
|
};
|
|
|
|
curve = [{
|
|
_args = [
|
|
"customcurve"
|
|
{
|
|
type = "bezier";
|
|
points = lua "{ {0.0, 0.9}, {0.1, 1.0} }";
|
|
}
|
|
];
|
|
}];
|
|
|
|
animation = [
|
|
{ leaf = "windows"; enabled = true; speed = 4; bezier = "customcurve"; }
|
|
{ leaf = "windowsOut"; enabled = true; speed = 4; bezier = "customcurve"; style = "popin 80%"; }
|
|
{ leaf = "border"; enabled = true; speed = 10; bezier = "customcurve"; }
|
|
{ leaf = "borderangle"; enabled = true; speed = 1; bezier = "customcurve"; }
|
|
{ leaf = "fade"; enabled = true; speed = 4; bezier = "customcurve"; }
|
|
{ leaf = "workspaces"; enabled = true; speed = 4; bezier = "customcurve"; }
|
|
];
|
|
|
|
|
|
gesture = {
|
|
fingers = 3;
|
|
direction = "vertical";
|
|
action = "workspace";
|
|
};
|
|
|
|
window_rule = [
|
|
{ match.title = "noshadow"; float= false;}
|
|
{
|
|
match.title = "^(flying_kitty)$";
|
|
float = true;
|
|
center = true;
|
|
size = "1100 600";
|
|
move = "{0 600}";
|
|
animation = "slide";
|
|
}
|
|
{ match.title = "^(Volume Control)$"; float = true; }
|
|
{ match.title = "^(Picture-in-Picture)$"; float = true; }
|
|
{ match.title = "^(Steam)$"; float = true; }
|
|
# --- Chat & Workspace Assignments ---
|
|
{ match.class = "^(org.telegram.desktop)$"; workspace = "2 silent"; }
|
|
{ match.class = "^(discord)$"; workspace = "2 silent"; }
|
|
{ match.class = "^(org.keepassxc.KeePassXC)$"; workspace = "8 silent"; }
|
|
{ match.title = "^(Nextcloud)$"; workspace = "8 silent"; }
|
|
{ match.class = "^(org.telegram.desktop)$"; match.title = "^(Media viewer)$"; float = true; center = true; }
|
|
{
|
|
match.class = "^(Tk)$";
|
|
match.title = "^(Server Configuration)$";
|
|
workspace = "8 silent";
|
|
}
|
|
# --- KeePassXC Dialogs ---
|
|
{
|
|
match.class = "^(org.keepassxc.KeePassXC)$";
|
|
match.title = "^(KeePassXC - Access Request)$";
|
|
float = true;
|
|
pin = true;
|
|
}
|
|
{
|
|
match.class = "^(org.keepassxc.KeePassXC)$";
|
|
match.title = "^(Unlock Database - KeePassXC)$";
|
|
float = true;
|
|
pin = true;
|
|
}
|
|
# --- Generic System / File Dialogs ---
|
|
{ match.title = "^(Open)$"; float = true; }
|
|
{ match.title = "^(Choose Files)$"; float = true; }
|
|
{ match.title = "^(Save As)$"; float = true; }
|
|
{ match.title = "^(Confirm to replace files)$"; float = true; }
|
|
{ match.title = "^(File Operation Progress)$"; float = true; }
|
|
|
|
# --- Firefox Window Rules ---
|
|
{
|
|
match.class = "^(firefox)$";
|
|
match.title = "^(Picture-in-Picture)$";
|
|
float = true;
|
|
pin = true;
|
|
suppress_event = "fullscreen";
|
|
}
|
|
{
|
|
match.class = "^(firefox)$";
|
|
match.title = "^(Firefox — Sharing Indicator)$";
|
|
float = true;
|
|
suppress_event = "fullscreen";
|
|
}
|
|
{
|
|
match.class = "^(firefox)$";
|
|
match.title = "^(Extension:.* Mozilla Firefox)$";
|
|
float = true;
|
|
suppress_event = "fullscreen";
|
|
}
|
|
|
|
# --- Telegram Media Viewer ---
|
|
{
|
|
match.class = "^(org.telegram.desktop)$";
|
|
match.title = "^(Media viewer)$";
|
|
float = true;
|
|
center = true;
|
|
}
|
|
|
|
# --- Idle Inhibition ---
|
|
{ match.class = "^(.*)$"; idle_inhibit = "fullscreen"; }
|
|
{ match.class = "^(steam_app_.*)$"; idle_inhibit = "focus"; }
|
|
{ match.class = "^(mpv)$"; idle_inhibit = "focus"; }
|
|
|
|
];
|
|
|
|
# windowrule = [ "noshadow, floating:0" ];
|
|
|
|
# windowrulev2 = [
|
|
# "workspace 2 silent, class:^(org.telegram.desktop)$"
|
|
# "workspace 2 silent, class:^(discord)$"
|
|
# "workspace 8 silent, class:^(org.keepassxc.KeePassXC)$"
|
|
# "workspace 8 silent, title:^(Nextcloud)$"
|
|
# "workspace 8 silent, class:^(Tk)$,title:^(Server Configuration)$"
|
|
# "float,class:^(org.keepassxc.KeePassXC)$,title:^(KeePassXC - Access Request)$"
|
|
# "pin,class:^(org.keepassxc.KeePassXC)$,title:^(KeePassXC - Access Request)$"
|
|
# "float,class:^(org.keepassxc.KeePassXC)$,title:^(Unlock Database - KeePassXC)$"
|
|
# "pin,class:^(org.keepassxc.KeePassXC)$,title:^(Unlock Database - KeePassXC)$"
|
|
# "float,title:^(Open)$"
|
|
# "float,title:^(Choose Files)$"
|
|
# "float,title:^(Save As)$"
|
|
# "float,title:^(Confirm to replace files)$"
|
|
# "float,title:^(File Operation Progress)$"
|
|
# "float,class:^(firefox)$,title:^(Picture-in-Picture)$"
|
|
# "pin,class:^(firefox)$,title:^(Picture-in-Picture)$"
|
|
# "suppressevent fullscreen,class:^(firefox)$,title:^(Picture-in-Picture)$"
|
|
# "float,class:^(firefox)$,title:^(Firefox — Sharing Indicator)$"
|
|
# "suppressevent fullscreen,class:^(firefox)$,title:^(Firefox — Sharing Indicator)$"
|
|
# "float,class:^(firefox)$,title:^(Extension:.* Mozilla Firefox)$"
|
|
# "suppressevent fullscreen,class:^(firefox)$,title:^(Extension:.* Mozilla Firefox)$"
|
|
# "float,class:^(org.telegram.desktop)$,title:^(Media viewer)$"
|
|
# "center,class:^(org.telegram.desktop)$,title:^(Media viewer)$"
|
|
# "idleinhibit fullscreen, class:^(.*)"
|
|
# "idleinhibit focus, class:^(steam_app_.*)$"
|
|
# "idleinhibit focus, class:^(mpv)$"
|
|
# ];
|
|
|
|
layer_rule = [ {
|
|
match.namespace = "^eww%-blur$";
|
|
blur = true;
|
|
ignore_alpha = 0.5;
|
|
}];
|
|
|
|
bind = [
|
|
(bind "SUPER + RETURN" (dsp.exec "kitty"))
|
|
(bind "SUPER + SHIFT + RETURN" (dsp.toggleSpecial "magic"))
|
|
(bind "SUPER + SHIFT + S" (dsp.moveToSpecial "magic"))
|
|
(bind "SUPER + Q" dsp.close)
|
|
(bind "SUPER + T" dsp.float)
|
|
(bind "SUPER + F" dsp.fullscreen)
|
|
(bind "SUPER + P" dsp.pseudo)
|
|
(bind "SUPER + J" (dsp.layout "togglesplit"))
|
|
(bind "SUPER + D" (dsp.exec "wofi -modi --show drun"))
|
|
(bind "SUPER + SHIFT + D" (dsp.exec "~/.config/hypr/themes/apatheia/eww/launch_bar"))
|
|
(bind "SUPER + V" (dsp.exec "cliphist list | wofi -dmenu | cliphist decode | wl-copy"))
|
|
(bind "PRINT" (dsp.exec "hyprshot -m region --raw | satty --filename - --early-exit --action-on-enter save-to-clipboard --copy-command 'wl-copy'"))
|
|
(bind "SUPER + L" (dsp.exec "swaylock"))
|
|
(bind "SUPER + left" (dsp.focus "left"))
|
|
(bind "SUPER + right" (dsp.focus "right"))
|
|
(bind "SUPER + up" (dsp.focus "up"))
|
|
(bind "SUPER + down" (dsp.focus "down"))
|
|
(bind "SUPER + mouse_down" (dsp.focusWorkspace "e+1"))
|
|
(bind "SUPER + mouse_up" (dsp.focusWorkspace "e-1"))
|
|
|
|
(bind "SUPER + 1" (dsp.focusWorkspace 1))
|
|
(bind "SUPER + SHIFT + 1" (dsp.moveToWorkspace 1))
|
|
(bind "SUPER + 2" (dsp.focusWorkspace 2))
|
|
(bind "SUPER + SHIFT + 2" (dsp.moveToWorkspace 2))
|
|
(bind "SUPER + 3" (dsp.focusWorkspace 3))
|
|
(bind "SUPER + SHIFT + 3" (dsp.moveToWorkspace 3))
|
|
(bind "SUPER + 4" (dsp.focusWorkspace 4))
|
|
(bind "SUPER + SHIFT + 4" (dsp.moveToWorkspace 4))
|
|
(bind "SUPER + 5" (dsp.focusWorkspace 5))
|
|
(bind "SUPER + SHIFT + 5" (dsp.moveToWorkspace 5))
|
|
(bind "SUPER + 6" (dsp.focusWorkspace 6))
|
|
(bind "SUPER + SHIFT + 6" (dsp.moveToWorkspace 6))
|
|
(bind "SUPER + 7" (dsp.focusWorkspace 7))
|
|
(bind "SUPER + SHIFT + 7" (dsp.moveToWorkspace 7))
|
|
(bind "SUPER + 8" (dsp.focusWorkspace 8))
|
|
(bind "SUPER + SHIFT + 8" (dsp.moveToWorkspace 8))
|
|
(bind "SUPER + 9" (dsp.focusWorkspace 9))
|
|
(bind "SUPER + SHIFT + 9" (dsp.moveToWorkspace 9))
|
|
(bind "SUPER + 0" (dsp.focusWorkspace 0))
|
|
(bind "SUPER + SHIFT + 0" (dsp.moveToWorkspace 0))
|
|
(bind "XF86AudioPlay" (dsp.exec "playerctl play-pause"))
|
|
(bind "XF86AudioPrev" (dsp.exec "playerctl previous"))
|
|
(bind "XF86AudioNext" (dsp.exec "playerctl next"))
|
|
(bindOpts "XF86AudioRaiseVolume" (dsp.exec "amixer -q sset 'Master' 5%+") { locked = true; repeating = true; })
|
|
(bindOpts "XF86AudioLowerVolume" (dsp.exec "amixer -q sset 'Master' 5%-") { locked = true; repeating = true; })
|
|
(bindOpts "XF86AudioMute" (dsp.exec "amixer -q sset 'Master' toggle") { locked = true; })
|
|
(bindOpts "XF86MonBrightnessUp" (dsp.exec "brightnessctl s 5%+") { locked = true; repeating = true; })
|
|
(bindOpts "XF86MonBrightnessDown" (dsp.exec "brightnessctl s 5%-") { locked = true; repeating = true; })
|
|
(bindOpts "SUPER + mouse:272" dsp.drag { mouse = true; })
|
|
(bindOpts "SUPER + mouse:273" dsp.resize { mouse = true; })
|
|
];
|
|
};
|
|
};
|
|
};
|
|
}
|