Я могу использовать echo -e "\e[?1003h" и смотреть, как мой терминал поглощает события движения мыши, как леденцы, но проклятиям они, похоже, совсем не нужны. я посмотрел на
События движения мыши в NCurses
но похоже, что эта проблема была решена путем изменения TERM env, что мне не помогло, потому что мой терминал действительно реагирует на события перемещения мыши, а 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".
@NominalAnimal Пожалуйста, напишите это как ответ, и я приму его. Мне не удалось найти это нигде во время моих исследований, большое спасибо :)





Пока printf и curses записывают в стандартный вывод, ncurses не сбрасывает stdout, поскольку выполняет свою собственную буферизацию. Как упоминалось в примечаниях к выпуску ncurses 6.0 (Август 2015 г.):
Output buffering provided a further, but worthwhile distraction. A bug report in 2012 regarding the use of signal handlers in ncurses) pointed out a problem with the use of unsafe functions for handling
SIGTSTP. Other signals could be addressed with workarounds; repairingSIGTSTPrequired a different approach. The solution required changing internal behavior of the library: how it handles output buffering.Now ncurses buffers its own output, independently of the standard output. A few applications relied upon the library's direct reuse of the standard output buffering; however that is unspecified behavior and has never been a recommended practice. Identifying these applications as well as refining the change to permit low-level applications to work consistently took time.
Хотя пример может работать, если за вызовом printf следует fflush(stdout), нет никакой гарантии, что он будет работать бесконечно, поскольку ncurses не нужно отправлять свою инициализацию мыши до вызова getch. Рекомендуемый способ работы с ncurses - поместить эту информацию в описание терминала, позволяя ncurses решать, когда вносить изменения на экран.
Пример в базе данных терминала ncurses уже есть: xterm-1003
Полностью согласен. Именно поэтому наличие printf() и fflush(stdout) перед вызовом mousemask() обычно не работает (потому что mousemask() переопределяет режим в соответствии с конфигурацией терминала). Конечно, запуск примера как TERM=xterm-1003 ./example будет работать во многих эмуляторах терминала (по крайней мере, gnome-terminal, xterm, mate-terminal, lxterm, uxterm и terminator), хотя не все, похоже, поддерживают горизонтальное колесо прокрутки.
По умолчанию
printf()буферизуется по строкам: библиотека C кэширует данные внутренне, пока не появится новая строка. Чтобы исправить, используйтеprintf("\033[?1003h"); fflush(stdout);. Точно так же добавьтеprintf("\033[?1000h"); fflush(stdout);передendwin();, чтобы восстановить поведение по умолчанию при выходе из программы.