aboutsummaryrefslogtreecommitdiff
path: root/share/cfg/hyprland.nix
blob: 91eeacbbd6b943b71de821b11ae0a52edd008707 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
{ ... }:
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 = "kitty";
  };
in
{
  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 kitty
        windowrule = opacity 0.9 override 0.5 override,^(kitty)$

        # Move windows to their designated workspaces
        windowrulev2 = workspace 3,class:(firefox)
        windowrulev2 = workspace 4,class:(org.telegram.desktop)
        windowrulev2 = workspace 4,class:(Signal)
        windowrulev2 = workspace 5,class:(Bitwarden)

        # 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 lanucher
        layerrule = noanim, launcher

        bindm = SUPER, mouse:272, movewindow      # Left mouse button
        bindm = SUPER, mouse:273, resizewindow 1  # Right mouse button
    '';
  };
}