一尘不染

NCurses中的鼠标移动事件

linux

我想知道NCurses中是否存在诸如鼠标移动事件之类的事情,以及是否有办法捕获它们。在与鼠标接口之后(来自NCurses编程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和其他一些东西。我还通过转到Linux计算机的tty(Fedora 15,Ctrl + Alt +
F2)尝试了文本环境(不带X),但该方法不起作用。

最后,假设我得到这个权利,这些事件应该报告,什么是bstate一个领域MEVENT的鼠标移动evenet?

提前谢谢了!


阅读 457

收藏
2020-06-03

共1个答案

一尘不染

你需要:

  1. 支持鼠标事件报告的终端;
  2. $TERM指向terminfo条目,该条目具有适当的XM条目以正确初始化终端。

xterm至少满足(1);对于(2),您可能需要为设置一个不同的值TERM

尝试:

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

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

curs_mouse(3x)手册页的“ PORTABILITY”部分描述了终端的初始化,Xterm
Control Sequences
文档的“
Mouse Tracking”部分描述了相关的“ private mode”扩展。)

您上面提供的代码getch()无需使用getchar();并且需要一个refresh()内部循环!除此之外,xterm当使用适当的TERM设置之一时,它对我有用。

2020-06-03