diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-08-13 11:05:50 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-08-13 11:05:50 -0700 |
commit | c6b49621e421d7f0fc6693758371104de02e3c8a (patch) | |
tree | f72e0ae7899993c0c7902444419e419c9af01956 | |
parent | 0939842565ce316ee621af170b01de552b347359 (diff) | |
download | unix-cruft-c6b49621e421d7f0fc6693758371104de02e3c8a.tar.gz unix-cruft-c6b49621e421d7f0fc6693758371104de02e3c8a.tar.bz2 unix-cruft-c6b49621e421d7f0fc6693758371104de02e3c8a.zip |
Resize script.
-rwxr-xr-x | resize | 66 |
1 files changed, 66 insertions, 0 deletions
@@ -0,0 +1,66 @@ +#!/bin/sh + +# +# resize - script to detect actual terminal window size +# and set the appropriate tty kernel params +# similarly to the 20+ year old resize program from X11. +# +# Kaz Kylheku <kkylheku@gmail.com> +# October 2006 +# + +if [ $# -ne 0 ] ; then + echo This is not the X11 resize program, but a shell script imitation. + echo It does not process any arguments. + exit 1 +fi + +# put tty in raw mode +saved_tty=$(stty -g) +stty raw isig -echo + +# Save cursor position +printf "\0337" > /dev/tty + +# Position the cursor to location 999,999 +printf "\033[999;999H" > /dev/tty + +# Query the actual cursor position +printf "\033[6n" > /dev/tty + +# read tty response +# We use dd to read character by character +# until encountering the R letter, +# The response syntax is ESC[<row>;<col>R +while true; do + char=$(dd bs=1 count=1 2> /dev/null) + if [ "$char" = "R" ] ; then + break; + fi + tty_response="$tty_response$char" +done + +# Restore cursor position +printf "\0338" > /dev/tty + +# restore tty +stty $saved_tty + +# Set up tty +set_tty_params() +{ + stty rows $2 columns $3 + cat <<! +COLUMNS=$3; +LINES=$2; +export COLUMNS LINES; +! +} + +# Trick: use IFS to parse the VT100 response. +# Since [ ; and R are delimiters, this means +# that the ESC, <row> and <col> will be +# extracted as tokens, and passed to the +# function as $1, $2 and $3. +IFS='[;R' +set_tty_params $tty_response |