dotfiles/files/sh/.local/bin/resize-terminal
Ben Grande d13a21a734
fix: avoid echo usage
Echo can interpret operand as an option and checking every variable to
be echoed is troublesome while with printf, if the format specifier is
present before the operand, printing as string can be enforced.
2024-08-06 18:12:46 +02:00

93 lines
2.5 KiB
Bash
Executable File

#!/bin/sh
## SPDX-FileCopyrightText: 2024 Benjamin Grande M. S. <ben.grande.b@gmail.com>
##
## SPDX-License-Identifier: GFDL-1.3-or-later
##
## Credits: https://wiki.archlinux.org/title/Working_with_the_serial_console#Resizing_a_terminal
##
## Resize terminal columns and lines to current window size.
## Useful for terminals over link (serial console, socat's pty etc).
if test -n "${TERM_RESIZE_DISABLE:-}"; then
exit 0
fi
test -t 0 || exit 0
msg_unsupported="error: cannot resize screen: unsupported terminal emulator"
## If argument is provided, allow user to bypass tty check.
if test "${#}" -eq 0; then
## Shells on graphical sessions (terminal emulators) are skipped.
test "${XDG_SESSION_TYPE:-}" = "tty" || exit 0
## Serial ports and devices are desired.
term_file="$(tty)"
term_file_wanted="ttyUSB ttyS"
## Consoles are desired.
if test -r /sys/class/tty/console/active; then
active_console="$(cat -- /sys/class/tty/console/active)"
term_file_wanted="${term_file_wanted} ${active_console}"
unset active_console
fi
term_file_active=0
for tf in $(printf '%s' "${term_file_wanted}"); do
case "${term_file}" in
*"/${tf}"*) term_file_active=1;;
*) ;;
esac
done
unset tf term_file term_file_wanted
## Terminal can handle screen resizing by itself.
if test "${term_file_active}" = "0"; then
unset term_file_active
exit 0
fi
unset term_file_active
fi
## POSIX compliant.
# shellcheck disable=SC3045
if ! printf '%s\n' "R" | read -r -t 1 -sd R 2>/dev/null; then
## Fast but depends on XTerm.
if has resize; then
resize_cmd="$(resize)"
eval "${resize_cmd}" >/dev/null
exit 0
fi
## Slow due to heavy stty calls.
termios="$(stty -g)"
stty raw -echo min 0 time 1
printf '\0337\033[r\033[99999;99999H\033[6n\0338' >/dev/tty
IFS='[;R' read -r _ rows cols _ </dev/tty
stty "${termios}" cols "${cols}" rows "${rows}"
unset termios
exit 0
fi
## Non-POSIX compliant and fast.
stty -echo
printf '\e7\e[r\033[99999;99999H\e[6n\e8' >/dev/tty
# shellcheck disable=3045,SC2034
IFS='[;R' read -r -t 1 -s -d R _ rows cols _ </dev/tty || {
printf '%s\n' "${msg_unsupported}" >&2
stty echo
unset rows cols
exit 1
}
if test "${COLUMNS}" = "${cols}" && test "${LINES}" = "${rows}";then
stty echo
unset rows cols
exit 0
elif test "${rows}" -gt 0 && test "${cols}" -gt 0;then
stty echo cols "${cols}" rows "${rows}"
unset rows cols
exit 0
fi
printf '%s\n' "${msg_unsupported}" >&2
stty echo
unset rows cols
exit 1