From 6a2ec1335a641cbe8fd90a75d028549c117c64c3 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Sun, 15 Jul 2018 23:40:42 -0600 Subject: [PATCH 1/2] runelite-client: Consume hotkeys in HotkeyListener KeyTyped consumer any non-modifier key while the hotkey is being pressed because there is no good way to determine if a KeyTyped event matches a Keybind due to it's keyCode being zeroed. --- .../net/runelite/client/config/Keybind.java | 15 ++++++++---- .../runelite/client/util/HotkeyListener.java | 24 ++++++++++++++++++- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/Keybind.java b/runelite-client/src/main/java/net/runelite/client/config/Keybind.java index 47bbd64343..dfef4674e6 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/Keybind.java +++ b/runelite-client/src/main/java/net/runelite/client/config/Keybind.java @@ -28,6 +28,7 @@ import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; +import javax.annotation.Nullable; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -39,7 +40,7 @@ import lombok.Getter; @EqualsAndHashCode public class Keybind { - private static final BiMap modifierToKeyCode = new ImmutableBiMap.Builder() + private static final BiMap MODIFIER_TO_KEY_CODE = new ImmutableBiMap.Builder() .put(InputEvent.CTRL_DOWN_MASK, KeyEvent.VK_CONTROL) .put(InputEvent.ALT_DOWN_MASK, KeyEvent.VK_ALT) .put(InputEvent.SHIFT_DOWN_MASK, KeyEvent.VK_SHIFT) @@ -47,7 +48,7 @@ public class Keybind .build(); // Bitmask of all supported modifers - private static final int KEYBOARD_MODIFIER_MASK = modifierToKeyCode.keySet().stream() + private static final int KEYBOARD_MODIFIER_MASK = MODIFIER_TO_KEY_CODE.keySet().stream() .reduce((a, b) -> a | b).get(); public static final Keybind NOT_SET = new Keybind(KeyEvent.VK_UNDEFINED, 0); @@ -65,7 +66,7 @@ public class Keybind // If the keybind is just modifiers we don't want the keyCode to contain the modifier too, // becasue this breaks if you do the keycode backwards - Integer mf = modifierToKeyCode.inverse().get(keyCode); + Integer mf = getModifierForKeyCode(keyCode); if (mf != null) { assert (modifiers & mf) != 0; @@ -102,7 +103,7 @@ public class Keybind int keyCode = e.getExtendedKeyCode(); int modifiers = e.getModifiersEx() & KEYBOARD_MODIFIER_MASK; - Integer mf = modifierToKeyCode.inverse().get(keyCode); + Integer mf = getModifierForKeyCode(keyCode); if (mf != null) { modifiers |= mf; @@ -177,4 +178,10 @@ public class Keybind } return buf.toString(); } + + @Nullable + public static Integer getModifierForKeyCode(int keyCode) + { + return MODIFIER_TO_KEY_CODE.inverse().get(keyCode); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/util/HotkeyListener.java b/runelite-client/src/main/java/net/runelite/client/util/HotkeyListener.java index b8aeaba730..08e26cb871 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/HotkeyListener.java +++ b/runelite-client/src/main/java/net/runelite/client/util/HotkeyListener.java @@ -39,9 +39,15 @@ public abstract class HotkeyListener implements KeyListener @Getter private boolean isPressed = false; + private boolean isConsumingTyped = false; + @Override public void keyTyped(KeyEvent e) { + if (isConsumingTyped) + { + e.consume(); + } } @Override @@ -49,8 +55,18 @@ public abstract class HotkeyListener implements KeyListener { if (keybind.get().matches(e)) { + boolean wasPressed = isPressed; isPressed = true; - hotkeyPressed(); + if (!wasPressed) + { + hotkeyPressed(); + } + if (Keybind.getModifierForKeyCode(e.getKeyCode()) == null) + { + isConsumingTyped = true; + // Only consume non modifier keys + e.consume(); + } } } @@ -60,7 +76,13 @@ public abstract class HotkeyListener implements KeyListener if (keybind.get().matches(e)) { isPressed = false; + isConsumingTyped = false; hotkeyReleased(); + if (Keybind.getModifierForKeyCode(e.getKeyCode()) == null) + { + // Only consume non modifier keys + e.consume(); + } } } From b83fcd4fc2f3c63d38dbdaa05410a4b2202c4a87 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Mon, 16 Jul 2018 17:58:40 -0600 Subject: [PATCH 2/2] runelite-client: Handle releasing modifiers first correctly if you pressed alt+a, the released alt then a hotkeyReleased would never be called --- .../src/main/java/net/runelite/client/config/Keybind.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/config/Keybind.java b/runelite-client/src/main/java/net/runelite/client/config/Keybind.java index dfef4674e6..23696022d9 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/Keybind.java +++ b/runelite-client/src/main/java/net/runelite/client/config/Keybind.java @@ -110,6 +110,11 @@ public class Keybind keyCode = KeyEvent.VK_UNDEFINED; } + if (e.getID() == KeyEvent.KEY_RELEASED && keyCode != KeyEvent.VK_UNDEFINED) + { + return this.keyCode == keyCode; + } + return this.keyCode == keyCode && this.modifiers == modifiers; }