обнаружение escape-последовательности ncurses - PullRequest
3 голосов
/ 18 августа 2011

Каков наилучший способ обнаружения escape-последовательностей в режиме ncurses raw.

Что мне приходит в голову, это сделать getch, а затем добавить его в какой-нибудь буфер, а затем, когда текст соответствует известной escape-последовательности, выполнить соответствующую команду, иначе проигнорировать последовательность.

Однако в этом алгоритме при попадании в escape-последовательность, о которой система не знает, даже если продолжить вводить другие символы, они будут считаться частью escape-последовательности.Существуют ли какие-либо правила относительно продолжительности escape-последовательности или некоторых стандартных символов, заканчивающих escape-последовательность

Или есть способ обнаружения в ncurses, когда пользователь перестал вводить символы?как escape-последовательность обычно идет как последовательность символов, но у меня нет способа обнаружить последний символ, потому что у меня есть блокирующий метод, который просто блокирует, когда нет символов из системы ввода

, как, например, если я нажимаю страницу внизи кнопка c у меня есть непрерывный поток символов escape-последовательности ^ [[6 ~ и затем символ c.как я могу обнаружить между этими двумя, что пользователь нажал сначала escape-последовательность, а затем c символ, если у меня нет предопределенного набора известных escape-последовательностей

Ответы [ 2 ]

6 голосов
/ 05 апреля 2012

Вы можете использовать libtermkey для разбора ключевых событий.

http://www.leonerd.org.uk/code/libtermkey/

Либо вы можете подключить его напрямую к stdin, либо передать его байты, как вамgetch().

Что касается общей идеи определения конца;Есть определенные правила, которым следуют последовательности.Последовательности, начинающиеся ESC [, являются последовательностями CSI и заканчиваются на первом октете в диапазоне [\x40-\x7e].Есть несколько других видов, но они редко приходят из терминала.

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

Без предопределенного набора escape-последовательностей вы не сможете определить конец последовательности.

Ncurses использует termcap / terminfo для перечисления последовательностей и их значений.

...