如何在终端/ terminfo条目中实现适当的鼠标支持?

时间:2013-11-20 19:41:31

标签: ncurses xterm terminfo

我已经实现了一个终端模拟器和相应的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激活)。

我错过了什么?

1 个答案:

答案 0 :(得分: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).

问题在于,如果kmous具有“ xterm”,则代码将使用TERM功能,否则将默认使用原始的xterm鼠标协议(不具有“任何事件”功能) )。由于惯性(人们在其他终端上使用“ xterm”终端描述的人),这可能已经被忽略了很长时间。

ncurses manual page确实说明了意图:

  

因为没有标准的终端响应可用于          识别支持xterm鼠标协议的终端,ncurses假定如果您的 $TERM 环境变量包含 "xterm" ,或者          在终端说明中定义了 kmous ,则终端可以          发送鼠标事件。