diff options
3 files changed, 62 insertions, 5 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 7b90cab..ebfc0f0 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java @@ -312,8 +312,10 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen private final static Controller createJoystickFromJoystickDevice(LinuxJoystickDevice device) { List components = new ArrayList(); + byte[] axisMap = device.getAxisMap(); + char[] buttonMap = device.getButtonMap(); for (int i = 0; i < device.getNumButtons(); i++) { - Component.Identifier.Button button_id = getButtonIdentifier(i); + Component.Identifier.Button button_id = (Component.Identifier.Button)LinuxNativeTypesMap.getButtonID(buttonMap[i]); if (button_id != null) { LinuxJoystickButton button = new LinuxJoystickButton(button_id); device.registerButton(i, button); @@ -322,14 +324,12 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen } for (int i = 0; i < device.getNumAxes(); i++) { Component.Identifier.Axis axis_id; - if ((i % 2) == 0) - axis_id = Component.Identifier.Axis.X; - else - axis_id = Component.Identifier.Axis.Y; + axis_id = (Component.Identifier.Axis) LinuxNativeTypesMap.getAbsAxisID(axisMap[i]); LinuxJoystickAxis axis = new LinuxJoystickAxis(axis_id); device.registerAxis(i, axis); components.add(axis); } + return new LinuxJoystickAbstractController(device, (Component[])components.toArray(new Component[]{}), new Controller[]{}, new Rumbler[]{}); } diff --git a/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java b/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java index 2d72027..bc37e7b 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java @@ -48,6 +48,8 @@ final class LinuxJoystickDevice implements LinuxDevice { private final Event event = new Event(); private final LinuxJoystickButton[] buttons; private final LinuxJoystickAxis[] axes; + private final byte[] axisMap; + private final char[] buttonMap; private EventQueue event_queue; @@ -63,6 +65,8 @@ final class LinuxJoystickDevice implements LinuxDevice { setBufferSize(AbstractController.EVENT_QUEUE_DEPTH); buttons = new LinuxJoystickButton[getNumDeviceButtons()]; axes = new LinuxJoystickAxis[getNumDeviceAxes()]; + axisMap = getDeviceAxisMap(); + buttonMap = getDeviceButtonMap(); } catch (IOException e) { close(); throw e; @@ -141,6 +145,14 @@ final class LinuxJoystickDevice implements LinuxDevice { public final int getNumButtons() { return buttons.length; } + + public final byte[] getAxisMap() { + return axisMap; + } + + public final char[] getButtonMap() { + return buttonMap; + } private final int getNumDeviceButtons() throws IOException { return nGetNumButtons(fd); @@ -151,6 +163,16 @@ final class LinuxJoystickDevice implements LinuxDevice { return nGetNumAxes(fd); } private final static native int nGetNumAxes(long fd) throws IOException; + + private final byte[] getDeviceAxisMap() throws IOException { + return nGetAxisMap(fd); + } + private final static native byte[] nGetAxisMap(long fd) throws IOException; + + private final char[] getDeviceButtonMap() throws IOException { + return nGetButtonMap(fd); + } + private final static native char[] nGetButtonMap(long fd) throws IOException; private final int getVersion() throws IOException { return nGetVersion(fd); diff --git a/plugins/linux/src/native/net_java_games_input_LinuxJoystickDevice.c b/plugins/linux/src/native/net_java_games_input_LinuxJoystickDevice.c index f82023b..92da2a6 100644 --- a/plugins/linux/src/native/net_java_games_input_LinuxJoystickDevice.c +++ b/plugins/linux/src/native/net_java_games_input_LinuxJoystickDevice.c @@ -108,6 +108,41 @@ JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetNumAxes return num_axes; } +JNIEXPORT jbyteArray JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetAxisMap(JNIEnv *env, jclass unused, jlong fd_address) { + int fd = (int)fd_address; + __u8 axis_map[ABS_MAX + 1]; + if (ioctl(fd, JSIOCGAXMAP, axis_map) == -1) { + throwIOException(env, "Failed to get axis map (%d)\n", errno); + return NULL; + } + + jbyteArray axis_map_array = (*env)->NewByteArray(env, (ABS_MAX + 1)); + if (axis_map_array == NULL) + return NULL; + (*env)->SetByteArrayRegion(env, axis_map_array, 0, (ABS_MAX + 1), (jbyte *)axis_map); + return axis_map_array; +} + +JNIEXPORT jcharArray JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetButtonMap(JNIEnv *env, jclass unused, jlong fd_address) { + int fd = (int)fd_address; + int i=0; + __u16 button_map[KEY_MAX - BTN_MISC + 1]; + if (ioctl(fd, JSIOCGBTNMAP, button_map) == -1) { + throwIOException(env, "Failed to get button map (%d)\n", errno); + return NULL; + } + + for(i=0;i<10;i++) { + printf("Button %d maps to %d\n", i, button_map[i]); + } + + jcharArray button_map_array = (*env)->NewCharArray(env, (KEY_MAX - BTN_MISC + 1)); + if (button_map_array == NULL) + return NULL; + (*env)->SetCharArrayRegion(env, button_map_array, 0, (KEY_MAX - BTN_MISC + 1), (jbyte *)button_map); + return button_map_array; +} + JNIEXPORT jboolean JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetNextEvent(JNIEnv *env, jclass unused, jlong fd_address, jobject event_return) { int fd = (int)fd_address; jclass event_class = (*env)->GetObjectClass(env, event_return); |