我已经实现了一个终端模拟器和一个相应的terminfo条目,它允许我运行ncurses程序,如emacs、mc(午夜命令器)或tig。我想为终端添加鼠标支持,最值得注意的是,通过点击窗口将光标定位在emacs中。经过大量的谷歌搜索和stackerflow上的一些帮助,我了解了所需的terminfo字段(最著名的是kmous
)和控制(例如E[?1000h
)以及"键"(E[M...
)序列,并在我的终端中实现了鼠标按钮事件。我写了一个ncurses的小程序,程序如下:
initscr ();
clear ();
noecho ();
cbreak ();
keypad (stdscr, TRUE);
mousemask (ALL_MOUSE_EVENT, NULL);
if (has_mouse ())
{
while (1)
{
switch (getch ())
{
case KEY_MOUSE:
if (getmouse (&event) == OK)
{
printf ("mouse event 0x%x at %i,%in", event.bstate, event.x, event.y);
这个程序在xterm和我的终端上运行良好,所以我的终端和它的terminfo条目都不会完全错误。
然而,mc似乎无法识别我的终端中的鼠标支持,甚至没有发出任何E[?1000h
序列来激活它,因此完全被我的终端发送的鼠标按钮事件弄糊涂了(即使没有E[?1000h
激活)。
我错过了什么?
最近有人指出了这个问题(尽管没有提到这个问题):
20181124
+ modify the initialization checks for mouse so that the xterm+sm+1006
block will work with terminal descriptions not mentioning xterm
(report by Tomas Janousek).
问题是,如果TERM
具有"xterm",代码将使用kmous
功能,否则将默认为原始的xterm鼠标协议(不具有"任何事件"功能)。由于惯性(人们将"xterm"终端描述与其他终端一起使用),这可能在很长一段时间内被忽视了。
ncurses手册页面确实说明了其意图:
因为没有标准的终端响应识别支持xterm鼠标协议的终端,ncurses假设如果
$TERM
环境变量包含"xterm"
,或者kmous
在终端描述中定义,则终端可以发送鼠标事件。