From 1a09559cda69c8a1329ad2212d41f43da9448fd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Thu, 8 Oct 2020 21:31:23 +0200 Subject: [PATCH] Add support for ctrl+c/d/z. --- .../cil/oc2/client/gui/RISCVTestScreen.java | 4 +- .../li/cil/oc2/client/gui/TerminalScreen.java | 6 +-- .../client/gui/terminal/TerminalInput.java | 39 ++++++++++++++++--- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/main/java/li/cil/oc2/client/gui/RISCVTestScreen.java b/src/main/java/li/cil/oc2/client/gui/RISCVTestScreen.java index f7ca21f8..b77c15f4 100644 --- a/src/main/java/li/cil/oc2/client/gui/RISCVTestScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/RISCVTestScreen.java @@ -138,8 +138,8 @@ public final class RISCVTestScreen extends Screen { return true; } - if (TerminalInput.KEYCODE_SEQUENCES.containsKey(keyCode)) { - final byte[] sequence = TerminalInput.KEYCODE_SEQUENCES.get(keyCode); + final byte[] sequence = TerminalInput.getSequence(modifiers, keyCode); + if (sequence != null) { for (int i = 0; i < sequence.length; i++) { terminal.putInput(sequence[i]); } diff --git a/src/main/java/li/cil/oc2/client/gui/TerminalScreen.java b/src/main/java/li/cil/oc2/client/gui/TerminalScreen.java index 634d4c3e..006215b9 100644 --- a/src/main/java/li/cil/oc2/client/gui/TerminalScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/TerminalScreen.java @@ -5,8 +5,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import li.cil.oc2.api.API; import li.cil.oc2.client.gui.terminal.Terminal; import li.cil.oc2.client.gui.terminal.TerminalInput; -import li.cil.oc2.common.network.TerminalBlockInputMessage; import li.cil.oc2.common.network.Network; +import li.cil.oc2.common.network.TerminalBlockInputMessage; import li.cil.oc2.common.tile.ComputerTileEntity; import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.ResourceLocation; @@ -98,8 +98,8 @@ public final class TerminalScreen extends Screen { return true; } - if (TerminalInput.KEYCODE_SEQUENCES.containsKey(keyCode)) { - final byte[] sequence = TerminalInput.KEYCODE_SEQUENCES.get(keyCode); + final byte[] sequence = TerminalInput.getSequence(modifiers, keyCode); + if (sequence != null) { for (int i = 0; i < sequence.length; i++) { terminal.putInput(sequence[i]); } diff --git a/src/main/java/li/cil/oc2/client/gui/terminal/TerminalInput.java b/src/main/java/li/cil/oc2/client/gui/terminal/TerminalInput.java index 088c5811..f4d4e464 100644 --- a/src/main/java/li/cil/oc2/client/gui/terminal/TerminalInput.java +++ b/src/main/java/li/cil/oc2/client/gui/terminal/TerminalInput.java @@ -3,8 +3,10 @@ package li.cil.oc2.client.gui.terminal; import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import org.lwjgl.glfw.GLFW; +import javax.annotation.Nullable; + public final class TerminalInput { - public static final Int2ObjectArrayMap KEYCODE_SEQUENCES = new Int2ObjectArrayMap<>(); + private static final Int2ObjectArrayMap> KEYCODE_SEQUENCES = new Int2ObjectArrayMap<>(); static { addSequence(GLFW.GLFW_KEY_ENTER, '\n'); @@ -22,23 +24,50 @@ public final class TerminalInput { addSequence(GLFW.GLFW_KEY_DOWN, "[B"); addSequence(GLFW.GLFW_KEY_RIGHT, "[C"); addSequence(GLFW.GLFW_KEY_LEFT, "[D"); + + addSequence(GLFW.GLFW_MOD_CONTROL, GLFW.GLFW_KEY_C, (char) 3); + addSequence(GLFW.GLFW_MOD_CONTROL, GLFW.GLFW_KEY_D, (char) 4); + addSequence(GLFW.GLFW_MOD_CONTROL, GLFW.GLFW_KEY_Z, (char) 0x1A); + } + + public static byte[] getSequence(final int keyCode) { + return getSequence(0, keyCode); + } + + @Nullable + public static byte[] getSequence(final int modifiers, final int keyCode) { + final Int2ObjectArrayMap map = KEYCODE_SEQUENCES.get(modifiers); + if (map == null) { + return null; + } + return map.get(keyCode); } private static void addSequence(final int keyCode, final char ch) { - addSequence(keyCode, (byte) ch); + addSequence(0, keyCode, ch); + } + + private static void addSequence(final int modifiers, final int keyCode, final char ch) { + addSequence(modifiers, keyCode, (byte) ch); } private static void addSequence(final int keyCode, final String sequence) { + addSequence(0, keyCode, sequence); + } + + private static void addSequence(final int modifiers, final int keyCode, final String sequence) { final byte[] bytes = new byte[1 + sequence.length()]; bytes[0] = 27; final char[] chars = sequence.toCharArray(); for (int i = 0; i < chars.length; i++) { bytes[i + 1] = (byte) chars[i]; } - addSequence(keyCode, bytes); + addSequence(modifiers, keyCode, bytes); } - private static void addSequence(final int keyCode, final byte... sequence) { - KEYCODE_SEQUENCES.put(keyCode, sequence); + private static void addSequence(final int modifiers, final int keyCode, final byte... sequence) { + KEYCODE_SEQUENCES + .computeIfAbsent(modifiers, i -> new Int2ObjectArrayMap<>()) + .put(keyCode, sequence); } }