IME on/off の切り替え
ATOK のメモリ対策で,IME の on/off(入力ソースを ATOK=IME on と US=IME off で切り替える)を AppleScript で行っていたが,しばらく運用しているうちに,AppleScript の呼び出しはコストが高く,IME on/off の度に毎回 AppleScript を呼び出すのは厳しいことがわかった。そのため,結局 InputContext#selectInputMethod(Locale.US / Locale.JAPAN) で IME 制御をする方法にしていた。当初は ATOK のメモリ対策であったが,しばらく使っているうちに,IME が入力場所によって on/off されるのは結構便利だと言うこともわかった。
しかし,その後,java が 1.6.0_26 から 1.6.0_29 にアップグレードされて,なぜか selectInputMethod が効かなくなってしまった。以下のような native 側の exception が出てしまう。
2011-11-13 16:45:56.608 java[1573:407] -[JRSInputMethodController setCurrentInputMethodForLocale]: unrecognized selector sent to instance 0x7fc534e29f10 2011-11-13 16:45:56.609 java[1573:407] -[JRSInputMethodController setCurrentInputMethodForLocale]: unrecognized selector sent to instance 0x7fc534e29f10 2011-11-13 16:45:56.610 java[1573:407] ( 0 CoreFoundation 0x00007fff93c4f286 __exceptionPreprocess + 198 1 libobjc.A.dylib 0x00007fff91867d5e objc_exception_throw + 43 2 CoreFoundation 0x00007fff93cdb4ce -[NSObject doesNotRecognizeSelector:] + 190 3 CoreFoundation 0x00007fff93c3c133 ___forwarding___ + 371 4 CoreFoundation 0x00007fff93c3bf48 _CF_forwarding_prep_0 + 232 5 CoreFoundation 0x00007fff93c3ea1d -[NSObject performSelector:withObject:] + 61 6 libawt.jnilib 0x00000001198e0849 +[CInputMethod setKeyboardLayout:] + 43 7 libawt.jnilib 0x00000001198e09a4 __Java_apple_awt_CInputMethod_setNativeLocale_block_invoke_1 + 105 8 JavaNativeFoundation 0x000000010feac545 +[JNFRunLoop _performDirectBlock:] + 12 9 CoreFoundation 0x00007fff93c790cd +[NSObject performSelector:withObject:] + 61 10 Foundation 0x00007fff95267e44 __NSThreadPerformPerform + 214 11 CoreFoundation 0x00007fff93bbdb51 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 12 CoreFoundation 0x00007fff93bbd3bd __CFRunLoopDoSources0 + 253 13 CoreFoundation 0x00007fff93be41a9 __CFRunLoopRun + 905 14 CoreFoundation 0x00007fff93be3ae6 CFRunLoopRunSpecific + 230 15 HIToolbox 0x00007fff919873d3 RunCurrentEventLoopInMode + 277 16 HIToolbox 0x00007fff9198e63d ReceiveNextEventCommon + 355 17 HIToolbox 0x00007fff9198e4ca BlockUntilNextEventMatchingListInMode + 62 18 AppKit 0x00007fff8ebce3f1 _DPSNextEvent + 659 19 AppKit 0x00007fff8ebcdcf5 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 135 20 libawt.jnilib 0x00000001198cf23d -[NSApplicationAWT nextEventMatchingMask:untilDate:inMode:dequeue:] + 124 21 AppKit 0x00007fff8ebca62d -[NSApplication run] + 470 22 libawt.jnilib 0x000000011987b600 +[AWTStarter startAWT:] + 1495 23 libawt.jnilib 0x000000011987af7a -[CPerformer perform] + 93 24 CoreFoundation 0x00007fff93c3ea1d -[NSObject performSelector:withObject:] + 61 25 Foundation 0x00007fff95267e44 __NSThreadPerformPerform + 214 26 CoreFoundation 0x00007fff93bbdb51 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 27 CoreFoundation 0x00007fff93bbd3bd __CFRunLoopDoSources0 + 253 28 CoreFoundation 0x00007fff93be41a9 __CFRunLoopRun + 905 29 CoreFoundation 0x00007fff93be3ae6 CFRunLoopRunSpecific + 230 30 java 0x000000010f5a8843 java + 18499 31 java 0x000000010f5a829a java + 17050 32 java 0x000000010f5a5a98 java + 6808
IME が入力場所によって切り替わるのは結構便利だったので,何か他の方法はないかと考えて,無理矢理 Robot を使って IME の on/off を行ってみた(IMEControl.java)。これもかなりコストは高いと考えられるが,実際の運用で今のところ実用レベルである。
« FileInspector でのソート | トップページ | 半透明の DnD フィードバック »
「OpenDolphin」カテゴリの記事
- Java 17 への移行(7) - OpenDolphin client の対応 (2023.02.04)
- Java 17 への移行(6) - Hibernate 6 でやらかす(2023.02.03)
- Java 17 への移行(5) - OpenDolphin server の対応(2023.02.02)
- Java 17 への移行(4) - OpenSearch の準備 [ubuntu 編](2023.02.01)
- Java 17 への移行(3) - OpenSearch の準備 [mac 編](2023.01.31)