如何在终端/terminfo条目中实现正确的鼠标支持



我已经实现了一个终端模拟器和一个相应的terminfo条目,它允许我运行ncurses程序,如emacsmc(午夜命令器)或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在终端描述中定义,则终端可以发送鼠标事件。

相关内容

  • 没有找到相关文章

最新更新