ncurses无法解释按键

5

我有一个基于curses的应用程序(WordGrinder)。最近有一个用户报告说他的某些键无法正常工作。经过调查,他是对的。

问题所在的键是SHIFT+光标键和一些键盘导航键,如END。经过调查,似乎curses没有向我发送这些键的事件。在SHIFT+光标键的情况下,我根本就没有得到任何信息,而对于END键,我得到了一个原始的转义序列。

这让我感到惊讶。所有其他按键都被正确地解释和转换为键值。我期望能够收到KEY_SLEFTKEY_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...
所以现在至少可以工作了,但是这些奇怪的新按键码是如何工作的?它们是否被定义在任何地方?它们肯定不在标头文件中。

你可以尝试在不同的终端中运行它吗?例如,使用OSX SSH或Windows Putty连接到该服务器并运行应用程序。您是否看到相同的问题? - Foo Bah
3个回答

1

当前版本的Debian无法将gnome识别为终端类型。如果我在传统的xterm中测试(终端类型设置为xterm),我得到与在gnome-terminal中相同的行为。同样,在rxvt-unicode中也是如此(将终端类型设置为rxvt)。 - David Given
我猜测可能是terminfo/termcap安装有误。我不熟悉Debian,无从说起细节。ncurses安装的哪个版本? - Craig

0

我已经使用EPOLL进行了一个原始的[cfmakeraw] STDIN扫描。我可以确认SHIFT+LEFT; SHIFT+RIGHT;没有被“扫描”。那么XLib客户端是如何读取这些键的呢?

XLib客户端/驱动程序使用直接键盘驱动程序(使用老旧的BIOS多路复用硬件中断钩子)...没有其他方法来“扫描”[Forgotten RAW]键盘状态) :-)

NCurses是串行/dev/TTY*的客户端,出于明显的网络原因 - 不是硬件钩子。


KEY_SRIGHT; KEY_SLEFT; 在 [n]curses.h 中有定义,但是没有 KEY_SUP 和 KEY_SDOWN... 不知道为什么.... - Bretzelus

0

很有可能gnome-terminal正在拦截您的SHIFT-arrow键以用于自己的目的。我建议在xterm或控制台中运行您的应用程序。


不行,如果我执行 cat > /dev/null 命令,我可以看到箭头键和 shift+箭头键产生不同的转义序列(分别为 ^[[C^[[1;2C)... - David Given
好的。第二个选项:你存储getch()返回值的变量是什么类型?有可能你正在使用charshort吗? - Seth
我实际上正在使用get_wch(),因为我需要了解Unicode,所以键类型是int。 - David Given
好的,我明白了。我检查了源代码并在本地编译(Debian Squeeze,lua 5.1.4,ncurses 5.7)。我可以正常使用 shift-left 和 shift-right 功能。你在测试中使用哪些版本? - Seth
你的意思是你编译了WordGrinder?如果是这样,谢谢!实际上它在Debian中,我这里有一个带有WordGrinder的gnome终端的标准Debian Wheezy系统,但它工作。但是使用cat,我可以看到终端产生了不同的转义序列... - David Given

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接