TOKUNAGA Hiroyuki
tkng****@xem*****
2004年 11月 10日 (水) 20:00:55 JST
報告ありがとうございます。 immodule for Qtを使った場合にdead keyが使えない、という報告は使用者の 環境の情報が足りないのでここではひとまず置いておくとして、uimのCompose関 係に関する実装状態とそれに関して前提となる知識をここに書いておきます。私 もここら辺はあまり明るくないので、間違っているかもしれません。多少疑いな がら読んでください。 ウムラウトやアクサンなどを入力する方法としてはDead keyやMulti keyがあ ります。これらをまとめてComposeKeyと呼びます。GTK+のgtk_compose_seqsとい うテーブルにはdead keyとmulti keyの両方が定義してあるので、たぶんこれが 正しい呼び方だと思います。 GTK+ではCompose Keyに関してどういう扱いをしているかというと、 GtkIMContextSimpleという専用のcontextを用意しています。 GtkIMContextSimpleはContextという名前ではありますが、実際にはGTK+組込み のimmoduleの一種と捉えた方がわかりやすいと思います。GtkIMContextSimpleは 800個以上の要素を持ったCompose用のテーブルを持っており、これを使って ComposeKeyに対応しています。試してはいませんが、たぶんX側のcompose sequenceのファイルは利用していません。 uimでは、GTK+用のBridgeは内部にGtkIMContextSimpleをもっており、これを slave contextと呼んでいます。uim側で処理しなかったkey eventはこのslave contextに処理させています。例えば、uim-anthyで半角英数モードになっている 場合、Multi_key a eと入力すると、これら3つのkey eventが全部uim側ではスル ーされてslave contextに回されるので、結果としてaeがくっついた奴が入力さ れます。 このmaster/slave contextの方法でGTK+の範囲では快適な生活が送れるはずで すが、GtkIMContextSimpleに頼っているので、他の環境、例えばuim-ximだとか UimQtだとかでは悲しい状態になります。(悲しいというか、これまでの事を考 えると変わらない訳ですが。) では単純に、GtkIMContextSimpleのデッドコピーをlibuim側に取り込んで GTK+用のBridgeからslave contextを削除すればそれで問題は解決するのかと言 うと、他にkey eventの扱いの問題があります。 libuim側ではkey eventは32から126までの間のキーコードを表すkeyと、 shiftやctrlなどの修飾キーが押されているかを表すstateの組合せで表現されま す。32〜126というところでわかると思いますが、これでは表現できないキーイ ベントがあります。この問題を解決しない間は、libuim側では満足な ComposeKeyサポートを提供できないので、GTK+用Bridgeからslave contextを削 除できません。 それでもuim-euroのようなものを提供するのはそれなりに価値があると思うの で、とりあえず試してみたのですが、手元では動かせませんでした。"\"と"""が いけないのかと思って"\\"にしてみたりもしてみたのですが、結局動きませんで した。実はuimにはlatin.scmという作りかけのcompose keyのサポートがあるので、 それとeuro.scmを併せてlatin.scmが動くようにしました。 latin.scmは最初は独自のIMとして実装しようとしていたのですが、どうして もcontext-widget云々のエラーが解消できなかったので、generic imの一種とし て実装する事にしています。shift+spaceの後に\aeでaとeのくっついた奴が入力 できる事を確認しましたが、逆にon状態では普通のアルファベットが入力できな くなっています。そもそもこのIMにon/offがある事自体が変なのですが、私には ちょっと独自IMとしての実装はできそうにないので、ヤマケンさんお願いします。 名前はuim-latinにしましたが、uim-composeの方がいいかもしれません。 revision 1629で試せます。 で、ここまで読んできた方はお気付きかと思いますが、以上は全てX上での話 です。コンソールでのComposeKeyに関しては私はよく知らないので、また調査が 必要です。ただ、emacsのleim/quail/latin-alt.el などを眺めていると、コン ソールでは何らかのソフトウェアを使わないとComposeKeyは使えないのかもなぁ、 という気がします。 Compose supportに関するTODO - GTK+でサポートされているのと同じだけのキーイベントをlibuim側でサポー トできるようにする - それを使ってuim-latinでサポートしている文字を増やす - dead keyもサポートする - 他のIMと組み合わせてcompose key supportを使えるようにする - compose key supportを使用するかどうかを設定できるようにする - バックスラッシュではなくMulti_keyを使えるようにする - Multi_keyとして扱うキーをカスタマイズできるようにする - 余裕があれば非UTF-8ロケールでも使えるようになにか考える -- 徳永拓之 tkng****@xem***** http://kodou.net/