terminal - 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);
}
测试:
- Windows 终端 (WSL2)
- cmd.exe (WSL2)
但它适用于:
- 薄荷味 (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 的版本,因为它可能太旧了)。
问题中有评论:这1015
是一个 rxvt-unicode 功能,Windows 终端无法识别。Windows cmd的文档中也没有提到它。它在 PuTTY 中实现(也是 xterm,尽管 PuTTY 的实现与 xterm 不同)。在 PuTTY/xterm中,命令1006
中前面的内容将导致这些终端使用 xterm 的 1006(“SGR 模式”),这是由 Windows 终端实现的。如果您省略了,那么它将不适用于 ncurses,因为协议不同 - 而且 ncurses 不支持编码。1015
echo
1006
1015
推荐阅读
- python - ValueError: int() 以 10 为底的无效文字:'(?)' Dash Plotly Pandas
- tableau-api - 桌面提取时间在服务器中需要一个多小时,而在桌面中需要几秒钟
- html - 如何取消“li:before {content:'text'}”的继承而不为每个重新分配它
- 元素?
- javascript - 用户运行托管 IIS 链接时如何在 asp.net 中获取客户端 IP 地址
- flutter - NoSuchMethodError:在 null 上调用了 getter 'dlongitude'
- javascript - 使用 React 播放音频
- ffmpeg - 将 5.1 PRORES 转换为 Prores 立体声
- javascript - react js在哪里存储网站的图像?
- javascript - 获取数组中字符串的最后一个字符
- laravel - 如何将 laravel 应用程序同时用作 Web 应用程序和 Rest API