我正在为学生项目复制Irssi interface。我想使用NCurses作为文本界面,readline在编写消息时提供更好的文本编辑功能。
question,answer和project为我提供了一个很好的起点。
我的问题是我希望有一个像这样的输入/事件循环:
int ch;
while (exit_condition) {
ch = wgetch(window);
switch (ch) {
case ERR: continue;
case KEY_F(1): /* do something */ break;
case KEY_UP: /* do something else */ break;
default: forward_to_readline(ch); break;
}
}
但为了匹配KEY_F(n)
或KEY_UP
,我需要启用keypad(window, TRUE)
,这将修改输入并使其无法用于readline。
从手册:
如果键盘为TRUE,并且按下了一个功能键,则表示该标记 返回功能键而不是原始字符。
当一个可能是功能键开头的字符时 收到(在现代终端上,表示逃脱字符), curses设置一个计时器。如果序列的其余部分没有进入 在指定的时间内,角色通过; 否则,返回功能键值。出于这个原因,很多 终端在用户按下时间之间经历延迟 转义键并将转义返回给程序。
以下是我的想法:
keypad
?keypad
的行为吗?我想如果我想捕捉像Shift + Up这样的事件,我也必须这样做。我很高兴有这方面的例子。感谢您的时间!
答案 0 :(得分:2)
这是多个问题。简言之:
keypad
功能的反面是通过调用参数设置为 FALSE
的给定窗口。keypad
/ wgetch
版本,但是(假设你可以用ncurses'ESCDELAY
来控制超时),除非你有很多好处想要移植到Solaris curses。