首页 > 解决方案 > ncurses 仅在 bstate 非零时报告鼠标移动

问题描述

我正在关注来自的代码

https://gist.github.com/sylt/93d3f7b77e7f3a881603

在这里,如果是 404

#include <curses.h>
#include <stdio.h>

int main()
{
  initscr();
  cbreak();
  noecho();

  // Enables keypad mode. This makes (at least for me) mouse events getting
  // reported as KEY_MOUSE, instead as of random letters.
  keypad(stdscr, TRUE);

  // Don't mask any mouse events
  mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL);

  printf("\033[?1003h\n"); // Makes the terminal report mouse movement events
  fflush(stdout);

  for (;;) { 
    int c = wgetch(stdscr);

    // Exit the program on new line fed
    if (c == '\n')
      break;

    char buffer[512];
    size_t max_size = sizeof(buffer);
    if (c == ERR) {
      snprintf(buffer, max_size, "Nothing happened.");
    }
    else if (c == KEY_MOUSE) {
      MEVENT event;
      if (getmouse(&event) == OK) {
        snprintf(buffer, max_size, "Mouse at row=%d, column=%d bstate=0x%08lx",
                 event.y, event.x, event.bstate);
      }
      else {
        snprintf(buffer, max_size, "Got bad mouse event.");
      }
    }
    else {
      snprintf(buffer, max_size, "Pressed key %d (%s)", c, keyname(c));      
    }

    move(0, 0);
    insertln();
    addstr(buffer);
    clrtoeol();
    move(0, 0);
  }

  printf("\033[?1003l\n"); // Disable mouse movement events, as l = low

  endwin();

  return 0;
}

当我将它放入一个文件并编译它(gcc -o test test.c -lncurses)时,在 xterm 中,鼠标移动会在没有按下按钮的情况下报告。在 gnome-terminal 和 Konsole 中,仅当按下鼠标上的按钮时才会报告移动事件!

我通常会说这只是兼容性/标准的事情,但是当我执行时:

printf '\033[?1003h'在 gnome-terminal 或 konsole 上,我可以看到所有报告的鼠标移动,而无需按下任何按钮!

那么这里发生了什么?如何说服 gnome-terminal 和 konsole 表现得像 xterm?或者甚至在他们处于 bash 模式时表现得像他们自己?

编辑:附加线索:

如果我滚动鼠标滚轮,此代码似乎适用于所有终端。这很可能是我最初在 xterm 中测试时发生的情况,因为即使 xterm 也需要按下按钮或滚动鼠标才能使其工作。

因此:我的问题变成了为什么终端只bstate在以某种方式修改后才报告鼠标移动,即使终端在 bash 模式下报告转义序列?

标签: cncursescurses

解决方案


推荐阅读