2016-12-13 10 views
1

私は学生プロジェクト用にIrssi interfaceを複製しています。テキストインターフェイスにはNCurses、メッセージの書き込み時にはより良いテキスト編集機能を提供するためにreadlineを使用したいと思います。ReadlineとNCurses、特別なキーとキーの組み合わせを扱う

このquestionanswerprojectは、私に大きな出発点を与えました。

私の問題は、私はこのような入力/イベントループを持ちたいということです。

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 ?)を使用していますか?

ありがとうございました!

答えて

2

これは複数の質問です。簡単に言えば:

  • keypad機能の逆はFALSEに設定パラメータで指定したウィンドウのためにそれを呼び出すことです。
  • いくつかのアプリケーションがkeypad/wgetchの独自のバージョンを実装しますが、(あなたはncursesをESCDELAYでタイムアウトをコントロールできることを考えると)、ゲインの多くは、あなたがポータブルになりたかったしない限り、そこではありません、と言う、Solarisのに呪い。
  • あなたは
  • readlineが端末データベースで能力アップリストシフト+を見ていない(つまりは端末に依存エスケープシーケンスです)例えば、シフト+アップで任意の改善を得ないだろう(これは、それが知っているtermcapのサブセットにはありません)。あなたのためにできることは、文字列をreadline関数に関連付けることです。
+0

ありがとうございました!私は私の質問に答えるより良い人間がいないと思うでしょう。私はreadline関数を使います。 逆の 'keypad'の意味は、ファンクションキーのトークンが与えられたときに、トークンの原点でエスケープコードのシーケンスを取り戻すことができるということです。 –

関連する問題