Home
       use alternate display rather than clearing the screen - iomenu - interactive terminal-based selection menu
  HTML git clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
   DIR LICENSE
       ---
   DIR commit 787d55ac409e0f0072e9520fc0967beb684aab06
   DIR parent b0af07b5048120f49051a183572b599be2a64cda
  HTML Author: Josuah Demangeon <mail@josuah.net>
       Date:   Mon, 30 Oct 2017 01:20:33 +0100
       
       use alternate display rather than clearing the screen
       
       Diffstat:
         M display.c                           |      11 +++--------
         M main.c                              |      17 ++---------------
       
       2 files changed, 5 insertions(+), 23 deletions(-)
       ---
   DIR diff --git a/display.c b/display.c
       @@ -44,13 +44,13 @@ print_line(char *line, int cur)
        {
                if (opt['#'] && line[0] == '#') {
                        format(line + 1, ws.ws_col - 1);
       -                fprintf(stderr, "\n\x1b[1m\x1b[K %s\x1b[m", formatted);
       +                fprintf(stderr, "\n\x1b[1m %s\x1b[m", formatted);
                } else if (cur) {
                        format(line, ws.ws_col - 1);
                        fprintf(stderr, "\n\x1b[47;30m\x1b[K %s\x1b[m", formatted);
                } else {
                        format(line, ws.ws_col - 1);
       -                fprintf(stderr, "\n\x1b[K %s", formatted);
       +                fprintf(stderr, "\n %s", formatted);
                }
        }
        
       @@ -65,15 +65,11 @@ print_screen(void)
                p = 0;
                i = current - current % rows;
                m = matchv + i;
       +        fputs("\x1b[H;\x1b[J", stderr);
                while (p < rows && i < matchc) {
                        print_line(*m, i == current);
                        p++, i++, m++;
                }
       -        while (p < rows) {
       -                fputs("\n\x1b[K", stderr);
       -                p++;
       -        }
       -        fprintf(stderr, "\x1b[%dA\r\x1b[K", rows);
                if (*prompt) {
                        format(prompt, cols - 2);
                        fprintf(stderr, "\x1b[30;47m %s \x1b[m", formatted);
       @@ -103,5 +99,4 @@ print_selection(void)
                        puts(input);
                else
                        puts(matchv[current]);
       -        fputs("\r\x1b[K", stderr);
        }
   DIR diff --git a/main.c b/main.c
       @@ -47,16 +47,11 @@ set_terminal(void)
        {
                struct termios new;
        
       -        /* save currentsor postition */
       -        fputs("\x1b[s", stderr);
       -
       -        /* save attributes to `termios` */
       +        fputs("\x1b[s\x1b[?1049h", stderr);
                if (tcgetattr(ttyfd, &termios) < 0 || tcgetattr(ttyfd, &new) < 0) {
                        perror("tcgetattr");
                        exit(EXIT_FAILURE);
                }
       -
       -        /* change to raw mode */
                new.c_lflag &= ~(ICANON | ECHO | IGNBRK | IEXTEN | ISIG);
                tcsetattr(ttyfd, TCSANOW, &new);
        }
       @@ -64,15 +59,7 @@ set_terminal(void)
        static void
        reset_terminal(void)
        {
       -        int i;
       -
       -        /* clear terminal */
       -        for (i = 0; i < rows + 1; i++)
       -                fputs("\r\x1b[K\n", stderr);
       -
       -        /* reset currentsor position */
       -        fputs("\x1b[u", stderr);
       -
       +        fputs("\x1b[u\033[?1049l", stderr);
                tcsetattr(ttyfd, TCSANOW, &termios);
        }