NCurses中的鼠标移动事件

Bar*_*kin 11 c linux terminal ncurses mouseevent

我想知道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);
}

...
Run Code Online (Sandbox Code Playgroud)

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

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

最后,假设我确实做到了这一点并且应该报告那些事件,那么鼠标运动evenet 的bstate领域是什么MEVENT

提前谢谢了!

Mat*_*ery 20

你需要:

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

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

尝试:

  • TERM=xterm-1002当按下按钮时光标移动到另一个单元格时获取位置事件; 要么
  • TERM=xterm-1003 即使没有按下任何按钮,每当光标移动到不同的单元格时总是获得位置事件.

结果事件REPORT_MOUSE_POSITIONbstate字段上设置了位.

(curs_mouse(3x)手册页的"可移植性"部分描述了终端初始化,Xterm控制序列文档的"鼠标跟踪"部分描述了相关的"私有模式"扩展.)

您上面给出的代码需要使用getch(),而不是getchar(); 并需要refresh()循环内部!除此之外,它适用于我xterm使用其中一个适当的TERM设置.