{ pkgs, ... }: let programs = { audio = { increase = "wpctl set-volume @DEFAULT_AUDIO_SINK@ --limit 1.0 5%+"; decrease = "wpctl set-volume @DEFAULT_AUDIO_SINK@ --limit 1.0 5%-"; toggle-mute = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }; screenshot = ''grim -g "$(slurp)" -t png - | wl-copy --type image/png''; cmd = { run = "tofi-run"; drun = "tofi-drun"; }; brightness = { increase = "brightnessctl set +5%"; decrease = "brightnessctl set 5%-"; }; terminal = "foot"; }; in { home.packages = [ pkgs.hyprland-qtutils ]; wayland.windowManager.hyprland = { extraConfig = '' $mod = SUPER bind = $mod SHIFT, Return, exec, ${programs.terminal} general { layout = master } master { mfact = 0.5 new_status = slave } # workspaces # binds $mod + [shift +] {1..10} to [move to] workspace {1..10} ${builtins.concatStringsSep "\n" ( builtins.genList ( x: let ws = let c = (x + 1) / 10; in builtins.toString (x + 1 - (c * 10)); in '' bind = $mod, ${ws}, workspace, ${toString (x + 1)} bind = $mod SHIFT, ${ws}, movetoworkspacesilent, ${toString (x + 1)} '' ) 10 )} bind = $mod SHIFT, C, killactive bind = $mod SHIFT, F, togglefloating bind = $mod SHIFT, Q, exit bind = $mod, P, exec, ${programs.cmd.drun} bind = $mod SHIFT, P, exec, ${programs.cmd.run} bind = $mod, H, cyclenext, prev bind = $mod, L, cyclenext bind = $mod SHIFT, H, swapnext, prev bind = $mod SHIFT, L, swapnext # audio control binde =, XF86AudioRaiseVolume, exec, ${programs.audio.increase} binde =, XF86AudioLowerVolume, exec, ${programs.audio.decrease} bind =, XF86AudioMute, exec, ${programs.audio.toggle-mute} # monitor brightness control binde =, XF86MonBrightnessUp, exec, ${programs.brightness.increase} binde =, XF86MonBrightnessDown, exec, ${programs.brightness.decrease} # Screenshotting # My stupid laptop outputs these three key codes when the PrtSc key is # pressed instead of using just one code like any sane device would bind = SUPER SHIFT, S, exec, ${programs.screenshot} input { # focus change on cursor move follow_mouse = 1 accel_profile = flat } monitor=,preferred,auto,1 decoration { rounding = 10 } # set opacity to 0.9 active and 0.5 inactive for foot windowrule = opacity 0.9 override 0.5 override,^(foot)$ # Move windows to their designated workspaces windowrulev2 = workspace 3,class:(firefox) windowrulev2 = workspace 4,class:(org.telegram.desktop) windowrulev2 = workspace 4,class:(Signal) # Floating picture-in-picture windows windowrulev2 = float, title:^(Picture-in-Picture)$,class:^(firefox)$ windowrulev2 = size 15% 15%, title:^(Picture-in-Picture)$,class:^(firefox)$ # workaround for https://github.com/hyprwm/Hyprland/issues/2661 windowrulev2 = stayfocused, title:^()$,class:^(steam)$ windowrulev2 = minsize 1 1, title:^()$,class:^(steam)$ # No fade-in animation for the launcher layerrule = noanim, launcher bindm = SUPER, mouse:272, movewindow # Left mouse button bindm = SUPER, mouse:273, resizewindow 1 # Right mouse button ''; }; }