teruyastarはかく語りき

TVゲームを例に組織効率や人間関係を考える記事がメインのようだ。あと雑記。

GoogleIME ver0.13.521.0 アップデートにおける「窓使いの憂鬱」の「IL-」挙動修正

※正式版の現在は治ってるみたい。
Google 日本語入力 がベータ版から正式版になりました。 - Google Japan Developer Relations Blog
http://googledevjp.blogspot.com/2010/12/google.html


今週始めあたりから GoogleIME が順次アップデートされてたようで
今回大きな変更がありました。


「もしかして」機能や、
「句読点による自動変換機能」
「シングルコア環境で最大 40%、デュアルコア環境では最大 70% 高速化しています」
など、とても嬉しい機能が追加されて感謝感激(^O^)
でも本題はここ。

Google Japan Blog: Google 日本語入力のベータ版をアップデートしました。(0.13.521.0 / 0.13.537.1)
http://googlejapan.blogspot.com/2010/11/google-0135210-0135371.html


Windows 版の変更点

日本語入力に使用する API を TSF から IMM32 に変更しました。

これにより、特に Windows XP 環境での
安定性と互換性が大幅に改善しました。

(GoogleIMEで「ばーじょん」を変換すると現在のバージョンがでます。)


IMM32は古い規格なのですが、XP の TSF は穴が多い模様で

Twitter / @Taku Kudo:
XP上のTSFはいろいろ地雷が多くて、すべてのバグを修正するにはIMM化が不可欠。MSIME2010も、TSFオンリーをやめてこっそりIMMモードを復活させています。


http://twitter.com/#!/taku910/status/25213375380


マイクロソフトによる講演「Windows Vista ゲーム開発」、数多くの国内PCゲームが躓いたIME問題は、SDKサンプルのささいなバグだった!?
http://game.watch.impress.co.jp/docs/20070927/wv.htm



僕は「窓使いの憂鬱」(の派生バージョンyamy0.03)という
キーバインディングソフトを使ってますが、
今週のアップデートからこの挙動がおかしくなりました。


具体的には、日本語入力中に

サジェストウィンドウがでたあとの「IL-」判定をとれなくなりました。

文字確定をしたらまた「IL-」判定を取れるようになります。
この現象は、IMM32ベースの 「メモ帳」「TerraPad」「Eclipse」などで発生して、
TSFサポート? されてる「ワードパッド」「ブラウザ全般」では発生しません。

mayu - MANUAL - CUSTOMIZE
http://mayu.sourceforge.net/mayu/doc/CUSTOMIZE-ja.html


IL- は、IME が on になっていることを表します。

ver0.13.521.0 サジェストで 「IL-」判定させる方法。


バグを使う荒わざで、
中がどうなってるかわかりませんので、
この方法は「自己責任」でお願いします。
作業中のファイルは保存しておきましょう。


僕の環境(XPpro-32bit & VsitaHome32bit)では
どちらでもうまくいってますが
もしかして環境によっては出来ないかもしれないのであしからず。


簡単に言うと、&SetImeString(text) 関数で
窓使いをフリーズ終了させて、
窓使い再起動すると「IL-」判定するようになります。


(1), まず、関数 &SetImeString(text) を、いらないキーに設定して設定ファイルを再読込します。



key C-A-F12 = &SetImeString(text)

(2),次に窓使いのログウィンドウを開きます。

ログウィンドウは、アイコン右クリックからも開けますが、
これもキーに設定しておいたほうが楽かもしれません。



key C-A-F11 = &MayuDialog(log, show) # 窓ログ

(3),GoogleIMEオンの状態で、&SetImeString(text) 設定キーを何度か押します。

さきほどの例では、「Ctrl+Alt+F12」 の同時押しです。


この関数はマニュアルでは
IME を経由して text 文字列 を入力します。」
となってますが、GoogleIME ではうまく働かず、

これでキーボード操作が全てフリーズします。

(4),タスクバーにあるログウィンドウタブを、右クリックから閉じます。

すると窓使いが終了してキーボードが回復します。



キーボード操作がフリーズしてて、
窓使いのウィンドウもアイコンも反応しませんが、
タスクバーにあるログウィンドウタブは
右クリックで2~3秒後に「閉じる」メニューがでてきます。


もちろんログウィンドウ出してないと、閉じることが出来ず
キーボードが回復しないので、順番は気をつけてください。
順番まちがえたら、Windowsのログオフか再起動が必要です。

(5),もう一度、窓使いの憂鬱を起動します。

するとなぜかサジェスト後も「IL-」判定するようになってます。


Vistaハイバネーション後でもこの判定は残ってます。
(XPはハイバネーション使わないので未確認)
さすがにWindows再起動したら、
もう一度フリーズからやりなおしです。


以上。

ログの詳細を見てみる。


ログを見ると、メモ帳で日本語入力始めたとき
GoogleIMEのウィンドウハンドルが入るのは分かるのですが、

HWND:	0
THREADID:2352
CLASS:	C:\Program Files\Google\Google Japanese Input\GoogleIMEJaRenderer.exe
TITLE:	C:\Program Files\Google\Google Japanese Input\GoogleIMEJaRenderer.exe
Toplevel Window Position/Size: (8, 2090129882) / (2088942955x-2090129730)
Desktop Window Position/Size: (0, 0) / (1280x772)

   0x1e   U-IL-IC-I-A
		    =>	   0x1e   U-A
* No key is pressed
* Gen Modifiers	{
		}
   0x1e   D-IL-IC-I-A
* Gen Modifiers	{
		}
		    =>	   0x1e   D-A

サジェストが表示されたときにもハンドルが割り込んできます。

HWND:	101b0
THREADID:2352
CLASS:	C:\Program Files\Google\Google Japanese Input\GoogleIMEJaRenderer.exe:GoogleJapaneseInputCandidateWindow
TITLE:	C:\Program Files\Google\Google Japanese Input\GoogleIMEJaRenderer.exe:
Toplevel Window Position/Size: (460, 104) / (64x73)
Desktop Window Position/Size: (0, 0) / (1280x772)

これ以降文字確定まで、「IL-IC-I-」が取れなくて「A」を押しても
0x1e U-IL-IC-I-A ではなく

   0x1e   U-A
		     >	&OtherWindowClass
		    =>	   0x1e   U-A

となります。
ワードパッドやブラウザでは、
サジェストがあってもこの割り込みがないので、
0x1e U-IL-IC-I-A
のままです。


今回のバグ技を使うと、
この割り込みが IMM32 ベースのメモ帳でも入らなくなります。
どうにかならんかなーといろいろいじって見つけた発見なので、
詳しいことはまったくわかりません (`・∀・´)エッヘン!!


ショートカットでフリーズキー作って再起動させるだけですが、
誰かもっとスマートな解決方法知ってたらご教授お願いします。


あとがき


別に、通常の配列ならサジェスト時の「IL-」判定はどうでもいいのですが、
「ACT」の実装を窓使いでやってたので、
GoogleIMEファンとしてとても困ったのでした。


「ACT」だけなら、IMEのローマ字編集でもできますが、
(GoogleIMEは記号含めたローマ字編集が可能なので)
オリジナル拡張(英大文字や記号入力は自動でIMEoffになるとか)にも
「IL-」判定を使ってるため、いろいろ試行錯誤してみたわけです。
正直、この記事の情報が必要な人は日本に何人いるやらw


GoogleIMEは頻繁なアップデートを行ってるので、
この問題もいつか自然と解決してたらいいなあと、期待してます。

Google Japan Blog: Google 日本語入力のベータ版をアップデートしました。(0.13.521.0 / 0.13.537.1)
http://googlejapan.blogspot.com/2010/11/google-0135210-0135371.html


Windows 版に限り、TSF から IMM32 への移行完了のため、今後数週間のうちに次のような自動更新を予定しています。この更新による機能変更はありません。


Windows 版ベータ版: 0.13.521.0 → 0.13.525.0
Windows 版開発版: 0.13.523.100 → 0.13.527.100