5

我已经实现了一个终端仿真器和一个相应的 terminfo 条目,它允许我运行ncurses程序,如emacsmc(午夜指挥官)或tig(git 浏览器)。我想为终端添加鼠标支持,最值得注意的是通过单击窗口将光标定位在emacs中。经过大量谷歌搜索和对 stackoverflow 的一些帮助后,我了解了所需的 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,%i\n", event.bstate, event.x, event.y);

这个程序在xterm和我的终端上运行良好,所以我的终端和它的 terminfo 条目都不会完全错误。

但是,mc似乎无法识别我的终端中的鼠标支持,甚至没有发出任何\E[?1000h序列来激活它,因此完全被我的终端发送的鼠标按钮事件(即使没有\E[?1000h激活)弄糊涂了。

我错过了什么?

4

1 回答 1

1

最近有人指出了这个问题(虽然没有提到这个问题):

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).

问题在于,如果有“xterm”,代码将使用该kmous功能TERM,否则将默认使用原始 xterm 鼠标协议(它没有“任何事件”功能)。由于惯性(人们将“xterm”终端描述与其他终端一起使用),这可能被忽视了很长一段时间。

ncurses手册页确实说明了它的意图:

因为没有标准的终端响应可以用来识别支持 ​​xterm 鼠标协议的终端,所以 ncurses 假设如果您的 $TERM 环境变量包含"xterm"kmous在终端描述中定义,那么终端可能会发送鼠标事件。

于 2018-12-27T00:36:34.230 回答