我有一个基于 ncurses 的小程序,可以执行基本的化学计算。它的主要功能是这样的:
int main() {
initscr();
cbreak();
nonl();
noecho();
/* draws borderlines from position 0 to (COLS - 1)
for purely decorative purposes at the top and bottom
of the screen */
draw_GUI();
keypress_loop();
endwin();
};
keypress_loop()
函数等待用户按下一个键,如果键是字母或数字,则在屏幕上打印键的符号,如果键既不是字母也不是数字,则发出蜂鸣声.如果用户按下 F2,函数返回,程序结束。
void keypress_loop()
{
int key;
while ((key = wgetch(stdscr)) != KEY_F(2))
process_key(key);
}
到目前为止,一切都按预期进行。但随后我为 SIGWINCH 添加了一个信号处理程序,以确保在调整终端仿真器窗口的大小后正确重绘边界线。在 main()
函数中的 initscr()
之前,我插入:
signal(SIGWINCH, handle_resizing);
handle_resizing
() 看起来像这样:
static void
handle_resizing(int signo) {
endwin();
initscr();
cbreak();
nonl();
noecho();
draw_GUI();
}
这个 SIGWINCH 处理函数按预期重绘边界线。但问题是,当用户在调整大小后按下一个键时,程序会忽略这个键。只有在用户按下一个键三次或更多次后,程序才会开始识别该键,然后一切正常!如何让程序在调整大小后立即识别按键?
最佳答案
handle_resizing
函数调用在信号处理程序中使用不安全的函数。 resizeterm
手册页有一节讨论这个。你的程序应该使用 KEY_RESIZE
从 getch
返回值。
关于c - 基于ncurses的程序拦截SIGWINCH后无法识别按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52893429/