feat: Adds preview windows to window and workspace pickers.

This commit is contained in:
2025-10-05 01:21:46 -04:00
parent cc47106e74
commit 6d6f24467f
2 changed files with 19 additions and 46 deletions

View File

@@ -11,9 +11,6 @@ USAGE:
$ $THIS [OPTIONS] [ARGS...] $ $THIS [OPTIONS] [ARGS...]
OPTIONS:
--show-window-class: Include window class in the table.
NOTES: NOTES:
By default, we show a footer and header unless specifically passed in as extra arguments / options. By default, we show a footer and header unless specifically passed in as extra arguments / options.
@@ -22,24 +19,17 @@ Any other options or arguments are passed directly to 'fzf'.
EOF EOF
} }
show_window_class_flag="0"
uses_supplied_footer="0" uses_supplied_footer="0"
uses_supplied_header="0"
fzf_opts=() fzf_opts=()
rows=() rows=()
window_data=$(hyprctl clients -j | jq 'sort_by(.workspace.name)') window_data=$(hyprctl clients -j | jq 'sort_by(.workspace.id)')
SCRIPTS=${SCRIPTS} SCRIPTS=${SCRIPTS}
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
if [[ $1 =~ ^--header ]]; then if [[ $1 =~ ^--footer ]]; then
uses_supplied_header="1"
fzf_opts+=("$1")
elif [[ $1 =~ ^--footer ]]; then
uses_supplied_footer="1" uses_supplied_footer="1"
fzf_opts+=("$1") fzf_opts+=("$1")
elif [[ $1 =~ ^--show-window-class ]]; then
show_window_class_flag="1"
else else
fzf_opts+=("$1") fzf_opts+=("$1")
fi fi
@@ -59,16 +49,6 @@ footer() {
EOF EOF
} }
header() {
local columns="Workspace | Title | Address"
if [[ $show_window_class_flag == "1" ]]; then
columns="Workspace | Title | Class | Address"
fi
echo "$columns"
}
generate_rows() { generate_rows() {
readarray -t addresses <<<"$(echo "$window_data" | jq -r '.[] | .address')" readarray -t addresses <<<"$(echo "$window_data" | jq -r '.[] | .address')"
@@ -76,13 +56,9 @@ generate_rows() {
readarray -t titles <<<$(echo "$window_data" | jq -r '.[] | .title') readarray -t titles <<<$(echo "$window_data" | jq -r '.[] | .title')
readarray -t workspaces <<<$(echo "$window_data" | jq -r '.[] | .workspace.name') readarray -t workspaces <<<$(echo "$window_data" | jq -r '.[] | .workspace.name')
# Zip into a new comma separated values # Zip into rows.
for i in "${!addresses[@]}"; do for i in "${!addresses[@]}"; do
if [[ $show_window_class_flag == "1" ]]; then rows+=("${workspaces[i]}=>${titles[i]}=>${classes[i]}=>${addresses[i]}")
rows+=("${workspaces[i]} | ${titles[i]} | ${classes[i]} | ${addresses[i]}")
else
rows+=("${workspaces[i]} | ${titles[i]} | ${addresses[i]}")
fi
done done
} }
@@ -98,13 +74,14 @@ if [[ $uses_supplied_footer == "0" ]]; then
fzf_opts+=("--footer=$(footer)") fzf_opts+=("--footer=$(footer)")
fi fi
if [[ $uses_supplied_header == "0" ]]; then
fzf_opts+=("--header=$(header)")
fi
generate_rows generate_rows
sel=$(printf '%s\n' "${rows[@]}" | fzf --style=full "${fzf_opts[@]}") sel=$(
printf '%s\n' "${rows[@]}" |
fzf --style=full "${fzf_opts[@]}" \
--preview-label='[ Window Stats ]' --delimiter='=>' --with-nth=2 \
--preview='echo -e "Title: {2}\nClass: {3}\nWorkspace: {1}\nAddress: {4}"'
)
[[ -z $sel ]] && exit 1 [[ -z $sel ]] && exit 1
@@ -112,5 +89,5 @@ sel=$(printf '%s\n' "${rows[@]}" | fzf --style=full "${fzf_opts[@]}")
sel=${sel//\"/} sel=${sel//\"/}
sel=${sel// /} sel=${sel// /}
# revove everything but the address portion. # revove everything but the address portion.
sel=${sel##*|} sel=${sel##*=>}
echo "$sel" echo "$sel"

View File

@@ -32,7 +32,6 @@ EOF
return_name_if_special_flag="0" return_name_if_special_flag="0"
return_name_flag="0" return_name_flag="0"
uses_supplied_footer="0" uses_supplied_footer="0"
uses_supplied_header="0"
fzf_opts=() fzf_opts=()
rows=() rows=()
@@ -44,9 +43,6 @@ while [[ $# -gt 0 ]]; do
return_name_flag="1" return_name_flag="1"
elif [[ $1 == "-s" ]] || [[ $1 == "--return-name-if-special" ]]; then elif [[ $1 == "-s" ]] || [[ $1 == "--return-name-if-special" ]]; then
return_name_if_special_flag="1" return_name_if_special_flag="1"
elif [[ $1 =~ ^--header ]]; then
uses_supplied_header="1"
fzf_opts+=("$1")
elif [[ $1 =~ ^--footer ]]; then elif [[ $1 =~ ^--footer ]]; then
uses_supplied_footer="1" uses_supplied_footer="1"
fzf_opts+=("$1") fzf_opts+=("$1")
@@ -73,9 +69,11 @@ EOF
generate_rows() { generate_rows() {
readarray -t names <<<"$(echo "$workspaces" | jq -r '.[] | .name')" readarray -t names <<<"$(echo "$workspaces" | jq -r '.[] | .name')"
readarray -t ids <<<"$(echo "$workspaces" | jq -r '.[] | .id')" readarray -t ids <<<"$(echo "$workspaces" | jq -r '.[] | .id')"
readarray -t monitors <<<"$(echo "$workspaces" | jq -r '.[] | .monitor')"
readarray -t windows <<<"$(echo "$workspaces" | jq -r '.[] | .windows')"
for i in "${!names[@]}"; do for i in "${!names[@]}"; do
rows+=("${ids[i]} | ${names[i]}") rows+=("${ids[i]}|${monitors[i]}|${windows[i]}|${names[i]}")
done done
} }
@@ -93,19 +91,17 @@ if [[ $uses_supplied_footer == "0" ]]; then
fzf_opts+=("--footer=$(footer)") fzf_opts+=("--footer=$(footer)")
fi fi
if [[ $uses_supplied_header == "0" ]]; then
fzf_opts+=("--header=Id | Name")
fi
sel=$( sel=$(
printf "%s\n" "${rows[@]}" | printf "%s\n" "${rows[@]}" |
fzf --style=full "${fzf_opts[@]}" fzf --style=full "${fzf_opts[@]}" \
--delimiter='|' --with-nth=4 --preview-label='[ Workspace Stats ]' \
--preview='printf "Name: {4}\nID: {1}\nWindows: {2}\nMonitor: {3}"'
) )
[[ -z $sel ]] && exit 1 [[ -z $sel ]] && exit 1
name=${sel##*| } name=${sel##*\|}
id=${sel% |*} id=${sel%%\|*}
if [[ $return_name_flag == "1" ]] || if [[ $return_name_flag == "1" ]] ||
([[ $return_name_if_special_flag == "1" ]] && [[ $name =~ ^special ]]); then ([[ $return_name_if_special_flag == "1" ]] && [[ $name =~ ^special ]]); then