当调整终端的高度和宽度时,ncurses bug

时间:2014-06-13 19:59:17

标签: c terminal ncurses

我正在学习ncurses。我制作了简单的程序来处理SIGWINCH信号。

主线程显示用户界面,然后按“' q'等待用户退出程序键。

调整终端大小后,程序会处理SIGWINCH信号并再次显示UI。

当我更改终端的宽度并按' q'时,程序退出。当我改变终端的高度并按下' q'时,程序退出。但是当我改变终端的高度然后改变终端的宽度,然后我按下“q”,程序就不会退出!我需要按' q'第二次退出计划。

那么,为什么要按' q'当我改变高度和宽度时,单次没有退出我的程序?

代码:

#include <stdio.h>
#include <stdlib.h>
#include <ncurses.h>
#include <signal.h>

WINDOW *win1;

void paint_window(void){
    int x, y;

    refresh();

    clear();
    refresh();

    getmaxyx(stdscr, y, x);

    bkgd(COLOR_PAIR(1));
    refresh();

    win1 = newwin(3, x - 4, 1, 2);
    box(win1, 0, 0);
    wbkgd(win1, COLOR_PAIR(2));

    wattron(win1, COLOR_PAIR(3));
    mvwprintw(win1, 1, 1, "MAX X: %d, MAX Y: %d. Press 'q' to exit.", x, y);
    wattroff(win1, COLOR_PAIR(3));

    wrefresh(win1);
}

void sig_handler(int sig_num){
    delwin(win1);
    endwin();
    paint_window();
}

int main(void) {
    int ch;

    initscr();

    raw();
    keypad(stdscr, TRUE);
    noecho();
    curs_set(0);

    start_color();
    init_pair(1, COLOR_WHITE, COLOR_BLUE);
    init_pair(2, COLOR_BLACK, COLOR_WHITE);
    init_pair(3, COLOR_WHITE, COLOR_RED);

    paint_window();

    signal(SIGWINCH, sig_handler);

    while(1){
        ch = getch();

        if(ch == 'q' || ch == 'Q'){
            delwin(win1);
            endwin();
            exit(EXIT_SUCCESS);
        }
    }

    return 0;
}

0 个答案:

没有答案