Terminal Ncurses在第94列之后不报告鼠标移动
在下面的例子中,我可以得到鼠标在终端中的位置,直到第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
#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
编码