Add console font selection to Locales menu (#4469)
* Add console font selection to Locales menu Add a 4th menu item "Console font" to the Locales configuration, allowing users to select a console font for the target system. The selected font is written to /etc/vconsole.conf. If a terminus font (ter-*) is selected, the terminus-font package is automatically installed on the target system. * Switch list_console_fonts to pathlib and add @lru_cache Address svartkanin's review on #4469. Replace os.listdir + chained removesuffix with Path.glob('*.gz') + split('.')[0], and cache the result via lru_cache - the kbd consolefonts directory is static at runtime so re-scanning on every menu reopen was wasted I/O.
This commit is contained in:
parent
9e05260df5
commit
210329ed80
|
|
@ -1982,12 +1982,10 @@ class Installer:
|
|||
def set_vconsole(self, locale_config: LocaleConfiguration) -> None:
|
||||
# use the already set kb layout
|
||||
kb_vconsole: str = locale_config.kb_layout
|
||||
# this is the default used in ISO other option for hdpi screens TER16x32
|
||||
# can be checked using
|
||||
# zgrep "CONFIG_FONT" /proc/config.gz
|
||||
# https://wiki.archlinux.org/title/Linux_console#Fonts
|
||||
font_vconsole = locale_config.console_font
|
||||
|
||||
font_vconsole = 'default8x16'
|
||||
if font_vconsole.startswith('ter-'):
|
||||
self.pacman.strap(['terminus-font'])
|
||||
|
||||
# Ensure /etc exists
|
||||
vconsole_dir: Path = self.target / 'etc'
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
from typing import override
|
||||
|
||||
from archinstall.lib.locale.utils import list_keyboard_languages, list_locales, set_kb_layout
|
||||
from archinstall.lib.locale.utils import list_console_fonts, list_keyboard_languages, list_locales, set_kb_layout
|
||||
from archinstall.lib.menu.abstract_menu import AbstractSubMenu
|
||||
from archinstall.lib.menu.helpers import Selection
|
||||
from archinstall.lib.models.locale import LocaleConfiguration
|
||||
|
|
@ -47,6 +47,13 @@ class LocaleMenu(AbstractSubMenu[LocaleConfiguration]):
|
|||
preview_action=lambda item: item.get_value(),
|
||||
key='sys_enc',
|
||||
),
|
||||
MenuItem(
|
||||
text=tr('Console font'),
|
||||
action=select_console_font,
|
||||
value=self._locale_conf.console_font,
|
||||
preview_action=lambda item: item.get_value(),
|
||||
key='console_font',
|
||||
),
|
||||
]
|
||||
|
||||
@override
|
||||
|
|
@ -140,3 +147,25 @@ async def select_kb_layout(preset: str | None = None) -> str | None:
|
|||
return preset
|
||||
case _:
|
||||
raise ValueError('Unhandled return type')
|
||||
|
||||
|
||||
async def select_console_font(preset: str | None = None) -> str | None:
|
||||
fonts = list_console_fonts()
|
||||
|
||||
items = [MenuItem(f, value=f) for f in fonts]
|
||||
group = MenuItemGroup(items, sort_items=False)
|
||||
group.set_focus_by_value(preset)
|
||||
|
||||
result = await Selection[str](
|
||||
header=tr('Console font'),
|
||||
group=group,
|
||||
enable_filter=True,
|
||||
).show()
|
||||
|
||||
match result.type_:
|
||||
case ResultType.Selection:
|
||||
return result.get_value()
|
||||
case ResultType.Skip:
|
||||
return preset
|
||||
case _:
|
||||
raise ValueError('Unhandled return type')
|
||||
|
|
|
|||
|
|
@ -1,3 +1,6 @@
|
|||
from functools import lru_cache
|
||||
from pathlib import Path
|
||||
|
||||
from archinstall.lib.command import SysCommand
|
||||
from archinstall.lib.exceptions import ServiceException, SysCallError
|
||||
from archinstall.lib.output import error
|
||||
|
|
@ -26,6 +29,13 @@ def list_locales() -> list[str]:
|
|||
return locales
|
||||
|
||||
|
||||
@lru_cache
|
||||
def list_console_fonts() -> list[str]:
|
||||
directory = Path('/usr/share/kbd/consolefonts')
|
||||
fonts = {path.name.split('.')[0] for path in directory.glob('*.gz')}
|
||||
return sorted(fonts)
|
||||
|
||||
|
||||
def list_x11_keyboard_languages() -> list[str]:
|
||||
return (
|
||||
SysCommand(
|
||||
|
|
|
|||
|
|
@ -10,6 +10,11 @@ class LocaleConfiguration:
|
|||
kb_layout: str
|
||||
sys_lang: str
|
||||
sys_enc: str
|
||||
# this is the default used in ISO other option for hdpi screens TER16x32
|
||||
# can be checked using
|
||||
# zgrep "CONFIG_FONT" /proc/config.gz
|
||||
# https://wiki.archlinux.org/title/Linux_console#Font
|
||||
console_font: str = 'default8x16'
|
||||
|
||||
@classmethod
|
||||
def default(cls) -> Self:
|
||||
|
|
@ -23,12 +28,14 @@ class LocaleConfiguration:
|
|||
'kb_layout': self.kb_layout,
|
||||
'sys_lang': self.sys_lang,
|
||||
'sys_enc': self.sys_enc,
|
||||
'console_font': self.console_font,
|
||||
}
|
||||
|
||||
def preview(self) -> str:
|
||||
output = '{}: {}\n'.format(tr('Keyboard layout'), self.kb_layout)
|
||||
output += '{}: {}\n'.format(tr('Locale language'), self.sys_lang)
|
||||
output += '{}: {}'.format(tr('Locale encoding'), self.sys_enc)
|
||||
output += '{}: {}\n'.format(tr('Locale encoding'), self.sys_enc)
|
||||
output += '{}: {}'.format(tr('Console font'), self.console_font)
|
||||
return output
|
||||
|
||||
def _load_config(self, args: dict[str, str]) -> None:
|
||||
|
|
@ -38,6 +45,8 @@ class LocaleConfiguration:
|
|||
self.sys_enc = args['sys_enc']
|
||||
if 'kb_layout' in args:
|
||||
self.kb_layout = args['kb_layout']
|
||||
if 'console_font' in args:
|
||||
self.console_font = args['console_font']
|
||||
|
||||
@classmethod
|
||||
def parse_arg(cls, args: dict[str, Any]) -> Self:
|
||||
|
|
|
|||
|
|
@ -252,6 +252,9 @@ msgstr ""
|
|||
msgid "Locale encoding"
|
||||
msgstr ""
|
||||
|
||||
msgid "Console font"
|
||||
msgstr ""
|
||||
|
||||
msgid "Drive(s)"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
|||
|
|
@ -256,6 +256,9 @@ msgstr "Мова локалізації"
|
|||
msgid "Locale encoding"
|
||||
msgstr "Кодування локалізації"
|
||||
|
||||
msgid "Console font"
|
||||
msgstr "Шрифт консолі"
|
||||
|
||||
msgid "Drive(s)"
|
||||
msgstr "Диск(и)"
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue