{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: Close any existing hakase popups first # This ensures only one popup is ever open at a time. 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') ${pkgs.hyprland}/bin/hyprctl dispatch closewindow "address:$OLD_ADDR" # Toggle behavior: If we clicked the same button again, just close and exit. if [[ "$OLD_CLASS" == "$TARGET_CLASS" ]]; then exit 0 fi sleep 0.15 fi # 2. POSITIONING 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') # Defaults to 0 if jq fails MON_X=''${MON_X:-0} MON_Y=''${MON_Y:-0} MON_WIDTH=''${MON_WIDTH:-1920} TARGET_X=$((MON_X + MON_WIDTH - WIN_WIDTH - MARGIN)) TARGET_Y=$((MON_Y + BAR_HEIGHT + MARGIN)) # 3. LAUNCH 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: Close on "Click Outside" (Blur) ( # Wait for the window to actually appear 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 # Listen to socket for focus changes ${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 # Extract address from event: activewindow>>1234abcd,title NEW_FOCUS=$(echo "$line" | cut -d '>' -f3 | cut -d ',' -f1) # Normalize to 0x format to match hyprctl if [[ "$NEW_FOCUS" != 0x* ]]; then NEW_FOCUS="0x$NEW_FOCUS" fi # If the focused window is NOT our popup, kill the 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 602 478 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 pkgs.yad 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 ]; }