fix(popup): popup script was inconsistent, removed temp
This commit is contained in:
@@ -5,137 +5,6 @@
|
|||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
# --- POPUP SCRIPTS ---
|
# --- 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 {
|
in {
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
exec-once = [
|
exec-once = [
|
||||||
@@ -154,17 +23,6 @@ in {
|
|||||||
pkgs.impala
|
pkgs.impala
|
||||||
pkgs.wiremix
|
pkgs.wiremix
|
||||||
pkgs.pamixer
|
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 = {
|
programs.waybar = {
|
||||||
|
|||||||
Executable
+44
@@ -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
|
||||||
Reference in New Issue
Block a user