2016-12-13 10 views
1

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

Это question, answer и 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), который модифицирует вход и сделать его непригодным для чтения.

Из инструкции:

Если клавиатура TRUE, и функциональная клавиша нажата, маркер для этой функциональной клавиши возвращается вместо исходных символов.

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

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

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

Благодарим за внимание!

ответ

2

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

  • обратной функции keypad является вызовом, что для заданного окна с параметром, установленным в FALSE. В некоторых приложениях реализована их собственная версия keypad/wgetch, но (учитывая, что вы можете контролировать таймаут с помощью ncurses 'ESCDELAY), там не так много выигрыша, если вы не хотите быть переносимым, скажем, проклятиями Solaris.
  • вы не получите какие-либо улучшения с SHIFT +, например (это последовательность выхода терминала зависимого)
  • Readline не смотрит на возможностях в базе данных терминалов, список SHIFT + (это не в подмножестве termcap, о котором он знает). То, что он может сделать для вас, связывает строку с функцией readline.
+0

Спасибо! Думаю, не может быть лучшего человека, который мог бы ответить на мои вопросы. Я пойду с функцией readline. Что я имел в виду под обратным «клавиатурой», так это то, что с учетом токена для функционального ключа я мог бы восстановить последовательность escape-кодов в начале токена. –

 Смежные вопросы

  • Нет связанных вопросов^_^