Readline и NCurses, обрабатывать специальные клавиши и комбинации клавиш

Я копирую интерфейс Irssi для студенческого проекта. Я хотел бы использовать NCurses для текстового интерфейса и readline, чтобы улучшить возможности редактирования текста при написании сообщений.

Этот вопрос, ответ и project предоставил мне отличную отправную точку.

Моя проблема в том, что я хотел бы иметь такой цикл ввода / события:

int ch;
while (exit_condition) {
    ch = wgetch(window);
    switch (ch) {
    case ERR: continue;
    case KEY_F(1): /* do something */ break;
    case KEY_UP: /* do something else */ break;
    default: forward_to_readline(ch); break;
    }
}

Но для соответствия KEY_F(n) или KEY_UP мне нужно включить keypad(window, TRUE), что изменит ввод и сделает его непригодным для чтения.

Из руководства:

Если клавиатура имеет значение ИСТИНА и нажата функциональная клавиша, вместо необработанных символов возвращается маркер для этой функциональной клавиши.

Когда получен символ, который может быть началом функциональной клавиши (что на современных терминалах означает escape-символ), curses устанавливает таймер. Если остаток последовательности не наступает в течение заданного времени, символ пропускается; в противном случае возвращается значение функциональной клавиши. По этой причине многие терминалы испытывают задержку между нажатием клавиши выхода и возвратом в программу выхода.

Вот мои мысли:

  • Есть ли функция для отмены эффекта keypad?
  • Стоит ли мне реализовать поведение keypad? Полагаю, я тоже должен это сделать, если хочу ловить такие события, как Shift + Up. Буду рад иметь примеры этого.
  • Может ли readline дать мне комбинацию клавиш, если я не могу получить ее из NCurses? возможно, с вызовами привязки клавиш (актуально?)?

Спасибо за уделенное время !


person Antonin Décimo    schedule 13.12.2016    source источник


Ответы (1)


Это несколько вопросов. Вкратце:

  • обратная сторона функции keypad - это вызов ее для данного окна с параметром, установленным на FALSE.
  • некоторые приложения реализуют свою собственную версию _3 _ / _ 4_, но (учитывая, что вы можете контролировать тайм-аут с помощью ncurses 'ESCDELAY), от этого не так много пользы, если вы не хотите быть переносимыми, скажем, на Solaris curses.
  • вы не получите никаких улучшений, например, с помощью shift + up (это управляющая последовательность, зависящая от терминала)
  • readline не смотрит на возможности в базе данных терминала, в которой перечислены shift + up (это не в подмножестве termcap, о котором он знает). Что он может сделать для вас, так это связать строку с функцией readline.
person Thomas Dickey    schedule 13.12.2016
comment
Спасибо ! Думаю, на мои вопросы не может быть лучшего человека. Я использую функцию чтения строки. Под обратным keypad я имел в виду то, что, имея токен для функциональной клавиши, я мог получить последовательность escape-кодов в источнике токена. - person Antonin Décimo; 14.12.2016