我正在编写一个使用 ncurses
的程序,并尝试使其正确响应终端大小调整。虽然我可以在程序中正确读取终端尺寸,但是 ncurses
似乎不能正确处理新的尺寸。这是一个(有点冗长的)示例程序:
#include <ncurses.h>
#include <string.h>
#include <signal.h>
#include <sys/ioctl.h>
void handle_winch(int sig){
struct winsize w;
ioctl(0, TIOCGWINSZ, &w);
COLS = w.ws_col;
LINES = w.ws_row;
wresize(stdscr, LINES, COLS);
clear();
mvprintw(0, 0, "COLS = %d, LINES = %d", COLS, LINES);
for (int i = 0; i < COLS; i++)
mvaddch(1, i, '*');
refresh();
}
int main(int argc, char *argv[]){
initscr();
struct sigaction sa;
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = handle_winch;
sigaction(SIGWINCH, &sa, NULL);
while(getch() != 27) {}
endwin();
return 0;
}
如果您运行它,您会看到终端尺寸被正确地检索。但是第二行应该在屏幕上绘制*
字符的操作不起作用。尝试水平调整窗口大小,星号线将不会变长。
问题出在哪里?我知道可以暂时离开curses模式,但我更喜欢一个更简洁的解决方案。谢谢!
resizeterm(lines,cols)
函数,如果您不想使用KEY_RESIZE,可以使用它,但它也是ncurses的扩展功能。 - Craiguse_window
执行同步窗口更新的ncurses
应用程序中,这个依赖信号的代码会表现如何?也就是说,有没有一种方法可以使其线程安全? - user67416SIGWINCH
时,您必须调用endwin()
,然后是refresh()
。只调用endwin()
将使getmaxyx
变量处于未定义状态。 - Joeendwin()
不会对库进行去初始化。它只是禁用 curses 模式并将终端恢复到正常模式。下一个refresh()
将再次启用 curses 模式。请参阅文档(man endwin
)。 - Nikos C.