75 lines
2.5 KiB
Java
75 lines
2.5 KiB
Java
package com.mojang.blaze3d.platform;
|
|
|
|
import ca.weblite.objc.Client;
|
|
import ca.weblite.objc.NSObject;
|
|
import com.sun.jna.Pointer;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.util.Base64;
|
|
import java.util.Locale;
|
|
import java.util.Optional;
|
|
import net.fabricmc.api.EnvType;
|
|
import net.fabricmc.api.Environment;
|
|
import net.minecraft.server.packs.resources.IoSupplier;
|
|
import org.lwjgl.glfw.GLFWNativeCocoa;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public class MacosUtil {
|
|
public static final boolean IS_MACOS = System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("mac");
|
|
private static final int NS_RESIZABLE_WINDOW_MASK = 8;
|
|
private static final int NS_FULL_SCREEN_WINDOW_MASK = 16384;
|
|
|
|
public static void exitNativeFullscreen(long windowId) {
|
|
getNsWindow(windowId).filter(MacosUtil::isInNativeFullscreen).ifPresent(MacosUtil::toggleNativeFullscreen);
|
|
}
|
|
|
|
public static void clearResizableBit(long windowId) {
|
|
getNsWindow(windowId).ifPresent(nSObject -> {
|
|
long l = getStyleMask(nSObject);
|
|
nSObject.send("setStyleMask:", new Object[]{l & -9L});
|
|
});
|
|
}
|
|
|
|
private static Optional<NSObject> getNsWindow(long windowId) {
|
|
long l = GLFWNativeCocoa.glfwGetCocoaWindow(windowId);
|
|
return l != 0L ? Optional.of(new NSObject(new Pointer(l))) : Optional.empty();
|
|
}
|
|
|
|
private static boolean isInNativeFullscreen(NSObject nsWindow) {
|
|
return (getStyleMask(nsWindow) & 16384L) != 0L;
|
|
}
|
|
|
|
private static long getStyleMask(NSObject nsWindow) {
|
|
return (Long)nsWindow.sendRaw("styleMask", new Object[0]);
|
|
}
|
|
|
|
private static void toggleNativeFullscreen(NSObject nsWindow) {
|
|
nsWindow.send("toggleFullScreen:", new Object[]{Pointer.NULL});
|
|
}
|
|
|
|
public static void loadIcon(IoSupplier<InputStream> iconStreamSupplier) throws IOException {
|
|
InputStream inputStream = iconStreamSupplier.get();
|
|
|
|
try {
|
|
String string = Base64.getEncoder().encodeToString(inputStream.readAllBytes());
|
|
Client client = Client.getInstance();
|
|
Object object = client.sendProxy("NSData", "alloc", new Object[0]).send("initWithBase64Encoding:", new Object[]{string});
|
|
Object object2 = client.sendProxy("NSImage", "alloc", new Object[0]).send("initWithData:", new Object[]{object});
|
|
client.sendProxy("NSApplication", "sharedApplication", new Object[0]).send("setApplicationIconImage:", new Object[]{object2});
|
|
} catch (Throwable var7) {
|
|
if (inputStream != null) {
|
|
try {
|
|
inputStream.close();
|
|
} catch (Throwable var6) {
|
|
var7.addSuppressed(var6);
|
|
}
|
|
}
|
|
|
|
throw var7;
|
|
}
|
|
|
|
if (inputStream != null) {
|
|
inputStream.close();
|
|
}
|
|
}
|
|
}
|