{pkgs, ...}: let # 1. The Brain: Logic to find a window or launch a new one hakase-launch-or-focus = pkgs.writeShellScriptBin "hakase-launch-or-focus" '' if (($# == 0)); then echo "Usage: hakase-launch-or-focus [window-pattern] [launch-command]" exit 1 fi WINDOW_PATTERN="$1" # Escaped Nix interpolation for shell default value logic LAUNCH_COMMAND="''${2:-"uwsm-app -- $WINDOW_PATTERN"}" # Locate window address via hyprctl and jq WINDOW_ADDRESS=$(${pkgs.hyprland}/bin/hyprctl clients -j | ${pkgs.jq}/bin/jq -r --arg p "$WINDOW_PATTERN" \ '.[] | select((.class | test("\\b" + $p + "\\b"; "i")) or (.title | test("\\b" + $p + "\\b"; "i"))) | .address' | head -n1) if [[ -n $WINDOW_ADDRESS ]]; then # If found, focus the existing window ${pkgs.hyprland}/bin/hyprctl dispatch focuswindow "address:$WINDOW_ADDRESS" else # If not found, execute the launch command eval exec setsid $LAUNCH_COMMAND fi ''; hakase-launch-tui = pkgs.writeShellScriptBin "hakase-launch-tui" '' APP_NAME=$(basename "$1") # Using org.hakase prefix so the focus script can find it via class name exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.hakase."$APP_NAME" -e "$@" ''; hakase-focus-wrapper = pkgs.writeShellScriptBin "hakase-focus-wrapper" '' APP_NAME=$(basename "$1") WINDOW_PATTERN="org.hakase.$APP_NAME" LAUNCH_CMD="hakase-launch-tui $*" exec hakase-launch-or-focus "$WINDOW_PATTERN" "$LAUNCH_CMD" ''; hakase-launch-wifi = pkgs.writeShellScriptBin "hakase-launch-wifi" '' # Unblock the WiFi radio (requires appropriate user groups/permissions) # ${pkgs.util-linux}/bin/rfkill unblock wifi # Use the focus wrapper to launch or switch to Impala exec hakase-focus-wrapper impala ''; hakase-launch-bluetooth = pkgs.writeShellScriptBin "hakase-launch-bluetooth" '' # ${pkgs.util-linux}/bin/rfkill unblock wifi exec hakase-focus-wrapper bluetui ''; hakase-launch-popup = pkgs.writeShellScriptBin "hakase-launch-popup" '' if (($# < 3)); then echo "Usage: hakase-launch-popup [width] [height] [command...]" exit 1 fi # --- ARGS & CONFIG --- WIN_WIDTH="$1" WIN_HEIGHT="$2" shift 2 MARGIN=10 BAR_HEIGHT=40 # --------------------- CMD_NAME=$(basename "$1") TARGET_CLASS="org.hakase.popup.$CMD_NAME" # 1. SINGLETON LOGIC: Check for ANY existing hakase popup # We look for any client with a class starting with "org.hakase.popup." EXISTING_JSON=$(${pkgs.hyprland}/bin/hyprctl clients -j | ${pkgs.jq}/bin/jq -r '.[] | select(.class | startswith("org.hakase.popup."))') if [[ -n "$EXISTING_JSON" ]]; then OLD_ADDR=$(echo "$EXISTING_JSON" | ${pkgs.jq}/bin/jq -r '.address') OLD_CLASS=$(echo "$EXISTING_JSON" | ${pkgs.jq}/bin/jq -r '.class') # Close the existing popup ${pkgs.hyprland}/bin/hyprctl dispatch closewindow "address:$OLD_ADDR" # If the existing popup was the SAME one we are trying to launch, we are done (Toggle Off behavior) if [[ "$OLD_CLASS" == "$TARGET_CLASS" ]]; then exit 0 fi # If it was a different popup, wait a tiny bit for Hyprland to process the close # This prevents the new window from "merging" with the closing animation of the old one sleep 0.15 fi # 2. Calculate Geometry (Standard logic) MONITOR_INFO=$(${pkgs.hyprland}/bin/hyprctl monitors -j | ${pkgs.jq}/bin/jq '.[] | select(.focused == true)') MON_X=$(echo "$MONITOR_INFO" | ${pkgs.jq}/bin/jq '.x') MON_Y=$(echo "$MONITOR_INFO" | ${pkgs.jq}/bin/jq '.y') MON_WIDTH=$(echo "$MONITOR_INFO" | ${pkgs.jq}/bin/jq '.width') TARGET_X=$((MON_X + MON_WIDTH - WIN_WIDTH - MARGIN)) TARGET_Y=$((MON_Y + BAR_HEIGHT + MARGIN)) # 3. Launch with Rules RULE="[float;pin;size $WIN_WIDTH $WIN_HEIGHT;move $TARGET_X $TARGET_Y]" ${pkgs.hyprland}/bin/hyprctl dispatch exec "$RULE xdg-terminal-exec --app-id=$TARGET_CLASS -e $@" # 4. Background Listener (Close on Blur) ( TIMEOUT=0 WINDOW_ADDR="" while [[ -z "$WINDOW_ADDR" && $TIMEOUT -lt 20 ]]; do sleep 0.1 WINDOW_ADDR=$(${pkgs.hyprland}/bin/hyprctl clients -j | ${pkgs.jq}/bin/jq -r --arg c "$TARGET_CLASS" '.[] | select(.class == $c) | .address') ((TIMEOUT++)) done if [[ -n "$WINDOW_ADDR" ]]; then ${pkgs.socat}/bin/socat -U - UNIX-CONNECT:"$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" | while read -r line; do if [[ "$line" == "activewindow>>"* ]]; then NEW_FOCUS="0x$(echo "$line" | cut -d '>' -f3 | cut -d ',' -f1)" # If focus is lost to another window, close this popup if [[ "$WINDOW_ADDR" != "$NEW_FOCUS" ]]; then ${pkgs.hyprland}/bin/hyprctl dispatch closewindow "address:$WINDOW_ADDR" break fi fi done fi ) & exit 0 ''; # 1. WiFi (Impala) - Requires a larger view hakase-popup-wifi = pkgs.writeShellScriptBin "hakase-popup-wifi" '' exec hakase-launch-popup 800 500 impala ''; # 2. Bluetooth (Bluetui) - Fits your specific test size hakase-popup-bluetooth = pkgs.writeShellScriptBin "hakase-popup-bluetooth" '' exec hakase-launch-popup 600 500 bluetui ''; # 3. Volume (Wiremix) - Can be smaller hakase-popup-volume = pkgs.writeShellScriptBin "hakase-popup-volume" '' exec hakase-launch-popup 800 300 wiremix ''; in { environment.systemPackages = [ pkgs.jq pkgs.socat # Required for the socket listener pkgs.util-linux pkgs.bluetui pkgs.impala pkgs.wiremix pkgs.pamixer hakase-launch-popup hakase-popup-wifi hakase-popup-bluetooth hakase-popup-volume hakase-launch-or-focus hakase-launch-tui hakase-focus-wrapper hakase-launch-wifi hakase-launch-bluetooth ]; }