add SIGWINCH support (handle terminal size changes during running)
authorThorsten Glaser <thorsten.glaser@teckids.org>
Sun, 29 Nov 2015 15:48:38 +0000 (16:48 +0100)
committerThorsten Glaser <thorsten.glaser@teckids.org>
Sun, 29 Nov 2015 15:51:30 +0000 (16:51 +0100)
<Nik> haste hübsch gemacht!

mksh/progress-bar

index 7b061da..886ddc6 100644 (file)
@@ -25,7 +25,8 @@
 # – $n times:        draw_progress_bar
 # – after:   done_progress_bar
 #
-# init_progress_bar trashes the EXIT signal handler!
+# init_progress_bar trashes the EXIT and SIGWINCH traps, which later
+# are cleared, again, by done_progress_bar.
 
 # global variables used by this library
 _cnt_progress_bar=0
@@ -39,6 +40,17 @@ function init_progress_bar {
        global -i nlin_progress_bar=$LINES isin_progress_bar=1
 
        trap 'done_progress_bar' EXIT
+       trap 'sigwinch_progress_bar' WINCH
+       # newline; up one line (to ensure we are not in the last line);
+       # save position; set scrolling region; restore position
+       print -n "\\n\\e[A\\e7\\e[1;$((# nlin_progress_bar - 1))r\\e8"
+}
+
+function sigwinch_progress_bar {
+       (( isin_progress_bar )) || return 0
+
+       # get new terminal size
+       nlin_progress_bar=$LINES
        # newline; up one line (to ensure we are not in the last line);
        # save position; set scrolling region; restore position
        print -n "\\n\\e[A\\e7\\e[1;$((# nlin_progress_bar - 1))r\\e8"
@@ -50,6 +62,8 @@ function done_progress_bar {
        # go to last line; delete line; restore position
        print "\\e7\\e[0;0r\\e[$nlin_progress_bar;0H\\e[M\\e8"
        isin_progress_bar=0
+       trap - WINCH
+       trap - EXIT
 }
 
 function draw_progress_bar {