ncurses不能捕获鼠标移动,但是终端可以

时间:2018-12-04 03:57:15

标签: c ncurses

我能够echo -e "\e[?1003h"并观看我的终端吞噬糖果之类的鼠标移动事件,但是诅咒似乎根本不需要它们。我看着

Mouse movement events in NCurses

,但是似乎可以通过更改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"

将其反转

1 个答案:

答案 0 :(得分:2)

printf和curses写入标准输出的同时,ncurses不会刷新 stdout ,因为它具有自己的缓冲功能。如ncurses 6.0发行说明(August 2015)中所述:

  

输出缓冲提供了进一步但值得的注意力。 2012年有关在ncurses中使用信号处理程序的错误报告指出了使用不安全的函数来处理SIGTSTP的问题。其他信号可以通过解决方法解决;修复SIGTSTP需要另一种方法。该解决方案需要更改库的内部行为:库如何处理输出缓冲。

     

现在ncurses可以独立于标准输出来缓冲其自身的输出。一些应用程序依赖于库对标准输出缓冲的直接重用。但是,这是未指定的行为,从来都不是推荐的做法。识别这些应用程序以及完善更改以使低级应用程序能够始终如一地工作需要花费时间。

虽然在 printf 调用后跟有 fflush(stdout) 的情况下,示例可能会起作用,但不能保证它会无限期地起作用,因为ncurses在 getch 调用之前无需发送其鼠标初始化操作。建议使用ncurses的方法是将该信息放入终端描述中,让ncurses决定何时更改屏幕。

ncurses终端数据库中已经有一个示例:xterm-1003