5

curses ベースのアプリケーション ( WordGrinder ) があります。あるユーザーから、キーボードで一部のキーが正しく機能しないというバグ レポートがありました。調査の結果、彼は正しい。

問題のキーは、SHIFT + カーソル キーと、END などのキーパッド ナビゲーション キーの一部です。何が起こっているのかを調査したところ、curses がこれらのキーのイベントを送信していないようです。SHIFT + カーソル キーの場合、何も得られず、END の場合は生のエスケープ シーケンスが得られます。

これは私を驚かせます。他のすべてのキーは解釈され、キーシムに正しく変換されます。とになると思います。なぜ私はそうではないのですか?KEY_SLEFTKEY_END

これらのキーが機能する他のアプリケーションをいくつか調べましたが、間違っていることを示す明らかなものは見つかりませんでした。また、nano のようなアプリケーションは、独自のエスケープ キーの解析を処理するなど、非常に悪いことを行うため、ソース コードの候補として適しているかどうかはわかりません。

次のように ncurses を初期化しています。

initscr();
raw();
noecho();
meta(NULL, TRUE);
nonl();
idlok(stdscr, TRUE);
idcok(stdscr, TRUE);
scrollok(stdscr, FALSE);
intrflush(stdscr, FALSE);
keypad(stdscr, TRUE);

端末エミュレーターとして gnome-terminal を使用し、端末タイプとして xterm を使用しています。ロケールは UTF-8 で、ライブラリの ncursesw バリアントがあります。

何か案は?

アップデート:

数か月後、Gnome 3 の gnome-terminal で Wordgrinder を試してみたところ、これらすべての風変わりなキーが有効な ncurses キーコードを生成することがわかりました。たとえば、SHIFT+LEFT はキーコード 393 を生成するようになりました。xterm はまったく同じ結果を生成します。残念ながら、CTRL + LEFT はキーコード 539 を生成し、Curses のドキュメントでは、有効なキーコードは KEY_MIN から KEY_MAX の範囲 (257 から 511...) であると明確に述べています。

少なくとも現在は機能していますが、これらの奇妙な新しいキーコードはどのように機能するのでしょうか? それらはどこかで定義されていますか?それらは確かにヘッダーにはありません。

4

3 に答える 3

1

gnome-terminalはxtermではありません。シフト矢印とコントロール矢印のさまざまな組み合わせを送信します。ncursesバージョン5.5では、TERMをgnomeに設定するとおそらく機能します。

ここにいくつかの情報があります:http: //invisible-island.net/xterm/xterm.faq.html#bug_gnometerm

于 2011-09-27T21:36:09.617 に答える
0

EPOLL を使用して生の [ cfmakeraw ] STDIN スキャンを実行しました。そして、SHIFT + LEFT であることを確認できます。Shift+右; 「スキャン」されません。では、XLib クライアントはこれらのキーをどのように読み取るのでしょうか?

ForgottenXLib クライアント/ドライバーは直接キーボード ドライバーを使用します (古き良き BIOS のマルチプレックス ハードウェア INTERRUPT フックを使用)... [ RAW] キーボード状態を「スキャン」する他の方法はありません:-)

NCurses は、明らかなネットワーク上の理由から、シリアル /dev/TTY* のクライアントです。ハードウェア フックではありません。

于 2015-05-15T16:18:01.110 に答える
0

gnome-terminal が独自の目的で SHIFT 矢印キーを傍受している可能性は十分にあります。xterm またはコンソールからアプリケーションを実行することをお勧めします。

于 2011-07-12T11:58:23.593 に答える