To open a new terminal in the focused terminal's directory, the launcher asked Hyprland for the active window with hyprctl, ~10ms on every SUPER+RETURN. The binding now reads the pid from hl.get_active_window() and passes it as --pid. Without one, from the menu or a shell, the launcher asks Hyprland as before. The bind is now a Lua function, which Hyprland reports only as __lua, so o.bind_commands records the command it stands for and the keybindings menu still launches a terminal when the entry is picked. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
38 lines
1.1 KiB
Bash
Executable File
38 lines
1.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Print the current working directory of the active terminal window
|
|
# omarchy:args=[terminal-pid]
|
|
# omarchy:hidden=true
|
|
|
|
terminal_pid=${1:-$(hyprctl activewindow | awk '/pid:/ {print $2}')}
|
|
kitty_socket="$XDG_RUNTIME_DIR/omarchy-kitty-$terminal_pid"
|
|
cwd=""
|
|
|
|
if [[ -S $kitty_socket ]]; then
|
|
cwd=$(kitten @ --to "unix:$kitty_socket" ls --match "state:focused" 2>/dev/null |
|
|
jq -r '.[].tabs[].windows[].cwd // empty')
|
|
else
|
|
# The newest child, as pgrep -P | tail -n1 found it, read from the kernel's
|
|
# child lists: pgrep scans all of /proc on every new terminal.
|
|
shell_pid=""
|
|
for children_file in /proc/"$terminal_pid"/task/*/children; do
|
|
[[ -r $children_file ]] || continue
|
|
read -ra children <"$children_file" || true
|
|
for child in "${children[@]}"; do
|
|
(( child > ${shell_pid:-0} )) && shell_pid=$child
|
|
done
|
|
done
|
|
|
|
if [[ -n $shell_pid ]]; then
|
|
cwd=$(readlink -f "/proc/$shell_pid/cwd" 2>/dev/null)
|
|
shell=$(readlink -f "/proc/$shell_pid/exe" 2>/dev/null)
|
|
grep -Fqsx "$shell" /etc/shells || cwd=""
|
|
fi
|
|
fi
|
|
|
|
if [[ -d $cwd ]]; then
|
|
echo "$cwd"
|
|
else
|
|
echo "$HOME"
|
|
fi
|