[英]ncurses not capturing mouse movements but terminal is
我能够echo -e "\\e[?1003h"
并在终端机echo -e "\\e[?1003h"
糖果之类的鼠标移动事件时观看,但是诅咒似乎根本不需要它们。 我看着
但是似乎可以通过更改TERM env解决此问题,但这对我无济于事,因为我的终端确实响应了鼠标移动事件,但是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
和curses写入标准输出时 ,ncurses不会刷新stdout
因为它会执行自己的缓冲。 如ncurses 6.0发行说明( 2015年8月 )所述:
输出缓冲提供了进一步但值得的注意力。 2012年有关在ncurses中使用信号处理程序的错误报告指出了使用不安全的函数来处理
SIGTSTP
。 其他信号可以通过解决方法解决; 修复SIGTSTP
需要采用不同的方法。 该解决方案需要更改库的内部行为:库如何处理输出缓冲。现在,ncurses可以独立于标准输出缓冲其自身的输出 。 一些应用程序依赖于库对标准输出缓冲的直接重用。 但是,这是未指定的行为,从来都不是推荐的做法。 识别这些应用程序以及完善更改以使低级应用程序能够始终如一地工作需要花费时间。
尽管在printf
调用后接fflush(stdout)
可能使示例正常工作,但不能保证它会无限期地工作,因为在getch
调用之前不需要ncurses发送其鼠标初始化。 建议使用ncurses的方法是将信息放入终端描述中,让ncurses决定何时更改屏幕。
ncurses终端数据库中已经有一个示例: xterm-1003
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.