* Fit the About window to its rendered content The About fastfetch layout needs more columns than the shared 875x600 float provides, and the terminal's grid often only reaches its final size after fastfetch has printed, leaving the output wrapped over the logo or clipped at the initial 80-column grid (#6465). Give About a dedicated org.omarchy.about app id so launch-or-focus can actually match it, render through a loop that repaints on window size or branding changes, and measure the rendered content to fit the window around it with even padding, whatever the terminal font or About logo. Fixes #6465 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Spacing --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
90 lines
3.6 KiB
Bash
Executable File
90 lines
3.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Launch the fastfetch TUI that gives information about the current system.
|
|
|
|
# The float rule only sets a starting size: the exact fit depends on the terminal
|
|
# font and the user's About logo, so once the terminal grid has settled we measure
|
|
# the rendered content and resize the window to hug it with even padding all around.
|
|
# Bash defers WINCH traps while read blocks, so poll for size changes and re-render
|
|
# fastfetch at the new width whenever the window is resized.
|
|
|
|
LOGO_FILE="$HOME/.config/omarchy/branding/about.txt"
|
|
|
|
hypr_dispatch() {
|
|
local lua="$1"
|
|
shift
|
|
hyprctl dispatch "$lua" >/dev/null 2>&1 || hyprctl dispatch "$@" >/dev/null
|
|
}
|
|
|
|
fit_window() {
|
|
# A user-level fastfetch config can relocate or restyle the logo in ways this
|
|
# measurement cannot see, so leave sizing to the float rule in that case.
|
|
[[ -f $HOME/.config/fastfetch/config.jsonc ]] && return 0
|
|
|
|
local rows cols address width height
|
|
read -r rows cols <<<"$(stty size)"
|
|
read -r address width height <<<"$(hyprctl clients -j | jq -r '.[] | select(.class == "org.omarchy.about") | "\(.address) \(.size[0]) \(.size[1])"')"
|
|
[[ -f $LOGO_FILE && -n ${address:-} ]] || return 1
|
|
(( cols > 0 && rows > 0 && width > 0 && height > 0 )) || return 1
|
|
|
|
# Mirror the logo block in the fastfetch config: 2 columns of padding on the
|
|
# left of the logo, 6 between the logo and the modules, 2 rows above the logo.
|
|
# wc -L measures display columns, so double-width glyphs count correctly.
|
|
local logo_w logo_h
|
|
logo_w=$(wc -L <"$LOGO_FILE")
|
|
logo_h=$(( $(wc -l <"$LOGO_FILE") + 2 ))
|
|
|
|
# The guard character keeps command substitution from eating the trailing
|
|
# break line, which provides the bottom padding row.
|
|
local modules module_w module_h
|
|
modules=$(fastfetch --logo none | sed 's/\x1b\[[0-9;?]*[a-zA-Z]//g'; printf X)
|
|
modules=${modules%X}
|
|
module_w=$(printf '%s' "$modules" | wc -L)
|
|
module_h=$(printf '%s' "$modules" | wc -l)
|
|
|
|
# Two columns of right padding to match the logo's left padding, and one row
|
|
# for the cursor line so the trailing break stays visible as bottom padding.
|
|
local target_c=$(( 2 + logo_w + 6 + module_w + 2 ))
|
|
local target_r=$(( (logo_h > module_h ? logo_h : module_h) + 1 ))
|
|
local target_w=$(( (target_c * width + cols / 2) / cols ))
|
|
local target_h=$(( (target_r * height + rows / 2) / rows ))
|
|
|
|
# Skip resizes within one terminal cell so the fit doesn't churn.
|
|
(( (target_w - width) ** 2 <= (width / cols) ** 2 && (target_h - height) ** 2 <= (height / rows) ** 2 )) && return
|
|
|
|
hypr_dispatch "hl.dsp.window.resize({ window = \"address:$address\", x = $target_w, y = $target_h })" resizewindowpixel "exact $target_w $target_h,address:$address"
|
|
hypr_dispatch "hl.dsp.window.center({ window = \"address:$address\" })" centerwindow
|
|
}
|
|
|
|
if [[ ${1:-} == "--render" ]]; then
|
|
printf '\e[?25l'
|
|
|
|
# Give the compositor a moment to apply the float rule before measuring cells.
|
|
previous=""
|
|
for _ in {1..20}; do
|
|
current=$(stty size)
|
|
[[ $current == $previous ]] && break
|
|
previous=$current
|
|
sleep 0.05
|
|
done
|
|
|
|
fitted=false
|
|
while :; do
|
|
size=$(stty size)
|
|
logo_stamp=$(stat -c %Y "$LOGO_FILE" 2>/dev/null)
|
|
clear
|
|
fastfetch
|
|
if [[ $fitted == false ]] && fit_window; then
|
|
fitted=true
|
|
fi
|
|
while [[ $(stty size) == $size && $(stat -c %Y "$LOGO_FILE" 2>/dev/null) == $logo_stamp ]]; do
|
|
read -t 0.5 -n 1 -s && exit
|
|
(( $? > 128 )) || exit
|
|
done
|
|
# A rebranded logo changes the content dimensions, so measure again.
|
|
[[ $(stat -c %Y "$LOGO_FILE" 2>/dev/null) == $logo_stamp ]] || fitted=false
|
|
done
|
|
fi
|
|
|
|
exec omarchy-launch-or-focus-tui --app-id=org.omarchy.about omarchy-launch-about --render
|