{
config,
dotfiles_lib,
pkgs,
lib,
...
}: let
cfg = config.dotfiles.gui.hyprland;
toggleDisplayWithLid = let
name = "disable-builtin-display-when-lid-closed";
script = pkgs.writeShellApplication {
inherit name;
runtimeInputs = [pkgs.coreutils];
text = ''
if grep open /proc/acpi/button/lid/LID0/state; then
hyprctl keyword monitor "eDP-1,preferred,auto,auto"
else
if [[ "$(hyprctl monitors | grep -c Monitor)" != "1" ]]; then
hyprctl keyword monitor "eDP-1,disable"
fi
fi
'';
};
in "${script}/bin/${name}";
in {
options.dotfiles.gui.hyprland = {
enable = lib.mkEnableOption "Enable configured hyprland.";
waybar.enable = dotfiles_lib.options.mkDefaultEnabledOption "Enable waybar with hyprland config";
};
imports = [
../sway/screenshots.nix
../sway/swayidle.nix
./windowrules.nix
./waybar.nix
./wallpaperd.nix
];
config = lib.mkIf cfg.enable {
dotfiles.gui.swayidle.enable = lib.mkDefault true;
wayland.windowManager.hyprland = {
inherit (cfg) enable;
xwayland.enable = true;
systemd.enable = true;
plugins = [];
settings = {
env = [
"GDK_BACKEND,wayland"
"XCURSOR_SIZE,24"
];
exec-once = [
"${pkgs.signal-desktop}/bin/signal-desktop"
"${pkgs.firefox}/bin/firefox"
# use systemd to start on hyprland-session.target instead
# "${pkgs.waybar}/bin/waybar"
];
monitor = [
",preferred,auto,auto"
];
input = {
kb_layout = "us";
follow_mouse = 1;
natural_scroll = "yes";
sensitivity = 0.0;
numlock_by_default = true;
touchpad = {
natural_scroll = "yes";
scroll_factor = 0.5;
middle_button_emulation = true;
clickfinger_behavior = true;
};
};
"device:dygma-defy-keyboard".input = {
kb_layout = "us";
kb_variant = ",";
};
"device:at-translated-set-2-keyboard".input = {
kb_layout = "us";
kb_variant = "colemak_dh,";
};
general = {
gaps_in = 3;
gaps_out = 3;
border_size = 1;
"col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg";
"col.inactive_border" = "rgba(595959aa)";
cursor_inactive_timeout = 5;
resize_on_border = true;
layout = "dwindle";
};
decoration = {
rounding = 5;
blur = {
enabled = true;
size = 3;
passes = 1;
};
active_opacity = 1.0;
inactive_opacity = 0.9825;
fullscreen_opacity = 1.0;
dim_inactive = true;
dim_strength = 0.25;
drop_shadow = "yes";
shadow_range = 4;
shadow_render_power = 3;
"col.shadow" = "rgba(1a1a1aee)";
};
animations = {
enabled = "yes";
bezier = ["windowBezier, 0.05, 0.9, 0.1, 1.05"];
animation = [
"windows, 1, 7, windowBezier"
"windowsOut, 1, 7, default, popin 80%"
"border, 1, 10, default"
"borderangle, 1, 8, default"
"fade, 1, 7, default"
"workspaces, 1, 6, default"
];
};
dwindle = {
pseudotile = "yes";
preserve_split = "yes";
};
master = {
new_is_master = true;
};
gestures = {
workspace_swipe = "on";
};
misc = {
animate_manual_resizes = true;
disable_hyprland_logo = false;
vrr = 2;
};
"$mainMod" = "SUPER";
"$dashKey" = 20; # the literal - key
bind = let
brightctl = "${pkgs.brightnessctl}/bin/brightnessctl";
pamixer = "${pkgs.pamixer}/bin/pamixer";
playerctl = "${pkgs.playerctl}/bin/playerctl";
term = with config.dotfiles.gui; "${terminal}/bin/${terminal.pname}";
withSuper = with lib.strings;
lst: (map (rule:
if (hasPrefix "+" rule)
then "$mainMod ${rule}"
else "$mainMod, ${rule}")
lst);
in
[
",XF86AudioRaiseVolume, exec, ${pamixer} --increase 5"
",XF86AudioLowerVolume, exec, ${pamixer} --decrease 5"
"SHIFT,XF86AudioRaiseVolume, exec, ${pamixer} --increase 5"
"SHIFT,XF86AudioLowerVolume, exec, ${pamixer} --decrease 5"
",XF86AudioMute, exec, ${pamixer} --toggle-mute"
",XF86AudioNext, exec, ${playerctl} next"
",XF86AudioPrev, exec, ${playerctl} previous"
",XF86AudioStop, exec, ${playerctl} play-pause"
",XF86MonBrightnessUp, exec, ${brightctl} set +5%"
",XF86MonBrightnessDown, exec, ${brightctl} set 5%-"
]
++ withSuper [
# primary actions
"T, exec, ${term}"
"Q, killactive,"
"+SHIFT, Q, exit,"
"+SHIFT, F, togglefloating,"
"F, fullscreen,"
# "P, pseudo,"
# "J, togglesplit,"
"P, togglefloating"
"P, pin"
"SPACE, exec, ${pkgs.wofi}/bin/wofi --show drun"
# movement between windows
"m, movefocus, l"
"n, movefocus, d"
"e, movefocus, u"
"i, movefocus, r"
"+ SHIFT, m, swapwindow, l"
"+ SHIFT, n, swapwindow, d"
"+ SHIFT, e, swapwindow, u"
"+ SHIFT, i, swapwindow, r"
# Move active window to a workspace with mainMod + SHIFT + [0-9]
"+ SHIFT, 1, movetoworkspace, 1"
"+ SHIFT, 2, movetoworkspace, 2"
"+ SHIFT, 3, movetoworkspace, 3"
"+ SHIFT, 4, movetoworkspace, 4"
"+ SHIFT, 5, movetoworkspace, 5"
"+ SHIFT, 6, movetoworkspace, 6"
"+ SHIFT, 7, movetoworkspace, 7"
"+ SHIFT, 8, movetoworkspace, 8"
"+ SHIFT, 9, movetoworkspace, 9"
"+ SHIFT, 0, movetoworkspace, 10"
# change to workspace by number
"1, workspace, 1"
"2, workspace, 2"
"3, workspace, 3"
"4, workspace, 4"
"5, workspace, 5"
"6, workspace, 6"
"7, workspace, 7"
"8, workspace, 8"
"9, workspace, 9"
"0, workspace, 10"
# Scroll through existing workspaces with mainMod + scroll
"mouse_right, workspace, e+1"
"mouse_left, workspace, e-1"
# Move window to scratch pad
"+SHIFT, $dashKey, movetoworkspacesilent, special:scratchpad"
"$dashKey, togglespecialworkspace, scratchpad"
# toggle between qwerty and colemak_dh keyboard layouts
# "+ SHIFT + CTRL + ALT, SPACE, exec, hyprctl switchxkblayout at-translated-set-2-keyboard next"
"+ SHIFT + CTRL + ALT, SPACE, exec, hyprctl keyword input:kb_variant colemak_dh"
];
bindl = [
",switch:Lid Switch, exec, ${toggleDisplayWithLid}"
];
bindm = [
# Move/resize windows with mainMod + LMB/RMB and dragging
"$mainMod, mouse:272, movewindow"
"$mainMod, mouse:273, resizewindow"
];
binds = {
workspace_back_and_forth = true;
scroll_event_delay = 100;
};
};
extraConfig = ''
'';
};
programs.wallpaperd = with lib; {
enable = mkDefault true;
enableHyprlandIntegration = mkDefault true;
};
# notifications daemon
services.mako = {
enable = lib.mkDefault true;
anchor = lib.mkDefault "top-center";
defaultTimeout = lib.mkDefault 2750;
};
services.blueman-applet.enable = lib.mkDefault true;
services.gammastep = {
enable = lib.mkDefault true;
latitude = "36.174465";
longitude = "-86.767960";
};
home.packages = with pkgs; [
imv
libnotify
mpv
pavucontrol
playerctl
pulseaudio
swaylock-effects
wl-clipboard
wofi
];
};
}