FB 内蔵の機能を使って、キーボード入力を得る 4 つの方法があります:
- inkey() は、ユーザが押したキーに対応する、ASCII 文字による文字列を返します。
あるいは、矢印キーやページ Up/Down のような、いくつかの特殊キーに対しては、2バイトの FB 拡張キーコードを返します。
これは、QB で行ったことと同様に作動します。
- getkey() は、inkey() と同じ情報を返します。しかし、文字列ではなく、整数の形式になります。
内重要な ()およびgetkey()はともに属します:
inkey() と getkey() は、ともに属します: これらは同じコードを使用します。そして、同じモジュールに位置します。
- multikey() は、FB scancode (SC_*) をとり、そのキーがこの瞬間に押されているかどうかをチェックします。
- screenevent() は、キー押しを、EVENT_KEY_PRESS イベントの形式で返します。(および、キーを放したり繰り返すなどの他のもの)
これは、EVENT.scancode field で FB scancode を返します。そして、EVENT.ascii field で、ASCII 文字値 あるいは 0 を返します。
EVENT.ascii は FB 拡張キーコードを使用しません; 拡張キーを扱うために、EVENT.scancode 項目を、代わりにチェックすることができます。
"scancode" は、多かれ少なかれ DOS キーボード・スキャンコードと一致している SC_* #defines を指します。
値は構築されません。値自身は、ある ASCII 文字に相当します。例えば:
SC_HOME = asc( "G" ) = &h47
これらは、同じ値で、DOS/DJGPP のもとで、あるいは、拡張キーコード・シーケンスの一部として Linux カーネルから得られる値です。
これらの、
multikey() や
screenevent() での使用に加えて、scancode は、内部で色々なところで使われます。例えば、キーコードの使いやすい、移植表現として、キーコードの異なる種類の間で翻訳するときです。
"key" は、ASCII 文字、あるいは、その他のキー用の2バイト拡張キーコード文字列(
inkey() によって返される)を指します。
rtlib は、整数の形式で、利用可能な2バイト拡張キーコードのための、いくつかの KEY_* #defines を持っています。
これらは、内部で使われ、
getkey() によって返される値と一致します。
FB の2バイト拡張キーコードは、押したキーに対応する SC_* scancode 値を含むバイトが続く &hFF バイトで構成されます。
inkey() で返される SC_HOME をチェックすると、以下のように見えます:
if( inkey( ) = chr( 255 ) + "G" ) then ...
Checking for SC_HOME returned by getkey():
if( getkey() = &h47FF ) then ...
if( getkey() = ((SC_HOME shl 8) or &hFF) ) then ...
inkey()、
getkey()、
multikey() は、ラッパー関数を使います。
ラッパー関数は、関数ポインター・フックを用いて、以下を呼びます。
- コンソール・バージョン fb_ConsoleInkey(), fb_ConsoleGetkey(), fb_ConsoleMultikey() :デフォルトで
- gfxlib バージョン fb_GfxInkey(), fb_GfxGetkey(), fb_GfxMultikey() :描画 SCREEN がアクティブなら
gfxlib では、
fb_GfxInkey() と
fb_GfxGetkey() は、異なるまたはプラットフォームに特有の gfx ドライバーが、そこにキーを記入する、キー・バッファー(すべてのプラットフォームで同じコード)を使います。
これに似て、
fb_GfxMultikey() のための、一つのキーの状態テーブルがあります。また、それは gfx ドライバーによって更新されます。
しかし、gfx ドライバーが、実際にキーを記入するか、キーの状態を更新するかどうかは、ドライバーしだいです。
- DOS
DOS gfxlib2 ポート (すべての DOS gfx ドライバーに対して) は、DOS fb_ConsoleMultikey() によって使われる、同じキーボード割り込みハンドラーによって呼ばれる hook/callback をセットします。
- Win32 driver
gfx ウィンドウ・スレッドは、WM_KEYDOWN、WM_CHAR、WM_CLOSE を聞き、キーを翻訳し、次に、キーの状態テーブルを更新します。そして、fb_GfxInkey()/fb_GfxGetkey() バッファーにそれらを記入し、screenevent() のために、対応する EVENT を、& ポストに入れます。
- X11 driver
The gfx window thread listens to KeyPress and other XEvent's, translates the keys, then posts them etc., just like the Win32 driver.
- Linux fbdev driver
As mentioned above, the fbdev driver gets its input from the same keyboard handler code that's used by the Linux fb_ConsoleMultikey().