66import java .util .TreeMap ;
77
88import com .badlogic .gdx .InputAdapter ;
9+ import com .badlogic .gdx .Gdx ;
910import com .badlogic .gdx .Input .Keys ;
1011import com .badlogic .gdx .utils .TimeUtils ;
1112
@@ -140,12 +141,12 @@ public abstract class KeyboardMatrix extends InputAdapter {
140141 private long minKeyReleaseTimes [] = new long [512 ];
141142
142143 /**
143- * Holds a queue of keycodes whose key release processing has been delayed. This is
144+ * Holds a map of keycodes whose key release processing has been delayed. This is
144145 * supported primarily for use with the Android virtual keyboard on some devices,
145146 * where the key pressed and release both get fired on release of the key, so have
146147 * virtually no time between them.
147148 */
148- private TreeMap <Long , Integer > delayedReleaseKeys = new TreeMap <Long , Integer >();
149+ private TreeMap <Integer , Long > delayedReleaseKeys = new TreeMap <Integer , Long >();
149150
150151 /**
151152 * Maps keypress characters to VIC keys.
@@ -157,6 +158,11 @@ public abstract class KeyboardMatrix extends InputAdapter {
157158 */
158159 private HashMap <Integer , int []> keycodeConvHashMap ;
159160
161+ /**
162+ * Maps VIC keys to libgdx keycodes.
163+ */
164+ private HashMap <Integer , Integer > vicKeyToLibgdxKeyMap ;
165+
160166 /**
161167 * Constructor for KeyboardMatrix.
162168 */
@@ -185,6 +191,14 @@ public KeyboardMatrix() {
185191 System .arraycopy (vicKeyMapping , 1 , vicKeys , 0 , vicKeyMapping .length -1 );
186192 keycodeConvHashMap .put (vicKeyMapping [0 ], vicKeys );
187193 }
194+
195+ // Converts VIC key to libgdx keycode.
196+ vicKeyToLibgdxKeyMap = new HashMap <Integer , Integer >();
197+ for (int i =0 ; i < VicKeys .VIC_KEY_TO_LIBGDX_KEY_MAP .length ; i ++) {
198+ vicKeyToLibgdxKeyMap .put (
199+ VicKeys .VIC_KEY_TO_LIBGDX_KEY_MAP [i ][0 ],
200+ VicKeys .VIC_KEY_TO_LIBGDX_KEY_MAP [i ][1 ]);
201+ }
188202 }
189203
190204 public boolean keyDown (int keycode ) {
@@ -261,7 +275,7 @@ public void vicKeyUp(int vicKey) {
261275 // keyboard or something similar that doesn't reflect the actual time the key
262276 // is down), so let's add this keycode to the delayed release list.
263277 synchronized (delayedReleaseKeys ) {
264- delayedReleaseKeys .put (minKeyReleaseTime , vicKey );
278+ delayedReleaseKeys .put (vicKey , minKeyReleaseTime );
265279 }
266280
267281 } else {
@@ -344,13 +358,45 @@ public boolean isAltKeyDown() {
344358 public void checkDelayedReleaseKeys () {
345359 if (!delayedReleaseKeys .isEmpty ()) {
346360 synchronized (delayedReleaseKeys ) {
347- List <Long > processedReleases = new ArrayList <Long >();
348- processedReleases .addAll (delayedReleaseKeys .headMap (TimeUtils .nanoTime ()).keySet ());
349- for (Long keyReleaseTime : processedReleases ) {
350- int delayedReleaseVicKey = delayedReleaseKeys .remove (keyReleaseTime );
351- vicKeyUp (delayedReleaseVicKey );
361+ // Identify the keys whose minimum release time has based.
362+ long currentTime = TimeUtils .nanoTime ();
363+ List <Integer > releasesToProcess = new ArrayList <Integer >();
364+ for (Integer vicKey : delayedReleaseKeys .keySet ()) {
365+ if (currentTime >= delayedReleaseKeys .get (vicKey )) {
366+ releasesToProcess .add (vicKey );
367+ }
352368 }
369+
370+ // Now process the key releases.
371+ for (Integer delayedReleaseVicKey : releasesToProcess ) {
372+ // Only trigger vicKeyUp if the key is not still down.
373+ if (!isKeyCurrentlyDown (delayedReleaseVicKey )) {
374+ vicKeyUp (delayedReleaseVicKey );
375+ delayedReleaseKeys .remove (delayedReleaseVicKey );
376+ } else {
377+ // Key is still down.
378+ }
379+ }
380+ }
381+ }
382+ }
383+
384+ /**
385+ * Checks if the given VIC key is down.
386+ *
387+ * @param vicKey The VIC key to check.
388+ *
389+ * @return true if the VIC key is down; otherwise false.
390+ */
391+ public boolean isKeyCurrentlyDown (int vicKey ) {
392+ if (vicKey != 0 ) {
393+ if (vicKeyToLibgdxKeyMap .containsKey (vicKey )) {
394+ return Gdx .input .isKeyPressed (vicKeyToLibgdxKeyMap .get (vicKey ));
395+ } else {
396+ return false ;
353397 }
398+ } else {
399+ return false ;
354400 }
355401 }
356402
0 commit comments