私は学生プロジェクト用に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;
}
}
しかし、私は入力を変更しますkeypad(window, TRUE)
を有効にし、それを作るために必要KEY_F(n)
またはKEY_UP
一致させるためにreadlineでは使用できません。マニュアルから
:キーパッドはTRUEで、ファンクションキーが押された場合
は、その ファンクションキーのトークンではなく、生の文字で返されます。
(現代の端末では、エスケープ文字を意味する)ファンクションキーの先頭になる可能性がある文字の場合、 cursesはタイマーを設定します。指定された時間内に残りのシーケンスが に入っていない場合、文字は通過します。 この場合、ファンクションキーの値が返されます。このため、多くの 端末では、ユーザが エスケープキーを押してからエスケープがプログラムに返されるまでの間に遅延が発生します。
ここに私の考えは以下のとおりです。
keypad
の効果を逆転させる機能がありますか?- 私は自分自身の動作を
keypad
にしますか?私はShift + Upのようなイベントをキャッチしたいなら、これをやる必要があると思います。私はこれの例を持ってうれしいです。 - NCursesから取得できない場合は、readlineでキーの組み合わせを指定できますか?キーバインディングコールバック(relevant ?)を使用していますか?
ありがとうございました!
ありがとうございました!私は私の質問に答えるより良い人間がいないと思うでしょう。私はreadline関数を使います。 逆の 'keypad'の意味は、ファンクションキーのトークンが与えられたときに、トークンの原点でエスケープコードのシーケンスを取り戻すことができるということです。 –