diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingConfig.java index 70bc8bae19..1dbe1eaff6 100755 --- a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingConfig.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.keyremapping; +import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; @@ -286,4 +287,15 @@ public interface KeyRemappingConfig extends Config { return new ModifierlessKeybind(KeyEvent.VK_SPACE, 0); } + + @ConfigItem( + position = 21, + keyName = "control", + name = "Control", + description = "The key which will replace {Control}." + ) + default ModifierlessKeybind control() + { + return new ModifierlessKeybind(KeyEvent.VK_UNDEFINED, InputEvent.CTRL_DOWN_MASK); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java index 181c4abf8c..72fdf8e2e8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java @@ -162,6 +162,11 @@ class KeyRemappingListener implements KeyListener mappedKeyCode = KeyEvent.VK_SPACE; } + if (config.control().matches(e)) + { + mappedKeyCode = KeyEvent.VK_CONTROL; + } + if (mappedKeyCode != KeyEvent.VK_UNDEFINED && mappedKeyCode != e.getKeyCode()) { final char keyChar = e.getKeyChar(); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/keyremapping/KeyRemappingListenerTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/keyremapping/KeyRemappingListenerTest.java index d7da96133d..7779391817 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/keyremapping/KeyRemappingListenerTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/keyremapping/KeyRemappingListenerTest.java @@ -27,6 +27,7 @@ package net.runelite.client.plugins.keyremapping; import com.google.inject.Guice; import com.google.inject.testing.fieldbinder.Bind; import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import javax.inject.Inject; import net.runelite.api.Client; @@ -63,6 +64,7 @@ public class KeyRemappingListenerTest public void setUp() { Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + when(keyRemappingConfig.control()).thenReturn(new ModifierlessKeybind(KeyEvent.VK_UNDEFINED, InputEvent.CTRL_DOWN_MASK)); } @Test @@ -123,4 +125,18 @@ public class KeyRemappingListenerTest verify(event).setKeyCode(KeyEvent.VK_SPACE); } + + @Test + public void testControlRemap() + { + when(keyRemappingConfig.control()).thenReturn(new ModifierlessKeybind(KeyEvent.VK_NUMPAD1, 0)); + when(keyRemappingPlugin.chatboxFocused()).thenReturn(true); + + KeyEvent event = mock(KeyEvent.class); + when(event.getExtendedKeyCode()).thenReturn(KeyEvent.VK_NUMPAD1); // for keybind matches() + + keyRemappingListener.keyPressed(event); + + verify(event).setKeyCode(KeyEvent.VK_CONTROL); + } }