diff options
author | endolf <[email protected]> | 2004-07-07 23:16:03 +0000 |
---|---|---|
committer | endolf <[email protected]> | 2004-07-07 23:16:03 +0000 |
commit | ea8235cd2305101d078265f7b4585fd250bd44fe (patch) | |
tree | f67c3eb436dcad3138baa353d76915fa0e05d9a5 | |
parent | 45cfed89c4464a4fe2489e84fef01ccfaaa70574 (diff) |
Updates so that for now keyboards are just created as normal devices, this means the Axis.Identifiers are not the standard ones, but the correct things are now show and no excpetions are seen on the Logitech Elite keyboard (or any that has axis as well)
git-svn-id: file:///home/sven/projects/JOGL/git-svn/svn-server-sync/jinput/trunk@83 e343933a-64c8-49c5-92b1-88f2ce3e89e8
-rw-r--r-- | plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java | 2 | ||||
-rw-r--r-- | plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java | 144 |
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]) */ |