a better fix for reading complex config from files

This commit is contained in:
Michael Hudson-Doyle 2018-03-27 12:02:27 +13:00
parent 0ea6c10553
commit c82b92dfb2
2 changed files with 26 additions and 20 deletions

View File

@ -76,7 +76,7 @@ class KeyboardSetting:
return self return self
@classmethod @classmethod
def from_config(cls, config_file): def from_config_file(cls, config_file):
content = open(config_file).read() content = open(config_file).read()
def optval(opt, default): def optval(opt, default):
match = re.search('(?m)^\s*%s=(.*)$'%(opt,), content) match = re.search('(?m)^\s*%s=(.*)$'%(opt,), content)
@ -89,34 +89,40 @@ class KeyboardSetting:
XKBVARIANT = optval("XKBVARIANT", "") XKBVARIANT = optval("XKBVARIANT", "")
XKBOPTIONS = optval("XKBOPTIONS", "") XKBOPTIONS = optval("XKBOPTIONS", "")
toggle = None toggle = None
if ',' in XKBLAYOUT:
layout1, layout2 = XKBLAYOUT.split(',', 1)
for option in XKBOPTIONS.split(','): for option in XKBOPTIONS.split(','):
if option.startswith('grp:'): if option.startswith('grp:'):
toggle = option[4:] toggle = option[4:]
return cls(layout=XKBLAYOUT, variant=XKBVARIANT, toggle=toggle)
def for_ui(self):
"""
Attempt to guess a setting the user chose which resulted in the current config.
Basically the inverse of latinizable().
"""
if ',' in self.layout:
layout1, layout2 = self.layout.split(',', 1)
else: else:
layout1, layout2 = XKBLAYOUT, '' layout1, layout2 = self.layout, ''
if ',' in XKBVARIANT: if ',' in self.variant:
variant1, variant2 = XKBVARIANT.split(',', 1) variant1, variant2 = self.variant.split(',', 1)
else: else:
variant1, variant2 = XKBVARIANT, '' variant1, variant2 = self.variant, ''
if XKBLAYOUT == 'lt,lt': if self.layout == 'lt,lt':
layout = layout1 layout = layout1
variant = variant1 variant = variant1
elif XKBLAYOUT in ('rs,rs', 'us,rs', 'jp,jp', 'us,jp'): elif self.layout in ('rs,rs', 'us,rs', 'jp,jp', 'us,jp'):
layout = layout2 layout = layout2
variant = variant2 variant = variant2
elif layout1 == 'us' and layout2 in standard_non_latin_layouts: elif layout1 == 'us' and layout2 in standard_non_latin_layouts:
layout = layout2 layout = layout2
variant = variant2 variant = variant2
elif ',' in XKBLAYOUT: elif ',' in self.layout:
# Something unrecognized # Something unrecognized
layout = 'us' layout = 'us'
variant = '' variant = ''
else: else:
layout = XKBLAYOUT return self
variant = XKBVARIANT return KeyboardSetting(layout=layout, variant=variant)
return cls(layout=layout, variant=variant, toggle=toggle)
# Non-latin keyboard layouts that are handled in a uniform way # Non-latin keyboard layouts that are handled in a uniform way
@ -135,7 +141,7 @@ class KeyboardModel:
self._kbnames_file = os.path.join(os.environ.get("SNAP", '.'), 'kbdnames.txt') self._kbnames_file = os.path.join(os.environ.get("SNAP", '.'), 'kbdnames.txt')
self._clear() self._clear()
if os.path.exists(self.config_path): if os.path.exists(self.config_path):
self.setting = KeyboardSetting.from_config(self.config_path) self.setting = KeyboardSetting.from_config_file(self.config_path)
else: else:
self.setting = KeyboardSetting(layout='us') self.setting = KeyboardSetting(layout='us')
@ -193,4 +199,3 @@ class KeyboardModel:
run_command(['/snap/bin/subiquity.subiquity-loadkeys']) run_command(['/snap/bin/subiquity.subiquity-loadkeys'])
else: else:
run_command(['sleep', '1']) run_command(['sleep', '1'])

View File

@ -370,9 +370,10 @@ class KeyboardView(BaseView):
connect_signal(self.form, 'cancel', self.cancel) connect_signal(self.form, 'cancel', self.cancel)
connect_signal(self.form.layout.widget, "select", self.select_layout) connect_signal(self.form.layout.widget, "select", self.select_layout)
self.form.layout.widget._options = opts self.form.layout.widget._options = opts
setting = model.setting.for_ui()
try: try:
self.form.layout.widget.value = model.setting.layout self.form.layout.widget.value = setting.layout
self.form.variant.widget.value = model.setting.variant self.form.variant.widget.value = setting.variant
except AttributeError: except AttributeError:
# Don't crash on pre-existing invalid config. # Don't crash on pre-existing invalid config.
pass pass