IME on/off の切換 - その5
IME 切換で、メニューバーの OCR までやって苦労していたら、masuda 先生が、手動で切り替えた場合も現在の状態を取得できる自作プログラム MacImSelect を教えてくれた。
以前 Foreign Function and Memory (FFM) API で挑戦したときは、入力ソース関連関数が Swing スレッドとバッティングして、どうにもできなかったのだが、masuda 先生は _dispatch_main_q スレッドで処理させることで、スマートに回避していた。さらに NSTextInputContext.currentInputContext で現在の inputContext を取得して操作していて、手動で切り替えても現在の状態が取れるのはここが、一体ポイントかもしれない。うちの TISServer のように、外部プロセスに処理させた場合は、呼び出し側がどの NSTextInputContext を使っているかなど知るよしもないので、どうにもならない。
教えてもらった MacImSelect は JNA で書かれていたので、これを参考にしながら、FFM API で、レベルの低いプログラムに挑戦、試行錯誤の末、何とか動くようにできた。(AppKit 版と Carbon 版)
基本的な流れとしては、入力ソース切換関係の関数を呼ぶときに、dispatch_sync_f(dispatch_queue_t queue, void * context, dispatch_function_t work) で _dispatch_main_q スレッドに処理を委託するのだが、委託先のネイティブからは、work(context) の形で呼ばれるので、その形の upcallStub を作成、さらに context 内に共通メモリ領域を作って、スレッドの異なる java とは、その領域で同期的にデータのやりとりをするという方式だ。
« IME on/off の切換 - その4 | トップページ | 中古整備品ハブ BS-MS2016P の速度低下とファームウェア更新 »
「OpenDolphin」カテゴリの記事
- 運用18年目のまとめ(2026.02.07)
- IME on/off の切換 - その5(2026.01.05)
- IME on/off の切換 - その4(2025.12.23)
- IME on/off の切換 - その3(2025.12.20)
- OpenDolphin: Java 25 / WildFly 38 への移行(2025.11.09)


