From 4680674da19239c03d004a41f951ab046d09c383 Mon Sep 17 00:00:00 2001 From: aftree-sp Date: Mon, 4 May 2026 10:22:02 +0800 Subject: [PATCH 1/2] Add UI scale setting to personalization page Allows users to configure HMCL UI scaling (100%-300%) via the personalization settings page. The setting is read from global config.json before JavaFX initializes so it takes effect on restart. Co-authored-by: yi159 <> --- .gitignore | 6 ++++ .../java/org/jackhuang/hmcl/EntryPoint.java | 31 +++++++++++++++++++ .../jackhuang/hmcl/setting/GlobalConfig.java | 18 +++++++++++ .../hmcl/ui/main/PersonalizationPage.java | 23 ++++++++++++++ .../resources/assets/lang/I18N.properties | 3 ++ .../assets/lang/I18N_zh_CN.properties | 3 ++ 6 files changed, 84 insertions(+) diff --git a/.gitignore b/.gitignore index 93689ac3ce..f31f099809 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,9 @@ language-subtag-registry !/.gemini/config.yaml .codex /.gradle-*/ + +# local/tools +.workbuddy/ +node_modules/ +/package.json +/package-lock.json diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java b/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java index 1bf9ee07ac..cba3af2504 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java @@ -25,6 +25,8 @@ import org.jackhuang.hmcl.util.io.JarUtils; import org.jackhuang.hmcl.util.platform.OperatingSystem; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import javax.swing.JOptionPane; import java.io.IOException; import java.lang.invoke.MethodHandle; @@ -52,6 +54,7 @@ public static void main(String[] args) { checkWine(); + applyUiScaleFromGlobalConfig(); setupJavaFXVMOptions(); if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS) { @@ -74,6 +77,34 @@ public static void exit(int exitCode) { System.exit(exitCode); } + /// Reads the UI scale from the global config file and sets it as the {@code hmcl.uiScale} system property, + /// so that {@link #setupJavaFXVMOptions()} can apply it before JavaFX initializes. + /// This is needed because the config is normally loaded after JavaFX starts. + private static void applyUiScaleFromGlobalConfig() { + if (System.getProperty("hmcl.uiScale") != null || System.getenv("HMCL_UI_SCALE") != null) { + return; // already set via command line or environment variable + } + + try { + Path configPath = Metadata.HMCL_GLOBAL_DIRECTORY.resolve("config.json"); + if (!Files.isRegularFile(configPath)) { + return; + } + + String content = Files.readString(configPath); + JsonObject json = JsonParser.parseString(content).getAsJsonObject(); + if (json.has("uiScale") && !json.get("uiScale").isJsonNull()) { + String uiScale = json.get("uiScale").getAsString(); + if (uiScale != null && !uiScale.isEmpty()) { + System.setProperty("hmcl.uiScale", uiScale); + LOG.info("Applied UI scale from global config: " + uiScale); + } + } + } catch (Throwable e) { + LOG.warning("Failed to read UI scale from global config", e); + } + } + private static void setupJavaFXVMOptions() { if ("true".equalsIgnoreCase(System.getenv("HMCL_FORCE_GPU"))) { LOG.info("HMCL_FORCE_GPU: true"); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java index 1c43366e4f..1b0a77965a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/GlobalConfig.java @@ -134,6 +134,24 @@ public void setFontAntiAliasing(String value) { this.fontAntiAliasing.set(value); } + /// The UI scale factor for the launcher. + /// Stored as a percentage string (e.g. `"150%"`), or `null` for auto (system default). + /// This setting requires a restart to take effect, as it configures JavaFX Glass properties before toolkit initialization. + @SerializedName("uiScale") + private final StringProperty uiScale = new SimpleStringProperty(); + + public StringProperty uiScaleProperty() { + return uiScale; + } + + public @Nullable String getUiScale() { + return uiScale.get(); + } + + public void setUiScale(String value) { + this.uiScale.set(value); + } + @SerializedName("userJava") private final ObservableSet userJava = FXCollections.observableSet(new LinkedHashSet<>()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java index 40f241121d..156be14132 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/PersonalizationPage.java @@ -41,6 +41,7 @@ import org.jackhuang.hmcl.ui.construct.*; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.javafx.SafeStringConverter; +import org.jackhuang.hmcl.util.platform.OperatingSystem; import java.util.Arrays; import java.util.Locale; @@ -117,6 +118,28 @@ public PersonalizationPage() { animationButton.setTitle(i18n("settings.launcher.turn_off_animations")); animationButton.setSubtitle(i18n("settings.take_effect_after_restart")); } + { + var uiScalePane = new LineSelectButton(); + uiScalePane.setTitle(i18n("settings.launcher.ui_scale")); + uiScalePane.setSubtitle(OperatingSystem.CURRENT_OS == OperatingSystem.MACOS + ? i18n("settings.launcher.ui_scale.unsupported") + : i18n("settings.take_effect_after_restart")); + uiScalePane.setConverter(name -> "auto".equals(name) + ? i18n("settings.launcher.ui_scale.auto") + : name); + uiScalePane.setItems("auto", "100%", "125%", "150%", "175%", "200%", "250%", "300%"); + + String currentScale = globalConfig().getUiScale(); + uiScalePane.setValue(currentScale != null ? currentScale : "auto"); + FXUtils.onChange(uiScalePane.valueProperty(), value -> + globalConfig().setUiScale("auto".equals(value) ? null : value)); + + if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS) { + uiScalePane.setDisable(true); + } + + themeList.getContent().add(uiScalePane); + } content.getChildren().addAll(ComponentList.createComponentListTitle(i18n("settings.launcher.appearance")), themeList); { diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index f02e5f3bf4..faaa5d687d 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1510,6 +1510,9 @@ settings.launcher.proxy.username=Username settings.launcher.theme=Theme Color settings.launcher.title_transparent=Transparent Titlebar settings.launcher.turn_off_animations=Disable Animation +settings.launcher.ui_scale=UI Scale +settings.launcher.ui_scale.auto=Auto +settings.launcher.ui_scale.unsupported=Not supported on macOS settings.launcher.version_list_source=Version List settings.launcher.background.settings.opacity=Opacity diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index ad5b57486e..44422996d3 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1305,6 +1305,9 @@ settings.launcher.proxy.username=账户 settings.launcher.theme=主题色 settings.launcher.title_transparent=标题栏透明 settings.launcher.turn_off_animations=关闭动画 +settings.launcher.ui_scale=界面缩放 +settings.launcher.ui_scale.auto=自动 +settings.launcher.ui_scale.unsupported=macOS 不支持 settings.launcher.version_list_source=版本列表源 settings.launcher.background.settings.opacity=不透明度 From 0ba141d054e661d2761735be9ecc52f1b0c8ee16 Mon Sep 17 00:00:00 2001 From: aftree-sp Date: Mon, 4 May 2026 10:25:35 +0800 Subject: [PATCH 2/2] Add missing translation keys for I18N_zh (Traditional Chinese) Fix checkTranslations CI failure: I18N_zh.properties was missing settings.launcher.ui_scale, settings.launcher.ui_scale.auto, and settings.launcher.ui_scale.unsupported. --- HMCL/src/main/resources/assets/lang/I18N_zh.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index facce5c2a7..812408148c 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1300,6 +1300,9 @@ settings.launcher.proxy.username=帳戶 settings.launcher.theme=主題色 settings.launcher.title_transparent=標題欄透明 settings.launcher.turn_off_animations=關閉動畫 +settings.launcher.ui_scale=介面縮放 +settings.launcher.ui_scale.auto=自動 +settings.launcher.ui_scale.unsupported=macOS 不支援 settings.launcher.version_list_source=版本清單來源 settings.launcher.background.settings.opacity=不透明度