ncurses 不解释键

问题描述 投票:0回答:4

我有一个基于诅咒的应用程序(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...

所以至少现在一切正常了,但是这些奇怪的新键码是如何工作的呢?它们在任何地方定义吗?它们肯定不在标题中。

c unix terminal ncurses curses
4个回答
1
投票

gnome-terminal 不是 xterm。它发送不同的 Shift 箭头和 control 箭头组合。使用 ncurses 5.5 版本,将 TERM 设置为 gnome 可能会起作用。

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


0
投票

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


0
投票

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

XLib 客户端/驱动程序使用直接键盘驱动程序(使用良好的旧 BIOS 多路硬件中断挂钩)...没有其他方法可以“扫描”[

Forgotten
RAW] 键盘状态):-)

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


0
投票

我相信这是新的 Linux/*Nix 终端(PTY/PTS)的概念问题,他们(我的意思是终端开发人员)决定遵循古老的 VT100-VT525 技术策略,从 ESC 序列中获取“键码”。

“旧”控制台 TTY,如 Linux 内核终端,允许读取键码(仅键码或仅字符),因此可以在那里获取所有可能的键码。

© www.soinside.com 2019 - 2024. All rights reserved.