NCurses中的鼠标移动事件

时间:2011-09-18 16:38:05

标签: c linux terminal mouseevent ncurses

我想知道NCurses中是否存在鼠标移动事件这样的事情,以及是否有办法捕获它们。在Interfacing with the mouse之后(来自NCurses programming HOWTO),似乎通过启用REPORT_MOUSE_POSITION调用中的mousemask位,可以确实捕获鼠标移动事件。

所以,我试过了,似乎没有用。我有这样的事情:

int ch, count=0;
mmask_t old;

initscr ();
noecho ();
cbreak ();
mousemask (ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, &old);
keypad (stdscr, TRUE);

while ((ch = getchar ()) != 'q')
{
  count++;
  if (ch == KEY_MOUSE)
  {
     MEVENT event;
     assert (getmouse (&event) == OK);
     mvprintw (0, 0, "Mouse Event!\n");
  }
  mvprintw (1, 1, "Event number %4d",count);
}

...

我预计,当我移动鼠标光标时,我会看到事件计数器增加。但事实并非如此。我也尝试在鼠标按钮1关闭时移动它以查看是否生成“拖动”事件,它也没有做任何事情。问题是,如果它只是我的终端模拟器的问题?或者我可能误解了NCurses认为的鼠标移动事件?收到所有其他鼠标事件(我可以在控制台中使用鼠标操作程序)。

我尝试过gnome-terminal,xterm和其他一些东西。我还尝试了一个文本环境(没有X),转到我的linux机器的tty(Fedora 15,Ctrl + Alt + F2),但是没有用。

最后,假设我确实做到了并且应该报告这些事件,那么bstate对于鼠标移动evenet的MEVENT字段是什么?

非常感谢提前!

1 个答案:

答案 0 :(得分:20)

你需要:

  1. 支持鼠标事件报告的终端;
  2. $TERM指向terminfo条目,该条目具有适当的XM条目以正确初始化终端。
  3. xterm至少满足(1);对于(2),您可能需要为TERM设置不同的值。

    尝试:

    • TERM=xterm-1002在按住按钮时光标移动到另一个单元格时获取位置事件;或
    • 只要光标移动到另一个单元格,
    • TERM=xterm-1003总是会获得一个位置事件,即使没有按下按钮也是如此。

    结果事件在REPORT_MOUSE_POSITION字段上设置了bstate位。

    curs_mouse(3x)手册页的“PORTABILITY”部分描述了终端初始化,Xterm Control Sequences文档的“鼠标跟踪”部分描述了相关的“私人模式”扩展。)

    您上面提到的代码需要使用getch(),而不是getchar();并且在循环中需要refresh()!除此之外,当使用适当的xterm设置时,TERM对我有效。