DarkTitleBar/src/main/java/tech/williamist/darktitlebar/DarkTitleBar.java

57 lines
1.9 KiB
Java

package tech.williamist.darktitlebar;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinNT;
import net.minecraft.client.util.Window;
import org.lwjgl.glfw.GLFWNativeWin32;
import org.lwjgl.system.Platform;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DarkTitleBar {
private static final Logger logger = LoggerFactory.getLogger("DarkTitleBar");
public static void setDarkTitlebar(Window w) {
// check if we are running on windows
if (Platform.get() != Platform.WINDOWS) {
logger.warn("DarkTitleBar only works on windows!");
return;
}
// check for supported windows versions
WinNT.OSVERSIONINFO osversioninfo = new WinNT.OSVERSIONINFO();
Kernel32.INSTANCE.GetVersionEx(osversioninfo);
if (osversioninfo.dwMajorVersion.longValue() < 10 || osversioninfo.dwBuildNumber.longValue() < 17763) { // 1809
logger.warn("DarkTitleBar requires Windows 10 version 1809 or newer!");
return;
}
// get hwnd
long glfwWindow = w.getHandle();
long hwndLong = GLFWNativeWin32.glfwGetWin32Window(glfwWindow);
WinDef.HWND hwnd = new WinDef.HWND(Pointer.createConstant(hwndLong));
// set dark modey
Memory mem = new Memory(Native.POINTER_SIZE);
mem.setInt(0, 1);
DwmApi.INSTANCE.DwmSetWindowAttribute(
hwnd,
DwmApi.DWMWA_USE_IMMERSIVE_DARK_MODE,
new WinDef.LPVOID(mem),
new WinDef.DWORD(WinDef.DWORD.SIZE)
);
mem.close();
// we have to "refresh" the window for the titlebar to appear without resizing.
// this seems to work.
w.applyVideoMode();
}
}