2016-12-13 80 views
1

我正在複製學生項目的Irssi interface。我想在文本界面中使用NCurses,在編寫消息時使用readline以提供更好的文本編輯功能。Readline&NCurses,處理特殊鍵和組合鍵

This questionanswer and 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),這將修改輸入並使它readline不可用。

從手冊:

如果鍵盤是TRUE,和一個功能鍵被按下時,該 功能鍵的標記被返回,而不是原始的字符。

當一個可能是功能鍵開頭的字符是 (在現代終端上,它表示一個轉義字符)時,curses設置一個定時器。如果在指定時間內序列的其餘部分不在 中,則字符會通過; 否則,返回功能鍵值。因此,許多 終端會在用戶按下 轉義密鑰並將轉義返回給程序之間經歷延遲。

這裏是我的想法:

  • 是否有扭轉keypad效果的功能?
  • 我是否應該實施keypad的行爲?我想我也必須這樣做,如果我想趕上像Shift + Up這樣的事件。我很高興有這樣的例子。
  • 如果我無法獲得它的形式NCurses可readline給我的組合鍵?也許用鍵綁定callbacs(relevant ?)?

謝謝你的時間!

回答

2

這是多個問題。簡言之:

  • keypad函數的逆是通過調用與設置爲FALSE參數給定的窗口。
  • 某些應用程序實現了它們自己的keypad/wgetch版本,但是(鑑於您可以使用ncurses'ESCDELAY控制超時),除非您希望可移植,例如Solaris curses,否則沒有太多收穫。
  • 你不會得到任何的改善與Shift +向上,例如(這是一個終端相關的轉義序列)
  • 的readline不看在終端數據庫的功能,這名單Shift +向上 (它不在它所知道的termcap的子集中)。它可以爲你做的是將一個字符串與一個readline函數關聯起來。
+0

謝謝!我猜想不可能有更好的人回答我的問題。我將會使用readline函數。 我的意思是反向鍵盤是給定一個功能鍵的標記,我可以在標記的原點處檢索轉義碼的序列。 –