keyboard: simplify language code to layout getter

Move code trying out different versions of language code to separate
function. Return fallback if no keyboards are available.
This commit is contained in:
Peter Eisenmann
2022-05-18 23:43:50 +02:00
parent 6a8aa74223
commit 0a779aa2fe
2 changed files with 30 additions and 17 deletions

View File

@@ -38,18 +38,17 @@ class KeyboardLayoutPage(Gtk.Box, Page):
languages = language_provider.get_all_languages_translated()
reset_model(self.languages_model, languages)
def _load_layout_list(self, language, short_hand):
def _load_layout_list(self, language, language_code):
self.stack.set_visible_child_name('layouts')
if self.loaded_language == short_hand:
if self.loaded_language == language_code:
return
self.loaded_language = short_hand
self.loaded_language = language_code
self.language_label.set_label(language)
# fill list with all keyboard layouts for given language
layouts = get_layouts_for(short_hand, language)
assert len(layouts) > 0, f'Language {language} has no keyboard layouts! Please report this.'
layouts = get_layouts_for(language_code, language)
reset_model(self.layouts_model, layouts)
first_row = self.layout_list.get_row_at_index(0)
self._activate_layout_row(self.layout_list, first_row)

View File

@@ -47,11 +47,32 @@ class KeyboardInfo(GObject.GObject):
self.layout = layout
def _get_fallback_language_code(language_code):
def _fallback_code(language_code):
if language_code in fallback_codes:
return fallback_codes[language_code]
def _short_code(code):
return code.split('_')[0]
def _get_existing_layouts(language_code):
xkb_info = XkbInfo()
layouts = xkb_info.get_layouts_for_language(language_code)
if len(layouts) > 0:
return layouts, language_code
if not (short_code := _short_code(language_code)) == language_code:
layouts = xkb_info.get_layouts_for_language(short_code)
if len(layouts) > 0:
return layouts, short_code
if fallback_code := _fallback_code(language_code):
layouts = xkb_info.get_layouts_for_language(fallback_code)
return layouts, fallback_code
else:
return 'us'
print(f'Language {language} has no keyboard layouts! Please report this.')
return ['us'], 'en'
def get_default_layout(language_code):
@@ -62,24 +83,17 @@ def get_default_layout(language_code):
def get_layouts_for(language_code, language):
xkb_info = XkbInfo()
layouts = xkb_info.get_layouts_for_language(language_code)
default_layout = get_default_layout(language_code)
if len(layouts) == 0:
fallback_code = _get_fallback_language_code(language_code)
print(f'Using fallback code {fallback_code} for {language_code}')
layouts = xkb_info.get_layouts_for_language(fallback_code)
language_code = fallback_code
layouts, code = _get_existing_layouts(language_code)
named_layouts = []
xkb_info = XkbInfo()
for layout in layouts:
name = xkb_info.get_layout_info(layout).display_name
named_layouts.append(KeyboardInfo(name, layout))
default_layout = get_default_layout(code)
# Sort the layouts, prefer those starting with language name or matching language short hand. Then by name.
return sorted(named_layouts, key=lambda o:
(not o.layout == default_layout,
not o.name.startswith(language),
not o.layout.startswith(language_code),
o.name))