Terminal Ncurses在第94列之后不报告鼠标移动

Terminal Ncurses在第94列之后不报告鼠标移动,terminal,mouseevent,ncurses,Terminal,Mouseevent,Ncurses,在下面的例子中,我可以得到鼠标在终端中的位置,直到第94列。限制在哪里 #include <curses.h> int main() { initscr(); cbreak(); noecho(); keypad(stdscr, TRUE); mousemask(ALL_MOUSE_EVENTS, NULL); MEVENT event; for (;;) if (wgetch(stdscr) == KEY

在下面的例子中,我可以得到鼠标在终端中的位置,直到第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);
}
#包括
int main()
{
initscr();
cbreak();
noecho();
键盘(stdscr,真);
鼠标掩码(所有鼠标事件,空);
MEVENT事件;
对于(;;)
if(wgetch(stdscr)=键\鼠标和获取鼠标(&event)=确定)
mvprintw(0,0,“鼠标位于第%03d行和第%03d列”,事件.y,事件.x);
}
测试地点:

  • Windows终端(WSL2)
  • cmd.exe(WSL2)
但它正在:

  • 明蒂(WSL2)
我错过了什么


在所有终端中,我通过手动启用带有
echo-e“\e[-1000;1006;1015h”
的鼠标报告来获得相同的结果。因此,Ncurses似乎在使用其他东西…

Ncurses使用终端描述来确定终端是否支持xterm。它查看
XM
标志(请参阅):

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终端无法识别。的文档中也没有提到它。它是在PuTTY中实现的(也是xterm,尽管PuTTY的实现不同于xterm)。在PuTTY/xterm中,
echo
命令中
1015
之前的
1006
将导致这些终端使用xterm的1006(“SGR模式”),这是由Windows终端实现的。如果您省略了
1006
,那么它将无法与ncurses一起工作,因为协议不同,并且ncurses不支持
1015
编码