File size: 1,941 Bytes
d46f4a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.mojang.blaze3d.platform;

import com.google.common.base.Charsets;
import java.nio.ByteBuffer;
import net.minecraft.util.StringDecomposer;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.lwjgl.BufferUtils;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.glfw.GLFWErrorCallbackI;
import org.lwjgl.system.MemoryUtil;

@OnlyIn(Dist.CLIENT)
public class ClipboardManager {
    public static final int FORMAT_UNAVAILABLE = 65545;
    private final ByteBuffer clipboardScratchBuffer = BufferUtils.createByteBuffer(8192);

    public String getClipboard(long p_83996_, GLFWErrorCallbackI p_83997_) {
        GLFWErrorCallback glfwerrorcallback = GLFW.glfwSetErrorCallback(p_83997_);
        String s = GLFW.glfwGetClipboardString(p_83996_);
        s = s != null ? StringDecomposer.filterBrokenSurrogates(s) : "";
        GLFWErrorCallback glfwerrorcallback1 = GLFW.glfwSetErrorCallback(glfwerrorcallback);
        if (glfwerrorcallback1 != null) {
            glfwerrorcallback1.free();
        }

        return s;
    }

    private static void pushClipboard(long p_83992_, ByteBuffer p_83993_, byte[] p_83994_) {
        p_83993_.clear();
        p_83993_.put(p_83994_);
        p_83993_.put((byte)0);
        p_83993_.flip();
        GLFW.glfwSetClipboardString(p_83992_, p_83993_);
    }

    public void setClipboard(long p_83989_, String p_83990_) {
        byte[] abyte = p_83990_.getBytes(Charsets.UTF_8);
        int i = abyte.length + 1;
        if (i < this.clipboardScratchBuffer.capacity()) {
            pushClipboard(p_83989_, this.clipboardScratchBuffer, abyte);
        } else {
            ByteBuffer bytebuffer = MemoryUtil.memAlloc(i);

            try {
                pushClipboard(p_83989_, bytebuffer, abyte);
            } finally {
                MemoryUtil.memFree(bytebuffer);
            }
        }
    }
}