miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

wxPython での IME 操作についていくつか

StaccatoEditorIME まわりの処理を実装しているんだけど、それ絡みでいくつか。

IME の候補ウィンドウにフォントが反映されない件

ImmSetCompositionFontW を呼び出しているはずなのに、フォントが変わらない現象が起きていて。いろいろ試してたけど、実はしょうもないバグだった。

-        lf.lfPitchAndFamily = 1 & 48    # FIXED_PITCH & FF_MODERN
+        lf.lfPitchAndFamily = 1 | 48    # FIXED_PITCH | FF_MODERN

& と | を間違えるとか恥ずかしいなぁ・・・。

この辺の処理は

で参考にされてたりするけど、他にも lfCharSet を設定しないとダメだったりとかあったので、参考にされる方は↓もご確認ください。前半は別のバグ対策を入れてしまったので、該当の変更は下のほうです。(日付見るとわかるけど、実は半年位前の話だったり・・・。)

wxPython で WndProc いじれる件

wxPython(wxWidget)はクロスプラットフォームなライブラリだから、Windows 特有の IME の処理なんかは考慮してくれません。なので IME が有効な状態でのキー入力を拾いたくても、それは拾えない・・・と思ってたんですけど、実は WM_xxxx 相当のメッセージを処理できるようで、

この辺に説明が載ってました。これでいろいろ制御できそうなので、↑のコミットではこの辺の調査用コードも入れちゃってます。

他にも MSWWindowProc を定義する方法とかあるみたいですね。

Editra(同じく wxPython を使っているエディタ)も IME まわりの処理がおかしいけど、頑張れば Windows だけでもそれっぽい動作にできるんじゃないかなとか。もし実装されたら参考にさせてもらおう。