微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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,"Mouse at row=%03d and column=%03d",event.y,event.x);
}

经过以下测试:

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

但是它在:

  • mintty(WSL2)

我想念什么?

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

解决方法

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中实现的(虽然PuTTY的实现与xterm不同,但也是xterm的实现)。在两个PuTTY / xterm中,在1006命令中 1015 之前的 echo 将使这些终端使用xterm的1006 (“ SGR模式”),由Windows Terminal实现。如果您省略了 1006 ,则它不适用于ncurses,因为协议不同-ncurses不支持 1015 编码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。