« FileInspector でのソート | トップページ | 半透明の DnD フィードバック »

2011年12月 8日 (木)

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