NCurses 中的鼠标移动事件

Posted

技术标签:

【中文标题】NCurses 中的鼠标移动事件【英文标题】:Mouse movement events in NCurses 【发布时间】:2011-11-19 17:49:03 【问题描述】:

我想知道NCurses中是否存在鼠标移动事件,是否有办法捕捉它们。在Interfacing with the mouse(来自NCurses programming 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 机器(Fedora 15,Ctrl+Alt+F2)的 tty 尝试了一个文本环境(没有 X),但没有成功。

最后,假设我做对了并且应该报告这些事件,那么鼠标移动事件的 MEVENTbstate 字段是什么?

非常感谢!

【问题讨论】:

【参考方案1】:

你需要:

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

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

试试:

TERM=xterm-1002 在按住按钮时光标移动到不同的单元格时获取位置事件;或 TERM=xterm-1003 总是在光标移动到不同的单元格时获得位置事件,即使没有按下任何按钮。

生成的事件在bstate 字段上设置了REPORT_MOUSE_POSITION 位。

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

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

【讨论】:

我不小心在***中输入了getchar,我的真实代码确实使用了getch。当我在这里输入伪代码时,我再次跳过了刷新:P 无论如何,非常感谢 - 您对 xterm 的建议非常有效!

以上是关于NCurses 中的鼠标移动事件的主要内容,如果未能解决你的问题,请参考以下文章

鼠标向上滚动(Ncurses / C++)

C指针原理(34)-Ncurses-文本终端的图形

如何在QNX中检测来自ncurses的屏幕调整大小事件?

C指针原理(29)-Ncurses-文本终端的图形

为 ncurses 游戏编写游戏循环?

在 ncurses 中实现文本滚动的推荐方法是啥?