События движения мыши в NCurses

Интересно, есть ли в NCurses такая вещь, как события движения мыши, и есть ли способ их поймать. Следуя Взаимодействию с мышью (из HOWTO по программированию в NCurses) кажется, что, включив бит 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 для события движения мыши?

Спасибо заранее!


person Barak Itkin    schedule 18.09.2011    source источник


Ответы (1)


Тебе нужно:

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

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

Пытаться:

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

В результирующих событиях установлен бит REPORT_MOUSE_POSITION в поле bstate.

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

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

person Matthew Slattery    schedule 18.09.2011
comment
Я случайно набрал getchar в stackoverflow, мой реальный код действительно использовал getch. Я снова пропустил обновление, когда набрал здесь псевдокод :P В любом случае, большое спасибо - ваше предложение с xterm сработало очень хорошо! - person Barak Itkin; 19.09.2011