#!/usr/bin/python from gi.repository import Xkl, Gdk, GdkX11 def item_str(s): '''Convert a zero-terminated byte array to a proper str''' i = s.find(b'\x00') return s[:i].decode("utf-8") class Variant(object): def __init__(self, name, desc): self.name = name self.desc = desc def __str__(self): return '%s (%s)' % (self.name, self.desc) @property def description(self): return self.desc language_keyboard_variants = dict() country_keyboard_variants = dict() variants_list = list() def get_variant(c_reg, item, subitem, *args): if subitem: name = item_str(item.name) + " (" + item_str(subitem.name) + ")" description = item_str(subitem.description) else: name = item_str(item.name) description = item_str(item.description) variants_list.append(Variant(name, description)) def get_language_variants(c_reg, item, user_data=None): global language_keyboard_variants global variants_list lang_name, lang_desc = item_str(item.name), item_str(item.description) variants_list = list() c_reg.foreach_language_variant(lang_name, get_variant, None) language_keyboard_variants[(lang_name, lang_desc)] = variants_list def get_country_variants(c_reg, item): global country_keyboard_variants global variants_list country_name, country_desc = item_str(item.name), item_str(item.description) variants_list = list() c_reg.foreach_country_variant(country_name, get_variant, None) country_keyboard_variants[(country_name, country_desc)] = variants_list display = GdkX11.x11_get_default_xdisplay() engine = Xkl.Engine.get_instance(display) configreg = Xkl.ConfigRegistry.get_instance(engine) configreg.load(False) configreg.foreach_language(get_language_variants, None) #configreg.foreach_country(get_country_variants) for (lang_name, lang_desc), layouts in sorted(language_keyboard_variants.items()): for layout in layouts: print "%s (%s) [%s]" % (lang_desc.encode("utf-8"), layout.description.encode("utf-8"), layout.name.encode("utf-8")) #for (country_name, country_desc), variants in sorted(country_keyboard_variants.items()): # print 'Country: %s (%s)' % (country_name, country_desc) # for variant in variants: # print '\t', map(str, variant)