From 322e29642d81e8096a47f484e658c9c23d38a9cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minecraft-=E6=B8=A9=E8=BF=AA?= <124678228+YiZhiMCQiu@users.noreply.github.com> Date: Mon, 27 Oct 2025 21:45:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AA=E5=9C=A8=E6=9C=AA=E8=A2=AB=E6=89=93?= =?UTF-8?q?=E5=8C=85=E4=B8=BA=20App=20=E6=97=B6=E8=AE=BE=E7=BD=AE=20macOS?= =?UTF-8?q?=20Dock=20=E6=A0=8F=E5=9B=BE=E6=A0=87=20(#4698)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Glavo --- .../java/org/jackhuang/hmcl/EntryPoint.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java b/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java index dc8ba26d8..7f13f54e3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java @@ -21,6 +21,8 @@ import org.jackhuang.hmcl.util.FileSaver; import org.jackhuang.hmcl.util.SelfDependencyPatcher; import org.jackhuang.hmcl.util.SwingUtils; import org.jackhuang.hmcl.java.JavaRuntime; +import org.jackhuang.hmcl.util.io.FileUtils; +import org.jackhuang.hmcl.util.io.JarUtils; import org.jackhuang.hmcl.util.platform.OperatingSystem; import java.io.IOException; @@ -28,6 +30,7 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.nio.file.Files; +import java.nio.file.Path; import java.util.concurrent.CancellationException; import static org.jackhuang.hmcl.util.logging.Logger.LOG; @@ -49,7 +52,7 @@ public final class EntryPoint { setupJavaFXVMOptions(); checkDirectoryPath(); - if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS) + if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS && !isInsideMacAppBundle()) initIcon(); checkJavaFX(); @@ -159,6 +162,25 @@ public final class EntryPoint { } } + private static boolean isInsideMacAppBundle() { + Path thisJar = JarUtils.thisJarPath(); + if (thisJar == null) + return false; + + for (Path current = thisJar.getParent(); + current != null && current.getParent() != null; + current = current.getParent() + ) { + if ("Contents".equals(FileUtils.getName(current)) + && FileUtils.getName(current.getParent()).endsWith(".app") + && Files.exists(current.resolve("Info.plist")) + ) { + return true; + } + } + return false; + } + private static void initIcon() { try { if (java.awt.Taskbar.isTaskbarSupported()) {