我有一个基于诅咒的应用程序(WordGrinder)。我刚刚收到一位用户的错误报告,称他的键盘上的某些按键无法正常工作。经过调查,他是对的。
有问题的键是 SHIFT+光标键和一些键盘导航键,例如 END。调查发生了什么,似乎诅咒没有向我发送这些键的事件。在 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 终端使用 Wordgrinder,发现所有这些古怪的键都会生成有效的 ncurses 键码。例如,SHIFT+LEFT 现在生成键码 393。xterm 生成完全相同的结果。不幸的是,CTRL+LEFT 产生键码 539,而 Curses 文档明确指出有效键码的范围是 KEY_MIN 到 KEY_MAX --- 257 到 511...
所以至少现在一切正常了,但是这些奇怪的新键码是如何工作的呢?它们在任何地方定义吗?它们肯定不在标题中。
gnome-terminal 不是 xterm。它发送不同的 Shift 箭头和 control 箭头组合。使用 ncurses 5.5 版本,将 TERM 设置为 gnome 可能会起作用。
以下是一些信息: http://invisible-island.net/xterm/xterm.faq.html#bug_gnometerm
gnome-terminal 很有可能为了自己的目的而拦截你的 SHIFT-箭头键。我建议在 xterm 中或从控制台运行您的应用程序。
我已经使用 EPOLL 进行了原始 [ cfmakeraw ] STDIN 扫描。我可以确认 SHIFT+LEFT; Shift+右;没有被“扫描”。那么 XLib 客户端如何读取这些密钥呢?
XLib 客户端/驱动程序使用直接键盘驱动程序(使用良好的旧 BIOS 多路硬件中断挂钩)...没有其他方法可以“扫描”[
Forgotten
RAW] 键盘状态):-)
NCurses 是串行 /dev/TTY* 的客户端,出于明显的网络原因 - 不是硬件挂钩。
我相信这是新的 Linux/*Nix 终端(PTY/PTS)的概念问题,他们(我的意思是终端开发人员)决定遵循古老的 VT100-VT525 技术策略,从 ESC 序列中获取“键码”。
“旧”控制台 TTY,如 Linux 内核终端,允许读取键码(仅键码或仅字符),因此可以在那里获取所有可能的键码。