diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java b/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java index 52391c805..83623c86d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java @@ -51,8 +51,11 @@ public final class EntryPoint { setupJavaFXVMOptions(); - if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS && !isInsideMacAppBundle()) - initIcon(); + if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS) { + System.getProperties().putIfAbsent("apple.awt.application.appearance", "system"); + if (!isInsideMacAppBundle()) + initIcon(); + } checkJavaFX(); verifyJavaFX(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/theme/Themes.java b/HMCL/src/main/java/org/jackhuang/hmcl/theme/Themes.java index 0ad793038..3e01293ef 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/theme/Themes.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/theme/Themes.java @@ -32,6 +32,9 @@ import org.glavo.monetfx.beans.property.ColorSchemeProperty; import org.glavo.monetfx.beans.property.ReadOnlyColorSchemeProperty; import org.glavo.monetfx.beans.property.SimpleColorSchemeProperty; import org.jackhuang.hmcl.ui.FXUtils; +import org.jackhuang.hmcl.util.platform.OperatingSystem; +import org.jackhuang.hmcl.util.platform.SystemUtils; +import org.jackhuang.hmcl.util.platform.windows.WinReg; import java.util.ArrayList; import java.util.List; @@ -65,7 +68,7 @@ public final class Themes { if (FXUtils.DARK_MODE != null) { yield FXUtils.DARK_MODE.get() ? Brightness.DARK : Brightness.LIGHT; } else { - yield Brightness.DEFAULT; + yield getDefaultBrightness(); } } case "dark" -> Brightness.DARK; @@ -97,6 +100,34 @@ public final class Themes { theme.addListener(listener); } + private static Brightness defaultBrightness; + + private static Brightness getDefaultBrightness() { + if (defaultBrightness != null) + return defaultBrightness; + + Brightness brightness = Brightness.DEFAULT; + if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { + WinReg reg = WinReg.INSTANCE; + if (reg != null) { + Object appsUseLightTheme = reg.queryValue(WinReg.HKEY.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", "AppsUseLightTheme"); + if (appsUseLightTheme instanceof Integer value) { + brightness = value == 0 ? Brightness.DARK : Brightness.LIGHT; + } + } + } else if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS) { + try { + String result = SystemUtils.run("/usr/bin/defaults", "read", "-g", "AppleInterfaceStyle").trim(); + brightness = "Dark".equalsIgnoreCase(result) ? Brightness.DARK : Brightness.LIGHT; + } catch (Exception e) { + // If the key does not exist, it means Light mode is used + brightness = Brightness.LIGHT; + } + } + + return defaultBrightness = brightness; + } + public static ObjectExpression themeProperty() { return theme; } 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 b03bed7ca..d0f1e3bc8 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 @@ -44,7 +44,6 @@ import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.javafx.SafeStringConverter; import java.util.Arrays; -import java.util.List; import java.util.Locale; import java.util.Optional; @@ -87,11 +86,8 @@ public class PersonalizationPage extends StackPane { brightnessPane.setLeft(left); - JFXComboBox cboBrightness = new JFXComboBox<>(FXCollections.observableArrayList( - FXUtils.DARK_MODE != null - ? List.of("auto", "light", "dark") - : List.of("light", "dark") - )); + JFXComboBox cboBrightness = new JFXComboBox<>(); + cboBrightness.getItems().setAll("auto", "light", "dark"); cboBrightness.setConverter(FXUtils.stringConverter(name -> i18n("settings.launcher.brightness." + name))); cboBrightness.valueProperty().bindBidirectional(config().themeBrightnessProperty()); brightnessPane.setRight(cboBrightness);