AIX/XP Curses はクロスプラットフォーム方式でキー/修飾キーを取得します
-
18-09-2019 - |
質問
私は再び呪いに足を突っ込むためのシンプルなコンソール アプリを開発中です。アプリを XP から AIX に移植する際に少し問題が発生しています。コードのサンプル部分を次に示します。
int main(void)
{
WINDOW *_window = initscr();
int _rows;
int _cols;
cbreak();
/* Accept all keys */
keypad(_window, true);
/* Don't echo things that are typed */
noecho();
/* Get the screen dimensions */
getmaxyx(_window, _rows, _cols);
/* Don't display cursor */
curs_set(0);
for (;;)
{
printw("Press a Key ");
refresh();
int key = wgetch(_window);
printw("%d \n", key);
}
endwin();
return 0;
}
これを XP で実行すると、下矢印キーに続いて CTRL-下矢印キーを押すと、次の出力が得られます。
Press a Key 258
Press a Key 481
Press a Key
258 は下矢印のコード、481 は Ctrl+下矢印のコードであると考えられます。
これと同じテストを AIX で実行します。
Press a Key 1858
Press a Key 27
Press a Key 79
Press a Key 66
Press a Key
1858 は下矢印、27/29/66 は Ctrl+下矢印の応答です。27/29/66 はおそらく標準的なエスケープ シーケンスの 1 つであると認識しています。私は、curses がそれを単一の値にマッピングすることを期待していました。XP 側には、curses.h ファイルで CTL_DOWN が定義されています。AIX側はそうではありません。
それで、ここでの私の質問は次のとおりです
これらは、私がここで見逃した何かの呪文でしょうか。魔法のように、これら 3 つの文字をユニークな整数にマッピングするものでしょうか?それとも、プラットフォーム固有のキーストロークを実際のアプリで使用できるものに隠す処理を行うために、ある種のクラスを作成する必要がありますか?
AIX のオンライン関連の検索で目が充血してしまいました。私を正しい方向に導くための助けをいただければ幸いです。
その他のランダムな情報
私はXP Proを実行しています。最新のサービスパックMSVC 6を使用して、サービスパック6を使用しています。Curses ライブラリは pdcurses です
他のコンパイラはIBM XL C/C ++ Enterprise Edition v8.0です。コンパイルは使用します
xlc++ -g app.cpp -lcurses
私はPCでpdcurses33を使用しています AIX のネイティブ curses です。
解決 2
Re:[PDCurses] Windows の Alt + Shift + n (例)
LMの 金, 12 Jul 2002 08:13:53 -0700
2002 年 7 月 7 日午後 6 時 10 分 00 秒に、ジェレミー スミスは次のように書きました。
少し問題が発生しました。私はcurses関数getch()を 私のプログラム、 'n'やAlt + 'n'などのキーの場合、これらを検出するにはどうすればよいですか 組み合わせ:
Ctrl + n キー Alt + Shift + n キー Ctrl + Alt + n キー Ctrl + Alt + Shift + n キー
Shift + Alt + 2を 実際のキーコード(Shift、Alt、または2とは異なります)ですが、私は知りません ノウハウ。:-(
curses.hのファイルのヘッダーを確認したところ、すべての キーボードから取得できる標準のスキャンコード(ALTを含む) 組み合わせといくつかのコントロールの組み合わせ。
次に、文字を取得するための Windows 実装を確認しました。で pdckbd.c ルーチンwin32_kbhitは ReadConsoleInput を呼び出します。シフト、alt、 コントロールキーとその他のステータスキーは、この関数から dwControlKeyStateです。PDC_get_bios_keyは、どのキーが押されたかを報告します。 2 つの kptab テーブル (kptab と ext_kptab) なので、組み合わせが 表では、おそらく見ていないでしょう。いくつか追加できる場合があります 何かが足りない場合は、テーブルへの定義。また、いくつかのコードもあります 状態 (BUTTON_SHIFT、BUTTON_CONTROL、 BUTTON_ALT)ですが、これはマウス入力用です。だからあなたはチェックすることができます これらのキーは、MOUSE_STATUS 構造にあります。これは、 Windows の実装。すべてのプラットフォームには、独自の方法があります どのキーが押されているか。
16ビットDOSではシフト、capsロック、numlockの状態を変更していました HEX 417 アドレスの設定を変更します。これは実際にのみ機能します モードプログラム。新しい Windows コンパイラの多くは、次のことすら許可していません 機能でBIOSまたはメモリに直接アクセスすることはもうありません。16 ビットの ヘックス417とヘックス418の位置は、右シフトが 417アドレスの最上位ビット(左シフト)を設定することで押されます。 バイトの 2 番目に高いビットである Ctrl キーを設定するには、 次に高く、Alt キーはその次に高いキーです。418 address は、右または左の alt と コントロールキーが押されました。
いくつかの変更を加える必要があるようです。 cursesの特定のバージョンは、あなたが望むものを正確に手に入れるためのものです。curses は 非常にポータブルなユーザーインターフェイスであるため、多くの場合、最も低い共通をサポートします 一部のプラットフォームでの機能の分母。
そういえば、新しい 国際文字サポートを含む curses 標準。どなたかいらっしゃいます この取り組みについて、さらに何か聞きましたか?
幸運をお祈りしています。
ローラ・マイケルズhttp://www.distasis.com
キーボードのデコードを自分で行う必要があるようです。
他のヒント
IBM 固有のハードウェアおよびソフトウェア ライブラリに重点を置いた AIX 提供のライブラリではなく、オープン ソースの「ncurses」ライブラリを使用してみることもできます。
xlC と互換性のあるバージョンが存在するかどうかを正確に思い出せないため、ソースからライブラリをビルドするか、「gcc」に切り替える必要があるかもしれません。これは Windows 用の ncurses のバージョンでもあるため、変更をコードの元のバージョンにバックポートできる可能性があります。
UP_ARROW などの論理名をサポートする ncurse についてはうろ覚えです。コントロールキーの数字ではなく。この問題は、プラットフォーム、端末エミュレーション、NLS 設定などに応じて、単純な上矢印が「UP_ARROW」、「Esc_UP」、「Cntrl_K」として返される可能性があります。
前回、curses アプリケーションを別のプラットフォームに移植する必要があったとき (これは、AIX から Solaris への移植が比較的簡単でした)、いくつかのキー ストロークを「MEANT_UP」のような 1 つの論理的な「意図」にマッピングしたことを覚えています。