top page > Klaviatur > here

キーボードに関連した各種のツール


概要

X Window System 上で動作する,キーボード関連の各種ツールを紹介します. これらはすべて,ports/x11/xorg-clients に含まれています.
→ X.Org 7 系からは,別個に ports から導入する必要があるものがあります.

動作は以下の環境にて確認しています.


目次

1. キーボードの設定を補助するもの
1.1 xev
1.2 xkbprint
1.3 xkbcomp
1.4 xmodmap
1.5 xset
2. 実用上のツール
2.1 xkbvleds
2.2 xmodmap
2.3 setxkbmap

1. キーボードの設定を補助するもの

1.1  xev

xev を使えば,各々のキーに対応する keycode 番号keysym を知ることができます.

% xev

として起動すれば,"Event Tester" という名前の小さな Window ができます. そこから別の Window に Focus を移さないようにして (移ってしまったら再度ここに戻して),例えば PC-98 にて [a], [TAB], [CTRL] のキーを打てば,xev を起動した terminal に次のように表示されます.

KeyRelease event, serial 24, synthetic NO, window 0x1000001,
    root 0x3b, subw 0x0, time 7044604, (347,489), root:(376,546),
    state 0x0, keycode 37 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (61) "a"

KeyRelease event, serial 24, synthetic NO, window 0x1000001,
    root 0x3b, subw 0x0, time 6985487, (199,327), root:(228,384),
    state 0x0, keycode 23 (keysym 0xff09, Tab), same_screen YES,
    XLookupString gives 1 bytes: (09) " "

KeyRelease event, serial 24, synthetic NO, window 0x1000001,
    root 0x3b, subw 0x0, time 1469250, (672,773), root:(817,918),
    state 0x4, keycode 124 (keysym 0xffe3, Control_L), same_screen YES,
    XLookupString gives 0 bytes:   ← 対応する ASCII code がない.

/usr/X11R6/include/X11/keysymdef.h をこれらのキーに対して抜粋すると,次のようになっています.

#define XK_a                             0x0061  /* U+0061 LATIN SMALL LETTER A */
#define XK_Tab                           0xff09
#define XK_Control_L                     0xffe3  /* Left control */

1.2  xkbprint

xkbprint を用いれば,現在設定されているキーの状態を PostScript 形式の図として得ることができます.
(console の設定の確認のためにもこのようなツールがあると楽でしょう. 探せばあるという気もしますが.)

使用法としては,直接 xkbprint を実行するか,xkbcomp から得られる .xkm file を経るかの二通りがあります. すなわち,

% setxkbmap                    (X.Org 7.3 以前ならば,これは不要.)
% xkbprint $DISPLAY            (server-0_0.ps  という名の file が作成される.)

および,

% setxkbmap                    (X.Org 7.3 以前ならば,これは不要.)
% xkbcomp -a -xkm $DISPLAY     (server-0_0.xkm という名の file が作成される.)
% xkbprint server-0_0.xkm      (server-0_0.ps  という名の file が作成される.)

出力される file 名を指定したい場合は,次のようにします.

% setxkbmap                              (X.Org 7.3 以前ならば,これは不要.)
% xkbcomp -a -xkm -o pc98.xkm $DISPLAY   (pc98.xkm という名の file が作成される.)
% xkbprint pc98.xkm                      (pc98.ps  という名の file が作成される.)

.xkm file は,X Window System の version 等により互換性がない場合が多いので,異なる PC の間でこれをやりとりする場合は要注意です.

xkbprint への option には次のようなものがあります.

-color           色を着ける.(geometry file にてその K/B がカラー対応になっていれば.)
-label symbols   キートップに刻印に相当する文字等を書く.(default)
-label none      キートップに何も書かない.
-label name      キートップに <ESC> のような keycode 名を書く.
-label code      キートップに keycode 番号を 10 進数で書く.
-nokc            キーの下に小さく keycode 番号を書かない.(default は「書く」).

-label symbols に対する補足ですが,何が書かれるのかを分類すると,次のようになります.
(下の三つは xkbprint が独自に実現している機能です.)

  • 英数字,記号,Pey Pad の数字や記号は,ASCII 文字ストリングが書かれます.
  • 修飾キー,変換キー,Function Key は,"Alt_L", "Mode_switch", "F1" のように keysym 名が書かれます.
  • 半角カナやロシア語の場合,"kana_NU", "Cyrillic_YA" のような keysym 名が書かれます.
  • いくつかの特殊キー (DEL, HOME 等) は,刻印と同じ文字列が書かれます.
  • BS, TAB, SHIFT およびカーソル・キーは矢印が描かれます.
  • Enter は曲がった矢印が描かれます.

「素直に keysym 名だけを書く」という option も欲しいですね.

キーの配置や色を記述した geometry file は /usr/X11R6/lib/X11/xkb/geometry/ にあります. PC-98 は nec を,AT 互換機は pc を使います. これらは text file なので,容易に内容を見たり書き換えることができます. PC-98 と jp106 の設定は白黒のみなので,カラー対応を行い,ついでに形状の微調整を行なった自前の geometry file も作成しました. (PC-98 は本来の 106 キーに加え,109 キーおよび La13 のキーも作成しました.)

xkbprint は PostScript にしか出力できません. そこで,これを改造して出力先を X Window System 上に変え,キートップに各々の言語の文字を描くような xkbdisp を作成しました. (まだ半角カナとロシア語,および一部の Latin 文字にしか対応していません.)

Bug 情報

  1. xkbcomp を経る場合と経ない場合とで結果は同一であるべきです. しかし,Group が複数個設定されていて K/B が複数描かれるような場合にはそうならず,xkbcomp を経ないと K/B が一つしか描かれません. これは xkbprint の側の bug です.
  2. キーの絵は,基本的に二重の四角形で描かれます. corner_radius が 0 でない場合,その四角形の四隅は丸くなります. しかし,内側の四角形の左上において,横線が円弧からはみ出しているという bug があります. (PC-98, us101, jp106 のすべてに対して,この bug に遭遇します.)
  3. 「bug ではなく仕様」ですが,PC-98 においては,右側の [SHIFT] や Key Pad の [Enter] が独立でないことから,xkbprint では対応する code がない扱いにされ,白抜きになります. ダミーの keycode 番号と適切な keysym 名とを設定すれば,実際のキーの操作に影響することなしに xkbprint を騙すことができます.

出力のカラー対応や PC-98 の「仕様」を除く Bug を修正する patch を,ここで配布します. (xkbdisp は未だ配布できる状態にありません.)
xkbprint.tgz (更新日 : 2010.12.7)

また,PC-98 のための改良例や xkbdisp の出力例の入ったファイルを L'Internationale の localization にて配布しています. そちらもご覧下さい.

1.3  xkbcomp

xkbcompxkbprint の前段としてだけでなく,単独でも利用できます. .xkm file は binary ですが,これに相当する text 形式の .xkb file は次のようにすれば出力されます.

% setxkbmap                    (X.Org 7.3 以前ならば,これは不要.)
% xkbcomp -a -xkb $DISPLAY     (server-0_0.xkb という名の file が作成される.)

この出力は,設定状況の確認のために非常に役に立ちます.

1.4  xmodmap

xmodmap を用いれば,modifier の状態を確認することができます.

% xmodmap

option -pk を付ければ,キーマップの状態を確認することができます.

% xmodmap -pk

option -pke を付ければ,それをキーマップの変更に使える書式で出力することができます.

% xmodmap -pke

1.5  xset

% xset -q

で出力される情報に,"Keyboard Control:" の欄があります. ここから "LED mask:" の状態を知ることができます. [CAPS] 等の Lock がされた場合にこの数値が変化します. (それを graphic で表示するのが xkbvleds です.)

(注) PC-98 では,LED mask: の内容は状態の変化に反応しません.

2. 実用上のツール

2.1  xkbvleds

K/B に各種 Lock の状況を示す LED indicator (AT 互換機では [Num Lock], [Caps Lock], [Scroll Lock]) が付いていないと不便です. (ちなみに,うちに LED の備わった AT 互換機用 K/B はありません.)

また,PC-98 には [かな] の状態の変化を示す LED がありますが,AT 互換機ではそれに対応する [ALGR] の状態の変化を示す LED の備わった K/B はありません. (PC-98 配列 USB K/B は例外.)

このような場合,xkbvleds を利用すれば,それらが X Window の画面に表示されるので便利です.

% xkbvleds -g +0+0 &       この例では画面の左上の隅に表示する.

なお,Lock だけでなく一時的な修飾である Mode_switch にも反応し,それを押している間だけ点灯します.

LED は 8 個表示されます. jp106 の場合,右から [Caps Lock], [Num Lock], [Scroll Lock], 一つ飛んで [ALGR] です. この配置は,xkbvleds の機能としてでなく,keycodes の "indicator" や symbols の "modifier_map" 等の変更を通じて入れ替えることができます.

私は Window Manager として Motif (x11-toolkits/open-motif) を用いています. その環境で xkbvleds の Title Bar を表示しないようにするためには,~/.Xresources に次のように記述します.

Mwm*XkbLEDPanel*clientDecoration:            border

(注 1) PC-98 では,xkbvleds は状態の変化に反応しません. (要は,起動する意味がないということです.) PC-98 の [CAPS], [かな] の LED の点灯の制御はキーボードの中で完結しており,AT 互換機のように driver が点灯の指示を出しているわけではないからです.
(これを PC 側から検知し制御することも可能なようですが,FreeBSD ではサポートしていません.)

(注 2) 厳密には,PC-98 の [かな]Mode_switch,AT 互換機の [ALGR]ISO_Next_Group であり,特別な事情から同じ動作をするので「対応」と書きましたが,別のものです.

2.2  xmodmap

このプログラムは前節でも紹介しましたが,目的別に分類しているので再登場です.

xmodmap を用いれば,設定ファイルを書き換えることなしにキーマップを変更することができます. 標準の設定からの小変更であれば,これを活用する方が合理的でしょう. (計算機を共用しているならば,これしか手段はありません.)

使い方としては,変更する内容を記述した file (この例では filename) を用いて次のように実行します.

% xmodmap  filename

または -e option を付けて command line の中に変更内容を記述します.

変更内容は keycode 番号,または keysym 名 を使って記述します. (keycode 名は使えません.)
例えば,英数キーの 'a' を 'q' に変えるならば,filename に次のように記述します.

keycode  そのキーの keycode 番号 = 割り当てる keysym 名の列挙
keycode  37                      = q Q

または,

keysym  そのキーの keysym 名 = 割り当てる keysym 名の列挙
keysym  a                    = q Q

一方,Caps_LockControl_L のような修飾キーは,例えば usr/X11R6/lib/X11/xkb/symbols/pc/pc の抜粋

    key <CAPS> {        [       Caps_Lock               ]       };
    key <LCTL> {        [       Control_L               ]       };

    modifier_map Lock    { Caps_Lock, ISO_Lock };
    modifier_map Control { Control_L, Control_R };

を見れば分かりますが,keymodifier_map の両方に登場します. したがって,この二つのキーを入れ替える場合には,keycodekeysym の対応関係を入れ替えるだけでなく,modifier 名 の内容も変更しなければなりません. すなわち,filename の内容は次のようになります.

remove Lock = Caps_Lock            ← 入れ替えるキーを modifier 名の登録からはずす.
remove Control = Control_L
keysym Control_L = Caps_Lock       ← Caps_Lock と Control_L のキーを入れ替える.
keysym Caps_Lock = Control_L
add Lock = Caps_Lock               ← 入れ替えたキーを再度 modifier 名に登録する
add Control = Control_L

remove せずに add だけすると,両方の動作をしてしまいます.

そう言いつつ,私はこちらの目的で xmodmap を使っていません. 標準の設定に不満がないか,大量の変更を設定ファイルで対応するかの両極端なので.

2.3  setxkbmap

キーマップの切り換えは,setxkbmap を用いても可能です. 次のように使います.

% setxkbmap -rules xorg -model pc98 -layout nec/jp

X.Org 7 系 (少なくとも 7.4, 7.5) においては xkbcomp, xkbprint を正しく動作させるために,事前に setxkbmap を実行しておく必要があります. (X server を起動してから一度実行するだけで良いです.)

% setxkbmap
% xkbcomp -a -xkb $DISPLAY
% xkbprint $DISPLAY