我已经实现了一个终端模拟器和相应的terminfo条目,允许我运行 ncurses 程序,如 emacs , mc (午夜指挥官) )或 tig (git浏览器)。我想向终端添加鼠标支持,最明显的是通过单击窗口将光标定位在 emacs 中。经过大量的谷歌搜索和stackoverflow的一些帮助后,我了解了所需的terminfo字段(最值得注意的是kmous
)和控制(例如\E[?1000h
)和“key”(\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,%i\n", event.bstate, event.x, event.y);
这个程序在 xterm 和我的终端上工作正常,所以我的终端和它的terminfo条目都不能完全错误。
但是, mc 似乎无法识别终端中的鼠标支持,甚至没有发出任何\E[?1000h
序列来激活它,因此我的终端发送的鼠标按钮事件完全混淆了(即使没有\E[?1000h
激活)。
我错过了什么?
答案 0 :(得分:1)
最近有人指出了这个问题(尽管未提及该问题):
+ 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).
问题在于,如果kmous
具有“ xterm”,则代码将使用TERM
功能,否则将默认使用原始的xterm鼠标协议(不具有“任何事件”功能) )。由于惯性(人们在其他终端上使用“ xterm”终端描述的人),这可能已经被忽略了很长时间。
ncurses manual page确实说明了意图:
因为没有标准的终端响应可用于 识别支持xterm鼠标协议的终端,ncurses假定如果您的
$TERM
环境变量包含"xterm"
,或者 在终端说明中定义了kmous
,则终端可以 发送鼠标事件。