ncurses сообщает только о движении мыши, когда bstate не равно нулю - PullRequest
1 голос
/ 17 марта 2019

Я следую вместе с кодом из

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 или на консоли я могу видеть все сообщения о движениях мыши без нажатия кнопок!

Так что здесь происходит?Как мне убедить gnome-терминал и консоль вести себя как xterm?Или даже вести себя как они, когда они находятся в режиме bash?

РЕДАКТИРОВАТЬ: Дополнительные подсказки:

Похоже, этот код работает на всех терминалах, если я прокручиваю колесо мыши.Скорее всего, именно это и произошло, когда я первоначально тестировал в xterm, поскольку даже для xterm требуется либо нажатие кнопки, либо прокрутка мыши, чтобы это работало.

Поэтому: у меня возникает вопрос, почему терминалсообщать только о перемещении мыши после того, как bstate был каким-либо образом изменен, даже когда терминал сообщает escape-последовательности в режиме bash?

...