如何解决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 举报,一经查实,本站将立刻删除。