Обнаружение управляющей последовательности ncurses

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

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

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

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

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


person Troydm    schedule 18.08.2011    source источник


Ответы (2)


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

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

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

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

person LeoNerd    schedule 05.04.2012
comment
libtermkey хорошо работает для моей программы, работающей в mintty, спасибо. - person Kevin Smyth; 26.07.2013

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

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

person Craig    schedule 20.09.2011