make forward-compatible with the next couple of mksh versions
[shellsnippets/shellsnippets.git] / mksh / progress-bar
index 7b061da..53448a4 100644 (file)
@@ -1,6 +1,6 @@
 # -*- mode: sh -*-
 #-
-# Copyright © 2015
+# Copyright © 2015, 2017
 #      mirabilos <thorsten.glaser@teckids.org>
 #
 # Provided that these terms and disclaimer and all copyright notices
@@ -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
@@ -33,12 +34,31 @@ _cur_progress_bar=0
 isin_progress_bar=0
 nlin_progress_bar=0
 
+if [[ $KSH_VERSION = @(\@\(#\)MIRBSD KSH R)@(5[5-9]|[6-9][0-9]|[1-9][0-9][0-9])\ * ]]; then
+       alias global='typeset -g'
+else
+       alias global=global
+fi
+
 # args: $1 = number of draw_progress_bar calls to make up 100%
 function init_progress_bar {
        global -i _cnt_progress_bar=$1 _cur_progress_bar=0
        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"
+}
+
+unalias global
+
+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 +70,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 {