キーイベントの処理順
キーイベントを処理するかもしれないもの:
- アプリケーション (EVT_KEY_DOWN)
- Input Method
- Accelerator
この3者のうちのどれが優先されるべきか?
現状
キーを押したときのイベントがどの順番で処理されるか
wxMSW
WM_KEYDOWN
- Input Method
- Accelerator
- アプリケーション
Input Methodでイベントが消費された場合、wParamがVK_PROCESSKEYになっている。かなり早い段階でIMEに処理されるようだ。IMEに先んじるには…フックか?
wxOSX/Cocoa
NSResponder の keyDown: メソッド
- Accelerator
- アプリケーション
Input Methodに渡っているのか不明。一応src/osx/cocoa/window.mmのwxWidgetCocoaImpl::DoHandleKeyEventでinterpretKeyEvents:を呼んでいるようなのだが…
wxOSX/Carbon
kEventClassKeyboard/kEventRawKeyDown
- Accelerator
- アプリケーション
- Input Method
- CarbonEvents.hのコメントによるとkEventRawKeyDownが処理されなければTSMが処理するらしい
wxGTK
"key_press_event"
- アプリケーション
- Input Method (gtk_im_context_filter_keypress)
- Accelerator
src/gtk/window.cppのgtk_window_key_press_callbackを参照。
理想
- Input Method
- アプリケーションやAccelerator
Input Methodの処理がアプリケーションの後になると、入力した文字を確定する前の操作が制限される恐れがある。この結果、例えばwxRichTextCtrlでは、確定はできるが←→キーでの文節の移動や、エスケープキーでの入力取り消しができない。wxStyledTextCtrlでは確定すらできない。
実装するには
- GTK+はgtk_im_context_filter_keypressを呼ぶ位置を変えればいい。
- CocoaのOSX 10.6で追加されたAPI(-[NSTextInputContext handleEvent:])ではInput Methodがイベントを処理したかどうか教えてくれるが、
- OSX 10.0からある-[NSResponder interpretKeyEvents:]ではInput Methodが処理したかどうか分からない。
- CarbonもInput Methodが処理したかどうか分からない…いや、kEventRawKeyDownイベントを直接application targetに送ってやれば…でも面倒だな…
…と思ったけど、Input Methodに処理させるとwxでいうところのEVT_CHAR(kEventClassTextInput/kEventTextInputUnicodeForKeyEvent,inputText:,"commit")が発生してしまうなぁ。EVT_KEY_DOWNよりも前にEVT_CHARが発生するのはまずいか。普段は
- アプリケーションやAccelerator
- Input Method
としておいて、確定前の編集中だけ
- Input Method
- アプリケーションやAccelerator
に切り替えるのがいいのか? それとも、前に書いたパッチみたいにEVT_CHARを起こす直前にEVT_KEY_DOWNを起こすか?
最終更新:2011年03月25日 10:38