Add support for ctrl+c/d/z.

This commit is contained in:
Florian Nücke
2020-10-08 21:31:23 +02:00
parent b458f36595
commit 1a09559cda
3 changed files with 39 additions and 10 deletions

View File

@@ -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]);
}

View File

@@ -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]);
}

View File

@@ -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<byte[]> KEYCODE_SEQUENCES = new Int2ObjectArrayMap<>();
private static final Int2ObjectArrayMap<Int2ObjectArrayMap<byte[]>> 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<byte[]> 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);
}
}