From: Seiichi S. <ss...@sh...> - 2004-06-13 11:06:21
|
佐藤精一です。 先日コミットした uim 対応ですが、気に入らないとこがたくさんあった ので書き直しました。 変更点は以下の通りです。 1. オプションの変更 --uim(use_uim), --uimengine(uim_engine) オプションを廃止して --im(input_method) オプションを追加しました。 ~/.mlterm/main や ~/mlterm/menu に設定されていた方は修正をお願いします。書式は $ mlterm --im=uim:prime のように ':' の後に変換エンジンを指定します。 $ mlterm --im=uim として変換エンジンを指定しなかった場合は ~/.uim で設定 (default-im-name)された変換エンジンになる筈なのですが、上手くいき ません。原因調査中です。 前回のコミットと同じく XIM との共存は考慮されてないので uim を使 う時は --xim=false で XIM を無効にしてください。 mlconfig から uim を指定できませんのでコマンドラインオプションま たは ~/.mlterm/main を直接編集してください。オプションの仕様が固 まったら mlconfig からも uim を指定できるようにするつもりです。 2. プラグイン(モジュール)化 uim に関連する処理をプラグイン化して mlterm の外に追い出しました。 --im オプションで uim が指定された時だけロードされます。プラグイ ンにしたので、--enable-uim でビルドしても mlterm 自体は libuim に リンクしません。バイナリパッケージで「libuim に依存しない mlterm 本体」と「libuim をリンクした uim の追加モジュール」に分割するこ ともできる筈です。 3. 自前の候補ウィンドウを追加 uim の配布物に含まれる uim-helper-candwin-gtk をやめて、mlterm に 候補ウィンドウを持たせました。使われるフォントは ~/.mlterm/*font で設定された端末のフォントと同じです。ただし、-u, --onlyuscfont (only_use_unicode_font), -n, --noucsfont(not_use_unicode_font) オ プションには対応していません。 metacity, blackbox, Window Maker, twm で動作を確認しました。 4. 変換中(preedit/未確定文字列)の描画を最適化 少しだけ最適化しました。細い線でリモートの X サーバに mlterm を飛 ばすとかしないと違いがわからない程度ですが、ちょっとだけ描画が早 くなってます。フォントについては候補ウィンドウと同じです。 以上がユーザ向けの話です。ここからは開発者向けというか中身の話で す。興味がなければ無視してください。 -export-dynamic について: uim プラグインから mlterm 本体側の関数を呼んでいるので、プラグイ ンのロード時にシンボルを解決できるようにしなくてはいけません。 pixmap_engine(スクロールバープラグイン)の時は libtool の -export-dynamic を使ったのですが、移植性が落ちてしまいます。そこ で今回はモジュールから呼ばれる mlterm 側の関数をポインタでモジュー ルに渡す(x_im_export_syms_t)ようにして逃げました。こういうモジュー ルが本体の関数を要求する(バックリンク)のはよくないらしいので、設 計を失敗した気もしますが。 候補ウィンドウについて: x_im_candidate_screen.[ch] で、uim プラグインから呼ばれます。候補 ウィンドウを追加したことによる変更は、 - 文字列の描画処理を端末ウィンドウ(x_screen.c)と候補ウィンドウで 共有させたかったので x_screen.c の draw_str*() を x_draw_str.c に移動。 - _MOTIF_WM_HINTS を使わないでボーダレスにする必要があったので x_window_set_boderless_flags() を分割。 といったところです。x_window.c, x_window_manager.c に用意されてい た汎用的な部品を再利用しただけなので元々あったコードはそれほど弄っ てないです。一応他のインプットメソッドでも使い回すことができるよ うにしたつもりです。 # だれか IIIMF やりません? preedit について: ml_char_t をわかってなくて結合文字周りでアホなことをしていたのを 直しました。あと preedit で BiDi は考慮してません。BiDirection 言 語って入力は XKB でできる筈だし、日本語のように preedit が必要な インプットメソッドは存在しないと理解しているからです。間違ってい たら教えてください。 エンコーディングの変換について: uim から変換候補や確定文字列などを変換エンジンのネイティブエンコー ディングで受け取り mlterm 側で端末のエンコーディングに変換してま す。これによって uim 側では iconv を使った変換が行われないので iconv のない環境でも mlterm + uim が動く筈です。ちなみに、今回追 加した変換処理は ml_vt100_parser.c からのパクりなのですが、似たよ うな処理を複製しても仕方ないので、どこか一ヶ所にまとめるつもりで す。(ml_char_remap() とか作って unicode_font_policy、JOHAB、外字 の処理を移動?) XIM との共存について: まだ悩んでいる最中なのですが、XIM も --im オプションで指定できる ようにしてしまおうかと考えてます。例えば、 XMODIFIERS で設定された XIM サーバを使う(--openimと同じ) $ mlterm --im=xim 明示的に XIM サーバを指定 $ mlterm --im=xim:skkinput ロカールも指定 $ mlterm --im=xim:ami:ko_KR.eucKR uim をデフォルト変換エンジンで使う $ mlterm --im=uim uim の変換エンジンも指定 $ mlterm --im=uim:prime という感じに。 -- Seiichi |