NCurses中的鼠标移动事件

15
我想知道NCurses中是否有鼠标移动事件,并且是否有捕获它们的方法。按照NCurses编程HOWTO中的与鼠标交互,似乎通过在调用mousemask时启用REPORT_MOUSE_POSITION位,确实可以捕获鼠标移动事件。
因此,我尝试了这个方法,但似乎并没有起作用。我的代码类似于:
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),但也没有起作用。
最后,假设我理解正确,并且应该报告这些事件,那么鼠标移动事件的MEVENT的bstate字段是什么?
非常感谢!
1个回答

25
你需要:
  1. 一个支持鼠标事件报告的终端;
  2. $TERM 指向一个具有适当的 XM 条目以正确初始化终端的 terminfo 条目。
xterm 至少满足 (1);对于 (2),你很可能需要设置不同的 TERM 值。
尝试:
  • TERM=xterm-1002 以在按住按钮时将光标移动到不同单元时获取位置事件; 或者
  • TERM=xterm-1003 以始终在光标移动到不同单元时获取位置事件,即使没有按下任何按钮。
生成的事件在 bstate 字段上设置了 REPORT_MOUSE_POSITION 位。
curs_mouse(3x) 手册的 "PORTABILITY" 部分描述了终端的初始化,Xterm Control Sequences 文档的 "Mouse Tracking" 部分描述了相关的 "private mode" 扩展。)
你提供的代码需要使用 getch() 而不是 getchar(),并且循环内需要有 refresh()!除此之外,在使用适当的 TERM 设置时,我在使用 xterm 时可以成功运行。

1
我不小心在stackoverflow输入了getchar,我的真实代码确实使用了getch。当我在这里输入伪代码时,我忘了刷新:P 无论如何,非常感谢-您的建议与xterm很好地配合了! - Barak Itkin
有没有办法让程序自己设置TERM变量?我知道你可以通过执行TERM=xterm-1002 ./program来启动一个已经设置好的程序,但是是否有任何方法可以在代码中创建子进程时设置它,或者让程序分叉/启动一个新的进程并设置该变量? - Arthur Bouvier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接