From f20d6fbe83ad0676bcc5cd152ad3f2df10feb486 Mon Sep 17 00:00:00 2001 From: kenji Date: Sun, 4 Jan 2026 20:44:31 -0600 Subject: [PATCH] fix(popup): popup script was inconsistent, removed temp --- apps/waybar/default.nix | 142 ------------------------------------ test/hakase-popup-launch.sh | 44 +++++++++++ 2 files changed, 44 insertions(+), 142 deletions(-) create mode 100755 test/hakase-popup-launch.sh diff --git a/apps/waybar/default.nix b/apps/waybar/default.nix index a021441..730932a 100644 --- a/apps/waybar/default.nix +++ b/apps/waybar/default.nix @@ -5,137 +5,6 @@ ... }: let # --- POPUP SCRIPTS --- - # FIXME: must be centered - 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" '' - # Use the focus wrapper to launch or switch to Impala - exec hakase-focus-wrapper impala - ''; - - hakase-launch-bluetooth = pkgs.writeShellScriptBin "hakase-launch-bluetooth" '' - 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 - 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 [[ "$OLD_CLASS" == "$TARGET_CLASS" ]]; then - exit 0 - fi - sleep 0.15 - fi - - # 2. Calculate Geometry - 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 [[ "$WINDOW_ADDR" != "$NEW_FOCUS" ]]; then - ${pkgs.hyprland}/bin/hyprctl dispatch closewindow "address:$WINDOW_ADDR" - break - fi - fi - done - fi - ) & - - exit 0 - ''; - - hakase-popup-wifi = pkgs.writeShellScriptBin "hakase-popup-wifi" '' - exec hakase-launch-popup 800 500 impala - ''; - - hakase-popup-bluetooth = pkgs.writeShellScriptBin "hakase-popup-bluetooth" '' - exec hakase-launch-popup 600 500 bluetui - ''; - - hakase-popup-volume = pkgs.writeShellScriptBin "hakase-popup-volume" '' - exec hakase-launch-popup 800 300 wiremix - ''; in { wayland.windowManager.hyprland.settings = { exec-once = [ @@ -154,17 +23,6 @@ in { 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 ]; programs.waybar = { diff --git a/test/hakase-popup-launch.sh b/test/hakase-popup-launch.sh new file mode 100755 index 0000000..068137d --- /dev/null +++ b/test/hakase-popup-launch.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +echo "-- initiate -- " +date +echo "" + +tui_name=$1 + +if [[ -z ${tui_name} ]]; then + echo "Usage: $(basename "$0") [tui-name]" + exit 1 +fi + +# TODO: +# popup centered, dim-around using hypr, 70% size +# objective: on-click, open corresponding application +# must be a single-instance +# must be uwsm +# flow: +# * user clicks the icon on waybar +# * sh check for alive instance +# * if ANY INSTANCE ALIVE and INSTANCE IS SAME, focus using hyprctl +# * elif ANY INSTANCE ALIVE and INSTANCE IS DIFFERENT, exit the previous instance and launch the new one +# * else launch normally + +launch() { + echo "[LOG: $(date)] launching..." +} + +checker() { + echo "[LOG: $(date)] checking..." +} + +wrapper() { + echo "[LOG: $(date)]" + exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.hakase."${tui_name}" +} + +run() { + launch + checker +} + +run