KEYBOARD(4) | FreeBSD Kernel Interfaces Manual | KEYBOARD(4) |
名称
keyboard — pc キーボードインタフェース解説
PC キーボードは、コンソール文字入力デバイスとして使用されます。キーボードは、現在の仮想コンソールによって所有されます。仮想コンソールとの間を切り換えるには、ALT を押したままファンクションキーの 1 つを押すことを意味する、シーケンス ALT+Fn を使用します。ファンクションキーと同じ数がある仮想のコンソールは、次に現在の仮想のコンソールとして選択され、キーボードとディスプレイの排他的な使用を与えます。コンソールは、特別なキーシーケンスによってキーボードに物理的に存在していない値を入力することを可能にします。この機能を使用するためには、ALT を押したままにして、次に数字キーパッドによって 0 から 255 の 10 進数を入力し、そして ALT を離します。そして、入力された値は、1 つの文字の ASCII 値として使用されます。このように、キーボードに存在しないあらゆる ASCII 値を入力することが可能です。また、コンソールドライバは、ヒストリ (history) 機能を含んでいます。それは、スクロールロック (scroll-lock) キーを押すことによって、活性化されます。これは、表示を保持したまま、最後にスクロールアウトされた行 (スクロールして見えなくなった行) を通り抜けてスクロールアップとダウンのための矢印キーを有効にします。
キーボードは、個々のユーザと異なった国のレイアウト (キー配置) に適合するように設定可能です。
キーボード上のキーは、次の機能のいずれも使用することができます:
- 通常キー
- キーに関連している ASCII 値を入力します。
- ファンクションキー
- ASCII 値の文字列を入力します。
- スイッチキー
- 仮想コンソールを切り替えます。
- 修飾キー
- 別のキーの意味を変更します。
キーボードは、1 から n までの番号が付けられたキーの数としてとらえられます。この数は、しばしば与えられたキーのための "スキャンコード (scancode)"と呼ばれます。キーの数は、キーが押されたとき、ビット 7 が 0 である 8 ビット文字として変換され、離されたとき、ビット 7 が 1 である数に変換されます。これで、キーのマッピングを完全に設定可能にすることができます。
すべてのキーの意味は、PIO_KEYMAP ioctl 呼び出しによってプログラム可能で、それは、引数として構造体 keymap_t を取ります。この構造体のレイアウトは、次の通りです:
struct keymap { u_short n_keys; struct key_t { u_char map[NUM_STATES]; u_char spcl; u_char flgs; } key[NUM_KEYS]; };
フィールド n_keys は、いくつのキー定義 (スキャンコード) が続くかをシステムに伝えます。そして、各スキャンコードは、key_t サブ構造体で指定されます。
各スキャンコードは、シフト (shift)、コントロール (control) と alt 状態によって、 8 つの異なった値のいずれかに変換することがきます。これらの 8 つの可能性は、下記に示されるようなマップの配列によって表されます:
alt scan cntrl alt alt cntrl code base shift cntrl shift alt shift cntrl shift map[n] 0 1 2 3 4 5 6 7 ---- ------------------------------------------------------ 0x1E 'a' 'A' 0x01 0x01 'a' 'A' 0x01 0x01
これは、通常スキャンコード 0x1E がある 'A' とラベルが付けられたキーのデフォルトのマッピングです。 8 つの状態は、図のように、'A' キーを示すことは、通常の振る舞いです。 spcl フィールドは、キーに "特別"の処理を与えるために使用され、次のように解釈されます。各ビットは、上記の状態の 1 つに対応しています。ビットが 0 であるなら、キーは、対応する map[] エントリに定義された数を出力します。ビットが 1 であるなら、キーは、"特別"です。これは、何も出力しないことを意味します。代わりに、それは、"状態"を変更します。それは、シフト (shift)、コントロール (control)、alt、ロック (lock)、スイッチスクリーン (switch-screen)、ファンクションキー、または無効の (no-op) キーであることを意味します。ビットマップは、逆方向になります、すなわち、 7 が base に、6 がシフト (shift) などになります。
flgs フィールドは、キーが caps-lock (1)、num-lock (2)、both (両方) (3) または ignore both (両方無視) (0) に対処すべきであるなら、定義されます。
kbdcontrol(1) ユーティリティは、実行時にカーネルにそのような記述をロードする/ カーネルからそのような記述を取り出すために使用されます。これは、実行時にキーの割り当てを変更できるようにするか、またはカーネルから正確なキーの意味を (GIO_KEYMAP ioctl) 取得するためにより重要です (例えば、X サーバによって使用される)。
ファンクションキーは、SETFKEY ioctl 呼び出しを使用してプログラムすることができます。
この ioctl は、次のタイプ fkeyarg_t 引数を取ります:
struct fkeyarg { u_short keynum; char keydef[MAXFK]; char flen; };
フィールド keynum は、どのファンクションキーがプログラムされるかを定義します。配列 keydef は、使用される新しい文字列 (MAXFK の長さ) を含み、長さは、flen に入れられるべきです。
GETFKEY ioctl は、keynum の現在の設定を返すことを除いて、同じような方法で動作します。
ファンクションキーは、次のように番号付けられます:
F1-F12 key 1 - 12 Shift F1-F12 key 13 - 24 Ctrl F1-F12 key 25 - 36 Ctrl+shift F1-F12 key 37 - 48 Home key 49 Up arrow key 50 Page Up key 51 (keypad) - key 52 Left arrow key 53 (keypad) 5 key 54 Right arrow key 55 (keypad) + key 56 End key 57 Down arrow key 58 Page down key 59 Insert key 60 Delete key 61 Left window key 62 Right window key 63 Menu key 64
また、 kbdcontrol(1) ユーティリティによって、実行時にこれらの値を変更することができます。
作者
<sos@FreeBSD.org>January 8, 1995 | FreeBSD |