X11 for Mac OS Xでことえりを使う

X11 for Mac OS Xでことえりを使えるように、TSMのドキュメントやkinput2、jmodeのソースを覗きながら、XIMサーバを仕立てようなどとコード片を書き始めてみたが、先がかなり長そうなのであらためてGoogleで検索。九州大学の園田氏が作成され、MachTenのX11でMacのIMを使えるようにするというkinput2.MacIMを発見。
方針を大幅に変えて…、kinput2.MacIMを改造してX11 for Mac OS Xでことえりを使うようにするパッチを作成してみた。

kinput2.MacIMはhttp://homepage1.nifty.com/daemon/MachTen/sonoda/で公開されている。
システム条件:

Mac OS X 10.4 (Tiger)、10.3 (Panther)
XcodeとX11 SDKのインストールも必要。

入力モードの変更においてことえりの属性値を使っているので、ことえり以外では使えないと思う。(IMが持つInfo.plistに合わせて変更すれば使えるかもしれない。)
インストール方法:

1. 次の3つのファイルをダウンロード後、同じディレクトリに置く。
kinput2-v3.1 kinput2-v3.1.tar.gz
ftp://ftp.sra.co.jp/pub/x11/kinput2より
kinput2.MacIM kinput2.fix4.macim.0.2.patch.gz
上記、園田氏の公開ページより
本パッチ kinput2-v3.1-macim-20050629.patch.gz(10.4 (Tiger)向け)
kinput2-v3.1-macim-20040417.patch.gz(10.3 (Panther)向け)

2. 次のようにソースを展開、パッチを適用して、make、インストールする。
$ tar xfz kinput2-v3.1.tar.gz
$ cd kinput2-v3.1
$ gzip -cd ../kinput2.fix4.macim.0.2.patch.gz | sed -n -e '143,549p' -e '581,$p' | patch -p1
$ gzip -cd ../kinput2-v3.1-macim-20050629.patch.gz | patch -p0
$ xmkmf -a
$ make
$ sudo make install
$ sudo make install.man
10.3 (Panther)においては、4行目を次のように読み替え。
$ gzip -cd ../kinput2-v3.1-macim-20040417.patch.gz | patch -p0

3行目は、kinput2.MacIMから次の5ファイルを抽出するもの。(パッチ対象のkinput2のバージョンが異なるため、変則的ながらこのようにした。)
ファイル
kinput2-v3.1/include下 MacIM.h, MacIMP.h, MacIMProto.h
kinput2-v3.1/lib下 MacIM.c, mconv.c

利用方法:

1. kinput2の起動
kinput2をX11.appの起動時に自動起動するには、.xinitrcに例えば次のように追加しておく。
kinput2=/usr/X11R6/bin/kinput2
if [ -x $kinput2 ]; then
    $kinput2 &
fi
手動で起動するには、次のように入力する。
$ /usr/X11R6/bin/kinput2 &
2. XMODIFIERS環境変数の設定
利用しているシェルに応じて.bashrc/.tcshrcなどで、XMODIFIERS環境変数に'@im=kinput2'を設定しておく。
次は.bashrcでの指定例。
export XMODIFIERS='@im=kinput2'
3. リソースの設定
本パッチに固有の設定はない。とりあえず.Xresourcesには次のように設定して使っている。
emacs*inputMethod:  xim
emacs*useXim:   true
kinput2*OverTheSpotConversion*modeShell.borderWidth:    0
kinput2*OverTheSpotConversion.useOverrideShellForMode:  true
kterm*allowSendEvents:  true
kterm*openIm:   true
4. キー操作
ことえりによる入力の開始/終了はcommand-spaceで切り替える。(開始のキーはデフォルトのリソースに追加してある。) JISキーボードの場合、終了は英数やcontrol-かな、も利用できるようである(これらはkinput2.MacIMによる)。
入力中のキー操作はことえりと同様。(全てのキー操作が効く訳ではないが…。)

5. 入力文字種の変更とモード表示
次のように対応する。入力の開始/再開時はひらがなで固定。
ショートカットキー 文字種 モード表示
control-shift-J
control-shift-K
control-shift-L
control-shift-;
control-shift-; または : (*1)
control-shift-; または ' (*1)
ひらがな
カタカナ
全角英字
半角カタカナ
英字
英字
[あ]
[ア]
[A]
[半ア]
[半A]
[半A]




JISキーボードの場合(*2)
USキーボードの場合
(*1) 半角カタカナを有効としている場合は、: または ' 。
(*2) 効くと思うが、未確認。

kinput2の起動時にシステム環境設定で無効にしていた文字種へは変更しない。ただし、kinput2の起動後に有効/無効を変更したものについては検知しない。

6. クリップボードからの文字列のペースト
ことえりによる入力中は、command-option-Vでクリップボードから文字列をペーストできる(command-VはX11.appに予約されていて使えなかった)。
一度にペーストできるのは120文字程度までとしている。

7. JIS X 0213で追加された文字の入力
実装水準3(第1面)の範囲の文字は入力できると思う。実装水準4(第2面)の範囲の文字は入力できない(〓で置き換える)。
フォントやkterm(のパッチ)は下記ページを参照するなどして必要に応じてインストールする。

新JIS漢字実践情報
http://www.asahi-net.or.jp/~wq6k-yn/code/zissen.html
問題点など:

1. Xクライアントの実際の入力モード(およびその表示)と、ことえりの入力メニュー/入力モードパレットの表示は一致しない。(入力モードやXクライアント/Macアプリケーションの切り替え時に追従しない。)

2. 10.3 (Panther)向け"-20040417.patch"においては、候補ウインドウは移動などの操作はできない。"その他の「何々」"でウインドウが拡張して表示される範囲の候補は、表示・選択できない。

3. ことえりの入力メニュー/入力モードパレットによる入力モードの変更、文字パレット/かなパレットによる文字の入力はできない。

4. 本パッチの影響かどうか不明ながら、幾つかのXクライアントで試用した範囲で次のような現象が見られる。
kterm: JIS X 0213で追加された文字だけを確定すると、入力されなかったり化けたりすることがある。
gvim(GTK+2 GUI): ja_JP.eucJPで起動すると入力できない(文字が乱れる)。ja_JP.UTF-8で起動すると問題ない。
tgif: PreeditTypeを"root"にすると、確定した文字列が入力されない。"overthespot"にすると良いようだ。

5. ことえりによる入力をcommand-spaceで終了せずにXクライアントを終了し、新たに他のXクライアントで入力を開始した場合、開始時の入力モードがひらがなにならない(終了したXクライアントの入力モードになる)。

6. 10.3 (Panther)向け"-20040417.patch"においては、ディスクのマウント解除/取り出しが著しく遅延する。console.logやsystem.logにはdiskarbitrationdから次のようなログが出力される。
May 6 13:32:34 localhost diskarbitrationd[40]: kinput2 [487]:42299 not responding.
その他:

1. 入力スタイルと候補ウインドウの表示位置
次のように対応する。
入力スタイル 候補ウインドウの位置 Xクライアントの例
over-the-spot
on-the-spot
off-the-spot
root-window
入力文字列の下
入力ウインドウの右(*1)
入力文字列の下(*2)
入力文字列の下
kterm, emacs
GTK+2を利用するアプリケーション
???
kterm(リソースで変更した時)
(*1) 入力文字位置が得られないので、これ以上は無理のようだ。
(*2) となるはずだが、未確認。

2. 10.3 (Panther)においては、GTK+2を利用するアプリケーションを幾つか試したが(gvim, gimp 2, gedit 2など)、gvimを除いては日本語入力できなかった。XFree86 4.4.0のバイナリ(国内のRingサーバなどから入手できる)をインストールしてみたところ、何れも入力できるようになった。(GTK+2も他のアプリケーションも、X11のSDKを用い、何れもX_LOCALEを有効にしてmakeしたのだが、gvimは特別なのか???)

3. 次のような現象が見られる。(何れも、キー入力がkinput2に通知されないため。)
gedit 2: 入力文字種を全角英字に変更しようとすると、メニューのドキュメント->全て保存(control-shift-L)が実行される。
ethereal: ファイルのオープンダイアログなどで日本語入力中にescを押すと、ダイアログそのものがキャンセルされ閉じる。(候補ウインドウが表示されていると、候補ウインドウが残る。)
変更履歴:

年月日 内容
2004年3月17日 初版(-20040315.patch)
2004年3月21日 次の2点を修正(-20040320.patch)。
1. kinput2の起動時にシステム環境設定で無効にしていた文字種へは、ショートカットキーの操作で変更しないようにした。
2. "~"、"\"を入力/ペーストすると"〜"、"\"になっていたものを、"~"、"\"で入力/ペーストされるようにした。
問題点の5.を追記。
2004年3月28日 次の1点を修正(-20040328.patch)。
1. 候補ウインドウの表示内容が更新されるようにした。
2004年4月17日 次の2点を修正(-20040417.patch)。
1. 候補ウインドウを入力文字位置の近辺に表示するようにした。ただし、移動などの操作は(変わらず)できない。
2. 入力スタイルがon-the-spotの場合、入力文字列が乱れていたものを修正した。
その他の1.~3.を追記。
2005年5月6日 次の2点を修正(-20050506.patch)。
1. 10.4 (Tiger)でmakeできなかったものを修正した。
2. 入力開始のキーとしていたcontrol-shift-Jをリソースから削除した。
問題点の6.を追記。(今更ながら、10.3 (Panther)でも発生していた。)
2005年5月28日 次の1点を修正(-20050528.patch)。
1. タイマーを設定してCarbonイベントを監視するようにした。これにより、問題点の2.と6.が改善された。
2005年6月29日 次の1点を修正(-20050629.patch)。
1. optionキーが効かなかったものを修正した。