diff --git a/src/main/java/javax/microedition/lcdui/Canvas.java b/src/main/java/javax/microedition/lcdui/Canvas.java index 8422b83..c6cfb10 100644 --- a/src/main/java/javax/microedition/lcdui/Canvas.java +++ b/src/main/java/javax/microedition/lcdui/Canvas.java @@ -149,6 +149,10 @@ public static void emitKeyPressed(Canvas canvas, int keyCode) { canvas.keyPressed(keyCode); } + public static void emitKeyRepeated(Canvas canvas, int keyCode) { + canvas.keyRepeated(keyCode); + } + public static void emitKeyReleased(Canvas canvas, int keyCode) { canvas.keyReleased(keyCode); } diff --git a/src/main/java/net/sktemu/ams/AppInstance.java b/src/main/java/net/sktemu/ams/AppInstance.java index e041af7..ced3c69 100644 --- a/src/main/java/net/sktemu/ams/AppInstance.java +++ b/src/main/java/net/sktemu/ams/AppInstance.java @@ -124,6 +124,7 @@ public void onShutdown() { public abstract boolean shutdown(); public abstract void keyPressed(int keyCode); + public abstract void keyRepeated(int keyCode); public abstract void keyReleased(int keyCode); public abstract AmsClassLoader getClassLoader(); diff --git a/src/main/java/net/sktemu/ams/skvm/SkvmAppInstance.java b/src/main/java/net/sktemu/ams/skvm/SkvmAppInstance.java index 651d825..a3e5cfc 100644 --- a/src/main/java/net/sktemu/ams/skvm/SkvmAppInstance.java +++ b/src/main/java/net/sktemu/ams/skvm/SkvmAppInstance.java @@ -144,6 +144,14 @@ public void keyPressed(int keyCode) { }); } + @Override + public void keyRepeated(int keyCode) { + runOnAppThread(() -> { + Canvas canvas = (Canvas) display.getCurrent(); + Canvas.emitKeyRepeated(canvas, keyCode); + }); + } + @Override public void keyReleased(int keyCode) { runOnAppThread(() -> { diff --git a/src/main/java/net/sktemu/ui/EmuUIFrame.java b/src/main/java/net/sktemu/ui/EmuUIFrame.java index f25d246..034bee4 100644 --- a/src/main/java/net/sktemu/ui/EmuUIFrame.java +++ b/src/main/java/net/sktemu/ui/EmuUIFrame.java @@ -3,18 +3,20 @@ import net.sktemu.ams.AppInstance; import net.sktemu.ams.AppModel; -import javax.microedition.lcdui.Canvas; import javax.swing.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.util.HashSet; public class EmuUIFrame extends JFrame { private final EmuCanvas canvas; private AppInstance appInstance; + private HashSet pressedKeys = new HashSet(); + public EmuUIFrame(AppModel appModel) { setTitle("SKTemu \u2013 " + appModel.getAppTitle()); @@ -47,7 +49,12 @@ public void keyPressed(KeyEvent e) { Integer keyCode = KeyMappings.keyMappings.get(e.getKeyCode()); if (keyCode != null) { - appInstance.keyPressed(keyCode); + if (!pressedKeys.contains(keyCode)) { + pressedKeys.add(keyCode); + appInstance.keyPressed(keyCode); + } else { + appInstance.keyRepeated(keyCode); + } } } @@ -56,6 +63,7 @@ public void keyReleased(KeyEvent e) { Integer keyCode = KeyMappings.keyMappings.get(e.getKeyCode()); if (keyCode != null) { + pressedKeys.remove(keyCode); appInstance.keyReleased(keyCode); } }