« IME on/off の切換 - その4 | トップページ | 中古整備品ハブ BS-MS2016P の速度低下とファームウェア更新 »

2026年1月 5日 (月)

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」カテゴリの記事