【发布时间】:2019-05-05 10:31:24
【问题描述】:
我可以echo -e "\e[?1003h" 并看着我的终端像糖果一样吞噬鼠标移动事件,但curses 似乎根本不想要它们。我看了看
Mouse movement events in NCurses
但看来这个问题是通过更改 TERM 环境解决的,这对我没有帮助,因为我的终端确实在响应鼠标移动事件,但是,ncurses 不是。这是我尝试过的东西(这段代码几乎完全来自另一个问题):
#include <ncurses.h>
#include <assert.h>
int main(){
int ch, count=0;
mmask_t old;
initscr ();
noecho ();
cbreak ();
mousemask (ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, &old);
keypad (stdscr, TRUE);
printf("\033[?1003h");
while ((ch = getch ()) != '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);
refresh();
}
endwin();
}
附加信息和警告:
这个程序实际上完成了能够在执行后检测鼠标移动。这可以通过命令echo -e "\e[?1000h" 来逆转
【问题讨论】:
-
默认情况下
printf()是行缓冲的:C 库在内部缓存数据,直到看到换行符。要修复,请使用printf("\033[?1003h"); fflush(stdout);。同样,在endwin();之前添加printf("\033[?1000h"); fflush(stdout);可以在程序退出时恢复默认行为。 -
@NominalAnimal 请写下这个作为答案,我会接受。我在研究期间无法在任何地方找到这个,非常感谢:)