基于ncurses的程序拦截SIGWINCH后无法识别按键
After intercepting SIGWINCH in a ncurses-based program, key presses are not recognized
我有一个基于 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 函数 returns 并且程序结束。
void keypress_loop()
{
int key;
while ((key = wgetch(stdscr)) != KEY_F(2))
process_key(key);
}
目前一切正常。但随后我为 SIGWINCH 添加了一个信号处理程序,以确保在调整终端仿真器 window 的大小后正确重绘边界线。在 main()
函数的 initscr()
之前,我插入:
signal(SIGWINCH, handle_resizing);
而 handle_resizing
() 看起来像这样:
static void
handle_resizing(int signo) {
endwin();
initscr();
cbreak();
nonl();
noecho();
draw_GUI();
}
此 SIGWINCH 处理函数按预期重绘边界线。但问题是,当用户在调整大小后按下一个键时,程序会忽略这个键。只有在用户按下一个键三次或更多次后,程序才会开始识别该键,然后一切正常!如何让程序在调整大小后立即识别按键?
handle_resizing
函数调用了在信号处理程序中使用不安全的函数。来自 getch
.
的 resizeterm
manual page has a section discussing this. Your program should use the KEY_RESIZE
return 值
我有一个基于 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 函数 returns 并且程序结束。
void keypress_loop()
{
int key;
while ((key = wgetch(stdscr)) != KEY_F(2))
process_key(key);
}
目前一切正常。但随后我为 SIGWINCH 添加了一个信号处理程序,以确保在调整终端仿真器 window 的大小后正确重绘边界线。在 main()
函数的 initscr()
之前,我插入:
signal(SIGWINCH, handle_resizing);
而 handle_resizing
() 看起来像这样:
static void
handle_resizing(int signo) {
endwin();
initscr();
cbreak();
nonl();
noecho();
draw_GUI();
}
此 SIGWINCH 处理函数按预期重绘边界线。但问题是,当用户在调整大小后按下一个键时,程序会忽略这个键。只有在用户按下一个键三次或更多次后,程序才会开始识别该键,然后一切正常!如何让程序在调整大小后立即识别按键?
handle_resizing
函数调用了在信号处理程序中使用不安全的函数。来自 getch
.
resizeterm
manual page has a section discussing this. Your program should use the KEY_RESIZE
return 值