coと申します。SKK日本語入力FEPというWindowsのテキストサービスフレー ムワークによる日本語入力メソッド(以下IME/TSF)を作成しております。
LibreOfficeのWindows版のコンポジション処理(漢字変換時のインライン表 示関連)を改善したいと考えています。どなたかLibreOfficeのWindows版を ビルドできる方、ご協力願えないでしょうか。 # もし場違いな話題でしたらすみません… 以下に、IME/TSF開発者の視点によるLibreOffice側の問題箇所につい て情報を書きます。ソースは vcl/win/source/window/salframe.cxx ImplHandleIMENotify() の周辺です。 -------------------------------------------------------------------- ・LibreOffice(のWindows版)ではMS-OfficeやIE,Firefoxなどと同様、コン ポジションを自前で処理している。 ・LibreOfficeのコンポジションの実装は他のアプリケーションと比べると 貧弱で、IME/TSF側からコンポジションの座標が正確に取得できず (ITfContextView::GetTextExt APIが画面隅の座標を返す)非常に使いに くいものとなってしまっている。 ・この対応策として、LibreOfficeにはアプリケーションまたはIME/TSF側から IMN_OPENCANDIDATEメッセージを受け取り、コンポジション座標を受動的に 更新する処理が実装されているが、この手法には以下の問題があると考える。 ■問題1 他のアプリケーションではメッセージなどなくてもコンポジションの更新 によって自動的に座標が更新され、IME/TSF側に正しい座標が渡るのに、 LibreOfficeだけはわざわざ特殊なメッセージを送らないと何も変化しない というのが、そもそもおかしい。 このメッセージはマイナーなもので、使わないで済むならそのほうが効率 が良い。何より、IME/TSF側からウィンドウメッセージを生成して送信する という処理自体、処理レベルがおかしく歪な設計だと(個人的に)考える。こ のメッセージを必要としている主要なアプリはLibreOffice以外で見たこと がない。今後新たに作られるIME/TSFでは、わざわざLibreOfficeのためだけ にメッセージを送信する筋の悪い実装を強いられることになる。 ■問題2 このメッセージはOPENCANDIDATEと名がついている通り、IME/TSFの候補一 覧を選択する瞬間に使うもので、候補入力途中のサジェストウィンドウ(予 測表示)の表示でも同じメッセージを使うのはおかしい。 IME/TSFは全てのアプリケーションに食い込んで動作するので、予測表示 の時にもOPENCANDIDATEのメッセージを飛ばす作りにしてしまうと、他のア プリケーションの動作がおかしくなってしまう恐れがある。そのため、『わ ざわざLibreOfficeかどうかを判断して内部動作を切り替え』『本来は候補 一覧を通知するためのメッセージを間違った用途に使う』ことでようやく座 標更新が行えるというデザインを取らざるを得ない。 ■問題3 メッセージを受け取ったLibreOfficeは、座標を更新してくれるのだが、 同時にカーソルを消してしまう(pFrame->mbCandidateMode = TRUE)。現状で は候補一覧の時にはカーソルが消えても問題はないのだが、予測表示の最中 にカーソルが消えてしまうのは問題で、IME/TSF側が困ってしまう。 (画像のように、候補選択中にカーソル表示が必要なIMEが将来登場する かもしれないと考えると、消してしまうこと自体おかしいとは思うが、現在 の主要な日本語入力方式では特に問題はないため、今回は気にしません) (余談ですが、現在LibreOfficeではコンポジションの属性でカーソル制御も 行なっているようなので(憶測)、日本語入力のIME/TSFを使っている限りに おいてはこのメッセージでのカーソル制御はなくても問題ないと考えます) ■問題4 メッセージを一切送らなくても、ごくまれにIME/TSF側が座標を取得でき ることがある(なぜかは不明。現在拙作のSKK日本語入力FEPではこの現象を 利用してメッセージ送信なしで動作させている)。しかし、アプリ側で ImmSetCandidateWindow APIを呼んでもらえない限り、LibreOfficeのウィン ドウ移動のイベントなどが一切IME/TSF側に通知されない。このためコンポ ジション関連ウィンドウだけがアプリケーションのウィンドウ移動に連動し て動かずに取り残されるなど、使い勝手が非常に悪い。 ■結論 LibreOfficeのWindows版ではコンポジション処理を独自実装しているが、 座標更新に関して実装が不十分であり、他のアプリ(MS-Officeとか)と同じ ように、コンポジションの変更に応じて、外部からのイベントに一切頼らず に自力で座標を更新する(ImmSetCandidateWindow APIを呼ぶ)よう改良すべき。 -------------------------------------------------------------------- と、ここまでは威勢のいい話なのですが… LibreOfficeのソースを読んで修正箇所の目星をつけようとしているので すが、情けないことにいまだにWindows版をコンパイルすることができず、 スタートラインにすら立てず苦戦しています。VC++を使っているせいだと思 うのですが…。 どなたかWindows用の日本語版LibreOfficeをビルドできる方、ご協力いた だけないでしょうか。 # 正直、英語わかりません… 余談ですが、LibreOfficeはコンポジションの色属性をまったく解釈しな いので、MS-Office等と比べると同じ内容を与えてもこのように異なった(モ ノクロの)表示になってしまいます。将来的にはこのあたりも改善していけ たらいいなと考えております。 http://twitpic.com/aj9hw9/full よろしくお願いします。 -- co http://coexe.web.fc2.com/ -- Unsubscribe instructions: E-mail to [email protected] Posting guidelines + more: http://wiki.documentfoundation.org/Netiquette List archive: http://listarchives.libreoffice.org/ja/discuss/ All messages sent to this list will be publicly archived and cannot be deleted
