minecraft-src/com/mojang/blaze3d/platform/ClipboardManager.java
2025-07-04 01:41:11 +03:00

54 lines
1.7 KiB
Java

package com.mojang.blaze3d.platform;
import com.google.common.base.Charsets;
import java.nio.ByteBuffer;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.util.StringDecomposer;
import org.lwjgl.BufferUtils;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.glfw.GLFWErrorCallbackI;
import org.lwjgl.system.MemoryUtil;
@Environment(EnvType.CLIENT)
public class ClipboardManager {
public static final int FORMAT_UNAVAILABLE = 65545;
private final ByteBuffer clipboardScratchBuffer = BufferUtils.createByteBuffer(8192);
public String getClipboard(long window, GLFWErrorCallbackI errorCallback) {
GLFWErrorCallback gLFWErrorCallback = GLFW.glfwSetErrorCallback(errorCallback);
String string = GLFW.glfwGetClipboardString(window);
string = string != null ? StringDecomposer.filterBrokenSurrogates(string) : "";
GLFWErrorCallback gLFWErrorCallback2 = GLFW.glfwSetErrorCallback(gLFWErrorCallback);
if (gLFWErrorCallback2 != null) {
gLFWErrorCallback2.free();
}
return string;
}
private static void pushClipboard(long window, ByteBuffer buffer, byte[] clipboardContent) {
buffer.clear();
buffer.put(clipboardContent);
buffer.put((byte)0);
buffer.flip();
GLFW.glfwSetClipboardString(window, buffer);
}
public void setClipboard(long window, String clipboardContent) {
byte[] bs = clipboardContent.getBytes(Charsets.UTF_8);
int i = bs.length + 1;
if (i < this.clipboardScratchBuffer.capacity()) {
pushClipboard(window, this.clipboardScratchBuffer, bs);
} else {
ByteBuffer byteBuffer = MemoryUtil.memAlloc(i);
try {
pushClipboard(window, byteBuffer, bs);
} finally {
MemoryUtil.memFree(byteBuffer);
}
}
}
}