a better fix for reading complex config from files
This commit is contained in:
parent
0ea6c10553
commit
c82b92dfb2
|
@ -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'])
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue