From 3acfc2e9d9392f26fb38c69897eba87b4a39fcdf Mon Sep 17 00:00:00 2001
From: NullBite <me@nullbite.com>
Date: Mon, 19 Feb 2024 19:43:25 +0100
Subject: [PATCH] Add hyprland dispatcher (doesn't do anything yet)

---
 home/sessions/hyprland/default.nix            |  5 ++++
 home/sessions/hyprland/dispatcher/default.nix | 19 +++++++++++++++
 .../hyprland/dispatcher/dispatcher.sh         | 23 +++++++++++++++++++
 3 files changed, 47 insertions(+)
 create mode 100644 home/sessions/hyprland/dispatcher/default.nix
 create mode 100755 home/sessions/hyprland/dispatcher/dispatcher.sh

diff --git a/home/sessions/hyprland/default.nix b/home/sessions/hyprland/default.nix
index a390317..c82b045 100644
--- a/home/sessions/hyprland/default.nix
+++ b/home/sessions/hyprland/default.nix
@@ -2,6 +2,8 @@
 let
   cfg = config.nixfiles.sessions.hyprland;
   mkd = lib.mkDefault;
+  hyprland-pkg = config.wayland.windowManager.hyprland.finalPackage;
+
   terminal = "${pkgs.kitty}/bin/kitty";
   files = "${pkgs.dolphin}/bin/dolphin";
   rofi = "${pkgs.rofi-wayland}/bin/rofi";
@@ -10,6 +12,8 @@ let
   polkit-agent = "${pkgs.polkit-kde-agent}/libexec/polkit-kde-authentication-agent-1";
   grimblast = "${inputs.hyprwm-contrib.packages.${pkgs.system}.grimblast}/bin/grimblast";
 
+  hypr-dispatcher = "${pkgs.callPackage ./dispatcher { hyprland = hyprland-pkg; }}/bin/hypr-dispatcher";
+
   # https://github.com/flatpak/xdg-desktop-portal-gtk/issues/440#issuecomment-1900520919
   xdpg-workaround = pkgs.writeShellScript "xdg-desktop-portal-gtk-workaround"
     ''
@@ -56,6 +60,7 @@ in
       wev
       dunst
       pkgs.brightnessctl
+      hypr-dispatcher
     ];
 
     wayland.windowManager.hyprland = {
diff --git a/home/sessions/hyprland/dispatcher/default.nix b/home/sessions/hyprland/dispatcher/default.nix
new file mode 100644
index 0000000..f3e23c3
--- /dev/null
+++ b/home/sessions/hyprland/dispatcher/default.nix
@@ -0,0 +1,19 @@
+{ lib,
+  stdenvNoCC,
+  socat,
+  coreutils,
+  hyprland,
+  makeShellWrapper }:
+let
+  wrappedPath = lib.makeBinPath [ coreutils socat hyprland ];
+in
+stdenvNoCC.mkDerivation {
+  name = "hyprland-dispatcher";
+  phases = [ "installPhase" ];
+  nativeBuildInputs = [ makeShellWrapper ];
+  src = ./.;
+  installPhase = ''
+    install -Dm555 $src/dispatcher.sh $out/bin/hypr-dispatcher
+    wrapProgramShell $out/bin/hypr-dispatcher --prefix PATH : "${wrappedPath}"
+  '';
+}
diff --git a/home/sessions/hyprland/dispatcher/dispatcher.sh b/home/sessions/hyprland/dispatcher/dispatcher.sh
new file mode 100755
index 0000000..94eab15
--- /dev/null
+++ b/home/sessions/hyprland/dispatcher/dispatcher.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+
+state_gd_rebind=0
+
+log() {
+	echo "$@" >&2
+}
+
+handle_active_window() {
+	case "$1" in 
+		# geometry dash
+		*'>>'steam_app_322170,*) log matched Geometry Dash ;;
+	esac
+}
+
+handle() {
+	case "$1" in
+		activewindow*) handle_active_window "$1" ;;
+	esac
+};
+
+socat - "UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" | \
+	while read -r line ; do handle "$line"; done