summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java2
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java144
2 files changed, 130 insertions, 16 deletions
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java b/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java
index 88ea81c..da60789 100644
--- a/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java
+++ b/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java
@@ -113,7 +113,7 @@ public class LinuxEnvironmentPlugin extends ControllerEnvironment implements Plu
if((mouseCharacteristic > keyboardCharacteristic) && (mouseCharacteristic > joystickCharacteristic)) {
device = new LinuxMouse(new LinuxDevice(deviceNumber, name, numButtons, numRelAxes, numAbsAxes));
} else if((keyboardCharacteristic > mouseCharacteristic) && (keyboardCharacteristic > joystickCharacteristic)) {
- device = new LinuxKeyboard(new LinuxDevice(deviceNumber, name, numButtons, numRelAxes, numAbsAxes));
+ device = new LinuxDevice(deviceNumber, name, numButtons, numRelAxes, numAbsAxes, Controller.Type.KEYBOARD);
} else if((joystickCharacteristic > keyboardCharacteristic) && (joystickCharacteristic > mouseCharacteristic)) {
device = new LinuxDevice(deviceNumber, name, numButtons, numRelAxes, numAbsAxes);
} else {
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java b/plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java
index cddb5c8..9fbb2d6 100644
--- a/plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java
+++ b/plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java
@@ -25,15 +25,35 @@
*/
package net.java.games.input;
-import java.util.HashMap;
-
/** Class that represents a keyboard under linux
* @author Jeremy Booth ([email protected])
*/
public class LinuxKeyboard extends StandardKeyboard {
- private HashMap keyMap = new HashMap();
- private LinuxDevice realController;
+ /** Values for the keys
+ */
+ private int keyData[];
+ /** Needed for the polling methods
+ */
+ private int dummyRelAxesData[];
+ /** Needed for the polling methods
+ */
+ private int dummyAbsAxesData[];
+ /** Map of native key numbers from jinput key id key indexes.
+ */
+ private int keyMap[];
+ /** List of keys this keyboard supports
+ */
+ private int supportedKeys[];
+ /** Number of keys this keyboard has
+ */
+ private int numKeys;
+ /** Port type that this keyboard is connected to.
+ */
+ private PortType portType;
+ /** The native device id
+ */
+ private int nativeID;
/** Creates a new instance of LinuxKeyboard
* @param nativeID Native device id
@@ -42,11 +62,31 @@ public class LinuxKeyboard extends StandardKeyboard {
* @param numRelAxes Number of relative axes (you never know)
* @param numAbsAxes Number of absolute axes (you never know)
*/
- public LinuxKeyboard(LinuxDevice realController) {
- super(realController.getName());
- this.realController = realController;
+ public LinuxKeyboard(int nativeID, String name, int numButtons, int numRelAxes, int numAbsAxes) {
+ super(name);
+
+ throw new RuntimeException("Error, should not get here");
+
+ /*children = NO_CONTROLLERS;
+ rumblers = NO_RUMBLERS;
+
+ this.nativeID = nativeID;
+
+ portType = LinuxNativeTypesMap.getPortType(getNativePortType(nativeID));
+
+ dummyRelAxesData = new int[numRelAxes];
+ dummyAbsAxesData = new int[numAbsAxes];
+
+ this.numKeys = numButtons;
+ keyData = new int[numButtons+1];
+ supportedKeys = new int[numButtons+1];
+ keyMap = new int[KeyID.LAST.getKeyIndex()];
+
+ getSupportedButtons(supportedKeys);
+ supportedKeys[numKeys] = NativeDefinitions.KEY_UNKNOWN;
setupKeyMap();
+ renameKeys();*/
}
/** Returns whether or not the given key has been pressed since the last
@@ -55,8 +95,19 @@ public class LinuxKeyboard extends StandardKeyboard {
* @return the value fo the key
*/
protected boolean isKeyPressed(Key key) {
- Axis button = (Axis)keyMap.get(key.getIdentifier());
- if(button.getPollData()!=0) return true; else return false;
+ /*if(((Keyboard.KeyID) key.getIdentifier()).getKeyIndex() == StandardKeyboard.KeyID.ESCAPE.getKeyIndex()) {
+ System.out.println("Asked if key " + key + " was pressed");
+ System.out.println("key id " + key.getIdentifier());
+ System.out.println("keyIndex " + ((Keyboard.KeyID) key.getIdentifier()).getKeyIndex());
+ System.out.println("keyMap for index is " + keyMap[((Keyboard.KeyID) key.getIdentifier()).getKeyIndex()]);
+ System.out.println("name for supportedKeys index is " + LinuxNativeTypesMap.getButtonName(supportedKeys[keyMap[((Keyboard.KeyID) key.getIdentifier()).getKeyIndex()]]));
+ System.out.println("id for supportedKeys index is " + LinuxNativeTypesMap.getButtonID(supportedKeys[keyMap[((Keyboard.KeyID) key.getIdentifier()).getKeyIndex()]]));
+ System.out.flush();
+ }*/
+ if(keyData[keyMap[((Keyboard.KeyID) key.getIdentifier()).getKeyIndex()]] > 0) {
+ return true;
+ }
+ return false;
}
/** Polls axes for data. Returns false if the controller is no longer valid.
@@ -64,19 +115,82 @@ public class LinuxKeyboard extends StandardKeyboard {
* @return False if this device is invalid.
*/
public boolean poll() {
- return realController.poll();
+ int retval = nativePoll(nativeID, keyData, dummyRelAxesData, dummyAbsAxesData);
+ if(retval>=0) return true;
+ return false;
}
/** Goes through every key to initialise the key map
*/
private void setupKeyMap() {
- Axis[] allButtons = realController.getButtons();
- for(int i=0;i<allButtons.length;i++) {
- Axis tempButton = allButtons[i];
- keyMap.put(tempButton.getIdentifier(), tempButton);
- }
+ for(int i=0;i<KeyID.LAST.getKeyIndex();i++) {
+ keyMap[i] = numKeys;
+ }
+ for(int i=0;i<numKeys;i++) {
+ int tempNativeID = supportedKeys[i];
+ Keyboard.KeyID tempKeyID = StandardKeyboard.KeyID.VOID;
+ try {
+ tempKeyID = (Keyboard.KeyID)LinuxNativeTypesMap.getButtonID(tempNativeID);
+ } catch (ClassCastException e) {
+ System.out.println("LinuxNativeTypesMap.getButtonID() returned " + LinuxNativeTypesMap.getButtonID(tempNativeID).getClass().toString());
+ }
+ if(tempKeyID.getKeyIndex() < keyMap.length) {
+ keyMap[tempKeyID.getKeyIndex()] = i;
+ //System.out.println("keyMap[" + (tempKeyID.getKeyIndex()) + "] (" + tempKeyID + ") set to index " + i + " (" + LinuxNativeTypesMap.getButtonName(supportedKeys[i]) + ")");
+ } else {
+ //System.out.println("Linux key " + LinuxNativeTypesMap.getButtonName(tempNativeID) + " isn't supported by jinput");
+ }
+ }
+ }
+
+ /** Renames all the keys based on what information we have about them (number/name)
+ */
+ private void renameKeys() {
+ Axis tempAxes[] = getAxes();
+ // Do this one by hand as it's a special case
+ //((AbstractAxis)tempAxes[0]).setName("Unknown");
+ for(int i=0;i<tempAxes.length;i++) {
+ Axis tempAxis = tempAxes[i];
+ int nativeKeyID = supportedKeys[keyMap[((Keyboard.KeyID) tempAxis.getIdentifier()).getKeyIndex()]];
+ //System.out.println("key " + tempAxis + " map: " + nativeKeyID);
+ if(nativeKeyID != NativeDefinitions.KEY_UNKNOWN) {
+ String tempName = LinuxNativeTypesMap.getButtonName(nativeKeyID);
+ ((AbstractAxis)tempAxis).setName(tempName);
+
+ /*System.out.println("axis id is " + (Keyboard.KeyID) tempAxis.getIdentifier());
+ System.out.println("keyMap[id] is " + keyMap[((Keyboard.KeyID) tempAxis.getIdentifier()).getKeyIndex()]);
+ System.out.println("nativeKeyID is: " + nativeKeyID);
+ System.out.println("Set name of key " + ((Keyboard.KeyID) tempAxis.getIdentifier()).getKeyIndex() + " to " + tempName);*/
+ }
+ }
}
+ /** Gets all the supported keys for this device
+ * @param supportedButtons The array if key types to populate
+ */
+ private void getSupportedButtons(int supportedButtons[]) {
+ getNativeSupportedButtons(nativeID, supportedButtons);
+ }
+
+ /** Gets the supported key types for a particular native device
+ * @param deviceID The device ID
+ * @param supportedButtons The array to populate with teh supported key ids
+ */
+ private native void getNativeSupportedButtons(int deviceID, int supportedButtons[]);
+ /** Calls the native library to poll the device
+ * @param deviceID The device ID
+ * @param buttonData Aray to populate with button values
+ * @param relAxesData Array to populate with relative axis values
+ * @param absAxesData Array to populate with absolute axes values
+ * @return <0 if soething went wrong
+ */
+ private native int nativePoll(int deviceID, int buttonData[], int relAxesData[], int absAxesData[]);
+ /** Gets the port type from the native library for a particular keyboard
+ * @param deviceID The keybaord id
+ * @return native port ype
+ */
+ private native int getNativePortType(int deviceID);
+
/** Linux specific key ID's
* @author Jeremy Booth ([email protected])
*/