diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2021-12-17 16:00:57 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2021-12-17 16:00:57 +0100 |
| commit | 93a55f64c35280d68af59585797f8f89a7aba0fb (patch) | |
| tree | 501594d2fb4f1e2df14500a9ebe60fca5c54d6d9 | |
| parent | 983777535eb72de453cd84f73d791108d5453b81 (diff) | |
macOS platform: fix for issue #325 Disabling IM disables Greek and Cyrillic layouts
Thanks to Pierre Ossman who gave the fix.
| -rw-r--r-- | src/Fl_cocoa.mm | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 3b8cf6370..a9ebb7125 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -133,8 +133,10 @@ typedef OSStatus (*TSMSetDocumentProperty_type)(TSMDocumentID, OSType, UInt32, v static TSMSetDocumentProperty_type TSMSetDocumentProperty; typedef OSStatus (*TSMRemoveDocumentProperty_type)(TSMDocumentID, OSType); static TSMRemoveDocumentProperty_type TSMRemoveDocumentProperty; -typedef CFArrayRef (*TISCreateASCIICapableInputSourceList_type)(void); -static TISCreateASCIICapableInputSourceList_type TISCreateASCIICapableInputSourceList; +typedef CFArrayRef (*TISCreateInputSourceList_type)(CFDictionaryRef, Boolean); +static TISCreateInputSourceList_type TISCreateInputSourceList; +static CFStringRef kTISTypeKeyboardLayout; +static CFStringRef kTISPropertyInputSourceType; typedef void (*KeyScript_type)(short); static KeyScript_type KeyScript; @@ -1490,8 +1492,15 @@ static FLWindowDelegate *flwindowdelegate_instance = nil; TSMRemoveDocumentProperty(doc, kTSMDocumentEnabledInputSourcesPropertyTag); else { CFArrayRef inputSources; - - inputSources = TISCreateASCIICapableInputSourceList(); + CFDictionaryRef filter; + // FLΤΚ previously used TISCreateASCIICapableInputSourceList(), + // which mostly hits the mark. But it excludes things like Greek + // and Cyrillic keyboards. So let's be more explicit. + filter = CFDictionaryCreate(NULL, (const void **)kTISPropertyInputSourceType, + (const void **)kTISTypeKeyboardLayout, + 1, NULL, NULL); + inputSources = TISCreateInputSourceList(filter, false); + CFRelease(filter); TSMSetDocumentProperty(doc, kTSMDocumentEnabledInputSourcesPropertyTag, sizeof(CFArrayRef), &inputSources); CFRelease(inputSources); @@ -1771,11 +1780,17 @@ static int input_method_startup() if (retval == -1) { fl_open_display(); if (fl_mac_os_version >= 100500) { + // These symbols are no longer visible in Apple doc. + // They do exist in Carbon.framework --> HIToolbox.framework --> TextServices.h TSMGetActiveDocument = (TSMGetActiveDocument_type)Fl_Darwin_System_Driver::get_carbon_function("TSMGetActiveDocument"); TSMSetDocumentProperty = (TSMSetDocumentProperty_type)Fl_Darwin_System_Driver::get_carbon_function("TSMSetDocumentProperty"); TSMRemoveDocumentProperty = (TSMRemoveDocumentProperty_type)Fl_Darwin_System_Driver::get_carbon_function("TSMRemoveDocumentProperty"); - TISCreateASCIICapableInputSourceList = (TISCreateASCIICapableInputSourceList_type)Fl_Darwin_System_Driver::get_carbon_function("TISCreateASCIICapableInputSourceList"); - retval = (TSMGetActiveDocument && TSMSetDocumentProperty && TSMRemoveDocumentProperty && TISCreateASCIICapableInputSourceList ? 1 : 0); + // These symbols are no longer visible in Apple doc. + // They do exist in Carbon.framework --> HIToolbox.framework --> TextInputSources.h + TISCreateInputSourceList = (TISCreateInputSourceList_type)Fl_Darwin_System_Driver::get_carbon_function("TISCreateInputSourceList"); + kTISTypeKeyboardLayout = (CFStringRef)Fl_Darwin_System_Driver::get_carbon_function("kTISTypeKeyboardLayout"); + kTISPropertyInputSourceType = (CFStringRef)Fl_Darwin_System_Driver::get_carbon_function("kTISPropertyInputSourceType"); + retval = (TSMGetActiveDocument && TSMSetDocumentProperty && TSMRemoveDocumentProperty && TISCreateInputSourceList && kTISTypeKeyboardLayout && kTISPropertyInputSourceType ? 1 : 0); } else { KeyScript = (KeyScript_type)Fl_Darwin_System_Driver::get_carbon_function("KeyScript"); retval = (KeyScript? 1 : 0); |
