diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 9f8c51b2bd..a1313b9f71 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -927,6 +927,11 @@ def minimal_installation( if locale_config: self.set_vconsole(locale_config) + # fonts that are in the ISO but not on target + # unless we specifically request it before base + # otherwise mkinitcpio will be screaming at you + if locale_config.console_font.startswith('ter-'): + self._base_packages.append('terminus-font') self.pacman.strap(self._base_packages) self._helper_flags['base-strapped'] = True @@ -1979,23 +1984,14 @@ def chown(self, owner: str, path: str, options: list[str] = []) -> bool: return False 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: str = locale_config.console_font - font_vconsole = 'default8x16' - - # Ensure /etc exists vconsole_dir: Path = self.target / 'etc' vconsole_dir.mkdir(parents=True, exist_ok=True) vconsole_path: Path = vconsole_dir / 'vconsole.conf' - # Write both KEYMAP and FONT to vconsole.conf vconsole_content = f'KEYMAP={kb_vconsole}\n' - # Corrects another warning vconsole_content += f'FONT={font_vconsole}\n' vconsole_path.write_text(vconsole_content) diff --git a/archinstall/lib/locale/locale_menu.py b/archinstall/lib/locale/locale_menu.py index c03824a145..dc743fd358 100644 --- a/archinstall/lib/locale/locale_menu.py +++ b/archinstall/lib/locale/locale_menu.py @@ -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 @@ def _define_menu_options(self) -> list[MenuItem]: 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') diff --git a/archinstall/lib/locale/utils.py b/archinstall/lib/locale/utils.py index e72291606b..1ebea08885 100644 --- a/archinstall/lib/locale/utils.py +++ b/archinstall/lib/locale/utils.py @@ -1,5 +1,6 @@ from archinstall.lib.command import SysCommand from archinstall.lib.exceptions import ServiceException, SysCallError +from archinstall.lib.linux_path import LPath from archinstall.lib.output import error from archinstall.lib.utils.util import running_from_iso @@ -109,3 +110,16 @@ def list_timezones() -> list[str]: .decode() .splitlines() ) + + +def list_console_fonts() -> list[str]: + fonts: list[str] = [] + font_dir = LPath('/usr/share/kbd/consolefonts') + if font_dir.exists(): + for f in font_dir.iterdir(): + # do not ask me there are readme files in here + if not f.name.startswith('README'): + name = f.name.removesuffix('.gz').removesuffix('.psfu').removesuffix('.psf') + fonts.append(name) + + return sorted(fonts, key=lambda x: (len(x), x)) diff --git a/archinstall/lib/models/locale.py b/archinstall/lib/models/locale.py index 15dee2f66c..f6f41abac3 100644 --- a/archinstall/lib/models/locale.py +++ b/archinstall/lib/models/locale.py @@ -10,6 +10,7 @@ class LocaleConfiguration: kb_layout: str sys_lang: str sys_enc: str + console_font: str = 'default8x16' @classmethod def default(cls) -> Self: @@ -23,12 +24,14 @@ def json(self) -> dict[str, str]: '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 +41,8 @@ def _load_config(self, args: dict[str, str]) -> None: 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: