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

メールによる返信