首页 > 解决方案 > Ncurses 在第 94 列之后不报告鼠标移动

问题描述

通过以下示例,我可以在终端中获取鼠标位置,直到第 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);
}

测试:

但它适用于:

我错过了什么?

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

标签: terminalmouseeventncurses

解决方案


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 的版本,因为它可能太旧了)。

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


推荐阅读