URI: 
       Force redisplay of all lines in DECSCNM - st - simple terminal
  HTML git clone https://git.parazyd.org/st
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 930b2c4a7f222e15e6493d5bbb8fd90e681d2626
   DIR parent a984ffc4cb755c6dcdbc153b2591dca0ae6a8ead
  HTML Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Mon,  3 Sep 2012 21:52:34 +0200
       
       Force redisplay of all lines in DECSCNM
       
       When it is called DECSCNM all lines become dirty, because it is necessary
       redraw all lines for getting the new colors. It is easy see the problem
       running 'echo ^[[?5h'.
       
       In order to get a correct flash when running tput flash is necessary wait
       after DECSCNM, until the changes are displayed, because in other case the
       switch between reverse on/reverse off will be too much fast and nothing will
       happen.
       ---
        st.c |   12 +++++++++++-
        1 file changed, 11 insertions(+), 1 deletion(-)
       Diffstat:
         M st.c                                |      12 +++++++++++-
       
       1 file changed, 11 insertions(+), 1 deletion(-)
       ---
   DIR diff --git a/st.c b/st.c
       @@ -54,6 +54,7 @@
        
        #define SELECT_TIMEOUT (20*1000) /* 20 ms */
        #define DRAW_TIMEOUT  (20*1000) /* 20 ms */
       +#define REDRAW_TIMEOUT (80*1000) /* 80 ms */
        
        #define SERRNO strerror(errno)
        #define MIN(a, b)  ((a) < (b) ? (a) : (b))
       @@ -238,6 +239,7 @@ typedef struct {
        
        static void die(const char*, ...);
        static void draw(void);
       +static void redraw(void);
        static void drawregion(int, int, int, int);
        static void execsh(void);
        static void sigchld(int);
       @@ -1206,7 +1208,7 @@ tsetmode(bool priv, bool set, int *args, int narg) {
                                        mode = term.mode;
                                        MODBIT(term.mode,set, MODE_REVERSE);
                                        if (mode != term.mode)
       -                                        draw();
       +                                        redraw();
                                        break;
                                case 7:
                                        MODBIT(term.mode, set, MODE_WRAP);
       @@ -2030,6 +2032,14 @@ xdrawcursor(void) {
        }
        
        void
       +redraw(void) {
       +        struct timespec tv = {0, REDRAW_TIMEOUT * 1000};
       +        tfulldirt();
       +        draw();
       +        nanosleep(&tv, NULL);
       +}
       +
       +void
        draw() {
                drawregion(0, 0, term.col, term.row);
                xcopy();