【问题标题】:ncurses not capturing mouse movements but terminal isncurses 不捕获鼠标移动,但终端是
【发布时间】: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 请写下这个作为答案,我会接受。我在研究期间无法在任何地方找到这个,非常感谢:)

标签: c ncurses


【解决方案1】:

虽然printf 和curses 写入标准输出,但ncurses 不会刷新stdout,因为它自己进行缓冲。如 ncurses 6.0 发行说明 (August 2015) 中所述:

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

现在 ncurses 缓冲自己的输出,独立于标准输出。一些应用程序依赖于库对标准输出缓冲的直接重用;但是,这是未指定的行为,并且从未被推荐过。识别这些应用程序并完善更改以使低级应用程序能够始终如一地工作需要时间。

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

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

【讨论】:

  • 完全同意。正因为如此,在mousemask() 调用之前使用printf()fflush(stdout) 通常不会起作用(因为mousemask() 会覆盖每个终端配置的模式)。当然,以TERM=xterm-1003 ./example 运行示例将在许多终端仿真器中运行(gnome-terminalxtermmate-terminallxtermuxtermterminator 至少),尽管似乎并非全部支持水平滚轮。
猜你喜欢
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2013-05-22
相关资源
最近更新 更多