Windows 10のビルド 17643で、TS_E_NOLAYOUT
問題が解決されたとのことなので検証してみた
初回投稿日時: 2018年06月02日01時09分54秒
カテゴリ: IME TSF Windows
固定リンク: id=2018060200
SNS:
Tweet (list)
TSFのTS_E_NOLAYOUT問題とは何かということについては、以前書いた記事を参照してください。
今年初頭に、Windows Insider Meetup in Japan 3にお邪魔して、「この問題なんとかならないですか」とお願いしてみたところ、早くも以下のような嬉しすぎるお返事が来ました。
ご指摘いただきありがとうございます。#WindowsInsiders Skip Ahead (RS5) ビルド 17643 以降では、GetTextExt() が TS_E_NOLAYOUT と E_INVALIDPOS を正しく返すようになりました。ご確認いただけましたら幸いです。
— Masaru Iritani (@msdmairitan) 2018年4月13日
早速試してみようと思ったら、運悪くSkip Aheadの申し込みが既に終了していたので、Fastリングに降ってくるのを待つことに。そしてようやく、新しいビルドが手に入り、ひたすらATOKのインストールも終わり、この記事をまとめる時間がとれました。
- Microsoft IME (日本語版)
-
日本語版のWindowsに標準でインストールされている、いわゆる、MS-IMEです。Geckoは、こちらに対しては、キャレット位置への問い合わせ時と、未確定文字列内の特定の文字の矩形の問い合わせ時には、
TS_E_NOLAYOUT
を返さないようにしています。これらの設定(
intl.tsf.hack.ms_japanese_ime.do_not_return_no_layout_error_at_caret
とintl.tsf.hack.ms_japanese_ime.do_not_return_no_layout_error_at_first_char
を無効にしても、特に変わりなく動作することを確認できました。ただし、希に、候補ウインドウ、推測候補ウインドウ共に、初めての表示時に画面左上に表示され、その後、おそらくレイアウト変更完了の通知で正しい位置に再表示される、ということがあるようです。あまりにも希すぎて、これが再現した時のログを取得するのが困難なのでどうしたもんかという感じですね。
- Google日本語入力
-
Google日本語入力に関わられてたNyaRuRuさんがもともとこのTSFのバグを見つけられたので、Google日本語入力自身がこのバグに対策をとってくれています。ですので、今回の検証でも、候補ウインドウ位置、推測候補ウインドウ位置共に問題無く表示されていました。
ちなみにバージョンは、2.24.3250.0となっていました。
- ATOK 2017
-
ATOK 2017は実は、それ以前のATOKと大きく違う点があります。それは、ATOK 2016以前はATOK側で、Firefoxの過去のバグに対応するためのハックがいくつかあったようなのですが、それをお願いして全て削除してもらった最初のバージョンがATOK 2017です。ですので、今回は検証していませんが、ATOK Passportの最新版の挙動もこちらに準拠していると推測されます。
こちらの方は、まず、現在のハックを有効にしている状態でも一つだけ問題があります。それは、未確定文字列のうち、二文節目以降を選択している時に候補を高速に切り替えると(例えばスペースキー押しっぱなし)、候補ウインドウが一文節目の下に一瞬表示され、その後、二文節目の下に移動します。つまり、ちらついているように見えます。
ATOK 2017向けのハックは、未確定文字列内の矩形を問い合わせて来た時に
TS_E_NOLAYOUT
は返さないというもの(intl.tsf.hack.atok.do_not_return_no_layout_error_of_composition_string
)だけですが、これを無効にすると、上記の問題は再現しなくなりました。ただし、文節の位置に関係なく、候補ウインドウが一瞬だけ少しだけ上に表示され、その後、下に移動するという、若干ちらついた表示になります。この問題は、おそらくGecko側にあるのではないかと推測しています。と言うのも、Geckoは問い合わせ位置に文字がまだ無く、代わりにキャレットがある場合、そのキャレットの矩形を返すのですが、キャレットの高さは文字の高さよりもやや低いことがあるためです。これは次のWindows 10の大型アップデートまでに修正してしまいたいところです。
- ATOK 2016
-
ATOK 2016の動作はATOK 2017と似ています。このバージョンから、推測候補ウインドウは一文字目の下に表示されるようになったのですが、推測候補ウインドウが表示される時というのは、単に文字を追加入力していくだけですので、一文字目が変更されることはありません。そのため、安定して一文字目の矩形を返せるので推測候補ウインドウの位置がちらつくことは無くなっています。それに対して候補ウインドウの位置は、高速に候補を切り替えていくと、数ピクセル右にずれて、その後、本来の位置に移動する事でちらつくことがあります。
ATOK 2016以前のATOKへのハックは上記の未確定文字列内の矩形の問い合わせに対して
TS_E_NOLAYOUT
を返さないというもの(intl.tsf.hack.atok.do_not_return_no_layout_error_of_composition_string
)と、ネイティブキャレットを非表示で生成するというもの(intl.tsf.hack.atok.create_native_caret
)の二種類があります。まず、キャレットの生成を無効化してみると、ATOK 2017と同様に二文節目以降の候補ウインドウが一文節目の下に一瞬表示されるというバグが発生しました。これは、Bug 1273510でATOK向けのハックをATOK 2017以降では無効化する際の検証漏れですね。ATOKでは文節を先頭からひとつずつ確定していくのが標準の操作方法なので気付きませんでした。
ですが、未確定文字列内の矩形の問い合わせに対して
TS_E_NOLAYOUT
を返さないというもうひとつのハックを無効化すると、この問題も無くなりました。ただし、ATOK 2017と同様に、高速で候補を切り替え中に、本来の位置よりも数ピクセル上に一瞬だけ表示され、本来の位置に戻るというバグがあります。 - ATOK 2015
- ATOK 2014
- ATOK 2013
- ATOK 2012
- ATOK 2011
-
ATOK 2011からATOK 2015までは候補ウインドウと推測候補ウインドウに関してはまったく同じ動作でした。
まず、ハックを有効にしている状態だと、候補ウインドウは、候補を高速に切り替えていくと、本来の位置より数ピクセル右に表示され、その後、本来の位置に戻るというちらついた表示になります。また、推測候補ウインドウは、常に最後の文字の下に表示しようとするため、たまに一瞬だけ本来の位置よりも数ピクセル上に表示され、その後本来の場所に戻るというちらついた表示になります。
ATOK 2015以前のATOKへのハックはATOK 2016と同様に未確定文字列内の矩形の問い合わせに対して
TS_E_NOLAYOUT
を返さないというもの(intl.tsf.hack.atok.do_not_return_no_layout_error_of_composition_string
)と、ネイティブキャレットを非表示で生成するというもの(intl.tsf.hack.atok.create_native_caret
)の二種類があります。まず、ネイティブキャレットを生成しなかった場合、候補ウインドウ位置、推測候補ウインドウ位置共に安定し、つらつきが無くなります。さらに、未確定文字列内の矩形の問い合わせに対して
TS_E_NOLAYOUT
を返しても特に問題が見つかりませんでした。 - Japanist 10
-
Japanist 2003から14年、昨年2017年に発売されたJapanist 10です。Japanist 10ではようやくTSFのTIPとなりました。バージョンは10.10.1.0となっていました。
Geckoは、Japanist 10に対しても、未確定文字列内の矩形の問い合わせに対して
TS_E_NOLAYOUT
を返さないというハックがあります(intl.tsf.hack.japanist10.do_not_return_no_layout_error_of_composition_string
)。これが有効なままであれば、候補ウインドウの位置は問題無く、推測候補ウインドウの位置は一文字目の入力時に表示するように設定していると、一文字目の場合にだけ、画面左上に表示されてしまいます。このハックを無効にしてみると、最初にフォーカスをセットしたエディタ上では、推測候補ウインドウが文字入力の度に消えることが多くなり、かなり鬱陶しいちらつきを見せます。また、時々候補ウインドウが画面左上に表示されます。
さらに別のエディタにフォーカスを移動させると、推測候補ウインドウは常に画面左上に表示されるようになり、候補ウインドウは最初の候補の時だけ本来の位置に表示された後、その後は常に画面左上に表示されるようになります。
- Microsoft Pinyin
- Microsoft Wubi
-
中国語(簡体字)向けのIMEです。共に詳しい操作方法は知らないのですが、文字の入力を開始すると、横長の候補ウインドウが表示されます(役割というか挙動は推測候補ウインドウですが)。
この表示は、
TS_E_NOLAYOUT
を返さないようにするハック(intl.tsf.hack.ms_simplified_chinese.do_not_return_no_layout_error
)を無効にしても変わることなく正常に処理されているように見えました。 - Microsoft Bopomofo
-
未だに使い方の分からないIMEです。変換を試みてもインラインで変換結果が表示されるだけで、候補ウインドウの表示があるのか無いのか、よく分かりませんでした。
- Microsoft ChangJie
- Microsoft Quick
-
中国語(繁体字)のIMEです。共に未確定文字列を入力して変換すると、日本語用IMEの用に候補ウインドウが出ます。
さらに確定後に次の候補がある場合、推測候補ウインドウが表示されるというのが簡体字用IMEとはちょっと違うところです。
これらにも
TS_E_NOLAYOUT
を返さないようにするハックがあるのですが、有効・無効に関わらず、どちらのウインドウ位置も正常に表示されているように見えました。 - Chinese Traditional Array (version 6.0)
- Chinese Traditional DaYi (version 6.0)
-
これらも中国語(繁体字)のIMEなのですが、名前からも、また、以下のUIを見ても、どうも積極的にはもう開発されていなさそうなIMEです(でもWindows 10自身が持っている)。こちらは未確定文字列を入力するだけで候補ウインドウが表示されます。
また、確定後に即座に推測候補ウインドウが表示されます。
- Microsoft IME (韓国語版)
- Microsoft Old Hangul
-
ハングル用のIMEです。やはり、漢字へ変換したい時に、右Ctrlで候補ウインドウが表示されます。
候補を切り替えても未確定文字列が変化しないので、安定して表示されます。Geckoも特にハックは行っていないです。
ちなみに、日本語版も、韓国語版も"Microsoft IME"という呼称なのはややこしいので、どうにかしていただきたいところです。
Windowsという唯一のプラットフォームがバグっていたにも関わらず、TS_E_NOLAYOUT
とレイアウト変更の通知を受け取るというTSFの非同期描画にはJapanist 10以外は対応できているという驚くべき事実が判明したので、Windows 10のバージョンを確認して、これらのハックが行われないようにしていきたいと考えています(Japanist 10のスタッフにも連絡したいけど、どこへ連絡すれば良いんだろう……)。