我有一个基于curses的应用程序(WordGrinder)。最近有一个用户报告说他的某些键无法正常工作。经过调查,他是对的。
问题所在的键是SHIFT+光标键和一些键盘导航键,如END。经过调查,似乎curses没有向我发送这些键的事件。在SHIFT+光标键的情况下,我根本就没有得到任何信息,而对于END键,我得到了一个原始的转义序列。
这让我感到惊讶。所有其他按键都被正确地解释和转换为键值。我期望能够收到KEY_SLEFT
和KEY_END
之类的内容。为什么没有呢?
我查看了一些其他可以正常工作的应用程序,但没有发现我做错了什么明显的事情;而像nano这样的应用程序则处理了它们自己的转义键解析,所以我不知道它们是否是源代码的好选择。
我使用以下方式初始化ncurses:
initscr();
raw();
noecho();
meta(NULL, TRUE);
nonl();
idlok(stdscr, TRUE);
idcok(stdscr, TRUE);
scrollok(stdscr, FALSE);
intrflush(stdscr, FALSE);
keypad(stdscr, TRUE);
我正在使用gnome-terminal作为终端仿真器,xterm作为终端类型。本地环境是UTF-8,并且我已经安装了ncursesw库的变体。
有什么想法吗?
更新:
几个月后,我尝试在Gnome 3的gnome-terminal中使用Wordgrinder,并发现所有这些奇怪的键都会生成有效的ncurses按键代码。例如,SHIFT+LEFT现在产生的按键码是393。xterm产生完全相同的结果。不幸的是,CTRL+LEFT产生的按键码是539,而Curses文档清楚地指出,有效的按键码在KEY_MIN到KEY_MAX范围内,即257到511...
所以现在至少可以工作了,但是这些奇怪的新按键码是如何工作的?它们是否被定义在任何地方?它们肯定不在标头文件中。