Merge branch 'main' of https://gitlab.com/jeseibel/distant-horizons-core
This commit is contained in:
@@ -10,6 +10,7 @@ import java.util.List;
|
||||
* @author coolGi
|
||||
*/
|
||||
public abstract class AbstractScreen {
|
||||
public long minecraftWindow;
|
||||
public int width;
|
||||
public int height;
|
||||
public int mouseX = 0;
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
package com.seibel.lod.core.config.gui;
|
||||
|
||||
import org.lwjgl.system.*;
|
||||
import org.lwjgl.system.jawt.JAWT;
|
||||
import org.lwjgl.system.macosx.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.util.regex.*;
|
||||
|
||||
import static org.lwjgl.glfw.GLFWNativeCocoa.*;
|
||||
import static org.lwjgl.glfw.GLFWNativeWin32.*;
|
||||
import static org.lwjgl.glfw.GLFWNativeX11.*;
|
||||
import static org.lwjgl.system.JNI.*;
|
||||
import static org.lwjgl.system.jawt.JAWTFunctions.*;
|
||||
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
|
||||
|
||||
public final class EmbeddedFrameUtil {
|
||||
|
||||
private static final int JAVA_VERSION;
|
||||
|
||||
private static final JAWT awt;
|
||||
|
||||
static {
|
||||
Pattern p = Pattern.compile("^(?:1[.])?([1-9][0-9]*)[.-]");
|
||||
Matcher m = p.matcher(System.getProperty("java.version"));
|
||||
|
||||
if (!m.find()) {
|
||||
throw new IllegalStateException("Failed to parse java.version");
|
||||
}
|
||||
|
||||
JAVA_VERSION = Integer.parseInt(m.group(1));
|
||||
|
||||
awt = JAWT.calloc();
|
||||
awt.version(JAVA_VERSION < 9 ? JAWT_VERSION_1_4 : JAWT_VERSION_9);
|
||||
if (!JAWT_GetAWT(awt)) {
|
||||
throw new RuntimeException("GetAWT failed");
|
||||
}
|
||||
}
|
||||
|
||||
private static String getEmbeddedFrameImpl() {
|
||||
switch (Platform.get()) {
|
||||
case LINUX:
|
||||
return "sun.awt.X11.XEmbeddedFrame";
|
||||
case MACOSX:
|
||||
return "sun.lwawt.macosx.CViewEmbeddedFrame";
|
||||
case WINDOWS:
|
||||
return "sun.awt.windows.WEmbeddedFrame";
|
||||
default:
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
}
|
||||
|
||||
private static long getEmbeddedFrameHandle(long window) {
|
||||
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);
|
||||
default:
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
}
|
||||
|
||||
public static Frame embeddedFrameCreate(long window) {
|
||||
if (JAVA_VERSION < 9) {
|
||||
try {
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<? extends Frame> EmdeddedFrame = (Class<? extends Frame>)Class.forName(getEmbeddedFrameImpl());
|
||||
Constructor<? extends Frame> c = EmdeddedFrame.getConstructor(long.class);
|
||||
|
||||
return c.newInstance(getEmbeddedFrameHandle(window));
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
} else {
|
||||
return nJAWT_CreateEmbeddedFrame(getEmbeddedFrameHandle(window), awt.CreateEmbeddedFrame());
|
||||
}
|
||||
}
|
||||
|
||||
static void embeddedFrameSynthesizeWindowActivation(Frame embeddedFrame, boolean doActivate) {
|
||||
if (JAVA_VERSION < 9) {
|
||||
try {
|
||||
embeddedFrame
|
||||
.getClass()
|
||||
.getMethod("synthesizeWindowActivation", boolean.class)
|
||||
.invoke(embeddedFrame, doActivate);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
} else {
|
||||
JAWT_SynthesizeWindowActivation(embeddedFrame, doActivate, awt.SynthesizeWindowActivation());
|
||||
}
|
||||
}
|
||||
|
||||
public static void embeddedFrameSetBounds(Frame embeddedFrame, int x, int y, int width, int height) {
|
||||
if (JAVA_VERSION < 9) {
|
||||
try {
|
||||
Method setLocationPrivate = embeddedFrame
|
||||
.getClass()
|
||||
.getSuperclass()
|
||||
.getDeclaredMethod("setBoundsPrivate", int.class, int.class, int.class, int.class);
|
||||
setLocationPrivate.setAccessible(true);
|
||||
setLocationPrivate.invoke(embeddedFrame, x, y, width, height);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
} else {
|
||||
JAWT_SetBounds(embeddedFrame, x, y, width, height, awt.SetBounds());
|
||||
}
|
||||
}
|
||||
|
||||
// The code below is by Ran
|
||||
|
||||
public static void hideFrame(Frame embeddedFrame) {
|
||||
if (embeddedFrame != null) {
|
||||
embeddedFrame.setVisible(false);
|
||||
embeddedFrameSynthesizeWindowActivation(embeddedFrame, false);
|
||||
}
|
||||
}
|
||||
|
||||
public static void showFrame(Frame embeddedFrame) {
|
||||
if (embeddedFrame != null) {
|
||||
embeddedFrameSynthesizeWindowActivation(embeddedFrame, true);
|
||||
embeddedFrame.setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
public static void placeAtCenter(Frame embeddedFrame, int windowWidth, int windowHeight, int frameWidth, int frameHeight, float scale) {
|
||||
float scaleFactor = (100.0F - scale) / 100.0F;
|
||||
float newWidth = frameWidth * scaleFactor;
|
||||
float newHeight = frameHeight * scaleFactor;
|
||||
float newX = (windowWidth - newWidth) / 2F;
|
||||
float newY = (windowHeight - newHeight) / 2F;
|
||||
embeddedFrameSetBounds(embeddedFrame, Math.round(newX), Math.round(newY), Math.round(newWidth), Math.round(newHeight));
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,40 @@
|
||||
package com.seibel.lod.core.config.gui;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
public class JavaFXConfigScreen extends AbstractScreen {
|
||||
static {
|
||||
System.setProperty("java.awt.headless", "false");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
|
||||
Frame frame = EmbeddedFrameUtil.embeddedFrameCreate(this.minecraftWindow);
|
||||
frame.add(new ExampleScreen());
|
||||
EmbeddedFrameUtil.placeAtCenter(frame, this.width, this.height, 100, 100, 1);
|
||||
}
|
||||
|
||||
public class ExampleScreen extends JComponent {
|
||||
public ExampleScreen() {
|
||||
setLayout(new GridBagLayout());
|
||||
GridBagConstraints constraints = new GridBagConstraints();
|
||||
constraints.fill = GridBagConstraints.HORIZONTAL;
|
||||
constraints.weightx = 0.5;
|
||||
constraints.gridx = 0;
|
||||
constraints.gridy = 0;
|
||||
add(new JLabel("Hello World!"), constraints);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void render(float delta) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClose() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,6 @@ package com.seibel.lod.core.jar;
|
||||
import java.io.*;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static com.seibel.lod.core.jar.JarMain.getOperatingSystem;
|
||||
|
||||
/**
|
||||
* A fork of iris'is dark mode detector (https://github.com/IrisShaders/Iris-Installer/blob/master/src/main/java/net/hypercubemc/iris_installer/DarkModeDetector.java)
|
||||
* Which is a fork of HanSolo's dark mode detector (https://gist.github.com/HanSolo/7cf10b86efff8ca2845bf5ec2dd0fe1d)
|
||||
@@ -21,7 +19,7 @@ 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 (getOperatingSystem()) {
|
||||
switch (JarUtils.getOperatingSystem()) {
|
||||
case WINDOWS:
|
||||
return isWindowsDarkMode();
|
||||
case MACOS:
|
||||
|
||||
@@ -81,21 +81,4 @@ public class JarMain extends Application {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public enum OperatingSystem {WINDOWS, MACOS, LINUX, NONE} // Easy to use enum for the 3 main os's
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,4 +103,19 @@ public class JarUtils {
|
||||
//return complete hash
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
public enum OperatingSystem {WINDOWS, MACOS, LINUX, NONE} // Easy to use enum for the 3 main os's
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user