Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Application/ModernSetupApp/ModernSetupApp.c
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ UefiMain (
if ((Focus == SetupFocusContent) && (Page == PagePreferences) && mModernSetupPreferencePopupOpen) {
ModernSetupHandlePreferencePopupUp ();
} else if ((Focus == SetupFocusContent) && (Page == PageExit) && mModernSetupLanguageDropdownOpen) {
mModernSetupLanguageDropdownSelection = (mModernSetupLanguageDropdownSelection == 0) ? 1 : 0;
mModernSetupLanguageDropdownSelection = (mModernSetupLanguageDropdownSelection == 0) ? (MODERN_SETUP_LANGUAGE_OPTION_COUNT - 1) : (mModernSetupLanguageDropdownSelection - 1);
} else if ((Focus == SetupFocusContent) && (Page == PageDashboard)) {
if (ModernSetupGetDashboardQuickGrid (&Ui, mModernSetupPreferences.DashboardDensity, &DashboardGrid) &&
(DashboardSelection >= DashboardGrid.CardsPerRow))
Expand All @@ -437,7 +437,7 @@ UefiMain (
if ((Focus == SetupFocusContent) && (Page == PagePreferences) && mModernSetupPreferencePopupOpen) {
ModernSetupHandlePreferencePopupDown ();
} else if ((Focus == SetupFocusContent) && (Page == PageExit) && mModernSetupLanguageDropdownOpen) {
mModernSetupLanguageDropdownSelection = (mModernSetupLanguageDropdownSelection + 1) % 2;
mModernSetupLanguageDropdownSelection = (mModernSetupLanguageDropdownSelection + 1) % MODERN_SETUP_LANGUAGE_OPTION_COUNT;
} else if (Focus == SetupFocusNav) {
if (ModernSetupGetPageSelectableCount (&Ui, Page) > 0) {
Focus = SetupFocusContent;
Expand Down
44 changes: 38 additions & 6 deletions Application/ModernSetupApp/ModernSetupAppActions.c
Original file line number Diff line number Diff line change
Expand Up @@ -530,22 +530,54 @@ ModernSetupGetLanguageOptionName (
IN UINTN Selection
)
{
return (Selection == 0) ?
ModernUiGetString (ModernUiStringLanguageChinese) :
ModernUiGetString (ModernUiStringLanguageEnglish);
switch (Selection) {
case 0:
return ModernUiGetString (ModernUiStringLanguageChinese);
case 2:
return ModernUiGetString (ModernUiStringLanguageRussian);
case 1:
default:
return ModernUiGetString (ModernUiStringLanguageEnglish);
}
}

/**
Return TRUE when the active UI language is Russian.

@retval TRUE Active language starts with "ru".
@retval FALSE Active language is another supported language.
**/
STATIC
BOOLEAN
IsRussianLanguage (
VOID
)
{
CONST CHAR8 *Language;

Language = ModernUiGetLanguage ();
return (BOOLEAN)((Language[0] == 'r') && (Language[1] == 'u'));
}

/**
Return the selector index for the active language.

@return Zero for Chinese, one for English.
@return Zero for Chinese, two for Russian, one for English.
**/
UINTN
ModernSetupGetActiveLanguageSelection (
VOID
)
{
return IsChineseLanguage () ? 0 : 1;
if (IsChineseLanguage ()) {
return 0;
}

if (IsRussianLanguage ()) {
return 2;
}

return 1;
}

/**
Expand Down Expand Up @@ -1135,7 +1167,7 @@ ApplyLanguageSelection (
return;
}

Language = (Selection == 0) ? "zh-Hans" : "en-US";
Language = (Selection == 0) ? "zh-Hans" : ((Selection == 2) ? "ru-RU" : "en-US");
Status = ModernUiSetLanguage (Language, TRUE);
LanguageName = ModernSetupGetLanguageOptionName (ModernSetupGetActiveLanguageSelection ());

Expand Down
3 changes: 3 additions & 0 deletions Application/ModernSetupApp/ModernSetupAppChrome.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ STATIC CONST PAGE_DESCRIPTOR mPages[] = {
{ PageManagement, ModernUiStringPageManagement, ModernUiStringPageManagementHint },
{ PagePower, ModernUiStringPagePower, ModernUiStringPagePowerHint },
{ PagePerformance, ModernUiStringPagePerformance, ModernUiStringPagePerformanceHint },
{ PageQuickSettings, ModernUiStringPageQuickSettings, ModernUiStringPageQuickSettingsHint },
{ PageServerInventory, ModernUiStringPageServerInventory, ModernUiStringPageServerInventoryHint },
{ PagePreferences, ModernUiStringPagePreferences, ModernUiStringPagePreferencesHint },
{ PageExit, ModernUiStringPageExit, ModernUiStringPageExitHint }
Expand All @@ -37,6 +38,7 @@ STATIC CONST CHAR16 *mEnglishCompactTabLabels[] = {
L"Mgmt",
L"Power",
L"Perf",
L"Quick",
L"Assets",
L"Prefs",
L"Exit"
Expand All @@ -53,6 +55,7 @@ STATIC CONST CHAR16 *mChineseCompactTabLabels[] = {
L"管理",
L"电源",
L"性能",
L"设置",
L"资产",
L"偏好",
L"退出"
Expand Down
8 changes: 8 additions & 0 deletions Application/ModernSetupApp/ModernSetupAppInternal.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,13 @@
#define MODERN_SETUP_EXIT_ROW_COUNT 4
#define MODERN_SETUP_EXIT_VALUE_WIDTH 220

//
// Language selector options, in selector-index order: 0 Chinese, 1 English,
// 2 Russian. Keep the dropdown cycle, draw loop, and option-name/apply mapping
// in sync with this count.
//
#define MODERN_SETUP_LANGUAGE_OPTION_COUNT 3

typedef enum {
PageDashboard = 0,
PageSystemInfo,
Expand All @@ -90,6 +97,7 @@ typedef enum {
PageManagement,
PagePower,
PagePerformance,
PageQuickSettings,
PageServerInventory,
PagePreferences,
PageExit,
Expand Down
111 changes: 109 additions & 2 deletions Application/ModernSetupApp/ModernSetupAppPages.c
Original file line number Diff line number Diff line change
Expand Up @@ -1680,6 +1680,110 @@ SnapshotCapabilityText (
return CapabilityText (Present);
}

/**
Draw the Quick Settings page: high-churn platform knobs grouped by domain.

Tier-B prototype per Docs/ConfigurableItemsAndQuickSettings.md. This curates
the read-only policy-entry presence hints the providers already discover
(SR-IOV, Above-4G, ASPM, VT-d/IOMMU, RAS, Secure Boot, ...) into one screen so
a user can see, at a glance, which high-churn settings this platform exposes.
It is intentionally read-only: changing any of these stays in native
FormBrowser. (Per-row SendForm deep-link is a follow-up slice.)

@param[in] Ui Initialized render context. Must not be NULL.
@param[in] Theme Theme token table. Must not be NULL.
@param[in] Focus Current focus area.
**/
STATIC
VOID
MODERN_SETUP_NOINLINE
DrawQuickSettings (
IN MODERN_UI_RENDER_CONTEXT *Ui,
IN CONST MODERN_UI_THEME *Theme,
IN SETUP_FOCUS Focus
)
{
MODERN_SETUP_PROVIDER_SNAPSHOT Providers;
MODERN_UI_RECT Content;
MODERN_UI_RECT Panel;
MODERN_UI_RECT Column;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;
UINTN LeftWidth;
UINTN RightWidth;
UINTN RowY;
CONST CHAR16 *SecureBootText;

ModernSetupGetCachedProviderSnapshot (&Providers);

SecureBootText = (Providers.Security.SecureBoot == ModernUiSecurityStateEnabled) ? ModernUiGetString (ModernUiStringEnabled) :
((Providers.Security.SecureBoot == ModernUiSecurityStateDisabled) ? ModernUiGetString (ModernUiStringDisabled) : ModernUiGetString (ModernUiStringUnknown));

Content = ModernSetupContentRect (Ui);
Panel = (MODERN_UI_RECT){ Content.X, Content.Y, Content.Width, MIN (Content.Height, 540) };
Background = ModernUiBlendColor (Theme->Surface, Theme->BackgroundBlack, 30);
DrawProviderSummarySection (Ui, Theme, Panel, L"Quick Settings", TRUE);
ModernUiDrawFocusFrame (Ui, Panel, (BOOLEAN)(Focus == SetupFocusContent), Theme);
ModernUiDrawTextFit (
Ui,
Panel.X + 22,
Panel.Y + 38,
Panel.Width - 44,
L"Read-only entry points to high-churn settings. Change them in native setup.",
Theme->MutedText,
Background
);

if (Panel.Width >= 720) {
LeftWidth = (Panel.Width - 60) / 2;
RightWidth = Panel.Width - 60 - LeftWidth;
} else {
LeftWidth = Panel.Width - 44;
RightWidth = 0;
}

Column = (MODERN_UI_RECT){ Panel.X + 22, Panel.Y + 70, LeftWidth, Panel.Height - 86 };
RowY = Column.Y;
DrawProviderSubsectionHeader (Ui, Theme, Column.X, RowY, Column.Width, L"Virtualization & Isolation");
RowY += 22;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, L"VT-d / IOMMU", SnapshotCapabilityText (Providers.PcieStatus, (BOOLEAN)(Providers.Pcie.IommuPolicyEntryPresent || Providers.Pcie.IoMmuProtocolPresent)));
RowY += 26;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, L"SR-IOV", SnapshotCapabilityText (Providers.PcieStatus, Providers.Pcie.SriovPolicyEntryPresent));
RowY += 26;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, L"ACS / ARI", SnapshotCapabilityText (Providers.PcieStatus, (BOOLEAN)(Providers.Pcie.AcsPolicyEntryPresent || Providers.Pcie.AriPolicyEntryPresent)));
RowY += 26;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, L"CPU virtualization", SnapshotCapabilityText (Providers.PerformanceStatus, Providers.Performance.VirtualizationPolicyEntryPresent));
RowY += 36;

DrawProviderSubsectionHeader (Ui, Theme, Column.X, RowY, Column.Width, L"Security");
RowY += 22;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, ModernUiGetString (ModernUiStringSecureBoot), SecureBootText);
RowY += 26;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, L"TPM (TCG2)", SnapshotCapabilityText (Providers.SecurityStatus, (BOOLEAN)(Providers.Security.Tcg2Protocol == ModernUiSecurityStateEnabled)));

if (RightWidth == 0) {
return;
}

Column = (MODERN_UI_RECT){ Panel.X + 38 + LeftWidth, Panel.Y + 70, RightWidth, Panel.Height - 86 };
RowY = Column.Y;
DrawProviderSubsectionHeader (Ui, Theme, Column.X, RowY, Column.Width, L"PCIe Resource");
RowY += 22;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, L"Above 4G Decoding", SnapshotCapabilityText (Providers.PcieStatus, Providers.Pcie.Above4GPolicyEntryPresent));
RowY += 26;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, L"Resizable BAR", SnapshotCapabilityText (Providers.PcieStatus, Providers.Pcie.ResizeBarPolicyEntryPresent));
RowY += 26;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, L"ASPM", SnapshotCapabilityText (Providers.PcieStatus, Providers.Pcie.AspmPolicyEntryPresent));
RowY += 26;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, L"Hot-Plug", SnapshotCapabilityText (Providers.PcieStatus, Providers.Pcie.HotPlugPolicyEntryPresent));
RowY += 36;

DrawProviderSubsectionHeader (Ui, Theme, Column.X, RowY, Column.Width, L"Tuning / Serviceability");
RowY += 22;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, L"RAS policy", SnapshotCapabilityText (Providers.PerformanceStatus, Providers.Performance.RasPolicyEntryPresent));
RowY += 26;
DrawProviderSummaryInfoRow (Ui, Theme, Column.X, RowY, Column.Width, L"PCIe config page", SnapshotCapabilityText (Providers.PcieStatus, Providers.Pcie.PciePolicyEntryPresent));
}

/**
Draw a compact read-only Server Inventory summary from app provider snapshots.

Expand Down Expand Up @@ -2092,11 +2196,11 @@ DrawExit (

DropdownX = RowX + RowWidth - ValueWidth - 12;
DropdownY = Panel.Y + MODERN_SETUP_EXIT_ROW_TOP + MODERN_SETUP_EXIT_ROW_COUNT * MODERN_SETUP_EXIT_ROW_STRIDE - 8;
PopupModel.Rect = (MODERN_UI_RECT){ DropdownX, DropdownY, ValueWidth, 80 };
PopupModel.Rect = (MODERN_UI_RECT){ DropdownX, DropdownY, ValueWidth, 14 + MODERN_SETUP_LANGUAGE_OPTION_COUNT * 34 };
PopupModel.Title = NULL;
ModernUiEngineDrawPopup (Ui, &PopupModel, Theme);

for (Option = 0; Option < 2; Option++) {
for (Option = 0; Option < MODERN_SETUP_LANGUAGE_OPTION_COUNT; Option++) {
IsSelected = (BOOLEAN)(Option == mModernSetupLanguageDropdownSelection);
RowModel.Rect = (MODERN_UI_RECT){ DropdownX + 6, DropdownY + 7 + Option * 34, ValueWidth - 12, 30 };
RowModel.Prompt = ModernSetupGetLanguageOptionName (Option);
Expand Down Expand Up @@ -2172,6 +2276,9 @@ ModernSetupDrawCurrentPage (
case PagePerformance:
DrawPerformance (Ui, Theme, Focus);
break;
case PageQuickSettings:
DrawQuickSettings (Ui, Theme, Focus);
break;
case PageServerInventory:
DrawServerInventorySummary (Ui, Theme, Focus);
break;
Expand Down
33 changes: 33 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,39 @@ this file as both a release log and a lightweight development progress record.

### Added

- **Russian (ru) UI language.** The language selector is now three-way
(Chinese / English / Russian); selecting Русский switches the whole
ModernSetupApp UI to Russian. The Cyrillic glyph subset is baked from
Noto Sans CJK SC (SIL OFL 1.1) into the shared built-in glyph table with
per-glyph proportional advance and baseline alignment, so Cyrillic renders
anti-aliased and properly spaced alongside the Latin/CJK glyphs. Translations
are a best-effort technical pass pending native review.

### Changed

- **Native HII form right rail now shows real SMBIOS system data.** The
in-setup chrome's right rail previously displayed a static, partly-placeholder
telemetry panel; it now sources System (SMBIOS Type 1), Processor
(architecture + Type 4 model) and Memory (Type 17 type/speed) from the shared
ModernUiPlatformTablesLib, with an honest Sensors slot (N/A until a physical
platform supplies live readings). Empty fields fall back cleanly, so QEMU
shows what its SMBIOS provides and a real board shows its written identity.
- **Native HII forms get an honest breadcrumb title bar.** On forms reached
via SendForm, the decorative five-category tab strip (which read as clickable
but performed no navigation -- FormBrowser owns Esc=back / arrows=move) is
replaced by a "<category> > <form title>" breadcrumb that makes the real form
identity prominent. The native front page keeps its menu tabs.
- **Native HII forms look cleaner when entered through the modern engine.**
Removed the decorative telemetry rail (a static, partly-placeholder
CPU/Architecture/Memory/Voltage panel) that the DisplayEngine drew on the
right of every FormBrowser form; the form now reclaims that width and shows
no fake data. Also dropped the permanent "LIVE VIEW" footer status pill,
which carried no information and rendered as a clipped stub -- only
actionable states (unsaved / reboot / modal / live-refresh) surface a pill
now. Affects both the GOP and LVGL backends.

### Added

- The ModernSetupApp header now shows the UI release version (e.g.
"Modern UEFI Setup v1.1.0"), so a running UI can be matched to a specific
release on screen. The version is a single source of truth in
Expand Down
3 changes: 3 additions & 0 deletions Include/ModernUi/ModernUiString.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,9 @@ typedef enum {
ModernUiStringPreferenceDefaultsLoaded,
ModernUiStringPageSystemInfo,
ModernUiStringPageSystemInfoHint,
ModernUiStringPageQuickSettings,
ModernUiStringPageQuickSettingsHint,
ModernUiStringLanguageRussian,
ModernUiStringMax
} MODERN_UI_STRING_ID;

Expand Down
Loading
Loading