update from shellsnippets.git
authorThorsten Glaser <thorsten.glaser@teckids.org>
Thu, 30 Mar 2017 18:43:05 +0000 (20:43 +0200)
committerThorsten Glaser <thorsten.glaser@teckids.org>
Thu, 30 Mar 2017 18:43:05 +0000 (20:43 +0200)
mksh/progress-bar

index fbdaeb9..b80ed00 100644 (file)
@@ -1,5 +1,7 @@
 # -*- mode: sh -*-
 #-
 # -*- mode: sh -*-
 #-
+# Copyright © 2017
+#      mirabilos <t.glaser@tarent.de>
 # Copyright © 2015, 2017
 #      mirabilos <thorsten.glaser@teckids.org>
 #
 # Copyright © 2015, 2017
 #      mirabilos <thorsten.glaser@teckids.org>
 #
@@ -26,7 +28,8 @@
 # – after:   done_progress_bar
 #
 # init_progress_bar trashes the EXIT and SIGWINCH traps, which later
 # – after:   done_progress_bar
 #
 # init_progress_bar trashes the EXIT and SIGWINCH traps, which later
-# are cleared, again, by done_progress_bar.
+# are cleared, again, by done_progress_bar. Note that signals do not
+# work well with “wait” except in a “while [[ -n $(jobs) ]]” loop.
 
 # global variables used by this library
 _cnt_progress_bar=0
 
 # global variables used by this library
 _cnt_progress_bar=0
@@ -47,9 +50,8 @@ function init_progress_bar {
 
        trap 'done_progress_bar' EXIT
        trap 'sigwinch_progress_bar' WINCH
 
        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"
+       # set up scrolling region, draw initial empty bar
+       sigwinch_progress_bar
 }
 
 unalias global
 }
 
 unalias global
@@ -59,25 +61,37 @@ function sigwinch_progress_bar {
 
        # get new terminal size
        nlin_progress_bar=$LINES
 
        # 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"
+
+       # save position; clear scrolling region; restore position; newline;
+       # up one line (to ensure we are not in the last line); save position;
+       # clear rest of screen; set new scrolling region; restore position
+       print -nu2 "\\e7\\e[0;0r\\e8\\n\\e[A\\e7\\e[J\\e[1;$((# nlin_progress_bar - 1))r\\e8"
+
+       # redraw progress bar
+       draw_progress_bar_internal
 }
 
 function done_progress_bar {
        (( isin_progress_bar )) || return 0
 }
 
 function done_progress_bar {
        (( isin_progress_bar )) || return 0
-       # save position; clear scrolling region;
-       # go to last line; delete line; restore position
-       print -n "\\e7\\e[0;0r\\e[$nlin_progress_bar;0H\\e[M\\e8"
        isin_progress_bar=0
        isin_progress_bar=0
+       # save position; clear scrolling region; restore position;
+       # save position; clear rest of screen; restore position
+       print -nu2 "\\e7\\e[0;0r\\e8\\e7\\e[J\\e8"
        trap - WINCH
        trap - EXIT
 }
 
 function draw_progress_bar {
        trap - WINCH
        trap - EXIT
 }
 
 function draw_progress_bar {
+       # increment current progress
+       let ++_cur_progress_bar
+       # remaining drawing code
+       draw_progress_bar_internal
+}
+
+function draw_progress_bar_internal {
        local bar num w=$COLUMNS
 
        local bar num w=$COLUMNS
 
-       ((# num = (++_cur_progress_bar * w * 8) / _cnt_progress_bar ))
+       ((# num = (_cur_progress_bar * w * 8) / _cnt_progress_bar ))
        while ((# num >= 8 )); do
                bar+=█
                ((# num -= 8 ))
        while ((# num >= 8 )); do
                bar+=█
                ((# num -= 8 ))
@@ -98,5 +112,5 @@ function draw_progress_bar {
        # save position; go to last line; set colours;
        # output a line full of spaces (and completion percentage);
        # jump to first column; output bar (line præfix); restore position
        # save position; go to last line; set colours;
        # output a line full of spaces (and completion percentage);
        # jump to first column; output bar (line præfix); restore position
-       print -n -- "\\e7\\e[$nlin_progress_bar;0H\\e[0;1;33;44m$spc\\r$bar\\e8"
+       print -nu2 -- "\\e7\\e[$nlin_progress_bar;1H\\e[0;1;33;44m$spc\\r$bar\\e8"
 }
 }