【问题标题】:Keys not being interpreted by ncursesncurses 不解释键
【发布时间】:2011-09-29 01:48:07
【问题描述】:

我有一个基于诅咒的应用程序 (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 ssh 到盒子并运行应用程序)?你看到同样的问题吗?

标签: c unix terminal ncurses curses


【解决方案1】:

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

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

【讨论】:

  • 当前 Debian 无法将 gnome 识别为终端类型。如果我像在 gnome-terminal 中那样使用传统的 xterm(终端类型设置为 xterm)进行测试,我会得到相同的行为。同上 rxvt-unicode(终端类型设置为 rxvt)...
  • 我最好的猜测是 terminfo/termcap 安装有问题。我对debian不熟悉,所以我无法具体说明。安装了哪个版本的 ncurses?
【解决方案2】:

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

【讨论】:

  • 不,如果我这样做 cat > /dev/null 我可以看到箭头键和 shift+箭头键产生不同的转义序列(分别为 ^[[C^[[1;2C)...
  • 好的。第二种选择:您将 getch() 返回的变量存储在什么类型的变量中?您是否有机会使用charshort
  • 我实际上是在使用 get_wch(),因为我需要了解 Unicode,所以键类型是 int。
  • 好的,我明白了。我检查了源代码并在本地编译(Debian Squeeze、lua 5.1.4、ncurses 5.7)。我可以毫无问题地使用左移和右移功能。您使用哪些版本进行测试?
  • 你的意思是你编译了WordGrinder?如果是这样,ta!事实上,它在 Debian 中,我这里有一个 Debian Wheezy 系统,WordGrinder 在 gnome-terminal 中运行,它工作。但是使用cat我可以看到终端产生不同的转义序列...
【解决方案3】:

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

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

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

【讨论】:

  • KEY_SRIGHT; KEY_SLEFT;在 [n]curses.h 中定义,但没有 KEY_SUP KEY_SDOWN... 弄清楚为什么 ....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多