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),但没有成功。
最后,假设我做对了并且应该报告这些事件,那么鼠标移动事件的 MEVENT
的 bstate
字段是什么?
非常感谢!
【问题讨论】:
【参考方案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 中的鼠标移动事件的主要内容,如果未能解决你的问题,请参考以下文章