この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2015年8月)

2015年8月26日

Bug-org 299603 Use IM specified style for preedit string (It is better to use PANGO_ATTR_BACKGROUND for XIMReverse)
初回投稿日時: 2015年08月26日23時24分59秒
カテゴリ: GTK IME Mozilla Core Mozilla43 バグ修正
SNS: (list)

放置していたバグ修正第二弾です。LinuxのIMEは未確定文字列のスタイル情報を一般的には指定してきます(一部の変換エンジンは自分でカスタマイズもできます)。しかし、GTK版Geckoはこの指定をそのまま利用せず、そのスタイルから各文節の「意味」を推測して独自の描画を行っていました。

今回の修正では、まず、WindowsのTSFサポートのために実装していた、未確定文字列のスタイル指定をGTKのIMContextWrapperで設定するようにしました。これで表示はひとまず解決です。

続いて、アクセシビリティ上、適切な値を設定しておかなくてはいけない文節のタイプ(意味)はキャレット位置から推測するようにしました。まず、文節がひとつしかなく、未確定文字列全てを覆っているのであれば、NS_TEXTRANGE_RAWINPUT、文節内のいずれかの文字の前にキャレットが存在している場合、その文節をNS_TEXTRANGE_SELECTEDCONVERTEDTEXT、そして、それ以外の文節をNS_TEXTRANGE_CONVERTEDTEXTとしています。この方法なら、選択文節の末尾にキャレットを持ってくるIMEでなければ正しく意味づけもできているはずです。

これまでの未確定文字列の表示方法のせいでIME開発者が未確定文字列に指定するデフォルトのデザインに制約がありましたが、それがこの修正で取っ払われたことになります。

しかし、LinuxのIME開発者は常にシステムデフォルトのwidget上でIMEが利用されることを念頭に、前景色と背景色のどちらかしか設定しない可能性が考えられます。そこで、未確定文字列の文節が前景色か背景色どちらかだけが設定されていた場合、もう一方にはネイティブwidgetの配色を使うことでコントラストを確保するようにしました。

最後に、今回のバグ修正中に発見した、バグもついでに修正しています。それは、未確定文字列内にサロゲートペアが存在していて、それより後ろにキャレットがあると、キャレットの位置がずれてしまうというものです。

GTKはキャレット位置を文字数単位で指定してくるのに対して、GeckoはUTF-16で2バイトを1文字としてカウントしていたためです。単純に、glibの関数を利用して、GTKにとっての文字数分のUTF-16文字列を取得し、その長さからキャレット位置を算出するようになりました。

関連するかもしれないエントリ

bug-org 299603を含むエントリ