summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2021-12-17 16:00:57 +0100
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2021-12-17 16:00:57 +0100
commit93a55f64c35280d68af59585797f8f89a7aba0fb (patch)
tree501594d2fb4f1e2df14500a9ebe60fca5c54d6d9
parent983777535eb72de453cd84f73d791108d5453b81 (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.mm27
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);