From 96cc791453d20bc7994a8b6076d4bb1304ccd552 Mon Sep 17 00:00:00 2001 From: eliatlarge Date: Sat, 7 Sep 2024 13:22:10 -0700 Subject: [PATCH] feat: copy screenshot image to clipboard --- .../mixin/ScreenshotRecorderMixin.java | 26 ++++++++++++-- .../mixinsupport/ImageTransferable.java | 36 +++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/client/java/dev/spiritstudios/snapper/mixinsupport/ImageTransferable.java diff --git a/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java b/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java index c6413a3..252ac83 100644 --- a/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java +++ b/src/client/java/dev/spiritstudios/snapper/mixin/ScreenshotRecorderMixin.java @@ -1,15 +1,26 @@ package dev.spiritstudios.snapper.mixin; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import dev.spiritstudios.snapper.mixinsupport.ImageTransferable; +import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.texture.NativeImage; import net.minecraft.client.util.ScreenshotRecorder; import net.minecraft.text.Text; +import net.minecraft.util.Util; +import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.datatransfer.Clipboard; +//import java.awt.datatransfer.Tra +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; import java.io.File; import java.io.IOException; import java.util.function.Consumer; @@ -28,4 +39,15 @@ private static void lookBeforeYouLeap(NativeImage nativeImage, File screenshotFi screenshotFile.getParentFile().mkdirs(); screenshotFile.createNewFile(); } + + @Inject( + method = "method_1661", + at = @At(value = "INVOKE", target = "Lnet/minecraft/text/Text;literal(Ljava/lang/String;)Lnet/minecraft/text/MutableText;", shift = At.Shift.AFTER) + ) + private static void saveWrittenFileToClipboard(NativeImage nativeImage, File screenshotFile, Consumer messageReceiver, CallbackInfo ci) throws IOException { + if (!screenshotFile.getAbsolutePath().contains("/panorama/")) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(new ImageTransferable(ImageIO.read(screenshotFile)), null); + } + } } diff --git a/src/client/java/dev/spiritstudios/snapper/mixinsupport/ImageTransferable.java b/src/client/java/dev/spiritstudios/snapper/mixinsupport/ImageTransferable.java new file mode 100644 index 0000000..dfb9d02 --- /dev/null +++ b/src/client/java/dev/spiritstudios/snapper/mixinsupport/ImageTransferable.java @@ -0,0 +1,36 @@ +package dev.spiritstudios.snapper.mixinsupport; + +import org.jetbrains.annotations.NotNull; + +import java.awt.*; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.IOException; + +public class ImageTransferable implements Transferable { + private static final DataFlavor[] flavors = {DataFlavor.imageFlavor}; + + private final Image image; + + public ImageTransferable(Image im) { + this.image = im; + } + + @Override + public DataFlavor[] getTransferDataFlavors() { + return flavors; + } + + @Override + public boolean isDataFlavorSupported(DataFlavor flavor) { + return flavor.equals(DataFlavor.imageFlavor); + } + + @NotNull + @Override + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { + if (!isDataFlavorSupported(flavor)) throw new UnsupportedFlavorException(flavor); + return image; + } +} \ No newline at end of file