ncurses не фиксирует движения мыши, но терминал - PullRequest
0 голосов
/ 04 декабря 2018

Я могу echo -e "\e[?1003h" и наблюдать, как мой терминал поглощает события движения мыши, такие как конфеты, но проклятия, кажется, не хотят их вообще.Я посмотрел на

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

, но похоже, что эта проблема была решена путем изменения env TERM, что не помогло бы мне, потому что мой терминалдействительно, реагируя на события перемещения мыши, 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"

1 Ответ

0 голосов
/ 05 декабря 2018

Пока printf и curses записывают в стандартный вывод , ncurses не будет сбрасывать stdout, поскольку выполняет собственную буферизацию.Как упоминалось в примечаниях к выпуску ncurses 6.0 ( август 2015 ):

Буферизация вывода обеспечила дальнейшее, но стоящее отвлечение.Сообщение об ошибке в 2012 году, касающееся использования обработчиков сигналов в ncurses), указывало на проблему с использованием небезопасных функций для обработки SIGTSTP.Другие сигналы могут быть решены с помощью обходных путей;ремонт SIGTSTP требовал другого подхода.Решение потребовало изменения внутреннего поведения библиотеки: как она обрабатывает буферизацию вывода.

Теперь ncurses буферизует свой собственный вывод, независимо от стандартного вывода .Несколько приложений полагались на прямое повторное использование библиотекой стандартной буферизации вывода;однако такое поведение не определено и никогда не было рекомендуемой практикой.Идентификация этих приложений, а также доработка изменений, чтобы позволить низкоуровневым приложениям работать согласованно, заняли время.

Хотя пример может сработать, если вызов printfза ним следует fflush(stdout), и нет гарантии, что он будет работать бесконечно, поскольку ncurses не нужно отправлять инициализацию мыши до вызова getch.Рекомендуемый способ работы с ncurses - поместить эту информацию в описание терминала, позволяя ncurses решать, когда вносить изменения в экран.

В базе данных терминалов ncurses уже есть пример: xterm-1003

...