【问题标题】:Ncurses not reporting mouse movements after columns 94Ncurses 在第 94 列之后不报告鼠标移动
【发布时间】:2020-10-11 20:55:54
【问题描述】:

通过以下示例,我可以在终端中获取鼠标位置,直到第 94 列。限制在哪里?

#include <curses.h>

int main()
{
    initscr();
    cbreak();
    noecho();

    keypad(stdscr, TRUE);
    mousemask(ALL_MOUSE_EVENTS, NULL);

    MEVENT event;
    for (;;)
        if (wgetch(stdscr) == KEY_MOUSE && getmouse(&event) == OK)
            mvprintw(0, 0, "Mouse at row=%03d and column=%03d", event.y, event.x);
}

测试于:

  • Windows 终端 (WSL2)
  • cmd.exe (WSL2)

但它正在工作:

  • 薄荷味 (WSL2)

我错过了什么?

在所有终端中,通过使用echo -e "\e[?1000;1006;1015h" 手动启用鼠标报告,我得到了相同的结果。所以看起来 Ncurses 正在使用其他东西......

【问题讨论】:

    标签: terminal mouseevent ncurses


    【解决方案1】:

    ncurses 使用终端描述来确定终端是否支持 xterm 的1006 mouse-mode。它查看 XM 标志(参见user_caps(5)):

    XM 功能只有一个参数。如果非零,鼠标 应启用协议。如果为零,鼠标协议应该 被禁用。 ncurses 检查此功能(如果存在), 查看是否使用了 1006 协议。如果是这样,它预计 使用 SGR 1006 xterm 鼠标协议的响应。

    要查看该标志,您可以使用infocmp,例如,

    infocmp -1x |grep XM,
    

    查看是否已定义。对于mintty,您可能会看到:

    $ infocmp -1x mintty | grep XM
            XM=\E[?1006;1000%?%p1%{1}%=%th%el%;,
    

    对于其他人来说,知道TERM 设置为什么会有所帮助(还有ncurses 的版本,因为它could 太旧了)。

    问题中的 1015 带有评论:这是一个 rxvt-unicode 功能,Windows 终端无法识别。 Windows cmd 的文档中也没有提到它。它在 PuTTY 中实现(也是 xterm,尽管 PuTTY 的实现与 xterm 不同)。在 PuTTY/xterm 中,echo 命令中 1015 之前的 1006 将导致这些终端使用 xterm 的 1006(“SGR 模式”) ,由 Windows 终端实现。如果您省略了 1006,则它不适用于 ncurses,因为协议不同,并且 ncurses 不支持 1015 编码。

    【讨论】:

      猜你喜欢
      • 2011-11-19
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 2014-09-24
      相关资源
      最近更新 更多