summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xresize66
1 files changed, 66 insertions, 0 deletions
diff --git a/resize b/resize
new file mode 100755
index 0000000..86cf3db
--- /dev/null
+++ b/resize
@@ -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