Initial commit

- Create a basic bootable system with Hyprland, a browser and some
  basic utilities

Change-Id: I4178e1185de319c45c6a4f2711fe035f50777e08
diff --git a/modules/home/hyprland/default.nix b/modules/home/hyprland/default.nix
new file mode 100644
index 0000000..a2f8b88
--- /dev/null
+++ b/modules/home/hyprland/default.nix
@@ -0,0 +1,93 @@
+{ pkgs, config, inputs, system, ... }: let
+  lock = "${pkgs.waylock}/bin/waylock";
+in {
+
+  # TODO: Eww, SwayNC, hyprland-per-window-layout, waylock, hy3, anyrun, hypr-empty
+
+  home.packages = [ pkgs.hyprpicker ];
+
+  minion.touchpadGestures.enable = true;
+
+  services.fusuma.settings.swipe = let 
+    hyprctl = "${config.wayland.windowManager.hyprland.package}/bin/hyprctl";
+    jq = "${pkgs.jq}/bin/jq";
+    awk = "${pkgs.gawk}/bin/awk";
+  in {
+    "3".up.command = "${hyprctl} dispatch fullscreen 0";
+    "3".down.command = "${hyprctl} dispatch fullscreen 0";
+    "4".down.command = lock;
+    "3".left.command = "${hyprctl} dispatch workspace $(${hyprctl} activeworkspace -j | ${jq} .id | ${awk} '{print $1+1}')";
+    "3".right.command = "${hyprctl} dispatch workspace $(${hyprctl} activeworkspace -j | ${jq} .id | ${awk} '{print $1-1}')";
+  };
+
+  wayland.windowManager.hyprland = {
+    enable = true;
+
+    xwayland.enable = true;
+    systemd.enable = true;
+
+    settings = let
+      mod = "SUPER";
+      terminal = "${pkgs.kitty}/bin/kitty";
+      menu = "${inputs.anyrun.packages.${system}.anyrun}/bin/anyrun";
+    in {
+      misc = {
+        disable_hyprland_logo = true;
+        disable_splash_rendering = true;
+      };
+
+      exec-once = "${pkgs.hyprpaper}/bin/hyprpaper";
+
+      monitor = [
+        "eDP-1,preferred,0x0,1"
+        "desc:Dell Inc. DELL P2715Q V7WP95AV914L,preferred,2256x-1956,1,transform,1"
+        "desc:AOC 2460G5 0x00023C3F,preferred,336x-1080,1"
+        ",preferred,auto,1" # https://wiki.hyprland.org/Configuring/Monitors/
+      ];
+
+      input = {
+        kb_layout = "us";
+        kb_variant = "dvorak";
+        natural_scroll = true;
+
+        touchpad = {
+          natural_scroll = true;
+        };
+      };
+
+      xwayland = {
+        force_zero_scaling = true;
+      };
+
+      bind = [
+        "${mod}, Q, killactive"
+        "${mod}, SPACE, togglefloating"
+        "${mod}, RETURN, exec, ${terminal}"
+        "${mod}, down, movefocus, d"
+        "${mod}, up, movefocus, u"
+        "${mod}, right, movefocus, r"
+        "${mod}, left, movefocus, l"
+        "${mod}, L, exec, ${lock}"
+        "${mod}, D, exec, ${menu}"
+      ] ++ (
+        builtins.concatLists (builtins.genList (
+            x: let
+              ws = let
+                c = (x + 1) / 10;
+              in
+                builtins.toString (x + 1 - (c * 10));
+            in [
+              "${mod}, ${ws}, workspace, ${toString (x + 1)}"
+              "${mod} SHIFT, ${ws}, movetoworkspace, ${toString (x + 1)}"
+            ]
+          )
+          10)
+      );
+
+      bindm = [
+        "${mod}, mouse:272, movewindow"
+        "${mod}, mouse:273, resizewindow"
+      ];
+    };
+  };
+}
\ No newline at end of file