private void RegisterXkbKeyboards() { if (XkbKeyboards.Count <= 0) { return; } var xkbAdaptor = GetAdaptor <XkbKeyboardAdaptor>(); var configRegistry = XklConfigRegistry.Create(xkbAdaptor.XklEngine); var layouts = configRegistry.Layouts; foreach (var kvp in layouts) { foreach (var layout in kvp.Value) { int index; // Custom keyboards may omit defining a country code. Try to survive such cases. string codeToMatch; if (layout.CountryCode == null) { codeToMatch = layout.LanguageCode.ToLowerInvariant(); } else { codeToMatch = layout.CountryCode.ToLowerInvariant(); } if ((XkbKeyboards.TryGetValue(layout.LayoutId, out index) && (layout.LayoutId == codeToMatch)) || XkbKeyboards.TryGetValue(string.Format("{0}+{1}", codeToMatch, layout.LayoutId), out index)) { xkbAdaptor.AddKeyboardForLayout(layout, index, this); } } } }
private void ReinitLocales() { m_BadLocales = new List <IKeyboardErrorDescription>(); var configRegistry = XklConfigRegistry.Create(m_engine); var layouts = configRegistry.Layouts; for (int iGroup = 0; iGroup < m_engine.GroupNames.Length; iGroup++) { // a group in a xkb keyboard is a keyboard layout. This can be used with // multiple languages - which language is ambigious. Here we just add all // of them. // m_engine.GroupNames are not localized, but the layouts are. Before we try // to compare them we better localize the group name as well, or we won't find // much (FWNX-1388) var groupName = m_engine.LocalizedGroupNames[iGroup]; List <XklConfigRegistry.LayoutDescription> layoutList; if (!layouts.TryGetValue(groupName, out layoutList)) { // No language in layouts uses the groupName keyboard layout. m_BadLocales.Add(new KeyboardErrorDescription(groupName)); Console.WriteLine("WARNING: Couldn't find layout for {0}.", groupName); Logger.WriteEvent("WARNING: Couldn't find layout for {0}.", groupName); continue; } for (int iLayout = 0; iLayout < layoutList.Count; iLayout++) { var layout = layoutList[iLayout]; AddKeyboardForLayout(layout, iGroup); } } }
private void RegisterKeyboards(IDictionary <string, uint> keyboards, UnityKeyboardRetrievingHelper.IbusKeyboardEntry _) { if (keyboards.Count <= 0) { return; } var configRegistry = XklConfigRegistry.Create(XklEngine); var layouts = configRegistry.Layouts; Dictionary <string, XkbKeyboardDescription> curKeyboards = KeyboardController.Instance.Keyboards.OfType <XkbKeyboardDescription>().ToDictionary(kd => kd.Id); foreach (var kvp in layouts) { foreach (var layout in kvp.Value) { uint index; // Custom keyboards may omit defining a country code. Try to survive such cases. string codeToMatch; if (layout.CountryCode == null) { codeToMatch = layout.LanguageCode.ToLowerInvariant(); } else { codeToMatch = layout.CountryCode.ToLowerInvariant(); } if ((keyboards.TryGetValue(layout.LayoutId, out index) && (layout.LayoutId == codeToMatch)) || keyboards.TryGetValue(string.Format("{0}+{1}", codeToMatch, layout.LayoutId), out index)) { AddKeyboardForLayout(curKeyboards, layout, index, SwitchingAdaptor); } } } foreach (XkbKeyboardDescription existingKeyboard in curKeyboards.Values) { existingKeyboard.SetIsAvailable(false); } }
protected virtual void InitLocales() { var configRegistry = XklConfigRegistry.Create(_engine); Dictionary <string, List <XklConfigRegistry.LayoutDescription> > layouts = configRegistry.Layouts; Dictionary <string, XkbKeyboardDescription> curKeyboards = KeyboardController.Instance.Keyboards.OfType <XkbKeyboardDescription>().ToDictionary(kd => kd.Id); for (uint iGroup = 0; iGroup < _engine.GroupNames.Length; iGroup++) { // a group in a xkb keyboard is a keyboard layout. This can be used with // multiple languages - which language is ambiguous. Here we just add all // of them. // _engine.GroupNames are not localized, but the layouts are. Before we try // to compare them we better localize the group name as well, or we won't find // much (FWNX-1388) var groupName = _engine.LocalizedGroupNames[iGroup]; List <XklConfigRegistry.LayoutDescription> layoutList; if (!layouts.TryGetValue(groupName, out layoutList)) { // No language in layouts uses the groupName keyboard layout. Console.WriteLine("WARNING: Couldn't find layout for '{0}'.", groupName); Logger.WriteEvent("WARNING: Couldn't find layout for '{0}'.", groupName); continue; } for (int iLayout = 0; iLayout < layoutList.Count; iLayout++) { XklConfigRegistry.LayoutDescription layout = layoutList[iLayout]; AddKeyboardForLayout(curKeyboards, layout, iGroup, SwitchingAdaptor); } } foreach (XkbKeyboardDescription existingKeyboard in curKeyboards.Values) { existingKeyboard.SetIsAvailable(false); } }
private void InitLocales() { if (m_BadLocales != null) { return; } m_BadLocales = new List <IKeyboardErrorDescription>(); var configRegistry = XklConfigRegistry.Create(m_engine); var layouts = configRegistry.Layouts; var icuLocales = IcuLocalesByLanguageCountry; for (int iGroup = 0; iGroup < m_engine.GroupNames.Length; iGroup++) { // a group in a xkb keyboard is a keyboard layout. This can be used with // multiple languages - which language is ambigious. Here we just add all // of them. var groupName = m_engine.GroupNames[iGroup]; List <XklConfigRegistry.LayoutDescription> layoutList; if (!layouts.TryGetValue(groupName, out layoutList)) { // No language in layouts uses the groupName keyboard layout. m_BadLocales.Add(new KeyboardErrorDescription(groupName)); continue; } string unrecognizedLayout = null; for (int iLayout = 0; iLayout < layoutList.Count; iLayout++) { var layout = layoutList[iLayout]; string description; if (string.IsNullOrEmpty(layout.LayoutVariant)) { description = string.Format("{0} ({1})", layout.Language, layout.Country); } else { description = string.Format("{0} ({1}) - {2}", layout.Language, layout.Country, layout.LayoutVariant); } IcuLocale icuLocale; int lcid; if (icuLocales.TryGetValue(layout.Locale, out icuLocale)) { lcid = icuLocale.LCID; } else { lcid = Icu.GetLCID(layout.Locale); } if (lcid <= 0) { if (iLayout == 0) { unrecognizedLayout = groupName; } } else { // if we find the LCID for at least one layout, we don't report // the other failing variations of this layout as error. unrecognizedLayout = null; var keyboard = new XkbKeyboardDescription(lcid, description, this, iGroup); KeyboardController.Manager.RegisterKeyboard(lcid, keyboard); } } if (unrecognizedLayout != null) { m_BadLocales.Add(new KeyboardErrorDescription(unrecognizedLayout)); } } }