bool OSXKeyState::getGroups(GroupList& groups) const { CFIndex n; bool gotLayouts = false; // get number of layouts CFStringRef keys[] = { kTISPropertyInputSourceCategory }; CFStringRef values[] = { kTISCategoryKeyboardInputSource }; CFDictionaryRef dict = CFDictionaryCreate(NULL, (const void **)keys, (const void **)values, 1, NULL, NULL); CFArrayRef kbds = TISCreateInputSourceList(dict, false); n = CFArrayGetCount(kbds); gotLayouts = (n != 0); if (!gotLayouts) { LOG((CLOG_DEBUG1 "can't get keyboard layouts")); return false; } // get each layout groups.clear(); for (CFIndex i = 0; i < n; ++i) { bool addToGroups = true; TISInputSourceRef keyboardLayout = (TISInputSourceRef)CFArrayGetValueAtIndex(kbds, i); if (addToGroups) groups.push_back(keyboardLayout); } return true; }
void COSXKeyboardLayouts::GetLayouts() { CFDictionaryRef props; CFStringRef keys[] = {kTISPropertyInputSourceType}; CFStringRef vals[] = {kTISTypeKeyboardLayout}; CFRange range = {0,0}; props = CFDictionaryCreate(NULL, (const void **) keys, (const void**) vals, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); layouts = TISCreateInputSourceList(props, false); if(layouts != NULL && (range.length = CFArrayGetCount(layouts)) > 1) { TISInputSourceRef temp; c_layout = CFArrayGetFirstIndexOfValue(layouts, range, (temp = TISCopyCurrentKeyboardLayoutInputSource())); CFRelease(temp); } CFRelease(props); }
bool COSXKeyState::getGroups(GroupList& groups) const { CFIndex n; bool gotLayouts = false; #if defined(MAC_OS_X_VERSION_10_5) // get number of layouts CFStringRef keys[] = { kTISPropertyInputSourceCategory }; CFStringRef values[] = { kTISCategoryKeyboardInputSource }; CFDictionaryRef dict = CFDictionaryCreate(NULL, (const void **)keys, (const void **)values, 1, NULL, NULL); CFArrayRef kbds = TISCreateInputSourceList(dict, false); n = CFArrayGetCount(kbds); gotLayouts = (n != 0); #else OSStatus status = KLGetKeyboardLayoutCount(&n); gotLayouts = (status == noErr); #endif if (!gotLayouts) { LOG((CLOG_DEBUG1 "can't get keyboard layouts")); return false; } // get each layout groups.clear(); for (CFIndex i = 0; i < n; ++i) { bool addToGroups = true; #if defined(MAC_OS_X_VERSION_10_5) TISInputSourceRef keyboardLayout = (TISInputSourceRef)CFArrayGetValueAtIndex(kbds, i); #else KeyboardLayoutRef keyboardLayout; status = KLGetKeyboardLayoutAtIndex(i, &keyboardLayout); addToGroups == (status == noErr); #endif if (addToGroups) groups.push_back(keyboardLayout); } return true; }