我想知道NCurses中是否存在鼠标移动事件这样的事情,以及是否有办法捕获它们。在Interfacing with the mouse之后(来自NCurses programming 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和其他一些东西。我还尝试了一个文本环境(没有X),转到我的linux机器的tty(Fedora 15,Ctrl + Alt + F2),但是没有用。
最后,假设我确实做到了并且应该报告这些事件,那么bstate
对于鼠标移动evenet的MEVENT
字段是什么?
非常感谢提前!
答案 0 :(得分:20)
你需要:
$TERM
指向terminfo条目,该条目具有适当的XM
条目以正确初始化终端。 xterm
至少满足(1);对于(2),您可能需要为TERM
设置不同的值。
尝试:
TERM=xterm-1002
在按住按钮时光标移动到另一个单元格时获取位置事件;或TERM=xterm-1003
总是会获得一个位置事件,即使没有按下按钮也是如此。结果事件在REPORT_MOUSE_POSITION
字段上设置了bstate
位。
(curs_mouse(3x)
手册页的“PORTABILITY”部分描述了终端初始化,Xterm Control Sequences文档的“鼠标跟踪”部分描述了相关的“私人模式”扩展。)
您上面提到的代码需要使用getch()
,而不是getchar()
;并且在循环中需要refresh()
!除此之外,当使用适当的xterm
设置时,TERM
对我有效。