EN JA
KEYBOARD(4)
KEYBOARD(4) FreeBSD Kernel Interfaces Manual KEYBOARD(4)

名称

keyboardpc キーボードインタフェース

解説

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) ユーティリティによって、実行時にこれらの値を変更することができます。

作者

Søren Schmidt <sos@FreeBSD.org>
January 8, 1995 FreeBSD