Ключи не интерпретируются ncurses - PullRequest
5 голосов
/ 05 июля 2011

У меня есть приложение на основе проклятий ( WordGrinder ). Я только что получил сообщение об ошибке от пользователя, в котором говорится, что некоторые клавиши не работают должным образом на его клавиатуре. В расследовании он прав.

Обсуждаемыми клавишами являются клавиши курсора SHIFT + и некоторые из клавиш навигации клавиатуры, например, END. Изучая происходящее, кажется, что проклятия не посылают мне события для этих ключей. В случае клавиш курсора SHIFT + я ничего не получаю, а для КОНЦА я получаю необработанную escape-последовательность.

Это удивляет меня. Все остальные ключи интерпретируются и корректно переводятся в ключевые символы. Я бы ожидал, что получит KEY_SLEFT и KEY_END. Почему не я?

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

Я инициализирую ncurses следующим образом:

initscr();
raw();
noecho();
meta(NULL, TRUE);
nonl();
idlok(stdscr, TRUE);
idcok(stdscr, TRUE);
scrollok(stdscr, FALSE);
intrflush(stdscr, FALSE);
keypad(stdscr, TRUE);

Я использую gnome-терминал в качестве эмулятора терминала, а xterm в качестве типа терминала. Локаль UTF-8, и у меня есть вариант библиотеки ncursesw.

Есть идеи?

Обновление:

Ну, много месяцев спустя я попробую Wordgrinder с gnome-терминалом Gnome 3 и обнаружу, что все эти дурацкие ключи генерируют действительные коды ключей ncurses. Например, SHIFT + LEFT теперь генерирует код клавиши 393. xterm дает точно такой же результат. К сожалению, CTRL + LEFT генерирует код клавиши 539, и в документации Curses четко указано, что допустимые коды клавиш находятся в диапазоне от KEY_MIN до KEY_MAX --- от 257 до 511 ...

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

Ответы [ 3 ]

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

гном-терминал не является xterm.Он посылает различные комбинации для стрелки Shift и стрелки управления.С ncurses версии 5.5 установка TERM в gnome, вероятно, будет работать.

Вот некоторая информация: http://invisible -island.net / xterm / xterm.faq.html # bug_gnometerm

0 голосов
/ 15 мая 2015

Я сделал необработанное сканирование [cfmakeraw] STDIN с использованием EPOLL.И я могу подтвердить, что SHIFT + LEFT;SHIFT + RIGHT;НЕ "сканируются".Так как же клиент XLib читает эти ключи?

Клиент / драйвер XLib использует драйверы прямой клавиатуры (используя старые добрые мультиплексные BIOS-хуки Аппаратные перехватчики INTERRUPT) ... Других способов «просканировать» [Forgotten RAW] состояние клавиатуры нет): -)

NCurses является клиентом последовательного / dev / TTY * по очевидным сетевым причинам - не аппаратный хук.

0 голосов
/ 12 июля 2011

Существует большая вероятность того, что gnome-терминал перехватывает ваши клавиши со стрелками SHIFT для своих собственных целей. Я бы предложил запустить ваше приложение в xterm или из консоли.

...