我想知道NCurses中是否存在诸如鼠标移动事件之类的事情,以及是否有办法捕获它们。在与鼠标接口之后(来自NCurses编程HOWTO),似乎通过启用对REPORT_MOUSE_POSITION的调用mousemask,可以确实捕获鼠标移动事件。
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和其他一些东西。我还通过转到Linux计算机的tty(Fedora 15,Ctrl + Alt + F2)尝试了文本环境(不带X),但该方法不起作用。
最后,假设我得到这个权利,这些事件应该报告,什么是bstate一个领域MEVENT的鼠标移动evenet?
bstate
MEVENT
提前谢谢了!
你需要:
$TERM
XM
xterm至少满足(1);对于(2),您可能需要为设置一个不同的值TERM。
xterm
TERM
尝试:
TERM=xterm-1002
TERM=xterm-1003
结果事件REPORT_MOUSE_POSITION将在bstate字段上设置该位。
(curs_mouse(3x)手册页的“ PORTABILITY”部分描述了终端的初始化,Xterm Control Sequences文档的“ Mouse Tracking”部分描述了相关的“ private mode”扩展。)
curs_mouse(3x)
您上面提供的代码getch()无需使用getchar();并且需要一个refresh()内部循环!除此之外,xterm当使用适当的TERM设置之一时,它对我有用。
getch()
getchar()
refresh()