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();
 | |
| 		}
 | |
| 	}
 | |
| }
 |