События движения мыши в NCurses - PullRequest
11 голосов
/ 18 сентября 2011

Интересно, есть ли такая вещь, как события перемещения мыши в NCurses, и есть ли способ их отловить? После взаимодействия с мышью (из NCurses, программирующего HOWTO ) кажется, что, включив бит REPORT_MOUSE_POSITION в вызове к mousemask, можно действительно отловить события движения мыши .

Итак, я попробовал это, и это, кажется, не работает. У меня есть что-то вроде этого:

int ch, count=0;
mmask_t old;

initscr ();
noecho ();
cbreak ();
mousemask (ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, &old);
keypad (stdscr, TRUE);

while ((ch = getchar ()) != '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);
}

...

Я ожидал, что при перемещении курсора мыши счетчик событий будет увеличиваться. Но это не так. Я также попытался переместить его, когда кнопка мыши 1 нажата, чтобы увидеть, генерирует ли «перетаскивание» события, и он также ничего не сделал. Вопрос, если это просто проблема моего эмулятора терминала? Или, может быть, я неправильно понимаю, что NCurses считает событиями перемещения мыши? Все остальные события мыши были получены (и я могу управлять программами в консоли, которые используют мышь).

Я пробовал gnome-терминал, xterm и некоторые другие вещи. Я также попробовал текстовую среду (без X), зайдя в tty моего linux-компьютера (Fedora 15, Ctrl + Alt + F2), и это не сработало.

Наконец, если я правильно понял, и об этих событиях нужно сообщить, каково поле bstate поля MEVENT для движения мыши?

Заранее большое спасибо!

1 Ответ

20 голосов
/ 19 сентября 2011

Вам нужно:

  1. терминал, который поддерживает отчеты о событиях мыши;
  2. $TERM указывает на запись terminfo, которая имеет соответствующую запись XM для правильной инициализации терминала.

xterm по крайней мере удовлетворяет (1); для (2), вероятно, вам нужно будет установить другое значение для TERM.

Попробуйте:

  • TERM=xterm-1002 для получения события положения, когда курсор перемещается в другую ячейку, пока кнопка удерживается нажатой; или
  • TERM=xterm-1003, чтобы всегда получать событие положения, когда курсор перемещается в другую ячейку, даже если ни одна кнопка не нажата.

Полученные события имеют бит REPORT_MOUSE_POSITION, установленный в поле bstate.

(Раздел «ПОРТАТИВНОСТЬ» справочной страницы curs_mouse(3x) описывает инициализацию терминала, а раздел «Отслеживание мыши» Последовательности управления Xterm * Документация 1033 * описывает соответствующую информацию » Приватный режим "Расширения.)

Код, который вы дали выше, должен использовать getch(), а не getchar(); и нуждается в refresh() внутри цикла! Кроме этого, он работает с xterm при использовании одной из соответствующих TERM настроек.

...