Skip to content

Commit 14f4e87

Browse files
committed
Fixed how the minimum release time for keys work, and fixed a bug where a delayed release should not fire if the key is still down.
1 parent 48aa08b commit 14f4e87

2 files changed

Lines changed: 114 additions & 8 deletions

File tree

core/src/main/java/emu/jvic/KeyboardMatrix.java

Lines changed: 54 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.TreeMap;
77

88
import com.badlogic.gdx.InputAdapter;
9+
import com.badlogic.gdx.Gdx;
910
import com.badlogic.gdx.Input.Keys;
1011
import 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

core/src/main/java/emu/jvic/VicKeys.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,4 +254,64 @@ public interface VicKeys {
254254
{ Keys.NUMPAD_8, VicKeys.JOYSTICK_UP }, // Up
255255
{ Keys.NUMPAD_9, VicKeys.JOYSTICK_NE }, // NE
256256
};
257+
258+
public static final int[][] VIC_KEY_TO_LIBGDX_KEY_MAP = new int[][] {
259+
{ VicKeys.ONE, Keys.NUM_1 },
260+
{ VicKeys.TWO, Keys.NUM_2 },
261+
{ VicKeys.THREE, Keys.NUM_3 },
262+
{ VicKeys.FOUR, Keys.NUM_4 },
263+
{ VicKeys.FIVE, Keys.NUM_5 },
264+
{ VicKeys.SIX, Keys.NUM_6 },
265+
{ VicKeys.SEVEN, Keys.NUM_7 },
266+
{ VicKeys.EIGHT, Keys.NUM_8 },
267+
{ VicKeys.NINE, Keys.NUM_9 },
268+
{ VicKeys.ZERO, Keys.NUM_0 },
269+
{ VicKeys.HYPHEN, Keys.MINUS },
270+
{ VicKeys.EQUALS, Keys.EQUALS },
271+
{ VicKeys.HOME, Keys.HOME },
272+
{ VicKeys.DELETE, Keys.BACKSPACE },
273+
{ VicKeys.CONTROL, Keys.CONTROL_LEFT },
274+
{ VicKeys.CBM, Keys.TAB },
275+
{ VicKeys.Q, Keys.Q },
276+
{ VicKeys.W, Keys.W },
277+
{ VicKeys.E, Keys.E },
278+
{ VicKeys.R, Keys.R },
279+
{ VicKeys.T, Keys.T },
280+
{ VicKeys.Y, Keys.Y },
281+
{ VicKeys.U, Keys.U },
282+
{ VicKeys.I, Keys.I },
283+
{ VicKeys.P, Keys.P },
284+
{ VicKeys.A, Keys.A },
285+
{ VicKeys.S, Keys.S },
286+
{ VicKeys.D, Keys.D },
287+
{ VicKeys.F, Keys.F },
288+
{ VicKeys.G, Keys.G },
289+
{ VicKeys.H, Keys.H },
290+
{ VicKeys.J, Keys.J },
291+
{ VicKeys.K, Keys.K },
292+
{ VicKeys.L, Keys.L },
293+
{ VicKeys.SEMI_COLON, Keys.SEMICOLON },
294+
{ VicKeys.COLON, Keys.COLON },
295+
{ VicKeys.RETURN, Keys.ENTER },
296+
{ VicKeys.LEFT_SHIFT, Keys.SHIFT_LEFT },
297+
{ VicKeys.Z, Keys.Z },
298+
{ VicKeys.X, Keys.X },
299+
{ VicKeys.C, Keys.C },
300+
{ VicKeys.V, Keys.V },
301+
{ VicKeys.B, Keys.B },
302+
{ VicKeys.N, Keys.N },
303+
{ VicKeys.M, Keys.M },
304+
{ VicKeys.COMMA, Keys.COMMA },
305+
{ VicKeys.PERIOD, Keys.PERIOD },
306+
{ VicKeys.FORWARD_SLASH, Keys.SLASH },
307+
{ VicKeys.RIGHT_SHIFT, Keys.SHIFT_RIGHT },
308+
{ VicKeys.CURSOR_DOWN, Keys.DOWN },
309+
{ VicKeys.CURSOR_RIGHT, Keys.RIGHT },
310+
{ VicKeys.SPACE, Keys.SPACE },
311+
{ VicKeys.F1, Keys.F1 },
312+
{ VicKeys.F3, Keys.F3 },
313+
{ VicKeys.F5, Keys.F5 },
314+
{ VicKeys.F7, Keys.F7 },
315+
{ VicKeys.SHIFT_LOCK, Keys.CAPS_LOCK }
316+
};
257317
}

0 commit comments

Comments
 (0)