From f4c1c9ebbf69cc7ee695abe666c339222d5f1fb5 Mon Sep 17 00:00:00 2001 From: coolGi Date: Sun, 26 Mar 2023 16:03:02 +1030 Subject: [PATCH] Moved OS getting utils to its own Platform enum. --- .../core/config/gui/EmbeddedFrameUtil.java | 18 ++-- .../seibel/lod/core/jar/DarkModeDetector.java | 5 +- .../com/seibel/lod/core/jar/JarUtils.java | 18 ++-- .../com/seibel/lod/core/jar/Platform.java | 94 +++++++++++++++++++ 4 files changed, 119 insertions(+), 16 deletions(-) create mode 100644 core/src/main/java/com/seibel/lod/core/jar/Platform.java diff --git a/core/src/main/java/com/seibel/lod/core/config/gui/EmbeddedFrameUtil.java b/core/src/main/java/com/seibel/lod/core/config/gui/EmbeddedFrameUtil.java index 5202a468c..9b946321b 100644 --- a/core/src/main/java/com/seibel/lod/core/config/gui/EmbeddedFrameUtil.java +++ b/core/src/main/java/com/seibel/lod/core/config/gui/EmbeddedFrameUtil.java @@ -1,6 +1,6 @@ package com.seibel.lod.core.config.gui; -import org.lwjgl.system.*; +import com.seibel.lod.core.jar.Platform; import org.lwjgl.system.jawt.JAWT; import org.lwjgl.system.macosx.*; @@ -18,6 +18,12 @@ import static org.lwjgl.system.macosx.ObjCRuntime.*; // Some of the code is from https://github.com/LWJGL/lwjgl3/blob/master/modules/samples/src/test/java/org/lwjgl/demo/system/jawt/EmbeddedFrameUtil.java // which is licensed under https://www.lwjgl.org/license +/** + * Some utils for embeding awt and swing items into lwjgl windows + * + * @author Ran + * @author coolGi + */ public final class EmbeddedFrameUtil { private static final int JAVA_VERSION; @@ -45,10 +51,10 @@ public final class EmbeddedFrameUtil { switch (Platform.get()) { case LINUX: return "sun.awt.X11.XEmbeddedFrame"; - case MACOSX: - return "sun.lwawt.macosx.CViewEmbeddedFrame"; case WINDOWS: return "sun.awt.windows.WEmbeddedFrame"; + case MACOS: + return "sun.lwawt.macosx.CViewEmbeddedFrame"; default: throw new IllegalStateException(); } @@ -58,11 +64,11 @@ public final class EmbeddedFrameUtil { switch (Platform.get()) { case LINUX: return glfwGetX11Window(window); - case MACOSX: - long objc_msgSend = ObjCRuntime.getLibrary().getFunctionAddress("objc_msgSend"); - return invokePPP(glfwGetCocoaWindow(window), sel_getUid("contentView"), objc_msgSend); case WINDOWS: return glfwGetWin32Window(window); + case MACOS: + long objc_msgSend = ObjCRuntime.getLibrary().getFunctionAddress("objc_msgSend"); + return invokePPP(glfwGetCocoaWindow(window), sel_getUid("contentView"), objc_msgSend); default: throw new IllegalStateException(); } diff --git a/core/src/main/java/com/seibel/lod/core/jar/DarkModeDetector.java b/core/src/main/java/com/seibel/lod/core/jar/DarkModeDetector.java index db0e7e403..d7ba37c84 100644 --- a/core/src/main/java/com/seibel/lod/core/jar/DarkModeDetector.java +++ b/core/src/main/java/com/seibel/lod/core/jar/DarkModeDetector.java @@ -19,12 +19,15 @@ public class DarkModeDetector { private static final String DARK_THEME_CMD = REGQUERY_UTIL + "\"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\"" + " /v AppsUseLightTheme"; public static boolean isDarkMode() { - switch (JarUtils.getOperatingSystem()) { + switch (Platform.get()) { case WINDOWS: return isWindowsDarkMode(); case MACOS: return isMacOsDarkMode(); case LINUX: + // Most Unix(-like) distros also use a lot of the same things as Linux (like desktop environments and window managers) + case BSD: + case UNIX: return checkLinuxDark(); default: return false; diff --git a/core/src/main/java/com/seibel/lod/core/jar/JarUtils.java b/core/src/main/java/com/seibel/lod/core/jar/JarUtils.java index d071f8f84..47b47260f 100644 --- a/core/src/main/java/com/seibel/lod/core/jar/JarUtils.java +++ b/core/src/main/java/com/seibel/lod/core/jar/JarUtils.java @@ -105,17 +105,17 @@ public class JarUtils { } + /** Please use the Platform enum instead */ + @Deprecated public enum OperatingSystem {WINDOWS, MACOS, LINUX, NONE} // Easy to use enum for the 3 main os's + /** Please use the Platform enum instead */ + @Deprecated public static OperatingSystem getOperatingSystem() { // Get the os and turn it into that enum - String os = System.getProperty("os.name").toLowerCase(); - if (os.contains("win")) { - return OperatingSystem.WINDOWS; - } else if (os.contains("mac")) { - return OperatingSystem.MACOS; - } else if (os.contains("nix") || os.contains("nux")) { - return OperatingSystem.LINUX; - } else { - return OperatingSystem.NONE; + switch (Platform.get()) { + case WINDOWS: return OperatingSystem.WINDOWS; + case LINUX: return OperatingSystem.LINUX; + case MACOS: return OperatingSystem.MACOS; + default: return OperatingSystem.NONE; } } } diff --git a/core/src/main/java/com/seibel/lod/core/jar/Platform.java b/core/src/main/java/com/seibel/lod/core/jar/Platform.java new file mode 100644 index 000000000..28709d379 --- /dev/null +++ b/core/src/main/java/com/seibel/lod/core/jar/Platform.java @@ -0,0 +1,94 @@ +package com.seibel.lod.core.jar; + +/** + * A simple OS getting util based off LWJGL's Platform at org.lwjgl.system.Platform.
+ * This version includes some extra utils that we need and removes stuff which we don't. + * + * @author coolGi + */ +public enum Platform { + WINDOWS("Windows", false), + LINUX("Linux", true), + MACOS("macOS", true), + BSD("BSD", true), + UNIX("Unix", true); + + public enum Architecture { + X86(false), + X64(true), + ARM32(false), + ARM64(true); + + static final Architecture current; + final boolean is64Bit; + + static { + String osArch = System.getProperty("os.arch"); + boolean is64Bit = osArch.contains("64") || osArch.startsWith("armv8"); + + current = osArch.startsWith("arm") || osArch.startsWith("aarch64") + ? (is64Bit ? ARM64 : ARM32) + : (is64Bit ? X64 : X86); + } + + Architecture(boolean is64Bit) { + this.is64Bit = is64Bit; + } + } + + private static final Platform current; + + static { + String osName = System.getProperty("os.name").toLowerCase(); + if (osName.contains("windows")) { // Proper name is "Windows" + current = WINDOWS; + } else if (osName.contains("linux")) { // Proper name is "Linux" + current = LINUX; + } else if (osName.contains("mac") || osName.contains("darwin")) { // For MacOS it should either output "Mac OS X" or "Darwin" depending on the version of MacOS + current = MACOS; + } else if (osName.startsWith("bsd")) { // Depending on the BSD distro this will be different + current = BSD; + } else if (osName.startsWith("unix")) { // In case you are running some very niece OS which didnt change their OS name from Unix + current = UNIX; + } else { + // We only test on Windows, Linux and MacOS + // If you use a different os (eg, BSD, Unix) then it may or may not work + // Otherwise, good luck + throw new LinkageError("Unknown platform: " + osName); + } + } + + private final String name; + private final boolean isUnix; + + Platform(String name, boolean isUnix) { + this.name = name; + this.isUnix = isUnix; + } + + /** Returns the platform name. */ + public String getName() { + return name; + } + + /** Returns weather the OS is Unix or Unix-Like OS */ + public boolean isUnix() { + return isUnix; + } + + /** Returns the platform on which the library is running. */ + public static Platform get() { + return current; + } + + /** Returns the architecture on which the library is running. */ + public static Architecture getArchitecture() { + return Architecture.current; + } + + + @Override + public String toString() { + return this.getName(); + } +}