密钥不被ncurses解释

时间:2011-07-05 19:02:13

标签: c unix terminal ncurses curses

我有一个基于curses的应用程序(WordGrinder)。我刚刚收到用户的错误报告,说某些键在键盘上无法正常工作。在调查中,他是对的。

有问题的键是SHIFT +光标键和一些键盘导航键,例如END。调查正在发生的事情,似乎诅咒并没有向我发送这些密钥的事件。在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作为终端类型。 Locale是UTF-8,我有这个库的ncursesw变体。

有什么想法吗?

更新

好吧,几个月后,我尝试使用Gnome 3的gnome-terminal的Wordgrinder,并发现所有这些古怪的密钥生成有效的ncurses密钥代码。例如,SHIFT + LEFT现在生成键码393.xterm产生完全相同的结果。不幸的是,CTRL + LEFT生成密钥代码539,并且Curses文档明确指出有效密钥代码在KEY_MIN到KEY_MAX范围内--- 257到511 ......

所以至少事情现在有效,但这些奇怪的新密钥代码如何运作?他们在任何地方定义?它们当然不在标题中。

3 个答案:

答案 0 :(得分:1)

gnome-terminal不是xterm。它为shift-arrow和control-arrow发送不同的组合。使用ncurses版本5.5将TERM设置为gnome可能会有效。

以下是一些信息: http://invisible-island.net/xterm/xterm.faq.html#bug_gnometerm

答案 1 :(得分:0)

gnome-terminal很有可能为了自己的目的拦截你的SHIFT箭头键。我建议在xterm或控制台中运行你的应用程序。

答案 2 :(得分:0)

我使用EPOLL完成了原始[cfmakeraw] STDIN扫描。我可以确认SHIFT + LEFT; SHIFT +右;不是"扫描"。那么XLib客户端如何读取这些密钥呢?

XLib客户端/驱动程序使用直接键盘驱动程序(使用旧的BIOS多路硬件INTERRUPT挂钩)...没有其他方法可以扫描" [Forgotten RAW]键盘状态): - )

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