aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/linux
diff options
context:
space:
mode:
authorendolf <[email protected]>2006-03-21 22:29:45 +0000
committerendolf <[email protected]>2006-03-21 22:29:45 +0000
commit9c18dc30639973d05b278826040bf73d485b6263 (patch)
treec1460034d44cf27a83a2133e18058e778a59c23d /plugins/linux
parent5fdd2acbe6429e3a24c4b0eb7b9ef7739b3b6fc8 (diff)
First attempt at merging version 2 from oddlabs svn repository. Merging version 2
git-svn-id: file:///home/sven/projects/JOGL/git-svn/svn-server-sync/jinput/branches/version2@137 e343933a-64c8-49c5-92b1-88f2ce3e89e8
Diffstat (limited to 'plugins/linux')
-rw-r--r--plugins/linux/build.xml56
-rw-r--r--plugins/linux/src/java/net/java/games/input/JInputLibrary.java244
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxAbsInfo.java (renamed from plugins/linux/src/native/JoystickDevice.h)77
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxAbstractController.java74
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxAxis.java192
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxAxisDescriptor.java (renamed from plugins/linux/src/native/MixedDevice.h)70
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxComponent.java78
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxConstantFF.java (renamed from plugins/linux/src/native/eventInterface.h)23
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxControllers.java81
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxDevice.java679
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxDeviceRumbler.java28
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java401
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxEvent.java53
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxEventComponent.java115
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java397
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxForceFeedbackEffect.java76
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxInputID.java52
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxJoystickAbstractController.java70
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxJoystickAxis.java69
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxJoystickButton.java65
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java185
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxJoystickEvent.java (renamed from plugins/linux/src/native/joystickInterface.h)38
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java229
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxMouse.java226
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxNativeTypesMap.java758
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxPOV.java95
-rw-r--r--plugins/linux/src/java/net/java/games/input/LinuxRumbleFF.java54
-rw-r--r--plugins/linux/src/java/net/java/games/input/NativeDefinitions.java125
-rw-r--r--plugins/linux/src/native/Device.h72
-rw-r--r--plugins/linux/src/native/EventDevice.cpp481
-rw-r--r--plugins/linux/src/native/EventDevice.h92
-rw-r--r--plugins/linux/src/native/JoystickDevice.cpp200
-rw-r--r--plugins/linux/src/native/MixedDevice.cpp134
-rw-r--r--plugins/linux/src/native/build.xml73
-rw-r--r--plugins/linux/src/native/eventInterface.cpp147
-rw-r--r--plugins/linux/src/native/eventInterfaceTypes.h27
-rw-r--r--plugins/linux/src/native/getDefinitions11
-rw-r--r--plugins/linux/src/native/jinput.cpp357
-rw-r--r--plugins/linux/src/native/joystickInterface.cpp160
-rw-r--r--plugins/linux/src/native/logger.h11
-rw-r--r--plugins/linux/src/native/net_java_games_input_JInputLibrary.h156
-rw-r--r--plugins/linux/src/native/net_java_games_input_LinuxEventDevice.c257
-rw-r--r--plugins/linux/src/native/net_java_games_input_LinuxJoystickDevice.c128
43 files changed, 2931 insertions, 3985 deletions
diff --git a/plugins/linux/build.xml b/plugins/linux/build.xml
index a120a51..c2a5fa8 100644
--- a/plugins/linux/build.xml
+++ b/plugins/linux/build.xml
@@ -1,32 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="all" name="Linux Plugin">
-
<target name="init">
- <property name="hello" value="world"/>
<mkdir dir="classes"/>
<mkdir dir="bin"/>
+ <condition property="linux" >
+ <!--<os family="unix" />-->
+ <os name="Linux" />
+ </condition>
+
</target>
<target depends="init" name="compile">
+ <!-- <ant dir="src/native" target="createNativeDefinitions.java"/>-->
<javac debug="true" deprecation="true" destdir="classes" source="1.4" target="1.4" srcdir="src/java">
<classpath>
- <pathelement location="../../coreAPI/bin/jinput.jar"/>
- <pathelement location="../../coreAPI/lib/jutils.jar"/>
+ <pathelement location="../../coreAPI/bin/jinput-core.jar"/>
+ <pathelement location="../../lib/jutils.jar"/>
</classpath>
</javac>
</target>
<target depends="init,compile" name="jar">
<jar jarfile="bin/linux.jar" compress="true" basedir="classes">
- <exclude name="**/*.java"/>
- <exclude name="linux.jar"/>
- <exclude name="apidoc"/>
+ <include name="**/*.class"/>
</jar>
- <copy file="bin/linux.jar" todir="../../coreAPI/src/tests/controller" />
</target>
- <target depends="compileNativeJinputLib,jar" description="Build everything." name="all">
- <echo message="Application built. Hello ${hello}!"/>
+ <target depends="jar,compileNativeJinputLib" description="Build everything." name="all">
</target>
<target name="javadoc" depends="init" description="Javadoc for Linux plugin for JInput.">
@@ -39,43 +39,31 @@
<pathelement location="src/java"/>
</sourcepath>
<classpath>
- <pathelement location="../../coreAPI/bin/jinput.jar"/>
+ <pathelement location="../../coreAPI/bin/jinput-core.jar"/>
<pathelement location="../../coreAPI/lib/jutils.jar"/>
</classpath>
</javadoc>
</target>
<target description="Clean all build products." name="clean">
- <delete failonerror="no">
- <fileset dir="classes">
- <include name="**/*.class"/>
- </fileset>
- </delete>
- <delete file="bin/linux.jar" failonerror="no"/>
- <delete file="src/native/libjinput-linux.so" failonerror="no"/>
- <delete file="../../coreAPI/src/tests/controller/linux.jar" failonerror="no" />
- <delete file="../../coreAPI/src/tests/controller/libjinput-linux.so" failonerror="no"/>
- <delete file="apidoc" failonerror="no"/>
+ <delete dir="classes" failonerror="no"/>
+ <delete dir="bin" failonerror="no"/>
+ <delete dir="apidocs" failonerror="no"/>
+ <ant inheritAll="false" antfile="src/native/build.xml" target="clean"/>
</target>
<target depends="init,compile" name="createJNIHeaders">
- <javah destdir="src/native">
+ <javah destdir="src/native">
<classpath>
- <pathelement location="../../coreAPI/bin/jinput.jar"/>
- <pathelement location="bin/linux.jar"/>
+ <pathelement location="classes"/>
</classpath>
- <class name="net.java.games.input.JInputLibrary"/>
- </javah>
- </target>
-
- <target depends="init" name="createNativeDefinitions.java">
- <exec dir="." executable="./getDefinitions" os="linux" output="src/java/net/java/games/input/NativeDefinitions.java">
- <arg line="/usr/include/linux/input.h"/>
- </exec>
+ <class name="net.java.games.input.LinuxEventDevice"/>
+ <class name="net.java.games.input.LinuxJoystickDevice"/>
+ </javah>
</target>
- <target depends="init" name="compileNativeJinputLib">
+ <target depends="init,createJNIHeaders" name="compileNativeJinputLib" if="linux">
<ant dir="src/native" target="compileNativeJinputLib"/>
- <copy file="src/native/libjinput-linux.so" todir="../../coreAPI/src/tests/controller" />
+ <copy file="src/native/libjinput-linux.so" todir="bin" />
</target>
</project>
diff --git a/plugins/linux/src/java/net/java/games/input/JInputLibrary.java b/plugins/linux/src/java/net/java/games/input/JInputLibrary.java
deleted file mode 100644
index 5dbd217..0000000
--- a/plugins/linux/src/java/net/java/games/input/JInputLibrary.java
+++ /dev/null
@@ -1,244 +0,0 @@
-package net.java.games.input;
-
-public class JInputLibrary {
- static {
- if(isSupported()) {
- System.loadLibrary("jinput-linux");
- }
- }
-
- private static boolean inited = false;
- private static Object workerThreadMonitor = new Object();
- private static boolean shutdown = false;
- private static Object shutdownThreadMonitor = new Object();
- private static boolean cleanupDone = false;
- private static int rumbler = -1;
- private static float force;
-
- public static boolean isSupported() {
- System.out.println("OS name is: " + System.getProperty("os.name"));
- if(System.getProperty("os.name").indexOf("Linux")!=-1) {
- System.out.println("Linux plugin is supported");
- return true;
- }
- System.out.println("Linux plugin is not supported");
- return false;
- }
-
- public static void init() {
- if(!inited) {
- System.out.println("Initing JInputLibrary");
- Thread initShutdownThread = new Thread() {
- public void run() {
-
- nativeInit();
- inited=true;
-
- synchronized (workerThreadMonitor) {
- workerThreadMonitor.notify();
- }
-
- synchronized(workerThreadMonitor) {
- while(!shutdown) {
- System.out.println("Waiting on monitor");
- System.out.flush();
- try {
- workerThreadMonitor.wait();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- if(rumbler>=0) {
- nativeRumble(rumbler,force);
- rumbler =-1;
- }
- }
- }
- System.out.println("Cleaning up from shutdown thread");
- realCleanup();
- cleanupDone = true;
- synchronized (shutdownThreadMonitor) {
- System.out.println("Notifying on shutdownThreadMonitor after shutdown");
- System.out.flush();
- shutdownThreadMonitor.notifyAll();
- System.out.println("Notified on shutdownThreadMonitor after shutdown");
- System.out.flush();
- }
- }
- };
-
- initShutdownThread.setDaemon(true);
- initShutdownThread.start();
-
- System.out.println("Shutdown thread created and run");
-
- Runtime.getRuntime().addShutdownHook(new Thread() {
- public void run() {
- cleanup();
- }
- });
-
- synchronized (workerThreadMonitor) {
- while(!inited) {
- try {
- workerThreadMonitor.wait();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- }
- }
- }
-
- private static void realCleanup() {
- //Give the rumblers chance to cleanup
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println("Environment cleanup");
- for(int i=0;i<JInputLibrary.getNumberOfDevices();i++) {
- if(JInputLibrary.getFFEnabled(i)) {
- JInputLibrary.nativeRumble(i, 0f);
- }
- JInputLibrary.nativeCleanup(i);
- }
- }
-
- public static void rumble(int rumblerNo, float forceValue) {
- rumbler = rumblerNo;
- force = forceValue;
- synchronized (workerThreadMonitor) {
- System.out.println("Notifying clean up thread");
- System.out.flush();
- workerThreadMonitor.notify();
- }
- }
-
- private static void cleanup() {
- shutdown = true;
- System.out.println("Trying to notify for cleanup");
- System.out.flush();
- synchronized (workerThreadMonitor) {
- System.out.println("Notifying clean up thread");
- System.out.flush();
- workerThreadMonitor.notify();
- }
-
- while(!cleanupDone) {
- synchronized (shutdownThreadMonitor) {
- try {
- System.out.println("cleanup waiting on shutdownThreadMonitor");
- System.out.flush();
- shutdownThreadMonitor.wait();
- System.out.println("cleanup done waiting on shutdownThreadMonitor");
- System.out.flush();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
-
- /** Call to poll the device at the native library
- * @param deviceID The native device ID
- * @param buttonData Array to populate with button values
- * @param relAxesData Array to populate with relative axes values
- * @param absAxesData Array to populate with absolute axes values
- * @return the number of events read
- */
- public static int safePoll(int deviceID, int buttonData[], int relAxesData[], int absAxesData[]) {
- if(!shutdown) {
- return poll(deviceID, buttonData, relAxesData, absAxesData);
- }
-
- return 0;
- }
-
-
- /** Get the name of a device from the native library
- * @param deviceID The device id
- * @return The devices name
- */
- public static native String getDeviceName(int deviceID);
- /** Get the number of absolute axes for the requested device
- * @param deviceID The device ID
- * @return The number of abs axes
- */
- public static native int getNumAbsAxes(int deviceID);
- /** Get the nmber or relative axes from the native library
- * @param deviceID The native device ID
- * @return The number of raltive axes for the device
- */
- public static native int getNumRelAxes(int deviceID);
- /** Gets the number of buttons for the requested devce from the native library
- * @param deviceID The device ID
- * @return The number of buttons
- */
- public static native int getNumButtons(int deviceID);
- /** Initialises the native library
- * @return <0 if something went wrong
- */
- private static native int nativeInit();
- /** Gets the number of devices the native library found
- * @return Th number of devices
- */
- public static native int getNumberOfDevices();
- /** Native call to get the supported absolute axes for a device
- * @param deviceID The native device number
- * @param supportedAbsAxes aray to populate
- */
- public static native void getSupportedAbsAxes(int deviceID, int supportedAbsAxes[]);
- /** Native call to get the supported relative axes for a device
- * @param deviceID The native device number
- * @param supportedRelAxes aray to populate
- */
- public static native void getSupportedRelAxes(int deviceID, int supportedRelAxes[]);
- /** Native call to get the supported buttons for a device
- * @param deviceID The native device ID
- * @param supportedButtons The array to populate
- */
- public static native void getSupportedButtons(int deviceID, int supportedButtons[]);
- /** Call to poll the device at the native library
- * @param deviceID The native device ID
- * @param buttonData Array to populate with button values
- * @param relAxesData Array to populate with relative axes values
- * @param absAxesData Array to populate with absolute axes values
- * @return the number of events read
- */
- public static native int poll(int deviceID, int buttonData[], int relAxesData[], int absAxesData[]);
- /** Returns the fuzz of an axis fro mthe native lib
- * @param deviceID The native device id
- * @param axisID The native axis ID
- * @return The fuzz
- */
- public static native int getAbsAxisFuzz(int deviceID, int axisID);
- /** Gets the maximum value for an absloute axis fr omthe native library
- * @param deviceID The native device ID
- * @param axisID The native axis ID
- * @return The Max value
- */
- public static native int getAbsAxisMaximum(int deviceID, int axisID);
- /** Gets the minimum value for an absloute axis from the native library
- * @param deviceID The native device ID
- * @param axisID The native axis number
- * @return The min value
- */
- public static native int getAbsAxisMinimum(int deviceID, int axisID);
- /** Gets the port type from the native lib
- * @param deviceID The device to get the port type for
- * @return The port type
- */
- public static native int getNativePortType(int deviceID);
-
- public static native boolean getFFEnabled(int deviceID);
-
- private static native void nativeRumble(int deviceID, float intensity);
-
- private static native void nativeCleanup(int deviceID);
-}
diff --git a/plugins/linux/src/native/JoystickDevice.h b/plugins/linux/src/java/net/java/games/input/LinuxAbsInfo.java
index 87afa4d..a2b9456 100644
--- a/plugins/linux/src/native/JoystickDevice.h
+++ b/plugins/linux/src/java/net/java/games/input/LinuxAbsInfo.java
@@ -23,48 +23,47 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*/
+package net.java.games.input;
-#ifndef JoystickDevice_h
-#define JoystickDevice_h
+/**
+ * @author elias
+ */
+final class LinuxAbsInfo {
+ private int value;
+ private int minimum;
+ private int maximum;
+ private int fuzz;
+ private int flat;
+
+ public final void set(int value, int min, int max, int fuzz, int flat) {
+ this.value = value;
+ this.minimum = min;
+ this.maximum = max;
+ this.fuzz = fuzz;
+ this.flat = flat;
+ }
-#include <stdint.h>
-#include <linux/input.h>
-#include "eventInterfaceTypes.h"
-#include "Device.h"
+ public final String toString() {
+ return "AbsInfo: value = " + value + " | min = " + minimum + " | max = " + maximum + " | fuzz = " + fuzz + " | flat = " + flat;
+ }
-class JoystickDevice : public Device {
+ public final int getValue() {
+ return value;
+ }
- private:
- int fd;
- int inited;
- char *name;
- int numButtons;
- int *absAxesData;
- uint8_t *buttonData;
- int numAbsAxes;
+ final int getMax() {
+ return maximum;
+ }
- public:
- JoystickDevice(char *deviceFilename);
- int getNumberRelAxes();
- int getNumberAbsAxes();
- int getNumberButtons();
- const char *getName();
- int getBusType();
- int getVendorID();
- int getProductID();
- int getVersion();
- void getSupportedRelAxes(int supportedAxis[]);
- void getSupportedAbsAxes(int supportedAxis[]);
- void getSupportedButtons(int supportedButtons[]);
- int poll();
- void getPolledData(int relAxesData[], int absAxesData[], int buttonData[]);
- int getAbsAxisMinimum(int axisNumber);
- int getAbsAxisMaximum(int axisNumber);
- int getAbsAxisFuzz(int axisNumber);
- int isValidDevice();
- bool getFFEnabled();
- void rumble(float force);
- void cleanup();
-};
+ final int getMin() {
+ return minimum;
+ }
+
+ final int getFlat() {
+ return flat;
+ }
-#endif //eventInterface_eventDevice_h
+ final int getFuzz() {
+ return fuzz;
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxAbstractController.java b/plugins/linux/src/java/net/java/games/input/LinuxAbstractController.java
new file mode 100644
index 0000000..7efbfb1
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxAbstractController.java
@@ -0,0 +1,74 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+package net.java.games.input;
+
+import java.io.IOException;
+
+/** Represents a Linux controller
+* @author elias
+* @version 1.0
+*/
+final class LinuxAbstractController extends AbstractController {
+ private final PortType port;
+ private final LinuxEventDevice device;
+ private final Type type;
+
+ protected LinuxAbstractController(LinuxEventDevice device, Component[] components, Controller[] children, Rumbler[] rumblers, Type type) throws IOException {
+ super(device.getName(), components, children, rumblers);
+ this.device = device;
+ this.port = device.getPortType();
+ this.type = type;
+ }
+
+ public final PortType getPortType() {
+ return port;
+ }
+
+ public final void pollDevice() throws IOException {
+ device.pollKeyStates();
+ }
+
+ protected final boolean getNextDeviceEvent(Event event) throws IOException {
+ return LinuxControllers.getNextDeviceEvent(event, device);
+ }
+
+ public Type getType() {
+ return type;
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxAxis.java b/plugins/linux/src/java/net/java/games/input/LinuxAxis.java
deleted file mode 100644
index 21f3bc5..0000000
--- a/plugins/linux/src/java/net/java/games/input/LinuxAxis.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/**
- * Copyright (C) 2003 Jeremy Booth ([email protected])
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * The name of the author may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-
-package net.java.games.input;
-
-import net.java.games.input.AbstractComponent;
-import net.java.games.input.LinuxDevice;
-
-/** Represents an Axis absolute or relative
- *
- * @author Jeremy Booth ([email protected])
- */
-public class LinuxAxis extends AbstractComponent {
-
- /** The controller this axis is part of */
- private LinuxDevice controller;
- /** The native ID of this axis */
- private int axisID;
- /** The null zone, defaulted to 0 */
- private float nullZone = 0.0f;
- /** Is this axis analog */
- private boolean isAnalog = true;
- /** Are the values returned by getPollData normalised */
- private boolean isNormalized = false;
- /** Is this a relative axis */
- private boolean isRelative = false;
- /** Should we normalise the value before returning it in getPollData */
- private boolean needsNormalising = false;
- /** The minimum possible axis value (not always used) */
- private float minAxisValue;
- /** The maximum possibe axis value (not always used */
- private float maxAxisValue;
- /** The current value of the axis */
- private float value = 0.0f;
-
- /**
- * Creates a new instance of LinuxAxis
- * @param controller The parent Controller
- * @param axisID The native ID of this axis
- * @param name The name of this axis
- * @param id The Axis.Identifier of this axis
- * @param deadzone The deadzone (null zone) of this axis
- * @param isAnalog Is this axis analog
- * @param isNormalized Is this axis normalised
- * @param isRelative Is this axis relative
- */
- public LinuxAxis(LinuxDevice controller, int axisID, String name, Identifier id, float deadzone, boolean isAnalog, boolean isNormalized, boolean isRelative) {
- super(name, id);
- this.controller = controller;
- this.axisID = axisID;
- this.nullZone = deadzone;
- this.isAnalog = isAnalog;
- this.isNormalized = isNormalized;
- this.isRelative = isRelative;
-
- }
-
- /** Creates a new instance of LinuxAxis, it will auto normalise the data based on
- * the minimum and maximum values provided
- * @param controller The parent Controller
- * @param axisID The native ID of this axis
- * @param name The name of this axis
- * @param id The Axis.Identifier of this axis
- * @param deadzone The deadzone (null zone) of this axis
- * @param isAnalog Is this axis analog
- * @param isRelative Is this axis relative
- * @param minAxisValue Minimum value that the native library will return for this axis
- * @param maxAxisValue Maximum value that the native library will return for this axis
- */
- public LinuxAxis(LinuxDevice controller, int axisID, String name, Identifier id, float deadzone, boolean isAnalog, boolean isRelative, float minAxisValue, float maxAxisValue) {
- super(name, id);
-
- this.controller = controller;
- this.axisID = axisID;
- this.nullZone = deadzone;
- this.isAnalog = isAnalog;
- this.isNormalized = false;
- this.isRelative = isRelative;
- this.needsNormalising = true;
- this.minAxisValue = minAxisValue;
- this.maxAxisValue = maxAxisValue;
-
- }
-
- /** Returns <code>true</code> if data returned from <code>poll</code>
- * is relative to the last call, or <code>false</code> if data
- * is absolute.
- * @return Returns <code>true</code> if data returned from <code>poll</code>
- * is relative to the last call, or <code>false</code> if data
- * is absolute.
- */
- public boolean isRelative() {
- return isRelative;
- }
-
- /** Returns the suggested dead zone for this axis. Dead zone is the
- * amount polled data can vary before considered a significant change
- * in value. An application can safely ignore changes less than this
- * value in the positive or negative direction.
- * @return 0.0f by default, can be overridden
- */
- public float getDeadZone() {
- return nullZone;
- }
-
- /** Returns whether or not the axis is analog, or false if it is digital.
- * @return false by default, can be overridden
- */
- public boolean isAnalog() {
- return isAnalog;
- }
-
- /** Returns the data from the last time the control has been polled.
- * If this axis is a button, the value returned will be either 0.0f or 1.0f.
- * If this axis is normalized, the value returned will be between -1.0f and
- * 1.0f.
- * @return 0.0f by default, can be overridden
- */
- public float getPollData() {
- if(isPolling()) {
- updateValue();
- }
- return value;
- }
-
- /** Update this axis data from the latest native poll value
- */
- private void updateValue() {
- if(isAnalog) {
- float tempVal;
-
- if(isRelative) {
- tempVal = (float)controller.getRelAxisValue(axisID);
- } else {
- tempVal = (float)controller.getAbsAxisValue(axisID);
- }
- if(needsNormalising) {
- if(isRelative) {
- if(tempVal>1) {
- tempVal = 1;
- } else if(tempVal<-1) {
- tempVal = -1;
- }
- value = tempVal;
- } else {
- //float center = (minAxisValue + maxAxisValue) / 2;
- //value = (tempVal - center) / center;
- float center = ((maxAxisValue - minAxisValue)/2);
- value = (((tempVal - minAxisValue) - center) / center);
- //System.out.println("tempVal: " + tempVal + " minAxisValue: " + minAxisValue + " maxAxisValue: " + maxAxisValue + " center: " + center + " value: " + value);
- //System.out.flush();
- }
- } else {
- value = tempVal;
- }
- } else {
- value = (float)controller.getButtonValue(axisID);
- }
- }
-
- /** Returns whether or not data polled from this axis is normalized
- * between the values of -1.0f and 1.0f.
- * @return true by default, can be overridden
- */
- public boolean isNormalized() {
- return (isNormalized || needsNormalising);
- }
-
-}
diff --git a/plugins/linux/src/native/MixedDevice.h b/plugins/linux/src/java/net/java/games/input/LinuxAxisDescriptor.java
index 3239ed4..d2e476d 100644
--- a/plugins/linux/src/native/MixedDevice.h
+++ b/plugins/linux/src/java/net/java/games/input/LinuxAxisDescriptor.java
@@ -23,48 +23,40 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*/
+package net.java.games.input;
-#ifndef MixedDevice_h
-#define MixedDevice_h
+/**
+ * @author elias
+ */
+final class LinuxAxisDescriptor {
+ private int type;
+ private int code;
+
+ public final void set(int type, int code) {
+ this.type = type;
+ this.code = code;
+ }
-#include <stdint.h>
-#include <linux/input.h>
-#include "eventInterfaceTypes.h"
-#include "Device.h"
-#include "EventDevice.h"
-#include "JoystickDevice.h"
-#include "MixedDevice.h"
+ public final int getType() {
+ return type;
+ }
-class MixedDevice : public Device {
+ public final int getCode() {
+ return code;
+ }
- private:
- JoystickDevice *joystickDevice;
- EventDevice *eventDevice;
+ public final int hashCode() {
+ return type ^ code;
+ }
- public:
- MixedDevice(JoystickDevice *joystickDevice, EventDevice *eventDevice);
- int getNumberRelAxes();
- int getNumberAbsAxes();
- int getNumberButtons();
- const char *getName();
- int getBusType();
- int getVendorID();
- int getProductID();
- int getVersion();
- void getSupportedRelAxes(int supportedAxis[]);
- void getSupportedAbsAxes(int supportedAxis[]);
- void getSupportedButtons(int supportedButtons[]);
- void getSupportedRelAxes(short supportedAxis[]);
- void getSupportedAbsAxes(short supportedAxis[]);
- void getSupportedButtons(short supportedButtons[]);
- int poll();
- void getPolledData(int relAxesData[], int absAxesData[], int buttonData[]);
- int getAbsAxisMinimum(int axisNumber);
- int getAbsAxisMaximum(int axisNumber);
- int getAbsAxisFuzz(int axisNumber);
- bool getFFEnabled();
- void rumble(float force);
- void cleanup();
-};
+ public final boolean equals(Object other) {
+ if (!(other instanceof LinuxAxisDescriptor))
+ return false;
+ LinuxAxisDescriptor descriptor = (LinuxAxisDescriptor)other;
+ return descriptor.type == type && descriptor.code == code;
+ }
-#endif //eventInterface_eventDevice_h
+ public final String toString() {
+ return "LinuxAxis: type = 0x" + Integer.toHexString(type) + ", code = 0x" + Integer.toHexString(code);
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxComponent.java b/plugins/linux/src/java/net/java/games/input/LinuxComponent.java
new file mode 100644
index 0000000..8016deb
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxComponent.java
@@ -0,0 +1,78 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+package net.java.games.input;
+
+import java.io.IOException;
+
+/** Represents a linux Axis
+* @author elias
+* @version 1.0
+*/
+class LinuxComponent extends AbstractComponent {
+ private final LinuxEventComponent component;
+
+ public LinuxComponent(LinuxEventComponent component) {
+ super(component.getIdentifier().getName(), component.getIdentifier());
+ this.component = component;
+ }
+
+ public final boolean isRelative() {
+ return component.isRelative();
+ }
+
+ public final boolean isAnalog() {
+ return component.isAnalog();
+ }
+
+ protected float poll() throws IOException {
+ return convertValue(LinuxControllers.poll(component), component.getDescriptor());
+ }
+
+ float convertValue(float value, LinuxAxisDescriptor descriptor) {
+ return getComponent().convertValue(value);
+ }
+
+ public final float getDeadZone() {
+ return component.getDeadZone();
+ }
+
+ public final LinuxEventComponent getComponent() {
+ return component;
+ }
+}
diff --git a/plugins/linux/src/native/eventInterface.h b/plugins/linux/src/java/net/java/games/input/LinuxConstantFF.java
index 92e421c..6610c5a 100644
--- a/plugins/linux/src/native/eventInterface.h
+++ b/plugins/linux/src/java/net/java/games/input/LinuxConstantFF.java
@@ -23,15 +23,20 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*/
+package net.java.games.input;
-#if !defined(eventInterface_h)
-#define eventInterface_h
+import java.io.IOException;
-#include "Device.h"
-
-int evGetEventInterfaceVersionNumber();
-int evInit();
-int evGetNumberDevices();
-void evGetDevices(Device **deviceList);
+/**
+ * @author elias
+ */
+final class LinuxConstantFF extends LinuxForceFeedbackEffect {
+ public LinuxConstantFF(LinuxEventDevice device) throws IOException {
+ super(device);
+ }
-#endif //eventInterface_h
+ protected final int upload(int id, float intensity) throws IOException {
+ int scaled_intensity = Math.round(intensity*0x7fff);
+ return getDevice().uploadConstantEffect(id, 0, 0, 0, 0, 0, scaled_intensity, 0, 0, 0, 0);
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxControllers.java b/plugins/linux/src/java/net/java/games/input/LinuxControllers.java
new file mode 100644
index 0000000..e5edf81
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxControllers.java
@@ -0,0 +1,81 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+package net.java.games.input;
+
+import java.io.IOException;
+
+/** helper methods for Linux specific Controllers
+* @author elias
+* @version 1.0
+*/
+final class LinuxControllers {
+ private final static LinuxEvent linux_event = new LinuxEvent();
+
+ /* Declared synchronized to protect linux_event */
+ public final static synchronized boolean getNextDeviceEvent(Event event, LinuxEventDevice device) throws IOException {
+ while (device.getNextEvent(linux_event)) {
+ LinuxAxisDescriptor descriptor = linux_event.getDescriptor();
+ LinuxComponent component = device.mapDescriptor(descriptor);
+ if (component != null) {
+ float value = component.convertValue(linux_event.getValue(), descriptor);
+ event.set(component, value, linux_event.getNanos());
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private final static LinuxAbsInfo abs_info = new LinuxAbsInfo();
+
+ /* Declared synchronized to protect abs_info */
+ public final static synchronized float poll(LinuxEventComponent event_component) throws IOException {
+ int native_type = event_component.getDescriptor().getType();
+ switch (native_type) {
+ case NativeDefinitions.EV_KEY:
+ int native_code = event_component.getDescriptor().getCode();
+ float state = event_component.getDevice().isKeySet(native_code) ? 1f : 0f;
+ return state;
+ case NativeDefinitions.EV_ABS:
+ event_component.getAbsInfo(abs_info);
+ return abs_info.getValue();
+ default:
+ throw new RuntimeException("Unkown native_type: " + native_type);
+ }
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxDevice.java b/plugins/linux/src/java/net/java/games/input/LinuxDevice.java
index 4f7c559..2f26a68 100644
--- a/plugins/linux/src/java/net/java/games/input/LinuxDevice.java
+++ b/plugins/linux/src/java/net/java/games/input/LinuxDevice.java
@@ -25,680 +25,15 @@
*/
package net.java.games.input;
+import java.io.IOException;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.List;
import java.util.ArrayList;
/**
- * Represents a device that is not a keyboard or mouse.
- * @author Jeremy Booth ([email protected])
+ * @author elias
*/
-public class LinuxDevice extends AbstractController {
-
- /** The name of the device
- */
- private String name;
- /** The native ID of the device
- */
- private int nativeID;
- /** The port type the device is attached to.
- */
- private PortType portType;
- /** List of buttons the device has
- */
- private LinuxAxis[] buttons;
- /** List of relative axes the device has
- */
- private LinuxAxis[] relAxes;
- /** List of absolute axes the device has
- */
- private LinuxAxis[] absAxes;
- /** List of coolie hats the device has
- */
- private LinuxHat[] hats;
- /** The id's of the coolie hat axes
- */
- private int hatAxisIDs[] = new int[8];
- /** The number of buttons the device has
- */
- private int numButtons;
- /** The number of relative axes the device has
- */
- private int numRelAxes;
- /** The number of absolute axes the device has
- */
- private int numAbsAxes;
- /** The number of coolie hats the device has
- */
- private int numHats=0;
- /** The native button values.
- */
- private int[] buttonData;
- /** The native relative axes values
- */
- private int[] relAxesData;
- /** The native absolute axis values
- */
- private int[] absAxesData;
- /** A guess at the device type.
- */
- private Type typeGuess = Type.UNKNOWN;
- /** An array of the list of axes this device has
- */
- private ArrayList axesArray = new ArrayList();
-
- /** Creates a new instance of LinuxDevice
- * @param nativeID The native ID of this device
- * @param name The name of this device
- * @param numButtons The number of buttons the devices has
- * @param numRelAxes The number of raltive axes this device has
- * @param numAbsAxes The number of absolute axes this device has
- */
- public LinuxDevice(int nativeID, String name, int numButtons, int numRelAxes, int numAbsAxes, Controller.Type type) {
- this(nativeID, name, numButtons, numRelAxes, numAbsAxes);
- typeGuess = type;
- }
-
- /** Creates a new instance of LinuxDevice
- * @param nativeID The native ID of this device
- * @param name The name of this device
- * @param numButtons The number of buttons the devices has
- * @param numRelAxes The number of raltive axes this device has
- * @param numAbsAxes The number of absolute axes this device has
- */
- public LinuxDevice(int nativeID, String name, int numButtons, int numRelAxes, int numAbsAxes) {
- super(name);
-
- children = NO_CONTROLLERS;
- rumblers = NO_RUMBLERS;
-
- this.nativeID = nativeID;
-
- portType = LinuxNativeTypesMap.getPortType(JInputLibrary.getNativePortType(nativeID));
-
- for(int i=0;i<8;i++) {
- hatAxisIDs[i] = -1;
- }
-
- this.numButtons = numButtons;
- this.numRelAxes = numRelAxes;
- this.numAbsAxes = numAbsAxes;
- this.numHats = 0;
-
- buttonData = new int[numButtons];
- relAxesData = new int[numRelAxes];
- absAxesData = new int[numAbsAxes];
-
- createButtons(numButtons);
- createRelAxes(numRelAxes);
- createAbsAxes(numAbsAxes);
- createHats();
-
- /*ArrayList tempAxes = new ArrayList();
- for(int i=0;i<numButtons;i++) {
- Axis tempAxis = buttons[i];
- if(tempAxis!=null) {
- tempAxes.add(tempAxis);
- }
- }
- for(int i=0;i<numRelAxes;i++) {
- Axis tempAxis = relAxes[i];
- if(tempAxis!=null) {
- tempAxes.add(tempAxis);
- }
- }
- for(int i=0;i<numAbsAxes;i++) {
- Axis tempAxis = absAxes[i];
- if(tempAxis!=null) {
- tempAxes.add(tempAxis);
- }
- }
-
- axes = (Axis[]) tempAxes.toArray(axes);*/
- for(int i=0;i<numAbsAxes;i++) {
- if(absAxes[i]!=null) {
- axesArray.add(absAxes[i]);
- }
- }
- for(int i=0;i<numRelAxes;i++) {
- if(relAxes[i]!=null) {
- axesArray.add(relAxes[i]);
- }
- }
- for(int i=0;i<numHats;i++) {
- if(hats[i]!=null) {
- axesArray.add(hats[i]);
- }
- }
- for(int i=0;i<numButtons;i++) {
- if(buttons[i]!=null) {
- axesArray.add(buttons[i]);
- }
- }
- components = (Component[]) axesArray.toArray(components);
-
- guessType();
-
- if(getFFEnabled()) {
- System.out.println("Java code thinks FF is enabled for device " + name);
- Rumbler[] tempRumblers = rumblers;
- rumblers = new Rumbler[rumblers.length+1];
- System.arraycopy(tempRumblers,0,rumblers,0,tempRumblers.length);
- rumblers[rumblers.length-1] = new LinuxDeviceRumbler(nativeID);
- System.out.println("rumblers.length: " + rumblers.length);
- System.out.println("getRumblers().length: " + getRumblers().length);
- } else {
- System.out.println("Java code thinks FF is disabled for device " + name);
- }
- }
-
- /*public Axis[] getAxes(){
- Axis retval[] = new Axis[0];
- retval = (Axis []) axesArray.toArray(retval);
- return retval;
- }*/
-
- /**
- * Returns the port type that this device is connected to.
- * @return The port type
- */
- public PortType getPortType() {
- return portType;
- }
-
- /**
- * Returns the type of the Controller.
- * @return The controller type.
- */
- public Type getType() {
- return typeGuess;
- }
-
- /** Create the buttons for the device
- * @param numButtons The number of buttons the device has
- */
- private void createButtons(int numButtons) {
-
- int supportedButtons[] = new int[numButtons];
- buttons = new LinuxAxis[numButtons];
- if(numButtons>0) {
- getSupportedButtons(supportedButtons);
- for(int i=0;i<numButtons;i++) {
- buttons[i] = createButton(i, supportedButtons[i]);
- //axesArray.add(buttons[i]);
- }
- }
- }
-
- /** Create the relative axes for the device
- * @param numRelAxes The number of relative axes the device has
- */
- private void createRelAxes(int numRelAxes) {
- int supportedRelAxes[] = new int[numRelAxes];
- getSupportedRelAxes(supportedRelAxes);
- relAxes = new LinuxAxis[numRelAxes];
- for(int i=0;i<numRelAxes;i++) {
- relAxes[i] = createRelAxis(i, supportedRelAxes[i]);
- //axesArray.add(relAxes[i]);
- }
- }
-
- /** Create the absolute axes for the device
- * @param numAbsAxes The number of absolute axes the device has
- */
- private void createAbsAxes(int numAbsAxes) {
- int supportedAbsAxes[] = new int[numAbsAxes];
- getSupportedAbsAxes(supportedAbsAxes);
- absAxes = new LinuxAxis[numAbsAxes];
- for(int i=0;i<numAbsAxes;i++) {
- // Nasy code here
- // Hats underlinux are 2 axis, combine them
- if(supportedAbsAxes[i] == NativeDefinitions.ABS_HAT0X) {
- hatAxisIDs[0] = i;
- } else if(supportedAbsAxes[i] == NativeDefinitions.ABS_HAT0Y) {
- hatAxisIDs[1] = i;
- } else if(supportedAbsAxes[i] == NativeDefinitions.ABS_HAT1X) {
- hatAxisIDs[2] = i;
- } else if(supportedAbsAxes[i] == NativeDefinitions.ABS_HAT1Y) {
- hatAxisIDs[3] = i;
- } else if(supportedAbsAxes[i] == NativeDefinitions.ABS_HAT2X) {
- hatAxisIDs[4] = i;
- } else if(supportedAbsAxes[i] == NativeDefinitions.ABS_HAT2Y) {
- hatAxisIDs[5] = i;
- } else if(supportedAbsAxes[i] == NativeDefinitions.ABS_HAT3X) {
- hatAxisIDs[6] = i;
- } else if(supportedAbsAxes[i] == NativeDefinitions.ABS_HAT3Y) {
- hatAxisIDs[7] = i;
- } else {
- absAxes[i] = createAbsAxis(i, supportedAbsAxes[i]);
- //axesArray.add(absAxes[i]);
- }
- }
-
- }
-
- /** Create the coolie hats for the device
- */
- private void createHats() {
- LinuxHat tempHats[] = new LinuxHat[4];
- for(int i=0;i<4;i++) {
- int x = i*2;
- int y= x+1;
- //Check we have at least one hat axis (can hats have just one axis?
- if((hatAxisIDs[x]!=-1) || (hatAxisIDs[y]!=-1)) {
- String hatName = "Hat " + i;
- tempHats[numHats] = createHat(hatName, hatAxisIDs[x], hatAxisIDs[y]);
- numHats++;
- }
- }
- hats = new LinuxHat[numHats];
- for(int i=0;i<numHats;i++) {
- hats[i] = tempHats[i];
- //axesArray.add(hats[i]);
- }
- }
-
- /** Take a guess at the device type.
- */
- private void guessType() {
- int joystickCharacteristic=0;
- int digitiserCharacteristic=0;
- int gamepadCharacteristic=0;
- int miscCharacteristic=0;
- int mouseCharacteristic=0;
-
- int supportedButtons[] = new int[numButtons];
- getSupportedButtons(supportedButtons);
-
- for(int i=0;i<numButtons;i++) {
- switch (supportedButtons[i]) {
- case NativeDefinitions.BTN_TRIGGER :
- case NativeDefinitions.BTN_THUMB :
- case NativeDefinitions.BTN_THUMB2 :
- case NativeDefinitions.BTN_TOP :
- case NativeDefinitions.BTN_TOP2 :
- case NativeDefinitions.BTN_PINKIE :
- case NativeDefinitions.BTN_BASE :
- case NativeDefinitions.BTN_BASE2 :
- case NativeDefinitions.BTN_BASE3 :
- case NativeDefinitions.BTN_BASE4 :
- case NativeDefinitions.BTN_BASE5 :
- case NativeDefinitions.BTN_BASE6 :
- case NativeDefinitions.BTN_DEAD :
- joystickCharacteristic++;
- break;
- case NativeDefinitions.BTN_A :
- case NativeDefinitions.BTN_B :
- case NativeDefinitions.BTN_C :
- case NativeDefinitions.BTN_X :
- case NativeDefinitions.BTN_Y :
- case NativeDefinitions.BTN_Z :
- case NativeDefinitions.BTN_TL :
- case NativeDefinitions.BTN_TR :
- case NativeDefinitions.BTN_TL2 :
- case NativeDefinitions.BTN_TR2 :
- case NativeDefinitions.BTN_SELECT :
- case NativeDefinitions.BTN_MODE :
- case NativeDefinitions.BTN_THUMBL :
- case NativeDefinitions.BTN_THUMBR :
- gamepadCharacteristic++;
- break;
- case NativeDefinitions.BTN_0 :
- case NativeDefinitions.BTN_1 :
- case NativeDefinitions.BTN_2 :
- case NativeDefinitions.BTN_3 :
- case NativeDefinitions.BTN_4 :
- case NativeDefinitions.BTN_5 :
- case NativeDefinitions.BTN_6 :
- case NativeDefinitions.BTN_7 :
- case NativeDefinitions.BTN_8 :
- case NativeDefinitions.BTN_9 :
- miscCharacteristic++;
- break;
- case NativeDefinitions.BTN_LEFT :
- case NativeDefinitions.BTN_RIGHT :
- case NativeDefinitions.BTN_MIDDLE :
- case NativeDefinitions.BTN_SIDE :
- case NativeDefinitions.BTN_EXTRA :
- case NativeDefinitions.BTN_FORWARD :
- case NativeDefinitions.BTN_BACK :
- mouseCharacteristic++;
- break;
- case NativeDefinitions.BTN_TOOL_PEN :
- case NativeDefinitions.BTN_TOOL_RUBBER :
- case NativeDefinitions.BTN_TOOL_BRUSH :
- case NativeDefinitions.BTN_TOOL_PENCIL :
- case NativeDefinitions.BTN_TOOL_AIRBRUSH :
- case NativeDefinitions.BTN_TOOL_FINGER :
- case NativeDefinitions.BTN_TOOL_MOUSE :
- case NativeDefinitions.BTN_TOOL_LENS :
- case NativeDefinitions.BTN_TOUCH :
- case NativeDefinitions.BTN_STYLUS :
- case NativeDefinitions.BTN_STYLUS2 :
- digitiserCharacteristic++;
- break;
- default:
- // no sweat, it's non of the above, erg
- }
- }
- if((joystickCharacteristic > 0) &&
- (joystickCharacteristic >= digitiserCharacteristic) &&
- (joystickCharacteristic >= gamepadCharacteristic) &&
- (joystickCharacteristic >= miscCharacteristic) &&
- (joystickCharacteristic >= mouseCharacteristic)) {
- typeGuess = Type.STICK;
- } else if((gamepadCharacteristic > 0) &&
- (gamepadCharacteristic >= digitiserCharacteristic) &&
- (gamepadCharacteristic >= joystickCharacteristic) &&
- (gamepadCharacteristic >= miscCharacteristic) &&
- (gamepadCharacteristic >= mouseCharacteristic)) {
- typeGuess = Type.GAMEPAD;
- } else if((digitiserCharacteristic > 0) &&
- (digitiserCharacteristic >= gamepadCharacteristic) &&
- (digitiserCharacteristic >= joystickCharacteristic) &&
- (digitiserCharacteristic >= miscCharacteristic) &&
- (digitiserCharacteristic >= mouseCharacteristic)) {
- typeGuess = Type.TRACKPAD;
- } else if((miscCharacteristic > 0) &&
- (miscCharacteristic >= gamepadCharacteristic) &&
- (miscCharacteristic >= joystickCharacteristic) &&
- (miscCharacteristic >= miscCharacteristic) &&
- (miscCharacteristic >= mouseCharacteristic)) {
- // I'm not sure what one of these would be, but it has axis other
- // wise a LinuxKeyboard would have been constructed, so assume its
- // some kind of stick;
- typeGuess = Type.STICK;
- } else if((mouseCharacteristic > 0) &&
- (mouseCharacteristic >= digitiserCharacteristic) &&
- (mouseCharacteristic >= joystickCharacteristic) &&
- (mouseCharacteristic >= miscCharacteristic) &&
- (mouseCharacteristic >= gamepadCharacteristic)) {
- // We shouldn't ever get here, as a mouse should have constructed
- // a LinuxMouse object, but you never know
- typeGuess = Type.MOUSE;
- }
- if(typeGuess == Type.STICK) {
- String tempName = getName().toLowerCase();
- if((tempName.indexOf("gamepad") > -1) || (tempName.indexOf("game pad") > -1)) {
- typeGuess = Type.GAMEPAD;
- }
- }
- }
-
- /** Create an button for the device
- * @param buttonNumber The button number
- * @param nativeButtonType The type of button
- * @return The new button
- */
- private LinuxAxis createButton(int buttonNumber, int nativeButtonType) {
- Component.Identifier id = LinuxNativeTypesMap.getButtonID(nativeButtonType);
- String name = LinuxNativeTypesMap.getButtonName(nativeButtonType);
- if(name == null) {
- name = "Uknown button";
- id = Component.Identifier.Button.UNKNOWN;
- }
-
- return new LinuxAxis(this, buttonNumber, name, id, 0, false, true, false);
- }
-
- /** Create a relative axis for the device
- * @param axisNumber The native axis id
- * @param nativeType The native type
- * @return The new axis
- */
- private LinuxAxis createRelAxis(int axisNumber, int nativeType) {
- Component.Identifier id = LinuxNativeTypesMap.getRelAxisID(nativeType);
- String name = LinuxNativeTypesMap.getRelAxisName(nativeType);
-
- // This is done to be like the windows version
- // return new LinuxAxis(this, axisNumber, name, id, 0, true, true, 0, 0);
-
- // this is what should be done
- return new LinuxAxis(this, axisNumber, name, id, 0, true, false, true);
- }
-
- /** Create an absolute axis for the device
- * @param axisNumber The native axis number
- * @param nativeType The native tpye
- * @return The new axis
- */
- private LinuxAxis createAbsAxis(int axisNumber, int nativeType) {
- Component.Identifier id = LinuxNativeTypesMap.getAbsAxisID(nativeType);
- String name = LinuxNativeTypesMap.getAbsAxisName(nativeType);
-
- // Work around for a kernel level (I think) bug that incorrectly reports
- // the third axis as a rudder not a throttle on analog (gameport) 3 axis
- // 4 button sticks
- if((getName().equals("Analog 3-axis 4-button joystick")) && (portType == Controller.PortType.GAME)) {
- if((id == Component.Identifier.Axis.RZ) && (name.equals("Rudder"))) {
- id = Component.Identifier.Axis.SLIDER;
- name = "Throttle";
- }
- }
-
- return new LinuxAxis(this, axisNumber, name, id, getAbsAxisFuzz(axisNumber), true, false, getAbsAxisMinimum(axisNumber), getAbsAxisMaximum(axisNumber));
- //return new LinuxAxis(this, axisNumber, name, id, getAbsAxisFuzz(axisNumber), true, false, false);
- }
-
- /** Create a hat for the device
- * @param name The name of the hat to create
- * @param xAxisID The axis that is the hats X axis
- * @param yAxisID The axis that is the hats Y axis
- * @return The new hat
- */
- private LinuxHat createHat(String name, int xAxisID, int yAxisID) {
- return new LinuxHat(this, name, xAxisID, yAxisID);
- }
-
- /** Polls axes for data. Returns false if the controller is no longer valid.
- * Polling reflects the current state of the device when polled.
- * @return false if the controller is no longer valid.
- */
- public boolean poll() {
- int retval = JInputLibrary.safePoll(nativeID, buttonData, relAxesData, absAxesData);
- if(retval>=0) return true;
- return false;
- }
-
- /**
- * Retursn the value of a particular button or key
- * @param buttonID The button/key to check
- * @return The value fo the button/key
- */
- public float getButtonValue(int buttonID) {
- if(buttonData[buttonID]>0) return 1.0f;
- return 0.0f;
- }
-
- /**
- * Returns the value of a particular absolute axis
- * @param axisID The axis id
- * @return The axis value
- */
- public float getAbsAxisValue(int axisID) {
- return (float) absAxesData[axisID];
- }
-
- /**
- * Returns the value of the requested relative axis.
- * @param axisID The native axis ID.
- * @return The value of the axis
- */
- public float getRelAxisValue(int axisID) {
- return (float) relAxesData[axisID];
- }
-
- /**
- * Gets the axis fuzz, used for nullzone information
- * @param axisID The axis to get the fuzz for
- * @return The axis fuzz.
- */
- public float getAbsAxisFuzz(int axisID) {
- return (float) JInputLibrary.getAbsAxisFuzz(nativeID, axisID);
- }
-
- /**
- * Returns the maximum value for the requested axis
- * @param axisID The native ID of the axis to check
- * @return The maximum value
- */
- public float getAbsAxisMaximum(int axisID) {
- return (float) JInputLibrary.getAbsAxisMaximum(nativeID, axisID);
- }
-
- /**
- * The minimum value the requested axis can have
- * @param axisID The native axis ID
- * @return The minimum axis value
- */
- public float getAbsAxisMinimum(int axisID) {
- return (float) JInputLibrary.getAbsAxisMinimum(nativeID, axisID);
- }
-
- /** Return the enumeration of supported button types for this device
- * @param supportedButtons Array to populate
- */
- private void getSupportedButtons(int supportedButtons[]) {
- if(supportedButtons.length==0) {
- return;
- }
- JInputLibrary.getSupportedButtons(nativeID, supportedButtons);
- }
-
- /** Return the enumeration of supported absolute axis types for this device
- * @param suportedAbsAxes The array to populate
- */
- private void getSupportedAbsAxes(int suportedAbsAxes[]) {
- JInputLibrary.getSupportedAbsAxes(nativeID, suportedAbsAxes);
- }
-
- /** Return the enumeration of supported relative axis types for this device
- * @param supportedRelAxes The array to populate
- */
- private void getSupportedRelAxes(int supportedRelAxes[]) {
- JInputLibrary.getSupportedRelAxes(nativeID, supportedRelAxes);
- }
-
- /** Returns the status of FF support for this device
- *
- */
- private boolean getFFEnabled() {
- return JInputLibrary.getFFEnabled(nativeID);
- }
-
- /**
- * A device that represents a joystick coolie hat.
- * @author Jeremy Booth ([email protected])
- */
- public static class LinuxHat extends AbstractComponent {
-
- /** The parent controller
- */
- private LinuxDevice controller;
-
- /** The xAxis for this hat
- */
- private int xAxisID;
-
- /** The y axis for this hat
- */
- private int yAxisID;
-
- /** The last polled value of this hat
- */
- private float value;
-
- /**
- * Creates a new instance of LinuxHat, coolie hats under linux are reported as
- * two independant axis, this class is responsible for combining the axis values
- * and returning a value appropriate for a coolie hat.
- * @param controller The parent controller
- * @param name The name of this hat
- * @param xAxisID The X axis native axis ID
- * @param yAxisID The Y axis native axis ID
- */
- public LinuxHat(LinuxDevice controller, String name, int xAxisID, int yAxisID) {
- super(name, Component.Identifier.Axis.POV);
-
- System.out.println("Creating a Hat for device " + controller.getName() + " named " + name + " from axis " + xAxisID + " and " + yAxisID);
-
- this.controller = controller;
- this.xAxisID = xAxisID;
- this.yAxisID = yAxisID;
-
- //System.err.println("New hat: " + name + " created");
- //System.err.flush();
- }
-
- /** Returns <code>true</code> if data returned from <code>poll</code>
- * is relative to the last call, or <code>false</code> if data
- * is absolute.
- * @return Returns <code>true</code> if data returned from <code>poll</code>
- * is relative to the last call, or <code>false</code> if data
- * is absolute.
- */
- public boolean isRelative() {
- return false;
- }
-
- /** Returns true if this axis is analog
- * @return Always retursn true as coolie hats are analog under linux
- */
- public boolean isAnalog() {
- return false;
- }
-
- /**
- * Retursn true if this axis is normalised
- * @return Always returns true as linux hats are normalised
- */
- public boolean isNormalised() {
- return true;
- }
-
- /**
- * Returns the current value of this axis
- * @return The current axis value
- */
- public float getPollData() {
- //System.err.println("getPollData called, isPolling: " + isPolling());
- //System.err.flush();
- if(isPolling()) { updateData(); };
- return value;
- }
-
- /** Gets the data fro mthe native level and combines it to the hats value
- */
- private void updateData() {
- //System.err.println("updateData called");
- //System.err.flush();
- int newXAxisValue = (int)controller.getAbsAxisValue(xAxisID);
- int newYAxisValue = (int)controller.getAbsAxisValue(yAxisID);
-
- //System.err.println("newXAxisValue: " + newXAxisValue + " newYAxisValue: " + newYAxisValue);
-
- if((newXAxisValue == 0) && (newYAxisValue == 0)) {
- value = POV.OFF;
- } else if((newXAxisValue > 0) && (newYAxisValue < 0)) {
- value = POV.UP_RIGHT;
- } else if((newXAxisValue > 0) && (newYAxisValue == 0)) {
- value = POV.RIGHT;
- } else if((newXAxisValue > 0) && (newYAxisValue > 0)) {
- value = POV.DOWN_RIGHT;
- } else if((newXAxisValue == 0) && (newYAxisValue > 0)) {
- value = POV.DOWN;
- } else if((newXAxisValue < 0) && (newYAxisValue > 0)) {
- value = POV.DOWN_LEFT;
- } else if((newXAxisValue < 0) && (newYAxisValue == 0)) {
- value = POV.LEFT;
- } else if((newXAxisValue < 0) && (newYAxisValue < 0)) {
- value = POV.UP_LEFT;
- } else if((newXAxisValue == 0) && (newYAxisValue < 0)) {
- value = POV.UP;
- }
-
- //System.err.println("new value: " + value);
- //System.err.flush();
- }
-
- }
-
+interface LinuxDevice {
+ void close() throws IOException;
}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxDeviceRumbler.java b/plugins/linux/src/java/net/java/games/input/LinuxDeviceRumbler.java
deleted file mode 100644
index df8dd84..0000000
--- a/plugins/linux/src/java/net/java/games/input/LinuxDeviceRumbler.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package net.java.games.input;
-
-import net.java.games.input.Component.Identifier;
-
-public class LinuxDeviceRumbler implements Rumbler {
-
- private int deviceID;
-
- public LinuxDeviceRumbler(int deviceID) {
- this.deviceID = deviceID;
- }
-
- public void rumble(float intensity) {
- // TODO Auto-generated method stub
- JInputLibrary.rumble(deviceID, intensity);
- }
-
- public String getAxisName() {
- // TODO Auto-generated method stub
- return null;
- }
-
- public Identifier getAxisIdentifier() {
- // TODO Auto-generated method stub
- return null;
- }
-
-}
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 8883691..628ee04 100644
--- a/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java
+++ b/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java
@@ -26,27 +26,42 @@
package net.java.games.input;
import net.java.games.util.plugins.Plugin;
+import java.util.List;
+import java.util.ArrayList;
+import java.io.IOException;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
/** Environment plugin for linux
+ * @author elias
* @author Jeremy Booth ([email protected])
*/
-public class LinuxEnvironmentPlugin extends ControllerEnvironment implements Plugin {
+public final class LinuxEnvironmentPlugin extends ControllerEnvironment implements Plugin {
+ private final Controller[] controllers;
+ private final List devices = new ArrayList();
- /** List of controllers
- */
- private Controller[] controllers;
-
- /** Creates a new instance of LinuxEnvironmentPlugin */
+ static {
+ AccessController.doPrivileged(
+ new PrivilegedAction() {
+ public final Object run() {
+ System.loadLibrary("jinput-linux");
+ return null;
+ }
+ });
+ }
+
public LinuxEnvironmentPlugin() {
- if(JInputLibrary.isSupported()) {
- LinuxNativeTypesMap.init();
- JInputLibrary.init();
- createControllers();
- } else {
- controllers = new Controller[0];
- }
-
+ this.controllers = enumerateControllers();
System.out.println("Linux plugin claims to have found " + controllers.length + " controllers");
+ AccessController.doPrivileged(
+ new PrivilegedAction() {
+ public final Object run() {
+ Runtime.getRuntime().addShutdownHook(new ShutdownHook());
+ return null;
+ }
+ });
}
/** Returns a list of all controllers available to this environment,
@@ -54,91 +69,283 @@ public class LinuxEnvironmentPlugin extends ControllerEnvironment implements Plu
* @return Returns a list of all controllers available to this environment,
* or an empty array if there are no controllers in this environment.
*/
- public Controller[] getControllers() {
+ public final Controller[] getControllers() {
return controllers;
}
- /** Create the controllers
- */
- private void createControllers() {
- int numDevices = JInputLibrary.getNumberOfDevices();
-
- Controller[] tempControllers = new Controller[numDevices];
-
- int numRealDevices = 0;
- Controller tempController;
- for(int i=0;i<numDevices;i++) {
- tempController = createDevice(i);
- if(tempController!=null) {
- if(tempController.getComponents().length>0 || tempController.getControllers().length>0) {
- tempControllers[numRealDevices] = tempController;
- numRealDevices++;
- }
- }
- }
-
- controllers = new Controller[numRealDevices];
-
- for(int i=0;i<numRealDevices;i++) {
- controllers[i] = tempControllers[i];
- }
- }
-
- /** Create a particular device
- * @param deviceNumber The device ID
- * @return The new device
- */
- private Controller createDevice(int deviceNumber) {
- String name = JInputLibrary.getDeviceName(deviceNumber);
- int numAbsAxes = JInputLibrary.getNumAbsAxes(deviceNumber);
- int numRelAxes = JInputLibrary.getNumRelAxes(deviceNumber);
- int numButtons = JInputLibrary.getNumButtons(deviceNumber);
- Controller device = null;
-
- System.out.println("Java working on device " + name);
-
- int mouseCharacteristic = 0;
- int keyboardCharacteristic = 0;
- int joystickCharacteristic = 0;
-
- // we are going to try and guess what type of controller it is now
- if(name.toLowerCase().indexOf("mouse")>=0) {
- mouseCharacteristic++;
- }
- if(name.toLowerCase().indexOf("keyboard")>=0) {
- keyboardCharacteristic++;
- }
- if(name.toLowerCase().indexOf("joystick")>=0) {
- joystickCharacteristic++;
- }
-
- if(numRelAxes>=2) {
- mouseCharacteristic++;
- } else {
- mouseCharacteristic--;
- }
- if(numAbsAxes>=2) {
- joystickCharacteristic++;
- } else {
- joystickCharacteristic--;
- }
- if(numButtons>64) {
- keyboardCharacteristic++;
- } else {
- keyboardCharacteristic--;
- }
-
- if((mouseCharacteristic > keyboardCharacteristic) && (mouseCharacteristic > joystickCharacteristic)) {
- device = new LinuxMouse(new LinuxDevice(deviceNumber, name, numButtons, numRelAxes, numAbsAxes));
- } else if((keyboardCharacteristic > mouseCharacteristic) && (keyboardCharacteristic > joystickCharacteristic)) {
- 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 {
- //Dunno what this is, but try it anyway
- device = new LinuxDevice(deviceNumber, name, numButtons, numRelAxes, numAbsAxes);
- }
- return device;
+ private final static Component[] createComponents(List event_components, LinuxEventDevice device) {
+ LinuxEventComponent[][] povs = new LinuxEventComponent[4][2];
+ List components = new ArrayList();
+ for (int i = 0; i < event_components.size(); i++) {
+ LinuxEventComponent event_component = (LinuxEventComponent)event_components.get(i);
+ Component.Identifier identifier = event_component.getIdentifier();
+
+ if (identifier == Component.Identifier.Axis.POV) {
+ int native_code = event_component.getDescriptor().getCode();
+ switch (native_code) {
+ case NativeDefinitions.ABS_HAT0X:
+ povs[0][0] = event_component;
+ break;
+ case NativeDefinitions.ABS_HAT0Y:
+ povs[0][1] = event_component;
+ break;
+ case NativeDefinitions.ABS_HAT1X:
+ povs[1][0] = event_component;
+ break;
+ case NativeDefinitions.ABS_HAT1Y:
+ povs[1][1] = event_component;
+ break;
+ case NativeDefinitions.ABS_HAT2X:
+ povs[2][0] = event_component;
+ break;
+ case NativeDefinitions.ABS_HAT2Y:
+ povs[2][1] = event_component;
+ break;
+ case NativeDefinitions.ABS_HAT3X:
+ povs[3][0] = event_component;
+ break;
+ case NativeDefinitions.ABS_HAT3Y:
+ povs[3][1] = event_component;
+ break;
+ default:
+ ControllerEnvironment.logln("Unknown POV instance: " + native_code);
+ break;
+ }
+ } else if (identifier != null) {
+ LinuxComponent component = new LinuxComponent(event_component);
+ components.add(component);
+ device.registerComponent(event_component.getDescriptor(), component);
+ }
+ }
+ for (int i = 0; i < povs.length; i++) {
+ LinuxEventComponent x = povs[i][0];
+ LinuxEventComponent y = povs[i][1];
+ if (x != null && y != null) {
+ LinuxComponent controller_component = new LinuxPOV(x, y);
+ components.add(controller_component);
+ device.registerComponent(x.getDescriptor(), controller_component);
+ device.registerComponent(y.getDescriptor(), controller_component);
+ }
+ }
+ Component[] components_array = new Component[components.size()];
+ components.toArray(components_array);
+ return components_array;
+ }
+
+ private final static Mouse createMouseFromDevice(LinuxEventDevice device, Component[] components) throws IOException {
+ Mouse mouse = new LinuxMouse(device, components, new Controller[]{}, device.getRumblers());
+ if (mouse.getX() != null && mouse.getY() != null && mouse.getLeft() != null)
+ return mouse;
+ else
+ return null;
+ }
+
+ private final static Keyboard createKeyboardFromDevice(LinuxEventDevice device, Component[] components) throws IOException {
+ Keyboard keyboard = new LinuxKeyboard(device, components, new Controller[]{}, device.getRumblers());
+ return keyboard;
+ }
+
+ private final static Controller createJoystickFromDevice(LinuxEventDevice device, Component[] components, Controller.Type type) throws IOException {
+ Controller joystick = new LinuxAbstractController(device, components, new Controller[]{}, device.getRumblers(), type);
+ return joystick;
+ }
+
+ private final static Controller createControllerFromDevice(LinuxEventDevice device) throws IOException {
+ List event_components = device.getComponents();
+ Component[] components = createComponents(event_components, device);
+ Controller.Type type = device.getType();
+
+ if (type == Controller.Type.MOUSE) {
+ return createMouseFromDevice(device, components);
+ } else if (type == Controller.Type.KEYBOARD) {
+ return createKeyboardFromDevice(device, components);
+ } else if (type == Controller.Type.STICK || type == Controller.Type.GAMEPAD) {
+ return createJoystickFromDevice(device, components, type);
+ } else
+ return null;
+ }
+
+ private final Controller[] enumerateControllers() {
+ List controllers = new ArrayList();
+ enumerateEventControllers(controllers);
+ if (controllers.size() == 0) {
+ /* Some linux distros, even modern ones, can't figure out
+ * how to give event devices proper access rights, so we'll have
+ * to fallback to the legacy joystick interface.
+ */
+ enumerateJoystickControllers(controllers);
+ }
+ Controller[] controllers_array = new Controller[controllers.size()];
+ controllers.toArray(controllers_array);
+ return controllers_array;
+ }
+
+ private final static Component.Identifier.Button getButtonIdentifier(int index) {
+ switch (index) {
+ case 0:
+ return Component.Identifier.Button._0;
+ case 1:
+ return Component.Identifier.Button._1;
+ case 2:
+ return Component.Identifier.Button._2;
+ case 3:
+ return Component.Identifier.Button._3;
+ case 4:
+ return Component.Identifier.Button._4;
+ case 5:
+ return Component.Identifier.Button._5;
+ case 6:
+ return Component.Identifier.Button._6;
+ case 7:
+ return Component.Identifier.Button._7;
+ case 8:
+ return Component.Identifier.Button._8;
+ case 9:
+ return Component.Identifier.Button._9;
+ case 10:
+ return Component.Identifier.Button._10;
+ case 11:
+ return Component.Identifier.Button._11;
+ case 12:
+ return Component.Identifier.Button._12;
+ case 13:
+ return Component.Identifier.Button._13;
+ case 14:
+ return Component.Identifier.Button._14;
+ case 15:
+ return Component.Identifier.Button._15;
+ case 16:
+ return Component.Identifier.Button._16;
+ case 17:
+ return Component.Identifier.Button._17;
+ case 18:
+ return Component.Identifier.Button._18;
+ case 19:
+ return Component.Identifier.Button._19;
+ case 20:
+ return Component.Identifier.Button._20;
+ case 21:
+ return Component.Identifier.Button._21;
+ case 22:
+ return Component.Identifier.Button._22;
+ case 23:
+ return Component.Identifier.Button._23;
+ case 24:
+ return Component.Identifier.Button._24;
+ case 25:
+ return Component.Identifier.Button._25;
+ case 26:
+ return Component.Identifier.Button._26;
+ case 27:
+ return Component.Identifier.Button._27;
+ case 28:
+ return Component.Identifier.Button._28;
+ case 29:
+ return Component.Identifier.Button._29;
+ case 30:
+ return Component.Identifier.Button._30;
+ case 31:
+ return Component.Identifier.Button._31;
+ default:
+ return null;
+ }
+ }
+
+ private final static Controller createJoystickFromJoystickDevice(LinuxJoystickDevice device) {
+ List components = new ArrayList();
+ for (int i = 0; i < device.getNumButtons(); i++) {
+ Component.Identifier.Button button_id = getButtonIdentifier(i);
+ if (button_id != null) {
+ LinuxJoystickButton button = new LinuxJoystickButton(button_id);
+ device.registerButton(i, button);
+ components.add(button);
+ }
+ }
+ 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;
+ 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[]{});
+ }
+
+ private final void enumerateJoystickControllers(List controllers) {
+ File[] joystick_device_files = enumerateJoystickDeviceFiles("/dev/input");
+ if (joystick_device_files == null || joystick_device_files.length == 0) {
+ joystick_device_files = enumerateJoystickDeviceFiles("/dev");
+ if (joystick_device_files == null)
+ return;
+ }
+ for (int i = 0; i < joystick_device_files.length; i++) {
+ File event_file = joystick_device_files[i];
+ try {
+ LinuxJoystickDevice device = new LinuxJoystickDevice(event_file.getAbsolutePath());
+ Controller controller = createJoystickFromJoystickDevice(device);
+ if (controller != null) {
+ controllers.add(controller);
+ devices.add(device);
+ } else
+ device.close();
+ } catch (IOException e) {
+ ControllerEnvironment.logln("Failed to open device (" + event_file + "): " + e.getMessage());
+ }
+ }
+ }
+
+ private final static File[] enumerateJoystickDeviceFiles(String dev_path) {
+ File dev = new File(dev_path);
+ return dev.listFiles(new FilenameFilter() {
+ public final boolean accept(File dir, String name) {
+ return name.startsWith("js");
+ }
+ });
+ }
+
+ private final void enumerateEventControllers(List controllers) {
+ File dev = new File("/dev/input");
+ File[] event_device_files = dev.listFiles(new FilenameFilter() {
+ public final boolean accept(File dir, String name) {
+ return name.startsWith("event");
+ }
+ });
+ if (event_device_files == null)
+ return;
+ for (int i = 0; i < event_device_files.length; i++) {
+ File event_file = event_device_files[i];
+ try {
+ LinuxEventDevice device = new LinuxEventDevice(event_file.getAbsolutePath());
+ try {
+ Controller controller = createControllerFromDevice(device);
+ if (controller != null) {
+ controllers.add(controller);
+ devices.add(device);
+ } else
+ device.close();
+ } catch (IOException e) {
+ ControllerEnvironment.logln("Failed to create Controller: " + e.getMessage());
+ device.close();
+ }
+ } catch (IOException e) {
+ ControllerEnvironment.logln("Failed to open device (" + event_file + "): " + e.getMessage());
+ }
+ }
}
-
+
+ private final class ShutdownHook extends Thread {
+ public final void run() {
+ for (int i = 0; i < devices.size(); i++) {
+ try {
+ LinuxDevice device = (LinuxDevice)devices.get(i);
+ device.close();
+ } catch (IOException e) {
+ ControllerEnvironment.logln("Failed to close device: " + e.getMessage());
+ }
+ }
+ }
+ }
}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxEvent.java b/plugins/linux/src/java/net/java/games/input/LinuxEvent.java
new file mode 100644
index 0000000..de2959c
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxEvent.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (C) 2003 Jeremy Booth ([email protected])
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer. Redistributions in binary
+ * form must reproduce the above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * The name of the author may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ */
+package net.java.games.input;
+
+/**
+ * @author elias
+ */
+final class LinuxEvent {
+ private long nanos;
+ private final LinuxAxisDescriptor descriptor = new LinuxAxisDescriptor();
+ private int value;
+
+ public final void set(long seconds, long microseconds, int type, int code, int value) {
+ this.nanos = (seconds*1000000 + microseconds)*1000;
+ this.descriptor.set(type, code);
+ this.value = value;
+ }
+
+ public final int getValue() {
+ return value;
+ }
+
+ public final LinuxAxisDescriptor getDescriptor() {
+ return descriptor;
+ }
+
+ public final long getNanos() {
+ return nanos;
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxEventComponent.java b/plugins/linux/src/java/net/java/games/input/LinuxEventComponent.java
new file mode 100644
index 0000000..b2ad562
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxEventComponent.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (C) 2003 Jeremy Booth ([email protected])
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer. Redistributions in binary
+ * form must reproduce the above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * The name of the author may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ */
+package net.java.games.input;
+
+import java.io.IOException;
+
+/**
+ * @author elias
+ * @author Jeremy Booth ([email protected])
+ */
+final class LinuxEventComponent {
+ private final LinuxEventDevice device;
+ private final Component.Identifier identifier;
+ private final Controller.Type button_trait;
+ private final boolean is_relative;
+ private final LinuxAxisDescriptor descriptor;
+ private final int min;
+ private final int max;
+ private final int flat;
+
+
+ public LinuxEventComponent(LinuxEventDevice device, Component.Identifier identifier, boolean is_relative, int native_type, int native_code) throws IOException {
+ this.device = device;
+ this.identifier = identifier;
+ if (native_type == NativeDefinitions.EV_KEY)
+ this.button_trait = LinuxNativeTypesMap.guessButtonTrait(native_code);
+ else
+ this.button_trait = Controller.Type.UNKNOWN;
+ this.is_relative = is_relative;
+ this.descriptor = new LinuxAxisDescriptor();
+ descriptor.set(native_type, native_code);
+ if (native_type == NativeDefinitions.EV_ABS) {
+ LinuxAbsInfo abs_info = new LinuxAbsInfo();
+ getAbsInfo(abs_info);
+ this.min = abs_info.getMin();
+ this.max = abs_info.getMax();
+ this.flat = abs_info.getFlat();
+ } else {
+ this.min = Integer.MIN_VALUE;
+ this.max = Integer.MAX_VALUE;
+ this.flat = 0;
+ }
+ }
+
+ public final LinuxEventDevice getDevice() {
+ return device;
+ }
+
+ public final void getAbsInfo(LinuxAbsInfo abs_info) throws IOException {
+ assert descriptor.getType() == NativeDefinitions.EV_ABS;
+ device.getAbsInfo(descriptor.getCode(), abs_info);
+ }
+
+ public final Controller.Type getButtonTrait() {
+ return button_trait;
+ }
+
+ public final Component.Identifier getIdentifier() {
+ return identifier;
+ }
+
+ public final LinuxAxisDescriptor getDescriptor() {
+ return descriptor;
+ }
+
+ public final boolean isRelative() {
+ return is_relative;
+ }
+
+ public final boolean isAnalog() {
+ return identifier instanceof Component.Identifier.Axis && identifier != Component.Identifier.Axis.POV;
+ }
+
+ final float convertValue(float value) {
+ if (identifier instanceof Component.Identifier.Axis && !is_relative) {
+ // Some axes have min = max = 0
+ if (min == max)
+ return 0;
+ if (value > max)
+ value = max;
+ else if (value < min)
+ value = min;
+ return 2*(value - min)/(max - min) - 1;
+ } else {
+ return value;
+ }
+ }
+
+ final float getDeadZone() {
+ return flat/(2f*(max - min));
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java b/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java
new file mode 100644
index 0000000..f17e05d
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java
@@ -0,0 +1,397 @@
+/**
+ * Copyright (C) 2003 Jeremy Booth ([email protected])
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer. Redistributions in binary
+ * form must reproduce the above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * The name of the author may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ */
+package net.java.games.input;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @author elias
+ */
+final class LinuxEventDevice implements LinuxDevice {
+ private final Map component_map = new HashMap();
+ private final Rumbler[] rumblers;
+ private final long fd;
+ private final String name;
+ private final LinuxInputID input_id;
+ private final List components;
+ private final Controller.Type type;
+
+ /* Closed state variable that protects the validity of the file descriptor.
+ * Access to the closed state must be synchronized
+ */
+ private boolean closed;
+
+ /* Access the the key_states array could be synchronized, but
+ * it doesn't hurt to have multiple threads read/write from/to it
+ */
+ private final byte[] key_states = new byte[NativeDefinitions.KEY_MAX/8 + 1];
+
+ public LinuxEventDevice(String filename) throws IOException {
+ long fd;
+ try {
+ fd = nOpen(filename, true);
+ } catch (IOException e) {
+ ControllerEnvironment.logln("Failed to open device R/W: " + e.getMessage());
+ fd = nOpen(filename, false);
+ }
+ this.fd = fd;
+ try {
+ this.name = getDeviceName();
+ this.input_id = getDeviceInputID();
+ this.components = getDeviceComponents();
+ this.rumblers = enumerateRumblers();
+ this.type = guessType();
+ } catch (IOException e) {
+ close();
+ throw e;
+ }
+ }
+ private final static native long nOpen(String filename, boolean rw) throws IOException;
+
+ public final Controller.Type getType() {
+ return type;
+ }
+
+ private final static int countComponents(List components, Class id_type, boolean relative) {
+ int count = 0;
+ for (int i = 0; i < components.size(); i++) {
+ LinuxEventComponent component = (LinuxEventComponent)components.get(i);
+ if (id_type.isInstance(component.getIdentifier()) && relative == component.isRelative())
+ count++;
+ }
+ return count;
+ }
+
+ private final Controller.Type guessType() throws IOException {
+ Controller.Type type_from_usages = guessTypeFromUsages();
+ if (type_from_usages == Controller.Type.UNKNOWN)
+ return guessTypeFromComponents();
+ else
+ return type_from_usages;
+ }
+
+ private final Controller.Type guessTypeFromUsages() throws IOException {
+ byte[] usage_bits = getDeviceUsageBits();
+ if (isBitSet(usage_bits, NativeDefinitions.USAGE_MOUSE))
+ return Controller.Type.MOUSE;
+ else if (isBitSet(usage_bits, NativeDefinitions.USAGE_KEYBOARD))
+ return Controller.Type.KEYBOARD;
+ else if (isBitSet(usage_bits, NativeDefinitions.USAGE_GAMEPAD))
+ return Controller.Type.GAMEPAD;
+ else if (isBitSet(usage_bits, NativeDefinitions.USAGE_JOYSTICK))
+ return Controller.Type.STICK;
+ else
+ return Controller.Type.UNKNOWN;
+ }
+
+ private final Controller.Type guessTypeFromComponents() throws IOException {
+ List components = getComponents();
+ if (components.size() == 0)
+ return Controller.Type.UNKNOWN;
+ int num_rel_axes = countComponents(components, Component.Identifier.Axis.class, true);
+ int num_abs_axes = countComponents(components, Component.Identifier.Axis.class, false);
+ int num_keys = countComponents(components, Component.Identifier.Key.class, false);
+ int mouse_traits = 0;
+ int keyboard_traits = 0;
+ int joystick_traits = 0;
+ int gamepad_traits = 0;
+ if (name.toLowerCase().indexOf("mouse") != -1)
+ mouse_traits++;
+ if (name.toLowerCase().indexOf("keyboard") != -1)
+ keyboard_traits++;
+ if (name.toLowerCase().indexOf("joystick") != -1)
+ joystick_traits++;
+ if (name.toLowerCase().indexOf("gamepad") != -1)
+ gamepad_traits++;
+ int num_keyboard_button_traits = 0;
+ int num_mouse_button_traits = 0;
+ int num_joystick_button_traits = 0;
+ int num_gamepad_button_traits = 0;
+ // count button traits
+ for (int i = 0; i < components.size(); i++) {
+ LinuxEventComponent component = (LinuxEventComponent)components.get(i);
+ if (component.getButtonTrait() == Controller.Type.MOUSE)
+ num_mouse_button_traits++;
+ else if (component.getButtonTrait() == Controller.Type.KEYBOARD)
+ num_keyboard_button_traits++;
+ else if (component.getButtonTrait() == Controller.Type.GAMEPAD)
+ num_gamepad_button_traits++;
+ else if (component.getButtonTrait() == Controller.Type.STICK)
+ num_joystick_button_traits++;
+ }
+ if ((num_mouse_button_traits >= num_keyboard_button_traits) && (num_mouse_button_traits >= num_joystick_button_traits) && (num_mouse_button_traits >= num_gamepad_button_traits)) {
+ mouse_traits++;
+ } else if ((num_keyboard_button_traits >= num_mouse_button_traits) && (num_keyboard_button_traits >= num_joystick_button_traits) && (num_keyboard_button_traits >= num_gamepad_button_traits)) {
+ keyboard_traits++;
+ } else if ((num_joystick_button_traits >= num_keyboard_button_traits) && (num_joystick_button_traits >= num_mouse_button_traits) && (num_joystick_button_traits >= num_gamepad_button_traits)) {
+ joystick_traits++;
+ } else if ((num_gamepad_button_traits >= num_keyboard_button_traits) && (num_gamepad_button_traits >= num_mouse_button_traits) && (num_gamepad_button_traits >= num_joystick_button_traits)) {
+ gamepad_traits++;
+ }
+ if (num_rel_axes >= 2) {
+ mouse_traits++;
+ }
+ if (num_abs_axes >= 2) {
+ joystick_traits++;
+ gamepad_traits++;
+ }
+
+ if ((mouse_traits >= keyboard_traits) && (mouse_traits >= joystick_traits) && (mouse_traits >= gamepad_traits)) {
+ return Controller.Type.MOUSE;
+ } else if ((keyboard_traits >= mouse_traits) && (keyboard_traits >= joystick_traits) && (keyboard_traits >= gamepad_traits)) {
+ return Controller.Type.KEYBOARD;
+ } else if ((joystick_traits >= mouse_traits) && (joystick_traits >= keyboard_traits) && (joystick_traits >= gamepad_traits)) {
+ return Controller.Type.STICK;
+ } else if ((gamepad_traits >= mouse_traits) && (gamepad_traits >= keyboard_traits) && (gamepad_traits >= joystick_traits)) {
+ return Controller.Type.GAMEPAD;
+ } else
+ return null;
+ }
+
+ private final Rumbler[] enumerateRumblers() {
+ List rumblers = new ArrayList();
+ try {
+ int num_effects = getNumEffects();
+ if (num_effects <= 0)
+ return (Rumbler[])rumblers.toArray(new Rumbler[]{});
+ byte[] ff_bits = getForceFeedbackBits();
+ if (isBitSet(ff_bits, NativeDefinitions.FF_RUMBLE) && num_effects > rumblers.size()) {
+ rumblers.add(new LinuxRumbleFF(this));
+ }
+ } catch (IOException e) {
+ ControllerEnvironment.logln("Failed to enumerate rumblers: " + e.getMessage());
+ }
+ return (Rumbler[])rumblers.toArray(new Rumbler[]{});
+ }
+
+ public final Rumbler[] getRumblers() {
+ return rumblers;
+ }
+
+ public final synchronized int uploadRumbleEffect(int id, int trigger_button, int direction, int trigger_interval, int replay_length, int replay_delay, int strong_magnitude, int weak_magnitude) throws IOException {
+ checkClosed();
+ return nUploadRumbleEffect(fd, id, direction, trigger_button, trigger_interval, replay_length, replay_delay, strong_magnitude, weak_magnitude);
+ }
+ private final static native int nUploadRumbleEffect(long fd, int id, int direction, int trigger_button, int trigger_interval, int replay_length, int replay_delay, int strong_magnitude, int weak_magnitude) throws IOException;
+
+ public final synchronized int uploadConstantEffect(int id, int trigger_button, int direction, int trigger_interval, int replay_length, int replay_delay, int constant_level, int constant_env_attack_length, int constant_env_attack_level, int constant_env_fade_length, int constant_env_fade_level) throws IOException {
+ checkClosed();
+ return nUploadConstantEffect(fd, id, direction, trigger_button, trigger_interval, replay_length, replay_delay, constant_level, constant_env_attack_length, constant_env_attack_level, constant_env_fade_length, constant_env_fade_level);
+ }
+ private final static native int nUploadConstantEffect(long fd, int id, int direction, int trigger_button, int trigger_interval, int replay_length, int replay_delay, int constant_level, int constant_env_attack_length, int constant_env_attack_level, int constant_env_fade_length, int constant_env_fade_level) throws IOException;
+
+ final void eraseEffect(int id) throws IOException {
+ nEraseEffect(fd, id);
+ }
+ private final static native void nEraseEffect(long fd, int ff_id) throws IOException;
+
+ public final synchronized void writeEvent(int type, int code, int value) throws IOException {
+ checkClosed();
+ nWriteEvent(fd, type, code, value);
+ }
+ private final static native void nWriteEvent(long fd, int type, int code, int value) throws IOException;
+
+ public final void registerComponent(LinuxAxisDescriptor desc, LinuxComponent component) {
+ component_map.put(desc, component);
+ }
+
+ public final LinuxComponent mapDescriptor(LinuxAxisDescriptor desc) {
+ return (LinuxComponent)component_map.get(desc);
+ }
+
+ public final Controller.PortType getPortType() throws IOException {
+ return input_id.getPortType();
+ }
+
+ public final LinuxInputID getInputID() {
+ return input_id;
+ }
+
+ private final LinuxInputID getDeviceInputID() throws IOException {
+ return nGetInputID(fd);
+ }
+ private final static native LinuxInputID nGetInputID(long fd) throws IOException;
+
+ public final int getNumEffects() throws IOException {
+ return nGetNumEffects(fd);
+ }
+ private final static native int nGetNumEffects(long fd) throws IOException;
+
+ private final int getVersion() throws IOException {
+ return nGetVersion(fd);
+ }
+ private final static native int nGetVersion(long fd) throws IOException;
+
+ public final synchronized boolean getNextEvent(LinuxEvent linux_event) throws IOException {
+ checkClosed();
+ return nGetNextEvent(fd, linux_event);
+ }
+ private final static native boolean nGetNextEvent(long fd, LinuxEvent linux_event) throws IOException;
+
+ public final synchronized void getAbsInfo(int abs_axis, LinuxAbsInfo abs_info) throws IOException {
+ checkClosed();
+ nGetAbsInfo(fd, abs_axis, abs_info);
+ }
+ private final static native void nGetAbsInfo(long fd, int abs_axis, LinuxAbsInfo abs_info) throws IOException;
+
+ private final void addKeys(List components) throws IOException {
+ byte[] bits = getKeysBits();
+ for (int i = 0; i < bits.length*8; i++) {
+ if (isBitSet(bits, i)) {
+ Component.Identifier id = LinuxNativeTypesMap.getButtonID(i);
+ components.add(new LinuxEventComponent(this, id, false, NativeDefinitions.EV_KEY, i));
+ }
+ }
+ }
+
+ private final void addAbsoluteAxes(List components) throws IOException {
+ byte[] bits = getAbsoluteAxesBits();
+ for (int i = 0; i < bits.length*8; i++) {
+ if (isBitSet(bits, i)) {
+ Component.Identifier id = LinuxNativeTypesMap.getAbsAxisID(i);
+ components.add(new LinuxEventComponent(this, id, false, NativeDefinitions.EV_ABS, i));
+ }
+ }
+ }
+
+ private final void addRelativeAxes(List components) throws IOException {
+ byte[] bits = getRelativeAxesBits();
+ for (int i = 0; i < bits.length*8; i++) {
+ if (isBitSet(bits, i)) {
+ Component.Identifier id = LinuxNativeTypesMap.getRelAxisID(i);
+ components.add(new LinuxEventComponent(this, id, true, NativeDefinitions.EV_REL, i));
+ }
+ }
+ }
+
+ public final List getComponents() {
+ return components;
+ }
+
+ private final List getDeviceComponents() throws IOException {
+ List components = new ArrayList();
+ byte[] evtype_bits = getEventTypeBits();
+ if (isBitSet(evtype_bits, NativeDefinitions.EV_KEY))
+ addKeys(components);
+ if (isBitSet(evtype_bits, NativeDefinitions.EV_ABS))
+ addAbsoluteAxes(components);
+ if (isBitSet(evtype_bits, NativeDefinitions.EV_REL))
+ addRelativeAxes(components);
+ return components;
+ }
+
+ private final byte[] getForceFeedbackBits() throws IOException {
+ byte[] bits = new byte[NativeDefinitions.FF_MAX/8 + 1];
+ nGetBits(fd, NativeDefinitions.EV_FF, bits);
+ return bits;
+ }
+
+ private final byte[] getKeysBits() throws IOException {
+ byte[] bits = new byte[NativeDefinitions.KEY_MAX/8 + 1];
+ nGetBits(fd, NativeDefinitions.EV_KEY, bits);
+ return bits;
+ }
+
+ private final byte[] getAbsoluteAxesBits() throws IOException {
+ byte[] bits = new byte[NativeDefinitions.ABS_MAX/8 + 1];
+ nGetBits(fd, NativeDefinitions.EV_ABS, bits);
+ return bits;
+ }
+
+ private final byte[] getRelativeAxesBits() throws IOException {
+ byte[] bits = new byte[NativeDefinitions.REL_MAX/8 + 1];
+ nGetBits(fd, NativeDefinitions.EV_REL, bits);
+ return bits;
+ }
+
+ private final byte[] getEventTypeBits() throws IOException {
+ byte[] bits = new byte[NativeDefinitions.EV_MAX/8 + 1];
+ nGetBits(fd, 0, bits);
+ return bits;
+ }
+ private final static native void nGetBits(long fd, int ev_type, byte[] evtype_bits) throws IOException;
+
+ private final byte[] getDeviceUsageBits() throws IOException {
+ byte[] bits = new byte[NativeDefinitions.USAGE_MAX/8 + 1];
+ if (getVersion() >= 0x010001) {
+ nGetDeviceUsageBits(fd, bits);
+ }
+ return bits;
+ }
+ private final static native void nGetDeviceUsageBits(long fd, byte[] type_bits) throws IOException;
+
+ public final synchronized void pollKeyStates() throws IOException {
+ nGetKeyStates(fd, key_states);
+ }
+ private final static native void nGetKeyStates(long fd, byte[] states) throws IOException;
+
+ public final boolean isKeySet(int bit) {
+ return isBitSet(key_states, bit);
+ }
+
+ public final static boolean isBitSet(byte[] bits, int bit) {
+ return (bits[bit/8] & (1<<(bit%8))) != 0;
+ }
+
+ public final String getName() {
+ return name;
+ }
+
+ private final String getDeviceName() throws IOException {
+ return nGetName(fd);
+ }
+ private final static native String nGetName(long fd) throws IOException;
+
+ public final synchronized void close() throws IOException {
+ if (!closed) {
+ try {
+ if (rumblers != null)
+ for (int i = 0; i < rumblers.length; i++) {
+ rumblers[i].rumble(0);
+ // erasing effects seems to be unsupported on logitech devices
+ //rumblers[i].erase();
+ }
+ } finally {
+ closed = true;
+ nClose(fd);
+ }
+ }
+ }
+ private final static native void nClose(long fd) throws IOException;
+
+ private final void checkClosed() throws IOException {
+ if (closed)
+ throw new IOException("Device is closed");
+ }
+
+ protected void finalize() throws IOException {
+ close();
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxForceFeedbackEffect.java b/plugins/linux/src/java/net/java/games/input/LinuxForceFeedbackEffect.java
new file mode 100644
index 0000000..2e3a0e7
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxForceFeedbackEffect.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (C) 2003 Jeremy Booth ([email protected])
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer. Redistributions in binary
+ * form must reproduce the above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * The name of the author may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ */
+package net.java.games.input;
+
+import java.io.IOException;
+
+/**
+ * @author elias
+ */
+abstract class LinuxForceFeedbackEffect implements Rumbler {
+ private final LinuxEventDevice device;
+ private final int ff_id;
+
+ public LinuxForceFeedbackEffect(LinuxEventDevice device) throws IOException {
+ this.device = device;
+ this.ff_id = upload(-1, 0);
+ }
+
+ protected abstract int upload(int id, float intensity) throws IOException;
+
+ private final void write(int value) throws IOException {
+ device.writeEvent(NativeDefinitions.EV_FF, ff_id, value);
+ }
+
+ protected final LinuxEventDevice getDevice() {
+ return device;
+ }
+
+ public final void rumble(float intensity) {
+ try {
+ if (intensity > 0) {
+ upload(ff_id, intensity);
+ write(1);
+ } else {
+ write(0);
+ }
+ } catch (IOException e) {
+ ControllerEnvironment.logln("Failed to rumble: " + e);
+ }
+ }
+
+ public final void erase() throws IOException {
+ device.eraseEffect(ff_id);
+ }
+
+ public final String getAxisName() {
+ return null;
+ }
+
+ public final Component.Identifier getAxisIdentifier() {
+ return null;
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxInputID.java b/plugins/linux/src/java/net/java/games/input/LinuxInputID.java
new file mode 100644
index 0000000..bed8fd3
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxInputID.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (C) 2003 Jeremy Booth ([email protected])
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer. Redistributions in binary
+ * form must reproduce the above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * The name of the author may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ */
+package net.java.games.input;
+
+/**
+ * @author elias
+ */
+final class LinuxInputID {
+ private final int bustype;
+ private final int vendor;
+ private final int product;
+ private final int version;
+
+ public LinuxInputID(int bustype, int vendor, int product, int version) {
+ this.bustype = bustype;
+ this.vendor = vendor;
+ this.product = product;
+ this.version = version;
+ }
+
+ public final Controller.PortType getPortType() {
+ return LinuxNativeTypesMap.getPortType(bustype);
+ }
+
+ public final String toString() {
+ return "LinuxInputID: bustype = 0x" + Integer.toHexString(bustype) + " | vendor = 0x" + Integer.toHexString(vendor) +
+ " | product = 0x" + Integer.toHexString(product) + " | version = 0x" + Integer.toHexString(version);
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxJoystickAbstractController.java b/plugins/linux/src/java/net/java/games/input/LinuxJoystickAbstractController.java
new file mode 100644
index 0000000..bf5377f
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxJoystickAbstractController.java
@@ -0,0 +1,70 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+package net.java.games.input;
+
+import java.io.IOException;
+
+/** Represents a Linux controller
+* @author elias
+* @version 1.0
+*/
+final class LinuxJoystickAbstractController extends AbstractController {
+ private final LinuxJoystickDevice device;
+
+ protected LinuxJoystickAbstractController(LinuxJoystickDevice device, Component[] components, Controller[] children, Rumbler[] rumblers) {
+ super(device.getName(), components, children, rumblers);
+ this.device = device;
+ }
+
+ protected final void setDeviceEventQueueSize(int size) throws IOException {
+ device.setBufferSize(size);
+ }
+
+ public final void pollDevice() throws IOException {
+ device.poll();
+ }
+
+ protected final boolean getNextDeviceEvent(Event event) throws IOException {
+ return false;
+ }
+
+ public Type getType() {
+ return Controller.Type.STICK;
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxJoystickAxis.java b/plugins/linux/src/java/net/java/games/input/LinuxJoystickAxis.java
new file mode 100644
index 0000000..0b2621b
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxJoystickAxis.java
@@ -0,0 +1,69 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+package net.java.games.input;
+
+import java.io.IOException;
+
+/** Represents a linux Axis
+* @author elias
+* @version 1.0
+*/
+class LinuxJoystickAxis extends AbstractComponent {
+ private float value;
+
+ public LinuxJoystickAxis(Component.Identifier.Axis axis_id) {
+ super(axis_id.getName(), axis_id);
+ }
+
+ public final boolean isRelative() {
+ return false;
+ }
+
+ public final boolean isAnalog() {
+ return true;
+ }
+
+ final void setValue(float value) {
+ this.value = value;
+ }
+
+ protected final float poll() throws IOException {
+ return value;
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxJoystickButton.java b/plugins/linux/src/java/net/java/games/input/LinuxJoystickButton.java
new file mode 100644
index 0000000..f8d47d5
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxJoystickButton.java
@@ -0,0 +1,65 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+package net.java.games.input;
+
+import java.io.IOException;
+
+/** Represents a linux button from the joystick interface
+* @author elias
+* @version 1.0
+*/
+final class LinuxJoystickButton extends AbstractComponent {
+ private float value;
+
+ public LinuxJoystickButton(Component.Identifier.Button button_id) {
+ super(button_id.getName(), button_id);
+ }
+
+ public final boolean isRelative() {
+ return false;
+ }
+
+ final void setValue(float value) {
+ this.value = value;
+ }
+
+ protected final float poll() throws IOException {
+ return value;
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java b/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java
new file mode 100644
index 0000000..2d72027
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (C) 2003 Jeremy Booth ([email protected])
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer. Redistributions in binary
+ * form must reproduce the above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * The name of the author may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ */
+package net.java.games.input;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @author elias
+ */
+final class LinuxJoystickDevice implements LinuxDevice {
+ public final static int JS_EVENT_BUTTON = 0x01; /* button pressed/released */
+ public final static int JS_EVENT_AXIS = 0x02; /* joystick moved */
+ public final static int JS_EVENT_INIT = 0x80; /* initial state of device */
+
+ public final static int AXIS_MAX_VALUE = 32767;
+
+ private final long fd;
+ private final String name;
+
+ private final LinuxJoystickEvent joystick_event = new LinuxJoystickEvent();
+ private final Event event = new Event();
+ private final LinuxJoystickButton[] buttons;
+ private final LinuxJoystickAxis[] axes;
+
+ private EventQueue event_queue;
+
+ /* Closed state variable that protects the validity of the file descriptor.
+ * Access to the closed state must be synchronized
+ */
+ private boolean closed;
+
+ public LinuxJoystickDevice(String filename) throws IOException {
+ this.fd = nOpen(filename);
+ try {
+ this.name = getDeviceName();
+ setBufferSize(AbstractController.EVENT_QUEUE_DEPTH);
+ buttons = new LinuxJoystickButton[getNumDeviceButtons()];
+ axes = new LinuxJoystickAxis[getNumDeviceAxes()];
+ } catch (IOException e) {
+ close();
+ throw e;
+ }
+ }
+ private final static native long nOpen(String filename) throws IOException;
+
+ public final synchronized void setBufferSize(int size) {
+ event_queue = new EventQueue(size);
+ }
+
+ private final void processEvent(LinuxJoystickEvent joystick_event) {
+ int index = joystick_event.getNumber();
+ // Filter synthetic init event flag
+ int type = joystick_event.getType() & ~JS_EVENT_INIT;
+ switch (type) {
+ case JS_EVENT_BUTTON:
+ if (index < getNumButtons()) {
+ LinuxJoystickButton button = buttons[index];
+ if (button != null) {
+ float value = joystick_event.getValue();
+ button.setValue(value);
+ event.set(button, value, joystick_event.getNanos());
+ break;
+ }
+ }
+ return;
+ case JS_EVENT_AXIS:
+ if (index < getNumAxes()) {
+ LinuxJoystickAxis axis = axes[index];
+ if (axis != null) {
+ float value = (float)joystick_event.getValue()/AXIS_MAX_VALUE;
+ axis.setValue(value);
+ event.set(axis, value, joystick_event.getNanos());
+ break;
+ }
+ }
+ return;
+ default:
+ // Unknown component type
+ return;
+ }
+ if (!event_queue.isFull()) {
+ event_queue.add(event);
+ }
+ }
+
+ public final void registerAxis(int index, LinuxJoystickAxis axis) {
+ axes[index] = axis;
+ }
+
+ public final void registerButton(int index, LinuxJoystickButton button) {
+ buttons[index] = button;
+ }
+
+ public final synchronized boolean getNextEvent(Event event) throws IOException {
+ return event_queue.getNextEvent(event);
+ }
+
+ public final synchronized void poll() throws IOException {
+ checkClosed();
+ while (getNextDeviceEvent(joystick_event)) {
+ processEvent(joystick_event);
+ }
+ }
+
+ private final boolean getNextDeviceEvent(LinuxJoystickEvent joystick_event) throws IOException {
+ return nGetNextEvent(fd, joystick_event);
+ }
+ private final static native boolean nGetNextEvent(long fd, LinuxJoystickEvent joystick_event) throws IOException;
+
+ public final int getNumAxes() {
+ return axes.length;
+ }
+
+ public final int getNumButtons() {
+ return buttons.length;
+ }
+
+ private final int getNumDeviceButtons() throws IOException {
+ return nGetNumButtons(fd);
+ }
+ private final static native int nGetNumButtons(long fd) throws IOException;
+
+ private final int getNumDeviceAxes() throws IOException {
+ return nGetNumAxes(fd);
+ }
+ private final static native int nGetNumAxes(long fd) throws IOException;
+
+ private final int getVersion() throws IOException {
+ return nGetVersion(fd);
+ }
+ private final static native int nGetVersion(long fd) throws IOException;
+
+ public final String getName() {
+ return name;
+ }
+
+ private final String getDeviceName() throws IOException {
+ return nGetName(fd);
+ }
+ private final static native String nGetName(long fd) throws IOException;
+
+ public final synchronized void close() throws IOException {
+ if (!closed) {
+ closed = true;
+ nClose(fd);
+ }
+ }
+ private final static native void nClose(long fd) throws IOException;
+
+ private final void checkClosed() throws IOException {
+ if (closed)
+ throw new IOException("Device is closed");
+ }
+
+ protected void finalize() throws IOException {
+ close();
+ }
+}
diff --git a/plugins/linux/src/native/joystickInterface.h b/plugins/linux/src/java/net/java/games/input/LinuxJoystickEvent.java
index 01b8c58..4e14039 100644
--- a/plugins/linux/src/native/joystickInterface.h
+++ b/plugins/linux/src/java/net/java/games/input/LinuxJoystickEvent.java
@@ -23,15 +23,37 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*/
+package net.java.games.input;
-#if !defined(joystickInterface_h)
-#define joystickInterface_h
+/**
+ * @author elias
+ */
+final class LinuxJoystickEvent {
+ private long nanos;
+ private int value;
+ private int type;
+ private int number;
+
+ public final void set(long millis, int value, int type, int number) {
+ this.nanos = millis*1000000;
+ this.value = value;
+ this.type = type;
+ this.number = number;
+ }
+
+ public final int getValue() {
+ return value;
+ }
-#include "Device.h"
+ public final int getType() {
+ return type;
+ }
-int jsGetJoystickInterfaceVersionNumber();
-int jsInit();
-int jsGetNumberDevices();
-void jsGetDevices(Device **deviceList);
+ public final int getNumber() {
+ return number;
+ }
-#endif //joystickInterface_h
+ public final long getNanos() {
+ return nanos;
+ }
+}
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 4ea1c47..96b2d08 100644
--- a/plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java
+++ b/plugins/linux/src/java/net/java/games/input/LinuxKeyboard.java
@@ -1,175 +1,68 @@
-/**
- * Copyright (C) 2003 Jeremy Booth ([email protected])
+/*
+ * %W% %E%
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * The name of the author may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
package net.java.games.input;
-/** Class that represents a keyboard under linux
- * @author Jeremy Booth ([email protected])
- */
-public class LinuxKeyboard extends StandardKeyboard {
-
- /** 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
- * @param name Name of this keybaord
- * @param numButtons Number of keys
- * @param numRelAxes Number of relative axes (you never know)
- * @param numAbsAxes Number of absolute axes (you never know)
- */
- 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
- * call to poll. This is called from a key's getPollData method.
- * @param key The key to check
- * @return the value fo the key
- */
- protected boolean isKeyPressed(Key key) {
- /*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[((Component.Identifier.Key) key.getIdentifier()).getKeyIndex()]] > 0) {
- return true;
- }
- return false;
- }
-
- /** Polls axes for data. Returns false if the controller is no longer valid.
- * Polling reflects the current state of the device when polled.
- * @return False if this device is invalid.
- */
- public boolean poll() {
- int retval = JInputLibrary.safePoll(nativeID, keyData, dummyRelAxesData, dummyAbsAxesData);
- if(retval>=0) return true;
- return false;
- }
-
- /** Goes through every key to initialise the key map
- */
- private void setupKeyMap() {
- for(int i=0;i<Component.Identifier.Key.LAST.getKeyIndex();i++) {
- keyMap[i] = numKeys;
- }
- for(int i=0;i<numKeys;i++) {
- int tempNativeID = supportedKeys[i];
- Component.Identifier.Key tempKeyID = Component.Identifier.Key.VOID;
- try {
- tempKeyID = (Component.Identifier.Key)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() {
- Component tempAxes[] = getComponents();
- // Do this one by hand as it's a special case
- //((AbstractAxis)tempAxes[0]).setName("Unknown");
- for(int i=0;i<tempAxes.length;i++) {
- Component tempAxis = tempAxes[i];
- int nativeKeyID = supportedKeys[keyMap[((Component.Identifier.Key) tempAxis.getIdentifier()).getKeyIndex()]];
- //System.out.println("key " + tempAxis + " map: " + nativeKeyID);
- if(nativeKeyID != NativeDefinitions.KEY_UNKNOWN) {
- String tempName = LinuxNativeTypesMap.getButtonName(nativeKeyID);
- ((AbstractComponent)tempAxis).setName(tempName);
+import java.io.IOException;
+
+/** Represents an OSX Keyboard
+* @author elias
+* @version 1.0
+*/
+final class LinuxKeyboard extends Keyboard {
+ private final PortType port;
+ private final LinuxEventDevice device;
+
+ protected LinuxKeyboard(LinuxEventDevice device, Component[] components, Controller[] children, Rumbler[] rumblers) throws IOException {
+ super(device.getName(), components, children, rumblers);
+ this.device = device;
+ this.port = device.getPortType();
+ }
+
+ public final PortType getPortType() {
+ return port;
+ }
- /*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[]) {
- JInputLibrary.getSupportedButtons(nativeID, supportedButtons);
- }
+ protected final boolean getNextDeviceEvent(Event event) throws IOException {
+ return LinuxControllers.getNextDeviceEvent(event, device);
+ }
+ public final void pollDevice() throws IOException {
+ device.pollKeyStates();
+ }
}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxMouse.java b/plugins/linux/src/java/net/java/games/input/LinuxMouse.java
index b345b5e..17b5895 100644
--- a/plugins/linux/src/java/net/java/games/input/LinuxMouse.java
+++ b/plugins/linux/src/java/net/java/games/input/LinuxMouse.java
@@ -1,168 +1,68 @@
-/**
- * Copyright (C) 2003 Jeremy Booth ([email protected])
+/*
+ * %W% %E%
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * The name of the author may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
package net.java.games.input;
-/** Class that represents a mouse under linux.
- *
- * @author Jeremy Booth ([email protected])
- */
-public class LinuxMouse extends Mouse {
-
- /** The parent linux device
- */
- private LinuxDevice device;
-
- /** Creates a new instance of LinuxMouse
- * @param device The parent device
- */
- public LinuxMouse(LinuxDevice device) {
- super(device.getName());
-
- this.device = device;
- Component[] components = device.getComponents();
- Component x = null;
- Component y = null;
- Component wheel = null;
- Button left = null;
- Button right = null;
- Button middle = null;
- Button side = null;
- Button extra = null;
- Button forward = null;
- Button back = null;
-
- // start from the back, that way the first one is it
- for(int i = (components.length -1);i>=0;i--) {
- Component tempAxis = components[i];
- if(tempAxis.isRelative()) {
- if(tempAxis.getIdentifier() == Component.Identifier.Axis.X) {
- x = tempAxis;
- } else if(tempAxis.getIdentifier() == Component.Identifier.Axis.Y) {
- y = tempAxis;
- } else if(tempAxis.getIdentifier() == Component.Identifier.Axis.SLIDER) {
- wheel = tempAxis;
- }
- } else if(!(tempAxis.isAnalog())) {
- if(tempAxis.getIdentifier() == Component.Identifier.Button.LEFT) {
- left = new LinuxMouseButton(tempAxis);
- } else if(tempAxis.getIdentifier() == Component.Identifier.Button.RIGHT) {
- right = new LinuxMouseButton(tempAxis);
- } else if(tempAxis.getIdentifier() == Component.Identifier.Button.MIDDLE) {
- middle = new LinuxMouseButton(tempAxis);
- } else if(tempAxis.getIdentifier() == Component.Identifier.Button.SIDE) {
- side = new LinuxMouseButton(tempAxis);
- } else if(tempAxis.getIdentifier() == Component.Identifier.Button.EXTRA) {
- extra = new LinuxMouseButton(tempAxis);
- } else if(tempAxis.getIdentifier() == Component.Identifier.Button.FORWARD) {
- forward = new LinuxMouseButton(tempAxis);
- } else if(tempAxis.getIdentifier() == Component.Identifier.Button.BACK) {
- back = new LinuxMouseButton(tempAxis);
- }
- }
- }
- ball = new LinuxMouseBall(x,y,wheel);
- buttons = new LinuxMouseButtons(left, right, middle, side, extra, forward, back);
-
- }
-
- /** Polls axes for data. Returns false if the controller is no longer valid.
- * Polling reflects the current state of the device when polled.
- * @return Returns false if the controller is no longer valid.
- */
- public boolean poll() {
- return device.poll();
- }
-
- /** Mouse ball under linux
- */
- private class LinuxMouseBall extends Ball {
- /** Constructs the new mouse ball
- * @param x The x axis
- * @param y The y axis
- * @param wheel The mouse wheel axis
- */
- public LinuxMouseBall(Component x, Component y, Component wheel) {
- super(LinuxMouse.this.getName() + " ball");
- this.x = x;
- this.y = y;
- this.wheel = wheel;
- }
- }
-
- /** Mouse buttons under linux
- */
- private class LinuxMouseButtons extends Buttons {
- /** Creates the new mouse's buttons
- * @param left Left mouse button
- * @param right Right mouse button
- * @param middle Middle mouse button
- * @param side Side mouse button
- * @param extra Extra mouse button
- * @param forward Forward mouse button
- * @param back Back mouse button
- */
- public LinuxMouseButtons(Button left, Button right, Button middle, Button side, Button extra, Button forward, Button back) {
- super(LinuxMouse.this.getName() + " buttons");
- this.left = left;
- this.right = right;
- this.middle = middle;
- this.side = side;
- this.extra = extra;
- this.forward = forward;
- this.back = back;
- }
- }
-
- /** Linux specific mouse buttons
- */
- private class LinuxMouseButton extends Mouse.Button {
- /** The real Axis
- */
- private Component realAxis;
-
- /** Construct a linux mouse button fro mthe given axis
- * @param axis The axis that holds the data
- */
- public LinuxMouseButton(Component axis) {
- super(axis.getName(), (Component.Identifier.Button)axis.getIdentifier());
- this.realAxis = axis;
- }
-
- /** Returns true f this axis is relative
- * @return Always returns false for a mouse button
- */
- public boolean isRelative() {
- return false;
- }
-
- /** Returns the data for this mouse button
- * @return Retursn this mouse buttons value
- */
- public float getPollData(){
- return realAxis.getPollData();
- }
- }
+import java.io.IOException;
+
+/** Represents an OSX Mouse
+* @author elias
+* @version 1.0
+*/
+final class LinuxMouse extends Mouse {
+ private final PortType port;
+ private final LinuxEventDevice device;
+
+ protected LinuxMouse(LinuxEventDevice device, Component[] components, Controller[] children, Rumbler[] rumblers) throws IOException {
+ super(device.getName(), components, children, rumblers);
+ this.device = device;
+ this.port = device.getPortType();
+ }
+
+ public final PortType getPortType() {
+ return port;
+ }
+
+ public final void pollDevice() throws IOException {
+ device.pollKeyStates();
+ }
+
+ protected final boolean getNextDeviceEvent(Event event) throws IOException {
+ return LinuxControllers.getNextDeviceEvent(event, device);
+ }
}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxNativeTypesMap.java b/plugins/linux/src/java/net/java/games/input/LinuxNativeTypesMap.java
index 5817922..a739074 100644
--- a/plugins/linux/src/java/net/java/games/input/LinuxNativeTypesMap.java
+++ b/plugins/linux/src/java/net/java/games/input/LinuxNativeTypesMap.java
@@ -30,315 +30,25 @@ package net.java.games.input;
* Key.Identifiers
* @author Jeremy Booth ([email protected])
*/
-public class LinuxNativeTypesMap {
-
- /** Instance of they key map
- */
+class LinuxNativeTypesMap {
private static LinuxNativeTypesMap INSTANCE = new LinuxNativeTypesMap();
- /** Indexed array of key names
- */
- private String keyNames[];
- /** Inexed array of relative axes names
- */
- private String relAxesNames[];
- /** Indexed array of absolute axis names
- */
- private String absAxesNames[];
- /** Indexed array of relative axis ID's
- */
- private Component.Identifier relAxesIDs[];
- /** Indexed array of absoulte axis ID's
- */
- private Component.Identifier absAxesIDs[];
- /** Indexed array of button axis ID's
- */
- private Component.Identifier buttonIDs[];
+ private final Component.Identifier relAxesIDs[];
+ private final Component.Identifier absAxesIDs[];
+ private final Component.Identifier buttonIDs[];
/** create an empty, uninitialsed map
*/
private LinuxNativeTypesMap() {
- keyNames = new String[NativeDefinitions.KEY_MAX];
+ buttonIDs = new Component.Identifier[NativeDefinitions.KEY_MAX];
+ relAxesIDs = new Component.Identifier[NativeDefinitions.REL_MAX];
+ absAxesIDs = new Component.Identifier[NativeDefinitions.ABS_MAX];
+ reInit();
}
- /** Initialise the map, has to be done like this because the map references staic
- * classes, as this would otherwise be done in a static class initialiser the whole
- * thing blew up as the static classes this class references refer to this class
- * this meant that the other classes could not be initialsed until this one was,
- * but this class couldn't be loaded until the others were, all went horibly wrong
- * and INSTANCE was null whilst initialising the class, ouch.
- */
- public static void init() {
- INSTANCE.reInit();
- }
-
/** Do the work.
*/
private void reInit() {
- keyNames[NativeDefinitions.KEY_ESC] = "Escape";
- keyNames[NativeDefinitions.KEY_1] = "1";
- keyNames[NativeDefinitions.KEY_2] = "2";
- keyNames[NativeDefinitions.KEY_3] = "3";
- keyNames[NativeDefinitions.KEY_4] = "4";
- keyNames[NativeDefinitions.KEY_5] = "5";
- keyNames[NativeDefinitions.KEY_6] = "6";
- keyNames[NativeDefinitions.KEY_7] = "7";
- keyNames[NativeDefinitions.KEY_8] = "8";
- keyNames[NativeDefinitions.KEY_9] = "9";
- keyNames[NativeDefinitions.KEY_0] = "0";
- keyNames[NativeDefinitions.KEY_MINUS] = "-";
- keyNames[NativeDefinitions.KEY_EQUAL] = "=";
- keyNames[NativeDefinitions.KEY_BACKSPACE] = "Backspace";
- keyNames[NativeDefinitions.KEY_TAB] = "Tab";
- keyNames[NativeDefinitions.KEY_Q] = "Q";
- keyNames[NativeDefinitions.KEY_W] = "W";
- keyNames[NativeDefinitions.KEY_E] = "E";
- keyNames[NativeDefinitions.KEY_R] = "R";
- keyNames[NativeDefinitions.KEY_T] = "T";
- keyNames[NativeDefinitions.KEY_Y] = "Y";
- keyNames[NativeDefinitions.KEY_U] = "U";
- keyNames[NativeDefinitions.KEY_I] = "I";
- keyNames[NativeDefinitions.KEY_O] = "O";
- keyNames[NativeDefinitions.KEY_P] = "P";
- keyNames[NativeDefinitions.KEY_LEFTBRACE] = "[";
- keyNames[NativeDefinitions.KEY_RIGHTBRACE] = "]";
- keyNames[NativeDefinitions.KEY_ENTER] = "Enter";
- keyNames[NativeDefinitions.KEY_LEFTCTRL] = "LH Control";
- keyNames[NativeDefinitions.KEY_A] = "A";
- keyNames[NativeDefinitions.KEY_S] = "S";
- keyNames[NativeDefinitions.KEY_D] = "D";
- keyNames[NativeDefinitions.KEY_F] = "F";
- keyNames[NativeDefinitions.KEY_G] = "G";
- keyNames[NativeDefinitions.KEY_H] = "H";
- keyNames[NativeDefinitions.KEY_J] = "J";
- keyNames[NativeDefinitions.KEY_K] = "K";
- keyNames[NativeDefinitions.KEY_L] = "L";
- keyNames[NativeDefinitions.KEY_SEMICOLON] = ";";
- keyNames[NativeDefinitions.KEY_APOSTROPHE] = "'";
- keyNames[NativeDefinitions.KEY_GRAVE] = "`";
- keyNames[NativeDefinitions.KEY_LEFTSHIFT] = "LH Shift";
- keyNames[NativeDefinitions.KEY_BACKSLASH] = "\\";
- keyNames[NativeDefinitions.KEY_Z] = "Z";
- keyNames[NativeDefinitions.KEY_X] = "X";
- keyNames[NativeDefinitions.KEY_C] = "C";
- keyNames[NativeDefinitions.KEY_V] = "V";
- keyNames[NativeDefinitions.KEY_B] = "B";
- keyNames[NativeDefinitions.KEY_N] = "N";
- keyNames[NativeDefinitions.KEY_M] = "M";
- keyNames[NativeDefinitions.KEY_COMMA] = ",";
- keyNames[NativeDefinitions.KEY_DOT] = ".";
- keyNames[NativeDefinitions.KEY_SLASH] = "/";
- keyNames[NativeDefinitions.KEY_RIGHTSHIFT] = "RH Shift";
- keyNames[NativeDefinitions.KEY_KPASTERISK] = "*";
- keyNames[NativeDefinitions.KEY_LEFTALT] = "LH Alt";
- keyNames[NativeDefinitions.KEY_SPACE] = "Space";
- keyNames[NativeDefinitions.KEY_CAPSLOCK] = "CapsLock";
- keyNames[NativeDefinitions.KEY_F1] = "F1";
- keyNames[NativeDefinitions.KEY_F2] = "F2";
- keyNames[NativeDefinitions.KEY_F3] = "F3";
- keyNames[NativeDefinitions.KEY_F4] = "F4";
- keyNames[NativeDefinitions.KEY_F5] = "F5";
- keyNames[NativeDefinitions.KEY_F6] = "F6";
- keyNames[NativeDefinitions.KEY_F7] = "F7";
- keyNames[NativeDefinitions.KEY_F8] = "F8";
- keyNames[NativeDefinitions.KEY_F9] = "F9";
- keyNames[NativeDefinitions.KEY_F10] = "F10";
- keyNames[NativeDefinitions.KEY_NUMLOCK] = "NumLock";
- keyNames[NativeDefinitions.KEY_SCROLLLOCK] = "ScrollLock";
- keyNames[NativeDefinitions.KEY_KP7] = "KeyPad 7";
- keyNames[NativeDefinitions.KEY_KP8] = "KeyPad 8";
- keyNames[NativeDefinitions.KEY_KP9] = "Keypad 9";
- keyNames[NativeDefinitions.KEY_KPMINUS] = "KeyPad Minus";
- keyNames[NativeDefinitions.KEY_KP4] = "KeyPad 4";
- keyNames[NativeDefinitions.KEY_KP5] = "KeyPad 5";
- keyNames[NativeDefinitions.KEY_KP6] = "KeyPad 6";
- keyNames[NativeDefinitions.KEY_KPPLUS] = "KeyPad Plus";
- keyNames[NativeDefinitions.KEY_KP1] = "KeyPad 1";
- keyNames[NativeDefinitions.KEY_KP2] = "KeyPad 2";
- keyNames[NativeDefinitions.KEY_KP3] = "KeyPad 3";
- keyNames[NativeDefinitions.KEY_KP0] = "KeyPad 0";
- keyNames[NativeDefinitions.KEY_KPDOT] = "KeyPad decimal point";
- keyNames[NativeDefinitions.KEY_103RD] = "Huh?";
- keyNames[NativeDefinitions.KEY_F13] = "F13";
- keyNames[NativeDefinitions.KEY_102ND] = "Beats me...";
- keyNames[NativeDefinitions.KEY_F11] = "F11";
- keyNames[NativeDefinitions.KEY_F12] = "F12";
- keyNames[NativeDefinitions.KEY_F14] = "F14";
- keyNames[NativeDefinitions.KEY_F15] = "F15";
- keyNames[NativeDefinitions.KEY_F16] = "F16";
- keyNames[NativeDefinitions.KEY_F17] = "F17";
- keyNames[NativeDefinitions.KEY_F18] = "F18";
- keyNames[NativeDefinitions.KEY_F19] = "F19";
- keyNames[NativeDefinitions.KEY_F20] = "F20";
- keyNames[NativeDefinitions.KEY_KPENTER] = "Keypad Enter";
- keyNames[NativeDefinitions.KEY_RIGHTCTRL] = "RH Control";
- keyNames[NativeDefinitions.KEY_KPSLASH] = "KeyPad Forward Slash";
- keyNames[NativeDefinitions.KEY_SYSRQ] = "System Request";
- keyNames[NativeDefinitions.KEY_RIGHTALT] = "RH Alternate";
- keyNames[NativeDefinitions.KEY_LINEFEED] = "Line Feed";
- keyNames[NativeDefinitions.KEY_HOME] = "Home";
- keyNames[NativeDefinitions.KEY_UP] = "Up";
- keyNames[NativeDefinitions.KEY_PAGEUP] = "Page Up";
- keyNames[NativeDefinitions.KEY_LEFT] = "Left";
- keyNames[NativeDefinitions.KEY_RIGHT] = "Right";
- keyNames[NativeDefinitions.KEY_END] = "End";
- keyNames[NativeDefinitions.KEY_DOWN] = "Down";
- keyNames[NativeDefinitions.KEY_PAGEDOWN] = "Page Down";
- keyNames[NativeDefinitions.KEY_INSERT] = "Insert";
- keyNames[NativeDefinitions.KEY_DELETE] = "Delete";
- keyNames[NativeDefinitions.KEY_MACRO] = "Macro";
- keyNames[NativeDefinitions.KEY_MUTE] = "Mute";
- keyNames[NativeDefinitions.KEY_VOLUMEDOWN] = "Volume Down";
- keyNames[NativeDefinitions.KEY_VOLUMEUP] = "Volume Up";
- keyNames[NativeDefinitions.KEY_POWER] = "Power";
- keyNames[NativeDefinitions.KEY_KPEQUAL] = "KeyPad Equal";
- keyNames[NativeDefinitions.KEY_KPPLUSMINUS] = "KeyPad +/-";
- keyNames[NativeDefinitions.KEY_PAUSE] = "Pause";
- keyNames[NativeDefinitions.KEY_F21] = "F21";
- keyNames[NativeDefinitions.KEY_F22] = "F22";
- keyNames[NativeDefinitions.KEY_F23] = "F23";
- keyNames[NativeDefinitions.KEY_F24] = "F24";
- keyNames[NativeDefinitions.KEY_KPCOMMA] = "KeyPad comma";
- keyNames[NativeDefinitions.KEY_LEFTMETA] = "LH Meta";
- keyNames[NativeDefinitions.KEY_RIGHTMETA] = "RH Meta";
- keyNames[NativeDefinitions.KEY_COMPOSE] = "Compose";
- keyNames[NativeDefinitions.KEY_STOP] = "Stop";
- keyNames[NativeDefinitions.KEY_AGAIN] = "Again";
- keyNames[NativeDefinitions.KEY_PROPS] = "Properties";
- keyNames[NativeDefinitions.KEY_UNDO] = "Undo";
- keyNames[NativeDefinitions.KEY_FRONT] = "Front";
- keyNames[NativeDefinitions.KEY_COPY] = "Copy";
- keyNames[NativeDefinitions.KEY_OPEN] = "Open";
- keyNames[NativeDefinitions.KEY_PASTE] = "Paste";
- keyNames[NativeDefinitions.KEY_FIND] = "Find";
- keyNames[NativeDefinitions.KEY_CUT] = "Cut";
- keyNames[NativeDefinitions.KEY_HELP] = "Help";
- keyNames[NativeDefinitions.KEY_MENU] = "Menu";
- keyNames[NativeDefinitions.KEY_CALC] = "Calculator";
- keyNames[NativeDefinitions.KEY_SETUP] = "Setup";
- keyNames[NativeDefinitions.KEY_SLEEP] = "Sleep";
- keyNames[NativeDefinitions.KEY_WAKEUP] = "Wakeup";
- keyNames[NativeDefinitions.KEY_FILE] = "File";
- keyNames[NativeDefinitions.KEY_SENDFILE] = "Send File";
- keyNames[NativeDefinitions.KEY_DELETEFILE] = "Delete File";
- keyNames[NativeDefinitions.KEY_XFER] = "Transfer";
- keyNames[NativeDefinitions.KEY_PROG1] = "Program 1";
- keyNames[NativeDefinitions.KEY_PROG2] = "Program 2";
- keyNames[NativeDefinitions.KEY_WWW] = "Web Browser";
- keyNames[NativeDefinitions.KEY_MSDOS] = "DOS mode";
- keyNames[NativeDefinitions.KEY_COFFEE] = "Coffee";
- keyNames[NativeDefinitions.KEY_DIRECTION] = "Direction";
- keyNames[NativeDefinitions.KEY_CYCLEWINDOWS] = "Window cycle";
- keyNames[NativeDefinitions.KEY_MAIL] = "Mail";
- keyNames[NativeDefinitions.KEY_BOOKMARKS] = "Book Marks";
- keyNames[NativeDefinitions.KEY_COMPUTER] = "Computer";
- keyNames[NativeDefinitions.KEY_BACK] = "Back";
- keyNames[NativeDefinitions.KEY_FORWARD] = "Forward";
- keyNames[NativeDefinitions.KEY_CLOSECD] = "Close CD";
- keyNames[NativeDefinitions.KEY_EJECTCD] = "Eject CD";
- keyNames[NativeDefinitions.KEY_EJECTCLOSECD] = "Eject / Close CD";
- keyNames[NativeDefinitions.KEY_NEXTSONG] = "Next Song";
- keyNames[NativeDefinitions.KEY_PLAYPAUSE] = "Play and Pause";
- keyNames[NativeDefinitions.KEY_PREVIOUSSONG] = "Previous Song";
- keyNames[NativeDefinitions.KEY_STOPCD] = "Stop CD";
- keyNames[NativeDefinitions.KEY_RECORD] = "Record";
- keyNames[NativeDefinitions.KEY_REWIND] = "Rewind";
- keyNames[NativeDefinitions.KEY_PHONE] = "Phone";
- keyNames[NativeDefinitions.KEY_ISO] = "ISO";
- keyNames[NativeDefinitions.KEY_CONFIG] = "Config";
- keyNames[NativeDefinitions.KEY_HOMEPAGE] = "Home";
- keyNames[NativeDefinitions.KEY_REFRESH] = "Refresh";
- keyNames[NativeDefinitions.KEY_EXIT] = "Exit";
- keyNames[NativeDefinitions.KEY_MOVE] = "Move";
- keyNames[NativeDefinitions.KEY_EDIT] = "Edit";
- keyNames[NativeDefinitions.KEY_SCROLLUP] = "Scroll Up";
- keyNames[NativeDefinitions.KEY_SCROLLDOWN] = "Scroll Down";
- keyNames[NativeDefinitions.KEY_KPLEFTPAREN] = "KeyPad LH parenthesis";
- keyNames[NativeDefinitions.KEY_KPRIGHTPAREN] = "KeyPad RH parenthesis";
- keyNames[NativeDefinitions.KEY_INTL1] = "Intl 1";
- keyNames[NativeDefinitions.KEY_INTL2] = "Intl 2";
- keyNames[NativeDefinitions.KEY_INTL3] = "Intl 3";
- keyNames[NativeDefinitions.KEY_INTL4] = "Intl 4";
- keyNames[NativeDefinitions.KEY_INTL5] = "Intl 5";
- keyNames[NativeDefinitions.KEY_INTL6] = "Intl 6";
- keyNames[NativeDefinitions.KEY_INTL7] = "Intl 7";
- keyNames[NativeDefinitions.KEY_INTL8] = "Intl 8";
- keyNames[NativeDefinitions.KEY_INTL9] = "Intl 9";
- keyNames[NativeDefinitions.KEY_LANG1] = "Language 1";
- keyNames[NativeDefinitions.KEY_LANG2] = "Language 2";
- keyNames[NativeDefinitions.KEY_LANG3] = "Language 3";
- keyNames[NativeDefinitions.KEY_LANG4] = "Language 4";
- keyNames[NativeDefinitions.KEY_LANG5] = "Language 5";
- keyNames[NativeDefinitions.KEY_LANG6] = "Language 6";
- keyNames[NativeDefinitions.KEY_LANG7] = "Language 7";
- keyNames[NativeDefinitions.KEY_LANG8] = "Language 8";
- keyNames[NativeDefinitions.KEY_LANG9] = "Language 9";
- keyNames[NativeDefinitions.KEY_PLAYCD] = "Play CD";
- keyNames[NativeDefinitions.KEY_PAUSECD] = "Pause CD";
- keyNames[NativeDefinitions.KEY_PROG3] = "Program 3";
- keyNames[NativeDefinitions.KEY_PROG4] = "Program 4";
- keyNames[NativeDefinitions.KEY_SUSPEND] = "Suspend";
- keyNames[NativeDefinitions.KEY_CLOSE] = "Close";
- keyNames[NativeDefinitions.KEY_UNKNOWN] = "Specifically unknown";
- keyNames[NativeDefinitions.KEY_BRIGHTNESSDOWN] = "Brightness Down";
- keyNames[NativeDefinitions.KEY_BRIGHTNESSUP] = "Brightness Up";
- keyNames[NativeDefinitions.BTN_0] = "Button 0";
- keyNames[NativeDefinitions.BTN_1] = "Button 1";
- keyNames[NativeDefinitions.BTN_2] = "Button 2";
- keyNames[NativeDefinitions.BTN_3] = "Button 3";
- keyNames[NativeDefinitions.BTN_4] = "Button 4";
- keyNames[NativeDefinitions.BTN_5] = "Button 5";
- keyNames[NativeDefinitions.BTN_6] = "Button 6";
- keyNames[NativeDefinitions.BTN_7] = "Button 7";
- keyNames[NativeDefinitions.BTN_8] = "Button 8";
- keyNames[NativeDefinitions.BTN_9] = "Button 9";
- keyNames[NativeDefinitions.BTN_LEFT] = "Left Button";
- keyNames[NativeDefinitions.BTN_RIGHT] = "Right Button";
- keyNames[NativeDefinitions.BTN_MIDDLE] = "Middle Button";
- keyNames[NativeDefinitions.BTN_SIDE] = "Side Button";
- keyNames[NativeDefinitions.BTN_EXTRA] = "Extra Button";
- keyNames[NativeDefinitions.BTN_FORWARD] = "Forward Button";
- keyNames[NativeDefinitions.BTN_BACK] = "Back Button";
- keyNames[NativeDefinitions.BTN_TRIGGER] = "Trigger Button";
- keyNames[NativeDefinitions.BTN_THUMB] = "Thumb Button";
- keyNames[NativeDefinitions.BTN_THUMB2] = "Second Thumb Button";
- keyNames[NativeDefinitions.BTN_TOP] = "Top Button";
- keyNames[NativeDefinitions.BTN_TOP2] = "Second Top Button";
- keyNames[NativeDefinitions.BTN_PINKIE] = "Pinkie Button";
- keyNames[NativeDefinitions.BTN_BASE] = "Base Button";
- keyNames[NativeDefinitions.BTN_BASE2] = "Second Base Button";
- keyNames[NativeDefinitions.BTN_BASE3] = "Third Base Button";
- keyNames[NativeDefinitions.BTN_BASE4] = "Fourth Base Button";
- keyNames[NativeDefinitions.BTN_BASE5] = "Fifth Base Button";
- keyNames[NativeDefinitions.BTN_BASE6] = "Sixth Base Button";
- keyNames[NativeDefinitions.BTN_DEAD] = "Dead Button";
- keyNames[NativeDefinitions.BTN_A] = "Button A";
- keyNames[NativeDefinitions.BTN_B] = "Button B";
- keyNames[NativeDefinitions.BTN_C] = "Button C";
- keyNames[NativeDefinitions.BTN_X] = "Button X";
- keyNames[NativeDefinitions.BTN_Y] = "Button Y";
- keyNames[NativeDefinitions.BTN_Z] = "Button Z";
- keyNames[NativeDefinitions.BTN_TL] = "Thumb Left Button";
- keyNames[NativeDefinitions.BTN_TR] = "Thumb Right Button ";
- keyNames[NativeDefinitions.BTN_TL2] = "Second Thumb Left Button";
- keyNames[NativeDefinitions.BTN_TR2] = "Second Thumb Right Button ";
- keyNames[NativeDefinitions.BTN_SELECT] = "Select Button";
- keyNames[NativeDefinitions.BTN_MODE] = "Mode Button";
- keyNames[NativeDefinitions.BTN_THUMBL] = "Another Left Thumb Button ";
- keyNames[NativeDefinitions.BTN_THUMBR] = "Another Right Thumb Button ";
- keyNames[NativeDefinitions.BTN_TOOL_PEN] = "Digitiser Pen Tool";
- keyNames[NativeDefinitions.BTN_TOOL_RUBBER] = "Digitiser Rubber Tool";
- keyNames[NativeDefinitions.BTN_TOOL_BRUSH] = "Digitiser Brush Tool";
- keyNames[NativeDefinitions.BTN_TOOL_PENCIL] = "Digitiser Pencil Tool";
- keyNames[NativeDefinitions.BTN_TOOL_AIRBRUSH] = "Digitiser Airbrush Tool";
- keyNames[NativeDefinitions.BTN_TOOL_FINGER] = "Digitiser Finger Tool";
- keyNames[NativeDefinitions.BTN_TOOL_MOUSE] = "Digitiser Mouse Tool";
- keyNames[NativeDefinitions.BTN_TOOL_LENS] = "Digitiser Lens Tool";
- keyNames[NativeDefinitions.BTN_TOUCH] = "Digitiser Touch Button ";
- keyNames[NativeDefinitions.BTN_STYLUS] = "Digitiser Stylus Button ";
- keyNames[NativeDefinitions.BTN_STYLUS2] = "Second Digitiser Stylus Button ";
-
- buttonIDs = new Component.Identifier[NativeDefinitions.KEY_MAX];
buttonIDs[NativeDefinitions.KEY_ESC] = Component.Identifier.Key.ESCAPE;
buttonIDs[NativeDefinitions.KEY_1] = Component.Identifier.Key._1;
buttonIDs[NativeDefinitions.KEY_2] = Component.Identifier.Key._2;
@@ -422,7 +132,7 @@ public class LinuxNativeTypesMap {
buttonIDs[NativeDefinitions.KEY_KP3] = Component.Identifier.Key.NUMPAD3;
buttonIDs[NativeDefinitions.KEY_KP0] = Component.Identifier.Key.NUMPAD0;
buttonIDs[NativeDefinitions.KEY_KPDOT] = Component.Identifier.Key.DECIMAL;
- buttonIDs[NativeDefinitions.KEY_103RD] = null;
+// buttonIDs[NativeDefinitions.KEY_103RD] = null;
buttonIDs[NativeDefinitions.KEY_F13] = Component.Identifier.Key.F13;
buttonIDs[NativeDefinitions.KEY_102ND] = null;
buttonIDs[NativeDefinitions.KEY_F11] = Component.Identifier.Key.F11;
@@ -547,7 +257,7 @@ public class LinuxNativeTypesMap {
/*buttonIDs[NativeDefinitions.KEY_BRIGHTNESSDOWN] = "Brightness Down";
buttonIDs[NativeDefinitions.KEY_BRIGHTNESSUP] = "Brightness Up";*/
- //Msic keys
+ //Misc keys
buttonIDs[NativeDefinitions.BTN_0] = Component.Identifier.Button._0;
buttonIDs[NativeDefinitions.BTN_1] = Component.Identifier.Button._1;
buttonIDs[NativeDefinitions.BTN_2] = Component.Identifier.Button._2;
@@ -612,53 +322,15 @@ public class LinuxNativeTypesMap {
buttonIDs[NativeDefinitions.BTN_STYLUS] = Component.Identifier.Button.STYLUS;
buttonIDs[NativeDefinitions.BTN_STYLUS2] = Component.Identifier.Button.STYLUS2;
- relAxesNames = new String[NativeDefinitions.REL_MAX];
- relAxesNames[NativeDefinitions.REL_X] = "X axis";
- relAxesNames[NativeDefinitions.REL_Y] = "Y axis";
- relAxesNames[NativeDefinitions.REL_Z] = "Z axis";
- relAxesNames[NativeDefinitions.REL_HWHEEL] ="Horizontal wheel";
- relAxesNames[NativeDefinitions.REL_DIAL] = "Dial";
- relAxesNames[NativeDefinitions.REL_WHEEL] = "Vertical wheel";
- relAxesNames[NativeDefinitions.REL_MISC] = "Miscellaneous";
-
- relAxesIDs = new Component.Identifier[NativeDefinitions.REL_MAX];
relAxesIDs[NativeDefinitions.REL_X] = Component.Identifier.Axis.X;
relAxesIDs[NativeDefinitions.REL_Y] = Component.Identifier.Axis.Y;
relAxesIDs[NativeDefinitions.REL_Z] = Component.Identifier.Axis.Z;
- relAxesIDs[NativeDefinitions.REL_WHEEL] = Component.Identifier.Axis.SLIDER;
+ relAxesIDs[NativeDefinitions.REL_WHEEL] = Component.Identifier.Axis.Z;
// There are guesses as I have no idea what they would be used for
relAxesIDs[NativeDefinitions.REL_HWHEEL] = Component.Identifier.Axis.SLIDER;
relAxesIDs[NativeDefinitions.REL_DIAL] = Component.Identifier.Axis.SLIDER;
relAxesIDs[NativeDefinitions.REL_MISC] = Component.Identifier.Axis.SLIDER;
- absAxesNames = new String[NativeDefinitions.ABS_MAX];
- absAxesNames[NativeDefinitions.ABS_X] = "X axis";
- absAxesNames[NativeDefinitions.ABS_Y] = "Y axis";
- absAxesNames[NativeDefinitions.ABS_Z] = "Z axis";
- absAxesNames[NativeDefinitions.ABS_RX] = "X rate axis";
- absAxesNames[NativeDefinitions.ABS_RY] = "Y rate axis";
- absAxesNames[NativeDefinitions.ABS_RZ] = "Z rate axis";
- absAxesNames[NativeDefinitions.ABS_THROTTLE] = "Throttle";
- absAxesNames[NativeDefinitions.ABS_RUDDER] = "Rudder";
- absAxesNames[NativeDefinitions.ABS_WHEEL] = "Wheel";
- absAxesNames[NativeDefinitions.ABS_GAS] = "Accelerator";
- absAxesNames[NativeDefinitions.ABS_BRAKE] = "Brake";
- // Hats are done this way as they are mapped from two axis down to one
- absAxesNames[NativeDefinitions.ABS_HAT0X] = "Hat 1";
- absAxesNames[NativeDefinitions.ABS_HAT0Y] = "Hat 1";
- absAxesNames[NativeDefinitions.ABS_HAT1X] = "Hat 2";
- absAxesNames[NativeDefinitions.ABS_HAT1Y] = "Hat 2";
- absAxesNames[NativeDefinitions.ABS_HAT2X] = "Hat 3";
- absAxesNames[NativeDefinitions.ABS_HAT2Y] = "Hat 3";
- absAxesNames[NativeDefinitions.ABS_HAT3X] = "Hat 4";
- absAxesNames[NativeDefinitions.ABS_HAT3Y] = "Hat 4";
- absAxesNames[NativeDefinitions.ABS_PRESSURE] = "Pressure";
- absAxesNames[NativeDefinitions.ABS_DISTANCE] = "Distance";
- absAxesNames[NativeDefinitions.ABS_TILT_X] = "X axis tilt";
- absAxesNames[NativeDefinitions.ABS_TILT_Y] = "Y axis tilt";
- absAxesNames[NativeDefinitions.ABS_MISC] = "Miscellaneous";
-
- absAxesIDs = new Component.Identifier[NativeDefinitions.ABS_MAX];
absAxesIDs[NativeDefinitions.ABS_X] = Component.Identifier.Axis.X;
absAxesIDs[NativeDefinitions.ABS_Y] = Component.Identifier.Axis.Y;
absAxesIDs[NativeDefinitions.ABS_Z] = Component.Identifier.Axis.Z;
@@ -685,9 +357,373 @@ public class LinuxNativeTypesMap {
absAxesIDs[NativeDefinitions.ABS_TILT_X] = null;
absAxesIDs[NativeDefinitions.ABS_TILT_Y] = null;
absAxesIDs[NativeDefinitions.ABS_MISC] = null;
-
}
-
+
+ public final static Controller.Type guessButtonTrait(int button_code) {
+ switch (button_code) {
+ case NativeDefinitions.BTN_TRIGGER :
+ case NativeDefinitions.BTN_THUMB :
+ case NativeDefinitions.BTN_THUMB2 :
+ case NativeDefinitions.BTN_TOP :
+ case NativeDefinitions.BTN_TOP2 :
+ case NativeDefinitions.BTN_PINKIE :
+ case NativeDefinitions.BTN_BASE :
+ case NativeDefinitions.BTN_BASE2 :
+ case NativeDefinitions.BTN_BASE3 :
+ case NativeDefinitions.BTN_BASE4 :
+ case NativeDefinitions.BTN_BASE5 :
+ case NativeDefinitions.BTN_BASE6 :
+ case NativeDefinitions.BTN_DEAD :
+ return Controller.Type.STICK;
+ case NativeDefinitions.BTN_A :
+ case NativeDefinitions.BTN_B :
+ case NativeDefinitions.BTN_C :
+ case NativeDefinitions.BTN_X :
+ case NativeDefinitions.BTN_Y :
+ case NativeDefinitions.BTN_Z :
+ case NativeDefinitions.BTN_TL :
+ case NativeDefinitions.BTN_TR :
+ case NativeDefinitions.BTN_TL2 :
+ case NativeDefinitions.BTN_TR2 :
+ case NativeDefinitions.BTN_SELECT :
+ case NativeDefinitions.BTN_MODE :
+ case NativeDefinitions.BTN_THUMBL :
+ case NativeDefinitions.BTN_THUMBR :
+ return Controller.Type.GAMEPAD;
+ case NativeDefinitions.BTN_0 :
+ case NativeDefinitions.BTN_1 :
+ case NativeDefinitions.BTN_2 :
+ case NativeDefinitions.BTN_3 :
+ case NativeDefinitions.BTN_4 :
+ case NativeDefinitions.BTN_5 :
+ case NativeDefinitions.BTN_6 :
+ case NativeDefinitions.BTN_7 :
+ case NativeDefinitions.BTN_8 :
+ case NativeDefinitions.BTN_9 :
+ return Controller.Type.UNKNOWN;
+ case NativeDefinitions.BTN_LEFT :
+ case NativeDefinitions.BTN_RIGHT :
+ case NativeDefinitions.BTN_MIDDLE :
+ case NativeDefinitions.BTN_SIDE :
+ case NativeDefinitions.BTN_EXTRA :
+ return Controller.Type.MOUSE;
+ // case NativeDefinitions.KEY_RESERVED:
+ case NativeDefinitions.KEY_ESC:
+ case NativeDefinitions.KEY_1:
+ case NativeDefinitions.KEY_2:
+ case NativeDefinitions.KEY_3:
+ case NativeDefinitions.KEY_4:
+ case NativeDefinitions.KEY_5:
+ case NativeDefinitions.KEY_6:
+ case NativeDefinitions.KEY_7:
+ case NativeDefinitions.KEY_8:
+ case NativeDefinitions.KEY_9:
+ case NativeDefinitions.KEY_0:
+ case NativeDefinitions.KEY_MINUS:
+ case NativeDefinitions.KEY_EQUAL:
+ case NativeDefinitions.KEY_BACKSPACE:
+ case NativeDefinitions.KEY_TAB:
+ case NativeDefinitions.KEY_Q:
+ case NativeDefinitions.KEY_W:
+ case NativeDefinitions.KEY_E:
+ case NativeDefinitions.KEY_R:
+ case NativeDefinitions.KEY_T:
+ case NativeDefinitions.KEY_Y:
+ case NativeDefinitions.KEY_U:
+ case NativeDefinitions.KEY_I:
+ case NativeDefinitions.KEY_O:
+ case NativeDefinitions.KEY_P:
+ case NativeDefinitions.KEY_LEFTBRACE:
+ case NativeDefinitions.KEY_RIGHTBRACE:
+ case NativeDefinitions.KEY_ENTER:
+ case NativeDefinitions.KEY_LEFTCTRL:
+ case NativeDefinitions.KEY_A:
+ case NativeDefinitions.KEY_S:
+ case NativeDefinitions.KEY_D:
+ case NativeDefinitions.KEY_F:
+ case NativeDefinitions.KEY_G:
+ case NativeDefinitions.KEY_H:
+ case NativeDefinitions.KEY_J:
+ case NativeDefinitions.KEY_K:
+ case NativeDefinitions.KEY_L:
+ case NativeDefinitions.KEY_SEMICOLON:
+ case NativeDefinitions.KEY_APOSTROPHE:
+ case NativeDefinitions.KEY_GRAVE:
+ case NativeDefinitions.KEY_LEFTSHIFT:
+ case NativeDefinitions.KEY_BACKSLASH:
+ case NativeDefinitions.KEY_Z:
+ case NativeDefinitions.KEY_X:
+ case NativeDefinitions.KEY_C:
+ case NativeDefinitions.KEY_V:
+ case NativeDefinitions.KEY_B:
+ case NativeDefinitions.KEY_N:
+ case NativeDefinitions.KEY_M:
+ case NativeDefinitions.KEY_COMMA:
+ case NativeDefinitions.KEY_DOT:
+ case NativeDefinitions.KEY_SLASH:
+ case NativeDefinitions.KEY_RIGHTSHIFT:
+ case NativeDefinitions.KEY_KPASTERISK:
+ case NativeDefinitions.KEY_LEFTALT:
+ case NativeDefinitions.KEY_SPACE:
+ case NativeDefinitions.KEY_CAPSLOCK:
+ case NativeDefinitions.KEY_F1:
+ case NativeDefinitions.KEY_F2:
+ case NativeDefinitions.KEY_F3:
+ case NativeDefinitions.KEY_F4:
+ case NativeDefinitions.KEY_F5:
+ case NativeDefinitions.KEY_F6:
+ case NativeDefinitions.KEY_F7:
+ case NativeDefinitions.KEY_F8:
+ case NativeDefinitions.KEY_F9:
+ case NativeDefinitions.KEY_F10:
+ case NativeDefinitions.KEY_NUMLOCK:
+ case NativeDefinitions.KEY_SCROLLLOCK:
+ case NativeDefinitions.KEY_KP7:
+ case NativeDefinitions.KEY_KP8:
+ case NativeDefinitions.KEY_KP9:
+ case NativeDefinitions.KEY_KPMINUS:
+ case NativeDefinitions.KEY_KP4:
+ case NativeDefinitions.KEY_KP5:
+ case NativeDefinitions.KEY_KP6:
+ case NativeDefinitions.KEY_KPPLUS:
+ case NativeDefinitions.KEY_KP1:
+ case NativeDefinitions.KEY_KP2:
+ case NativeDefinitions.KEY_KP3:
+ case NativeDefinitions.KEY_KP0:
+ case NativeDefinitions.KEY_KPDOT:
+ case NativeDefinitions.KEY_ZENKAKUHANKAKU:
+ case NativeDefinitions.KEY_102ND:
+ case NativeDefinitions.KEY_F11:
+ case NativeDefinitions.KEY_F12:
+ case NativeDefinitions.KEY_RO:
+ case NativeDefinitions.KEY_KATAKANA:
+ case NativeDefinitions.KEY_HIRAGANA:
+ case NativeDefinitions.KEY_HENKAN:
+ case NativeDefinitions.KEY_KATAKANAHIRAGANA:
+ case NativeDefinitions.KEY_MUHENKAN:
+ case NativeDefinitions.KEY_KPJPCOMMA:
+ case NativeDefinitions.KEY_KPENTER:
+ case NativeDefinitions.KEY_RIGHTCTRL:
+ case NativeDefinitions.KEY_KPSLASH:
+ case NativeDefinitions.KEY_SYSRQ:
+ case NativeDefinitions.KEY_RIGHTALT:
+ case NativeDefinitions.KEY_LINEFEED:
+ case NativeDefinitions.KEY_HOME:
+ case NativeDefinitions.KEY_UP:
+ case NativeDefinitions.KEY_PAGEUP:
+ case NativeDefinitions.KEY_LEFT:
+ case NativeDefinitions.KEY_RIGHT:
+ case NativeDefinitions.KEY_END:
+ case NativeDefinitions.KEY_DOWN:
+ case NativeDefinitions.KEY_PAGEDOWN:
+ case NativeDefinitions.KEY_INSERT:
+ case NativeDefinitions.KEY_DELETE:
+ case NativeDefinitions.KEY_MACRO:
+ case NativeDefinitions.KEY_MUTE:
+ case NativeDefinitions.KEY_VOLUMEDOWN:
+ case NativeDefinitions.KEY_VOLUMEUP:
+ case NativeDefinitions.KEY_POWER:
+ case NativeDefinitions.KEY_KPEQUAL:
+ case NativeDefinitions.KEY_KPPLUSMINUS:
+ case NativeDefinitions.KEY_PAUSE:
+ case NativeDefinitions.KEY_KPCOMMA:
+ case NativeDefinitions.KEY_HANGUEL:
+ case NativeDefinitions.KEY_HANJA:
+ case NativeDefinitions.KEY_YEN:
+ case NativeDefinitions.KEY_LEFTMETA:
+ case NativeDefinitions.KEY_RIGHTMETA:
+ case NativeDefinitions.KEY_COMPOSE:
+ case NativeDefinitions.KEY_STOP:
+ case NativeDefinitions.KEY_AGAIN:
+ case NativeDefinitions.KEY_PROPS:
+ case NativeDefinitions.KEY_UNDO:
+ case NativeDefinitions.KEY_FRONT:
+ case NativeDefinitions.KEY_COPY:
+ case NativeDefinitions.KEY_OPEN:
+ case NativeDefinitions.KEY_PASTE:
+ case NativeDefinitions.KEY_FIND:
+ case NativeDefinitions.KEY_CUT:
+ case NativeDefinitions.KEY_HELP:
+ case NativeDefinitions.KEY_MENU:
+ case NativeDefinitions.KEY_CALC:
+ case NativeDefinitions.KEY_SETUP:
+ case NativeDefinitions.KEY_SLEEP:
+ case NativeDefinitions.KEY_WAKEUP:
+ case NativeDefinitions.KEY_FILE:
+ case NativeDefinitions.KEY_SENDFILE:
+ case NativeDefinitions.KEY_DELETEFILE:
+ case NativeDefinitions.KEY_XFER:
+ case NativeDefinitions.KEY_PROG1:
+ case NativeDefinitions.KEY_PROG2:
+ case NativeDefinitions.KEY_WWW:
+ case NativeDefinitions.KEY_MSDOS:
+ case NativeDefinitions.KEY_COFFEE:
+ case NativeDefinitions.KEY_DIRECTION:
+ case NativeDefinitions.KEY_CYCLEWINDOWS:
+ case NativeDefinitions.KEY_MAIL:
+ case NativeDefinitions.KEY_BOOKMARKS:
+ case NativeDefinitions.KEY_COMPUTER:
+ case NativeDefinitions.KEY_BACK:
+ case NativeDefinitions.KEY_FORWARD:
+ case NativeDefinitions.KEY_CLOSECD:
+ case NativeDefinitions.KEY_EJECTCD:
+ case NativeDefinitions.KEY_EJECTCLOSECD:
+ case NativeDefinitions.KEY_NEXTSONG:
+ case NativeDefinitions.KEY_PLAYPAUSE:
+ case NativeDefinitions.KEY_PREVIOUSSONG:
+ case NativeDefinitions.KEY_STOPCD:
+ case NativeDefinitions.KEY_RECORD:
+ case NativeDefinitions.KEY_REWIND:
+ case NativeDefinitions.KEY_PHONE:
+ case NativeDefinitions.KEY_ISO:
+ case NativeDefinitions.KEY_CONFIG:
+ case NativeDefinitions.KEY_HOMEPAGE:
+ case NativeDefinitions.KEY_REFRESH:
+ case NativeDefinitions.KEY_EXIT:
+ case NativeDefinitions.KEY_MOVE:
+ case NativeDefinitions.KEY_EDIT:
+ case NativeDefinitions.KEY_SCROLLUP:
+ case NativeDefinitions.KEY_SCROLLDOWN:
+ case NativeDefinitions.KEY_KPLEFTPAREN:
+ case NativeDefinitions.KEY_KPRIGHTPAREN:
+ case NativeDefinitions.KEY_F13:
+ case NativeDefinitions.KEY_F14:
+ case NativeDefinitions.KEY_F15:
+ case NativeDefinitions.KEY_F16:
+ case NativeDefinitions.KEY_F17:
+ case NativeDefinitions.KEY_F18:
+ case NativeDefinitions.KEY_F19:
+ case NativeDefinitions.KEY_F20:
+ case NativeDefinitions.KEY_F21:
+ case NativeDefinitions.KEY_F22:
+ case NativeDefinitions.KEY_F23:
+ case NativeDefinitions.KEY_F24:
+ case NativeDefinitions.KEY_PLAYCD:
+ case NativeDefinitions.KEY_PAUSECD:
+ case NativeDefinitions.KEY_PROG3:
+ case NativeDefinitions.KEY_PROG4:
+ case NativeDefinitions.KEY_SUSPEND:
+ case NativeDefinitions.KEY_CLOSE:
+ case NativeDefinitions.KEY_PLAY:
+ case NativeDefinitions.KEY_FASTFORWARD:
+ case NativeDefinitions.KEY_BASSBOOST:
+ case NativeDefinitions.KEY_PRINT:
+ case NativeDefinitions.KEY_HP:
+ case NativeDefinitions.KEY_CAMERA:
+ case NativeDefinitions.KEY_SOUND:
+ case NativeDefinitions.KEY_QUESTION:
+ case NativeDefinitions.KEY_EMAIL:
+ case NativeDefinitions.KEY_CHAT:
+ case NativeDefinitions.KEY_SEARCH:
+ case NativeDefinitions.KEY_CONNECT:
+ case NativeDefinitions.KEY_FINANCE:
+ case NativeDefinitions.KEY_SPORT:
+ case NativeDefinitions.KEY_SHOP:
+ case NativeDefinitions.KEY_ALTERASE:
+ case NativeDefinitions.KEY_CANCEL:
+ case NativeDefinitions.KEY_BRIGHTNESSDOWN:
+ case NativeDefinitions.KEY_BRIGHTNESSUP:
+ case NativeDefinitions.KEY_MEDIA:
+ case NativeDefinitions.KEY_SWITCHVIDEOMODE:
+ case NativeDefinitions.KEY_KBDILLUMTOGGLE:
+ case NativeDefinitions.KEY_KBDILLUMDOWN:
+ case NativeDefinitions.KEY_KBDILLUMUP:
+ // case NativeDefinitions.KEY_UNKNOWN:
+ case NativeDefinitions.KEY_OK:
+ case NativeDefinitions.KEY_SELECT:
+ case NativeDefinitions.KEY_GOTO:
+ case NativeDefinitions.KEY_CLEAR:
+ case NativeDefinitions.KEY_POWER2:
+ case NativeDefinitions.KEY_OPTION:
+ case NativeDefinitions.KEY_INFO:
+ case NativeDefinitions.KEY_TIME:
+ case NativeDefinitions.KEY_VENDOR:
+ case NativeDefinitions.KEY_ARCHIVE:
+ case NativeDefinitions.KEY_PROGRAM:
+ case NativeDefinitions.KEY_CHANNEL:
+ case NativeDefinitions.KEY_FAVORITES:
+ case NativeDefinitions.KEY_EPG:
+ case NativeDefinitions.KEY_PVR:
+ case NativeDefinitions.KEY_MHP:
+ case NativeDefinitions.KEY_LANGUAGE:
+ case NativeDefinitions.KEY_TITLE:
+ case NativeDefinitions.KEY_SUBTITLE:
+ case NativeDefinitions.KEY_ANGLE:
+ case NativeDefinitions.KEY_ZOOM:
+ case NativeDefinitions.KEY_MODE:
+ case NativeDefinitions.KEY_KEYBOARD:
+ case NativeDefinitions.KEY_SCREEN:
+ case NativeDefinitions.KEY_PC:
+ case NativeDefinitions.KEY_TV:
+ case NativeDefinitions.KEY_TV2:
+ case NativeDefinitions.KEY_VCR:
+ case NativeDefinitions.KEY_VCR2:
+ case NativeDefinitions.KEY_SAT:
+ case NativeDefinitions.KEY_SAT2:
+ case NativeDefinitions.KEY_CD:
+ case NativeDefinitions.KEY_TAPE:
+ case NativeDefinitions.KEY_RADIO:
+ case NativeDefinitions.KEY_TUNER:
+ case NativeDefinitions.KEY_PLAYER:
+ case NativeDefinitions.KEY_TEXT:
+ case NativeDefinitions.KEY_DVD:
+ case NativeDefinitions.KEY_AUX:
+ case NativeDefinitions.KEY_MP3:
+ case NativeDefinitions.KEY_AUDIO:
+ case NativeDefinitions.KEY_VIDEO:
+ case NativeDefinitions.KEY_DIRECTORY:
+ case NativeDefinitions.KEY_LIST:
+ case NativeDefinitions.KEY_MEMO:
+ case NativeDefinitions.KEY_CALENDAR:
+ case NativeDefinitions.KEY_RED:
+ case NativeDefinitions.KEY_GREEN:
+ case NativeDefinitions.KEY_YELLOW:
+ case NativeDefinitions.KEY_BLUE:
+ case NativeDefinitions.KEY_CHANNELUP:
+ case NativeDefinitions.KEY_CHANNELDOWN:
+ case NativeDefinitions.KEY_FIRST:
+ case NativeDefinitions.KEY_LAST:
+ case NativeDefinitions.KEY_AB:
+ case NativeDefinitions.KEY_NEXT:
+ case NativeDefinitions.KEY_RESTART:
+ case NativeDefinitions.KEY_SLOW:
+ case NativeDefinitions.KEY_SHUFFLE:
+ case NativeDefinitions.KEY_BREAK:
+ case NativeDefinitions.KEY_PREVIOUS:
+ case NativeDefinitions.KEY_DIGITS:
+ case NativeDefinitions.KEY_TEEN:
+ case NativeDefinitions.KEY_TWEN:
+ case NativeDefinitions.KEY_DEL_EOL:
+ case NativeDefinitions.KEY_DEL_EOS:
+ case NativeDefinitions.KEY_INS_LINE:
+ case NativeDefinitions.KEY_DEL_LINE:
+ case NativeDefinitions.KEY_FN:
+ case NativeDefinitions.KEY_FN_ESC:
+ case NativeDefinitions.KEY_FN_F1:
+ case NativeDefinitions.KEY_FN_F2:
+ case NativeDefinitions.KEY_FN_F3:
+ case NativeDefinitions.KEY_FN_F4:
+ case NativeDefinitions.KEY_FN_F5:
+ case NativeDefinitions.KEY_FN_F6:
+ case NativeDefinitions.KEY_FN_F7:
+ case NativeDefinitions.KEY_FN_F8:
+ case NativeDefinitions.KEY_FN_F9:
+ case NativeDefinitions.KEY_FN_F10:
+ case NativeDefinitions.KEY_FN_F11:
+ case NativeDefinitions.KEY_FN_F12:
+ case NativeDefinitions.KEY_FN_1:
+ case NativeDefinitions.KEY_FN_2:
+ case NativeDefinitions.KEY_FN_D:
+ case NativeDefinitions.KEY_FN_E:
+ case NativeDefinitions.KEY_FN_F:
+ case NativeDefinitions.KEY_FN_S:
+ case NativeDefinitions.KEY_FN_B:
+ return Controller.Type.KEYBOARD;
+ default:
+ return Controller.Type.UNKNOWN;
+ }
+ }
+
/** Return port type from a native port type int id
* @param nativeid The native port type
* @return The jinput port type
@@ -710,45 +746,6 @@ public class LinuxNativeTypesMap {
}
}
- /** Returns the name of a native button
- * @param nativeID The native button type id
- * @return The button name
- */
- public static String getButtonName(int nativeID) {
- String retval = INSTANCE.keyNames[nativeID];
- //if(retval == null){
- // retval = "Unknown button id";
- // INSTANCE.keyNames[nativeID] = retval;
- //}
- return retval;
- }
-
- /** Retursn the name of the native relative axis
- * @param nativeID The axis type ID
- * @return The axis name
- */
- public static String getRelAxisName(int nativeID) {
- String retval = INSTANCE.relAxesNames[nativeID];
- if(retval == null) {
- retval = "Unknown relative axis id";
- INSTANCE.relAxesNames[nativeID] = retval;
- }
- return retval;
- }
-
- /** Retursn the name of the native absolute axis
- * @param nativeID The native axis type ID
- * @return The name of the axis
- */
- public static String getAbsAxisName(int nativeID) {
- String retval = INSTANCE.absAxesNames[nativeID];
- if(retval == null) {
- retval = "Unknown absolute axis id " + nativeID;
- INSTANCE.absAxesNames[nativeID] = retval;
- }
- return retval;
- }
-
/** Gets the identifier for a relative axis
* @param nativeID The axis type ID
* @return The jinput id
@@ -793,5 +790,4 @@ public class LinuxNativeTypesMap {
}
return retval;
}
-
}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxPOV.java b/plugins/linux/src/java/net/java/games/input/LinuxPOV.java
new file mode 100644
index 0000000..7e62501
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxPOV.java
@@ -0,0 +1,95 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+package net.java.games.input;
+
+import java.io.IOException;
+
+/** Represents a linux button
+* @author elias
+* @version 1.0
+*/
+final class LinuxPOV extends LinuxComponent {
+ private final LinuxEventComponent component_x;
+ private final LinuxEventComponent component_y;
+
+ private float last_x;
+ private float last_y;
+
+ public LinuxPOV(LinuxEventComponent component_x, LinuxEventComponent component_y) {
+ super(component_x);
+ this.component_x = component_x;
+ this.component_y = component_y;
+ }
+
+ protected final float poll() throws IOException {
+ last_x = LinuxControllers.poll(component_x);
+ last_y = LinuxControllers.poll(component_y);
+ return convertValue(0f, null);
+ }
+
+ public float convertValue(float value, LinuxAxisDescriptor descriptor) {
+ if (descriptor == component_x.getDescriptor())
+ last_x = value;
+ if (descriptor == component_y.getDescriptor())
+ last_y = value;
+
+ if (last_x == -1 && last_y == -1)
+ return Component.POV.UP_LEFT;
+ else if (last_x == -1 && last_y == 0)
+ return Component.POV.LEFT;
+ else if (last_x == -1 && last_y == 1)
+ return Component.POV.DOWN_LEFT;
+ else if (last_x == 0 && last_y == -1)
+ return Component.POV.UP;
+ else if (last_x == 0 && last_y == 0)
+ return Component.POV.OFF;
+ else if (last_x == 0 && last_y == 1)
+ return Component.POV.DOWN;
+ else if (last_x == 1 && last_y == -1)
+ return Component.POV.UP_RIGHT;
+ else if (last_x == 1 && last_y == 0)
+ return Component.POV.RIGHT;
+ else if (last_x == 1 && last_y == 1)
+ return Component.POV.DOWN_RIGHT;
+ else {
+ ControllerEnvironment.logln("Unknown values x = " + last_x + " | y = " + last_y);
+ return Component.POV.OFF;
+ }
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/LinuxRumbleFF.java b/plugins/linux/src/java/net/java/games/input/LinuxRumbleFF.java
new file mode 100644
index 0000000..e76bd31
--- /dev/null
+++ b/plugins/linux/src/java/net/java/games/input/LinuxRumbleFF.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (C) 2003 Jeremy Booth ([email protected])
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer. Redistributions in binary
+ * form must reproduce the above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * The name of the author may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ */
+package net.java.games.input;
+
+import java.io.IOException;
+
+/**
+ * @author elias
+ */
+final class LinuxRumbleFF extends LinuxForceFeedbackEffect {
+ public LinuxRumbleFF(LinuxEventDevice device) throws IOException {
+ super(device);
+ }
+
+ protected final int upload(int id, float intensity) throws IOException {
+ int weak_magnitude;
+ int strong_magnitude;
+ if (intensity > 0.666666f) {
+ strong_magnitude = (int)(0x8000*intensity);
+ weak_magnitude = (int)(0xc000*intensity);
+ } else if (intensity > 0.3333333f) {
+ strong_magnitude = (int)(0x8000*intensity);
+ weak_magnitude = (int)(0xc000*0);
+ } else {
+ strong_magnitude = (int)(0x8000*0);
+ weak_magnitude = (int)(0xc000*intensity);
+ }
+
+ return getDevice().uploadRumbleEffect(id, 0, 0, 0, 0, 0, strong_magnitude, weak_magnitude);
+ }
+}
diff --git a/plugins/linux/src/java/net/java/games/input/NativeDefinitions.java b/plugins/linux/src/java/net/java/games/input/NativeDefinitions.java
index b7a17ff..efb644a 100644
--- a/plugins/linux/src/java/net/java/games/input/NativeDefinitions.java
+++ b/plugins/linux/src/java/net/java/games/input/NativeDefinitions.java
@@ -4,7 +4,20 @@ package net.java.games.input;
/**
* This file is generated from /usr/include/linux/input.h please do not edit
*/
-public class NativeDefinitions {
+class NativeDefinitions {
+ public static final int EV_VERSION = 0x010001;
+ public static final int EV_SYN = 0x00;
+ public static final int EV_KEY = 0x01;
+ public static final int EV_REL = 0x02;
+ public static final int EV_ABS = 0x03;
+ public static final int EV_MSC = 0x04;
+ public static final int EV_LED = 0x11;
+ public static final int EV_SND = 0x12;
+ public static final int EV_REP = 0x14;
+ public static final int EV_FF = 0x15;
+ public static final int EV_PWR = 0x16;
+ public static final int EV_FF_STATUS = 0x17;
+ public static final int EV_MAX = 0x1f;
public static final int KEY_RESERVED = 0;
public static final int KEY_ESC = 1;
public static final int KEY_1 = 2;
@@ -89,18 +102,17 @@ public class NativeDefinitions {
public static final int KEY_KP3 = 81;
public static final int KEY_KP0 = 82;
public static final int KEY_KPDOT = 83;
- public static final int KEY_103RD = 84;
- public static final int KEY_F13 = 85;
+ public static final int KEY_ZENKAKUHANKAKU = 85;
public static final int KEY_102ND = 86;
public static final int KEY_F11 = 87;
public static final int KEY_F12 = 88;
- public static final int KEY_F14 = 89;
- public static final int KEY_F15 = 90;
- public static final int KEY_F16 = 91;
- public static final int KEY_F17 = 92;
- public static final int KEY_F18 = 93;
- public static final int KEY_F19 = 94;
- public static final int KEY_F20 = 95;
+ public static final int KEY_RO = 89;
+ public static final int KEY_KATAKANA = 90;
+ public static final int KEY_HIRAGANA = 91;
+ public static final int KEY_HENKAN = 92;
+ public static final int KEY_KATAKANAHIRAGANA = 93;
+ public static final int KEY_MUHENKAN = 94;
+ public static final int KEY_KPJPCOMMA = 95;
public static final int KEY_KPENTER = 96;
public static final int KEY_RIGHTCTRL = 97;
public static final int KEY_KPSLASH = 98;
@@ -125,11 +137,10 @@ public class NativeDefinitions {
public static final int KEY_KPEQUAL = 117;
public static final int KEY_KPPLUSMINUS = 118;
public static final int KEY_PAUSE = 119;
- public static final int KEY_F21 = 120;
- public static final int KEY_F22 = 121;
- public static final int KEY_F23 = 122;
- public static final int KEY_F24 = 123;
- public static final int KEY_KPCOMMA = 124;
+ public static final int KEY_KPCOMMA = 121;
+ public static final int KEY_HANGUEL = 122;
+ public static final int KEY_HANJA = 123;
+ public static final int KEY_YEN = 124;
public static final int KEY_LEFTMETA = 125;
public static final int KEY_RIGHTMETA = 126;
public static final int KEY_COMPOSE = 127;
@@ -186,24 +197,18 @@ public class NativeDefinitions {
public static final int KEY_SCROLLDOWN = 178;
public static final int KEY_KPLEFTPAREN = 179;
public static final int KEY_KPRIGHTPAREN = 180;
- public static final int KEY_INTL1 = 181;
- public static final int KEY_INTL2 = 182;
- public static final int KEY_INTL3 = 183;
- public static final int KEY_INTL4 = 184;
- public static final int KEY_INTL5 = 185;
- public static final int KEY_INTL6 = 186;
- public static final int KEY_INTL7 = 187;
- public static final int KEY_INTL8 = 188;
- public static final int KEY_INTL9 = 189;
- public static final int KEY_LANG1 = 190;
- public static final int KEY_LANG2 = 191;
- public static final int KEY_LANG3 = 192;
- public static final int KEY_LANG4 = 193;
- public static final int KEY_LANG5 = 194;
- public static final int KEY_LANG6 = 195;
- public static final int KEY_LANG7 = 196;
- public static final int KEY_LANG8 = 197;
- public static final int KEY_LANG9 = 198;
+ public static final int KEY_F13 = 183;
+ public static final int KEY_F14 = 184;
+ public static final int KEY_F15 = 185;
+ public static final int KEY_F16 = 186;
+ public static final int KEY_F17 = 187;
+ public static final int KEY_F18 = 188;
+ public static final int KEY_F19 = 189;
+ public static final int KEY_F20 = 190;
+ public static final int KEY_F21 = 191;
+ public static final int KEY_F22 = 192;
+ public static final int KEY_F23 = 193;
+ public static final int KEY_F24 = 194;
public static final int KEY_PLAYCD = 200;
public static final int KEY_PAUSECD = 201;
public static final int KEY_PROG3 = 202;
@@ -230,6 +235,10 @@ public class NativeDefinitions {
public static final int KEY_BRIGHTNESSDOWN = 224;
public static final int KEY_BRIGHTNESSUP = 225;
public static final int KEY_MEDIA = 226;
+ public static final int KEY_SWITCHVIDEOMODE = 227;
+ public static final int KEY_KBDILLUMTOGGLE = 228;
+ public static final int KEY_KBDILLUMDOWN = 229;
+ public static final int KEY_KBDILLUMUP = 230;
public static final int KEY_UNKNOWN = 240;
public static final int BTN_MISC = 0x100;
public static final int BTN_0 = 0x100;
@@ -366,10 +375,34 @@ public class NativeDefinitions {
public static final int KEY_DEL_EOS = 0x1c1;
public static final int KEY_INS_LINE = 0x1c2;
public static final int KEY_DEL_LINE = 0x1c3;
+ public static final int KEY_FN = 0x1d0;
+ public static final int KEY_FN_ESC = 0x1d1;
+ public static final int KEY_FN_F1 = 0x1d2;
+ public static final int KEY_FN_F2 = 0x1d3;
+ public static final int KEY_FN_F3 = 0x1d4;
+ public static final int KEY_FN_F4 = 0x1d5;
+ public static final int KEY_FN_F5 = 0x1d6;
+ public static final int KEY_FN_F6 = 0x1d7;
+ public static final int KEY_FN_F7 = 0x1d8;
+ public static final int KEY_FN_F8 = 0x1d9;
+ public static final int KEY_FN_F9 = 0x1da;
+ public static final int KEY_FN_F10 = 0x1db;
+ public static final int KEY_FN_F11 = 0x1dc;
+ public static final int KEY_FN_F12 = 0x1dd;
+ public static final int KEY_FN_1 = 0x1de;
+ public static final int KEY_FN_2 = 0x1df;
+ public static final int KEY_FN_D = 0x1e0;
+ public static final int KEY_FN_E = 0x1e1;
+ public static final int KEY_FN_F = 0x1e2;
+ public static final int KEY_FN_S = 0x1e3;
+ public static final int KEY_FN_B = 0x1e4;
public static final int KEY_MAX = 0x1ff;
public static final int REL_X = 0x00;
public static final int REL_Y = 0x01;
public static final int REL_Z = 0x02;
+ public static final int REL_RX = 0x03;
+ public static final int REL_RY = 0x04;
+ public static final int REL_RZ = 0x05;
public static final int REL_HWHEEL = 0x06;
public static final int REL_DIAL = 0x07;
public static final int REL_WHEEL = 0x08;
@@ -402,10 +435,16 @@ public class NativeDefinitions {
public static final int ABS_VOLUME = 0x20;
public static final int ABS_MISC = 0x28;
public static final int ABS_MAX = 0x3f;
+ public static final int USAGE_MOUSE = 0x00;
+ public static final int USAGE_JOYSTICK = 0x01;
+ public static final int USAGE_GAMEPAD = 0x02;
+ public static final int USAGE_KEYBOARD = 0x03;
+ public static final int USAGE_MAX = 0x0f;
public static final int BUS_PCI = 0x01;
public static final int BUS_ISAPNP = 0x02;
public static final int BUS_USB = 0x03;
public static final int BUS_HIL = 0x04;
+ public static final int BUS_BLUETOOTH = 0x05;
public static final int BUS_ISA = 0x10;
public static final int BUS_I8042 = 0x11;
public static final int BUS_XTKBD = 0x12;
@@ -416,4 +455,24 @@ public class NativeDefinitions {
public static final int BUS_ADB = 0x17;
public static final int BUS_I2C = 0x18;
public static final int BUS_HOST = 0x19;
+ public static final int FF_STATUS_STOPPED = 0x00;
+ public static final int FF_STATUS_PLAYING = 0x01;
+ public static final int FF_STATUS_MAX = 0x01;
+ public static final int FF_RUMBLE = 0x50;
+ public static final int FF_PERIODIC = 0x51;
+ public static final int FF_CONSTANT = 0x52;
+ public static final int FF_SPRING = 0x53;
+ public static final int FF_FRICTION = 0x54;
+ public static final int FF_DAMPER = 0x55;
+ public static final int FF_INERTIA = 0x56;
+ public static final int FF_RAMP = 0x57;
+ public static final int FF_SQUARE = 0x58;
+ public static final int FF_TRIANGLE = 0x59;
+ public static final int FF_SINE = 0x5a;
+ public static final int FF_SAW_UP = 0x5b;
+ public static final int FF_SAW_DOWN = 0x5c;
+ public static final int FF_CUSTOM = 0x5d;
+ public static final int FF_GAIN = 0x60;
+ public static final int FF_AUTOCENTER = 0x61;
+ public static final int FF_MAX = 0x7f;
}
diff --git a/plugins/linux/src/native/Device.h b/plugins/linux/src/native/Device.h
deleted file mode 100644
index 61fe621..0000000
--- a/plugins/linux/src/native/Device.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Copyright (C) 2003 Jeremy Booth ([email protected])
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * The name of the author may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-
-#if !defined(eventInterface_Device_h)
-#define eventInterface_Device_h
-
-/**
- * Simple abstract device class
- *
- * @author Jeremy Booth ([email protected])
- */
-class Device {
-
- private:
-
- public:
- /** Maximum name length for a device */
- const static int MAX_NAME_LENGTH = 256;
- /** Return the number of relative axes for this device */
- virtual int getNumberRelAxes() = 0;
- /** Return the number ofr absolute axes for this device */
- virtual int getNumberAbsAxes() = 0;
- /** Return the number of buttons for this device */
- virtual int getNumberButtons() = 0;
- /** Get the name of this device */
- virtual const char *getName() = 0;
- /** get teh bus type */
- virtual int getBusType() = 0;
- virtual int getVendorID() = 0;
- virtual int getProductID() = 0;
- virtual int getVersion() = 0;
- /** Get the supported axes/button maps */
- virtual void getSupportedRelAxes(int supportedAxis[]) = 0;
- virtual void getSupportedAbsAxes(int supportedAxis[]) = 0;
- virtual void getSupportedButtons(int supportedButtons[]) = 0;
- /** poll it */
- virtual int poll() = 0;
- /** get the data */
- virtual void getPolledData(int relAxesData[], int absAxesData[], int buttonData[]) = 0;
- /** Get axis details */
- virtual int getAbsAxisMinimum(int axisNumber) = 0;
- virtual int getAbsAxisMaximum(int axisNumber) = 0;
- virtual int getAbsAxisFuzz(int axisNumber) = 0;
- virtual bool getFFEnabled() = 0;
- virtual void rumble(float force) = 0;
- virtual void cleanup() = 0;
-};
-
-#endif //eventInterface_Device_h
diff --git a/plugins/linux/src/native/EventDevice.cpp b/plugins/linux/src/native/EventDevice.cpp
deleted file mode 100644
index b77f2b7..0000000
--- a/plugins/linux/src/native/EventDevice.cpp
+++ /dev/null
@@ -1,481 +0,0 @@
-/**
- * Copyright (C) 2003 Jeremy Booth ([email protected])
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * The name of the author may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-
-#include "eventInterfaceTypes.h"
-#include "EventDevice.h"
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <string.h>
-#include <linux/input.h>
-#include <malloc.h>
-#include <errno.h>
-
-#include "logger.h"
-
-EventDevice::EventDevice(char *deviceFileName) {
- char tempName[Device::MAX_NAME_LENGTH-1] = "Unknown";
- int i;
-
- fd = open(deviceFileName, O_RDWR | O_NONBLOCK);
- if(fd<0) {
-
- char errorMessage[512];
- sprintf(errorMessage, "Error opening device %s read/write, Force Feedback disabled for this device\n", deviceFileName);
- perror(errorMessage);
-
- fd = open(deviceFileName, O_RDONLY | O_NONBLOCK);
- if(fd<0) {
- /*char errorMessage[512];
- sprintf(errorMessage, "Error opening device %s\n", deviceFileName);
- perror(errorMessage);*/
- inited = 0;
- return;
- }
- } else {
- if(ioctl(fd, EVIOCGBIT(EV_FF, sizeof(uint8_t) * 16), ff_bitmask) < 0) {
- char errorMessage[512];
- sprintf(errorMessage, "Error reading device %s\n", deviceFileName);
- perror(errorMessage);
- }
- if(getBit(FF_RUMBLE, ff_bitmask)==1) {
- ffSupported = 1;
- //LOG_TRACE("Force feedback supported for %s\n", deviceFileName);
- int n_effects = 0;
- if (ioctl(fd, EVIOCGEFFECTS, &n_effects) == -1) {
- char errorMessage[512];
- sprintf(errorMessage, "Failed to get number of effects for device %s\n", deviceFileName);
- perror(errorMessage);
- }
- LOG_TRACE("Device %s supports %d simultanious effects\n", deviceFileName, n_effects);
-
- effect_playing = false;
- effect.type=FF_RUMBLE;
- effect.id=-1;
- effect.u.rumble.strong_magnitude = (int)(0x8000);
- effect.u.rumble.weak_magnitude = (int)(0xc000);
- effect.replay.length = 5000;
- effect.replay.delay = 0;
- LOG_TRACE("Uploading effect %d\n", effect.id);
- if (ioctl(fd, EVIOCSFF, &effect) == -1) {
- perror("Upload effect");
- }
- LOG_TRACE("Uploaded effect %d\n", effect.id);
-
-
- } else {
- ffSupported = 0;
- LOG_TRACE("Force feedback not supported for %s %d\n", deviceFileName, getBit(FF_RUMBLE, ff_bitmask));
- }
- }
-
- if(ioctl(fd, EVIOCGNAME(sizeof(tempName)), tempName) < 0) {
- char errorMessage[512];
- sprintf(errorMessage, "Error reading device %s\n", deviceFileName);
- perror(errorMessage);
- }
-
- int namelength=strlen(tempName);
- name = (char *)malloc(namelength+1);
- strncpy(name,tempName, namelength+1);
-
- LOG_TRACE("Device name for device file %s is %s\n", deviceFileName, name);
-
- uint8_t evtype_bitmask[EV_MAX/8 + 1];
- memset(evtype_bitmask, 0, sizeof(evtype_bitmask));
-
- if(ioctl(fd, EVIOCGBIT(0, EV_MAX), evtype_bitmask) < 0) {
- char errorMessage[512];
- sprintf(errorMessage, "Error reading device %s\n", deviceFileName);
- perror(errorMessage);
- }
-
- struct input_devinfo deviceInfo;
- if(ioctl(fd, EVIOCGID, &deviceInfo) < 0) {
- char errorMessage[512];
- sprintf(errorMessage, "Error reading device %s\n", deviceFileName);
- perror(errorMessage);
- }
-
- bustype = deviceInfo.bustype;
- vendor = deviceInfo.vendor;
- product = deviceInfo.product;
- version = deviceInfo.version;
-
- numButtons = -1;
- numAbsAxes = -1;
- numRelAxes = -1;
-
- if(!(getBit(EV_KEY, evtype_bitmask))) {
- numButtons = 0;
- }
- if(!(getBit(EV_REL, evtype_bitmask))) {
- numRelAxes = 0;
- }
-
- if(!(getBit(EV_ABS, evtype_bitmask))) {
- numAbsAxes = 0;
- }
-
- if(!getBit(EV_FF, evtype_bitmask)) {
- ffSupported = 0;
- }
-
- if(numButtons < 0) {
- // This device supports keys, deal with it.
- if(ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask) < 0) {
- char errorMessage[512];
- sprintf(errorMessage, "Error reading device %s\n", deviceFileName);
- perror(errorMessage);
- }
- for(i=0;i<KEY_MAX;i++) {
- buttonLookup[i]=-1;
- }
- short tempSupportedButtons[KEY_MAX];
- numButtons = 0;
- for(i=0;i<KEY_MAX;i++) {
- if(getBit(i,key_bitmask)) {
- tempSupportedButtons[numButtons] = i;
- numButtons++;
- }
- }
- supportedButtons = (short *)malloc(numButtons * sizeof(short));
- buttonData = (uint8_t *)malloc(numButtons * sizeof(uint8_t));
- for(i=0;i<numButtons;i++) {
- buttonData[i] = 0;
- supportedButtons[i] = tempSupportedButtons[i];
- buttonLookup[supportedButtons[i]] = i;
- }
- }
-
- if(numRelAxes < 0) {
- // This device supports axes, deal with it.
- if(ioctl(fd, EVIOCGBIT(EV_REL, sizeof(rel_bitmask)), rel_bitmask) < 0) {
- char errorMessage[512];
- sprintf(errorMessage, "Error reading device %s\n", deviceFileName);
- perror(errorMessage);
- }
- for(i=0;i<REL_MAX;i++) {
- relAxisLookup[i]=-1;
- }
- short tempSupportedAxes[REL_MAX];
- numRelAxes=0;
- for(i=0;i<REL_MAX;i++) {
- if(getBit(i,rel_bitmask)) {
- tempSupportedAxes[numRelAxes] = i;
- numRelAxes++;
- }
- }
- relAxesData = (int *)malloc(numRelAxes * sizeof(int));
- supportedRelAxes = (short *)malloc(numRelAxes * sizeof(short));
- for(i=0;i<numRelAxes;i++) {
- relAxesData[i]=0;
- supportedRelAxes[i] = tempSupportedAxes[i];
- relAxisLookup[supportedRelAxes[i]] = i;
- }
- }
-
-
- if(numAbsAxes < 0) {
- if(ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(abs_bitmask)), abs_bitmask) < 0) {
- char errorMessage[512];
- sprintf(errorMessage, "Error reading device %s\n", deviceFileName);
- perror(errorMessage);
- }
- for(i=0;i<ABS_MAX;i++) {
- absAxisLookup[i] = -1;
- }
- short tempSupportedAxes[ABS_MAX];
- numAbsAxes=0;
- for(i=0;i<ABS_MAX;i++) {
- if(getBit(i,abs_bitmask)) {
- tempSupportedAxes[numAbsAxes] = i;
- numAbsAxes++;
- }
- }
-
- absAxesData = (int *)malloc(numAbsAxes * sizeof(int));
- supportedAbsAxes = (short *)malloc(numAbsAxes * sizeof(short));
- for(i=0;i<numAbsAxes;i++) {
- supportedAbsAxes[i] = tempSupportedAxes[i];
- absAxisLookup[supportedAbsAxes[i]] = i;
- }
-
- abs_features = (struct input_absinfo *)malloc(numAbsAxes * sizeof(struct input_absinfo));
- for(i=0;i<numAbsAxes;i++) {
- if(ioctl(fd, EVIOCGABS(supportedAbsAxes[i]), &(abs_features[i]))) {
- char errorMessage[512];
- sprintf(errorMessage, "Error reading device %s\n", deviceFileName);
- perror(errorMessage);
- }
- absAxesData[i] = abs_features[i].value;
- }
- }
-
- inited = 1;
-}
-
-int EventDevice::isValidDevice() {
- return inited;
-}
-
-int EventDevice::getNumberRelAxes(){
- if(inited!=1) return -1;
- return numRelAxes;
-}
-
-int EventDevice::getNumberAbsAxes(){
- if(inited!=1) return -1;
- return numAbsAxes;
-}
-
-int EventDevice::getNumberButtons(){
- if(inited!=1) return -1;
- return numButtons;
-}
-
-const char *EventDevice::getName(){
- LOG_TRACE("EventDevice::getName()\n");
- return name;
-}
-
-int EventDevice::getBusType(){
- if(inited!=1) return -1;
- return bustype;
-}
-
-int EventDevice::getVendorID(){
- if(inited!=1) return -1;
- return vendor;
-}
-
-int EventDevice::getProductID(){
- if(inited!=1) return -1;
- return product;
-}
-
-int EventDevice::getVersion(){
- if(inited!=1) return -1;
- return version;
-}
-
-void EventDevice::getSupportedRelAxes(int supportedAxis[]){
- int i;
-
- if(inited!=1) return;
- for(i=0;i<numRelAxes; i++) {
- (supportedAxis)[i] = supportedRelAxes[i];
- }
-}
-
-void EventDevice::getSupportedAbsAxes(int supportedAxis[]){
- int i;
-
- if(inited!=1) return;
- for(i=0;i<numAbsAxes; i++) {
- (supportedAxis)[i] = supportedAbsAxes[i];
- }
-}
-
-void EventDevice::getSupportedButtons(int supportedButtons[]){
- int i;
-
- if(inited!=1) return;
- for(i=0;i<numButtons; i++) {
- (supportedButtons)[i] = this->supportedButtons[i];
- }
-}
-
-/**
- * A return value of -1 means error, 0 means ok, but no change
- * a return of >0 means the data for this device has changed
- */
-int EventDevice::poll(){
- size_t read_bytes;
- struct input_event events[64];
- int dataChanged=0;
-
- if(inited!=1) return -1;
-
- // first thing to do is reset all relative axis as mice never seem to do it
- int i;
- for(i=0;i<numRelAxes;i++){
- if(relAxesData[i]!=0) {
- dataChanged=1;
- relAxesData[i]=0;
- }
- }
-
- read_bytes = read(fd, events, sizeof(struct input_event) * 64);
-
- if(read_bytes == 0) {
- // no sweat, just return;
- return 0;
- }
-
- if(read_bytes == -1) {
- if(errno == EAGAIN) {
- // No worries, we are in non blocking and noting is ready
- return 0;
- } else {
- perror("Error reading events: ");
- return -1;
- }
- }
-
- if (read_bytes < (int) sizeof(struct input_event)) {
- perror("Error reading events: ");
- return -1;
- }
-
- int numEventsRead = (int) (read_bytes / sizeof(struct input_event));
- for(i=0;i<numEventsRead;i++) {
- switch(events[i].type) {
- case EV_SYN:
- case EV_MSC:
- // not sure what to do with it, ignore for now -- JPK
- break;
- case EV_KEY: {
- dataChanged = 1;
- int buttonIndex = buttonLookup[events[i].code];
- buttonData[buttonIndex] = events[i].value;
- //printf("button %d translates to button %d on this device\n", events[i].code, buttonIndex);
- break;
- }
- case EV_REL: {
- dataChanged = 1;
- int axisIndex = relAxisLookup[events[i].code];
- relAxesData[axisIndex] += events[i].value;
- //printf("rel axis %d translates to rel axis %d on this device\n", events[i].code, axisIndex);
- break;
- }
- case EV_ABS: {
- dataChanged = 1;
- int axisIndex = absAxisLookup[events[i].code];
- absAxesData[axisIndex] = events[i].value;
- //printf("abs axis %d translates to abs axis %d on this device\n", events[i].code, axisIndex);
- break;
- }
- case EV_LED:
- // reveiced for things like numlock led change
- break;
- default:
- fprintf(stderr, "Received event of type 0x%02X from %s, which I wasn't expecting, please report it to jinput forum at www.javagaming.org\n", events[i].type, name);
- }
- }
- return dataChanged;
-}
-
-void EventDevice::getPolledData(int relAxesData[], int absAxesData[], int buttonData[]){
- int i;
-
- if(inited!=1) return;
- for(i=0;i<numRelAxes;i++) {
- (relAxesData)[i] = this->relAxesData[i];
- }
- for(i=0;i<numAbsAxes;i++) {
- (absAxesData)[i] = this->absAxesData[i];
- }
- for(i=0;i<numButtons;i++) {
- (buttonData)[i] = this->buttonData[i];
- }
-}
-
-int EventDevice::getAbsAxisMinimum(int axisNumber) {
- return abs_features[axisNumber].minimum;
-}
-
-int EventDevice::getAbsAxisMaximum(int axisNumber) {
- return abs_features[axisNumber].maximum;
-}
-
-int EventDevice::getAbsAxisFuzz(int axisNumber) {
- return abs_features[axisNumber].fuzz;
-}
-
-bool EventDevice::getFFEnabled() {
- if(ffSupported==1) {
- //LOG_TRACE("FF is supported for %s\n", getName());
- return true;
- }
- //LOG_TRACE("FF is not supported for %s\n", getName());
- return false;
-}
-
-void EventDevice::rumble(float force) {
- if(force>1) force=1;
- if(force<-1) force=-1;
- //LOG_TRACE("Rumbling at %d%%, (shh, pretend)\n", (int)(force*100));
-
- if(effect_playing==true) {
- stop.type=EV_FF;
- stop.code = effect.id;
- stop.value=0;
- LOG_TRACE("Stopping effect %d\n", stop.code);
- if (write(fd, (const void*) &stop, sizeof(stop)) == -1) {
- perror("Failed to stop effect");
- } else {
- effect_playing=false;
- }
- }
-
- if(force>0.666666) {
- effect.u.rumble.strong_magnitude = (int)(0x8000*force);
- effect.u.rumble.weak_magnitude = (int)(0xc000*force);
- } else if(force>0.3333333) {
- effect.u.rumble.strong_magnitude = (int)(0x8000*force);
- effect.u.rumble.weak_magnitude = (int)(0xc000*0);
- } else {
- effect.u.rumble.strong_magnitude = (int)(0x8000*0);
- effect.u.rumble.weak_magnitude = (int)(0xc000*force);
- }
-
- LOG_TRACE("Uploading effect %d\n", effect.id);
- if (ioctl(fd, EVIOCSFF, &effect) == -1) {
- perror("Upload effect");
- }
- LOG_TRACE("Uploaded effect %d\n", effect.id);
-
- if(effect_playing==false && force!=0) {
- play.type = EV_FF;
- play.code=effect.id;
- play.value=1;
-
- LOG_TRACE("Playing effect %d\n", play.code);
- if (write(fd, (const void*) &play, sizeof(play)) == -1) {
- perror("Failed to play effect");
- } else {
- effect_playing=true;
- }
- }
-}
-
-void EventDevice::cleanup() {
- char message[512];
- sprintf(message, "Closing device %s\n", name);
- LOG_TRACE(message);
- close(fd);
-}
diff --git a/plugins/linux/src/native/EventDevice.h b/plugins/linux/src/native/EventDevice.h
deleted file mode 100644
index 1a79493..0000000
--- a/plugins/linux/src/native/EventDevice.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * Copyright (C) 2003 Jeremy Booth ([email protected])
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * The name of the author may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-
-#if !defined(eventInterface_eventDevice_h)
-#define eventInterface_eventDevice_h
-
-#include <stdint.h>
-#include <linux/input.h>
-#include "eventInterfaceTypes.h"
-#include "Device.h"
-
-class EventDevice : public Device {
-
- private:
- int fd;
- int inited;
- char *name;
- int numButtons;
- uint16_t bustype;
- uint16_t vendor;
- uint16_t product;
- uint16_t version;
- short *supportedRelAxes;
- short *supportedAbsAxes;
- short *supportedButtons;
- int *relAxesData;
- int *absAxesData;
- uint8_t *buttonData;
- int ffSupported;
- int numRelAxes;
- int numAbsAxes;
- uint8_t evtype_bitmask[EV_MAX/8 + 1];
- uint8_t key_bitmask[KEY_MAX/8 + 1];
- uint8_t rel_bitmask[REL_MAX/8 + 1];
- uint8_t abs_bitmask[ABS_MAX/8 + 1];
- uint8_t ff_bitmask[16];
- struct input_absinfo *abs_features;
- int absAxisLookup[ABS_MAX];
- int relAxisLookup[REL_MAX];
- int buttonLookup[KEY_MAX];
- struct ff_effect effect;
- struct input_event play, stop;
- bool effect_playing;
-
- public:
- EventDevice(char *deviceFilename);
- int getNumberRelAxes();
- int getNumberAbsAxes();
- int getNumberButtons();
- const char *getName();
- int getBusType();
- int getVendorID();
- int getProductID();
- int getVersion();
- void getSupportedRelAxes(int supportedAxis[]);
- void getSupportedAbsAxes(int supportedAxis[]);
- void getSupportedButtons(int supportedButtons[]);
- int poll();
- void getPolledData(int relAxesData[], int absAxesData[], int buttonData[]);
- int getAbsAxisMinimum(int axisNumber);
- int getAbsAxisMaximum(int axisNumber);
- int getAbsAxisFuzz(int axisNumber);
- int isValidDevice();
- bool getFFEnabled();
- void rumble(float force);
- void cleanup();
-};
-
-#endif //eventInterface_eventDevice_h
diff --git a/plugins/linux/src/native/JoystickDevice.cpp b/plugins/linux/src/native/JoystickDevice.cpp
deleted file mode 100644
index 20be098..0000000
--- a/plugins/linux/src/native/JoystickDevice.cpp
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * Copyright (C) 2003 Jeremy Booth ([email protected])
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * The name of the author may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-
-#include "eventInterfaceTypes.h"
-#include "JoystickDevice.h"
-#include <stdio.h>
-#include <linux/input.h>
-#include <linux/joystick.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <string.h>
-#include <malloc.h>
-#include <errno.h>
-
-#include "logger.h"
-
-JoystickDevice::JoystickDevice(char *deviceFileName) {
- char tempName[Device::MAX_NAME_LENGTH-1] = "Unknown";
- int i;
-
- LOG_TRACE("Trying to open %s\n", deviceFileName);
- fd = open(deviceFileName, O_RDONLY | O_NONBLOCK);
- /*if(fd<0) {
- char errorMessage[512];
- sprintf(errorMessage, "Error opening device %s\n", deviceFileName);
- perror(errorMessage);
- }*/
-
- if(fd>0){
- LOG_TRACE("Opened %s, trying to get device name\n", deviceFileName);
- if(ioctl(fd, JSIOCGNAME(sizeof(tempName)), tempName) < 0) {
- LOG_TRACE("Failed to get device name for %s\n", deviceFileName);
- char errorMessage[512];
- sprintf(errorMessage, "Error reading device %s\n", deviceFileName);
- perror(errorMessage);
- }
-
- int namelength=strlen(tempName);
- name = (char *)malloc(namelength+1);
- strncpy(name,tempName, namelength+1);
-
- char tempNumButtons;
- char tempNumAxes;
- LOG_TRACE("Getting button and axes information for %s\n", deviceFileName);
- ioctl (fd, JSIOCGBUTTONS, &tempNumButtons);
- ioctl (fd, JSIOCGAXES, &tempNumAxes);
-
- numButtons = tempNumButtons;
- numAbsAxes = tempNumAxes;
-
- //fprintf(stderr, "Got joystick %s with %d buttons and %d axes\n", tempName, numButtons, numAbsAxes);
-
- //buttonData = (uint8_t *)malloc(numButtons * sizeof(uint8_t));
- buttonData = new uint8_t[numButtons];
- //absAxesData = (int *)malloc(numAbsAxes * sizeof(int));
- absAxesData = new int[numAbsAxes];
-
- LOG_TRACE("Initialisation of %s completed\n", deviceFileName);
- inited = 1;
- } else {
- LOG_TRACE("Failed to open device %s\n", deviceFileName);
- inited = 0;
- }
-}
-
-int JoystickDevice::isValidDevice() {
- return inited;
-}
-
-int JoystickDevice::getNumberRelAxes(){
- if(inited!=1) return -1;
- return 0;
-}
-
-int JoystickDevice::getNumberAbsAxes(){
- if(inited!=1) return -1;
- return numAbsAxes;
-}
-
-int JoystickDevice::getNumberButtons(){
- if(inited!=1) return -1;
- return numButtons;
-}
-
-const char *JoystickDevice::getName(){
- return name;
-}
-
-int JoystickDevice::getBusType(){
- if(inited!=1) return -1;
- return 0;
-}
-
-int JoystickDevice::getVendorID(){
- if(inited!=1) return -1;
- return 0;
-}
-
-int JoystickDevice::getProductID(){
- if(inited!=1) return -1;
- return 0;
-}
-
-int JoystickDevice::getVersion(){
- if(inited!=1) return -1;
- return 0;
-}
-
-void JoystickDevice::getSupportedRelAxes(int supportedAxis[]){
-}
-
-void JoystickDevice::getSupportedAbsAxes(int supportedAxis[]){
-}
-
-void JoystickDevice::getSupportedButtons(int supportedButtons[]){
-}
-
-/**
- * A return value of -1 means error, 0 means ok, but no change
- * a return of >0 means the data for this device has changed
- */
-int JoystickDevice::poll(){
- struct js_event event;
- int numEvents = 0;
- while(read(fd, &event, sizeof event) > 0) {
- numEvents++;
- event.type &= ~JS_EVENT_INIT;
- if(event.type == JS_EVENT_BUTTON) {
- buttonData[event.number] = event.value;
- } else if(event.type == JS_EVENT_AXIS) {
- absAxesData[event.number] = event.value;
- }
-
- }
- // EAGAIN is returned when the queue is empty
- if(errno != EAGAIN) {
- printf("Something went wrong getting an event\n");
- }
-
- return numEvents;
-}
-
-void JoystickDevice::getPolledData(int relAxesData[], int absAxesData[], int buttonData[]){
- int i;
-
- if(inited!=1) return;
- for(i=0;i<numAbsAxes;i++) {
- (absAxesData)[i] = this->absAxesData[i];
- }
- for(i=0;i<numButtons;i++) {
- (buttonData)[i] = this->buttonData[i];
- }
-}
-
-int JoystickDevice::getAbsAxisMinimum(int axisNumber) {
- return -32767;
-}
-
-int JoystickDevice::getAbsAxisMaximum(int axisNumber) {
- return 32767;
-}
-
-int JoystickDevice::getAbsAxisFuzz(int axisNumber) {
- return 0;
-}
-
-bool JoystickDevice::getFFEnabled() {
- return false;
-}
-
-void JoystickDevice::rumble(float force) {
- return;
-}
-
-void JoystickDevice::cleanup() {
- close(fd);
-}
diff --git a/plugins/linux/src/native/MixedDevice.cpp b/plugins/linux/src/native/MixedDevice.cpp
deleted file mode 100644
index aff795e..0000000
--- a/plugins/linux/src/native/MixedDevice.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * Copyright (C) 2003 Jeremy Booth ([email protected])
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * The name of the author may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-
-#include "eventInterfaceTypes.h"
-#include "JoystickDevice.h"
-#include "MixedDevice.h"
-#include <stdio.h>
-#include <linux/input.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <string.h>
-#include <malloc.h>
-#include <errno.h>
-
-MixedDevice::MixedDevice(JoystickDevice *jsDevice, EventDevice *evDevice) {
-
- joystickDevice = jsDevice;
- eventDevice = evDevice;
-}
-
-int MixedDevice::getNumberRelAxes(){
- eventDevice->getNumberRelAxes();
-}
-
-int MixedDevice::getNumberAbsAxes(){
- return eventDevice->getNumberAbsAxes();
-}
-
-int MixedDevice::getNumberButtons(){
- return eventDevice->getNumberButtons();
-}
-
-const char *MixedDevice::getName(){
- return eventDevice->getName();
-}
-
-int MixedDevice::getBusType(){
- return eventDevice->getBusType();
-}
-
-int MixedDevice::getVendorID(){
- return eventDevice->getVendorID();
-}
-
-int MixedDevice::getProductID(){
- return eventDevice->getProductID();
-}
-
-int MixedDevice::getVersion(){
- return eventDevice->getVersion();
-}
-
-void MixedDevice::getSupportedRelAxes(int supportedAxis[]){
- return eventDevice->getSupportedRelAxes(supportedAxis);
-}
-
-void MixedDevice::getSupportedAbsAxes(int supportedAxis[]){
- return eventDevice->getSupportedAbsAxes(supportedAxis);
-}
-
-void MixedDevice::getSupportedButtons(int supportedButtons[]){
- return eventDevice->getSupportedButtons(supportedButtons);
-}
-
-/**
- * A return value of -1 means error, 0 means ok, but no change
- * a return of >0 means the data for this device has changed
- */
-int MixedDevice::poll(){
- eventDevice->poll();
- return joystickDevice->poll();
-}
-
-void MixedDevice::getPolledData(int relAxesData[], int absAxesData[], int buttonData[]){
- int i;
-
- joystickDevice->getPolledData(new int[joystickDevice->getNumberRelAxes()], absAxesData, new int[joystickDevice->getNumberButtons()]);
- eventDevice->getPolledData(relAxesData, new int[eventDevice->getNumberAbsAxes()], buttonData);
-
-}
-
-int MixedDevice::getAbsAxisMinimum(int axisNumber) {
- return joystickDevice->getAbsAxisMinimum(axisNumber);
-}
-
-int MixedDevice::getAbsAxisMaximum(int axisNumber) {
- return joystickDevice->getAbsAxisMaximum(axisNumber);
-}
-
-int MixedDevice::getAbsAxisFuzz(int axisNumber) {
- return joystickDevice->getAbsAxisFuzz(axisNumber);
-}
-
-bool MixedDevice::getFFEnabled() {
- return eventDevice->getFFEnabled();
-}
-
-void MixedDevice::rumble(float force) {
- eventDevice->rumble(force);
-}
-
-void MixedDevice::cleanup() {
- if(joystickDevice!=0 && eventDevice!=0) {
- joystickDevice->cleanup();
- eventDevice->cleanup();
- free(joystickDevice);
- free(eventDevice);
- joystickDevice=0;
- eventDevice=0;
- }
-}
diff --git a/plugins/linux/src/native/build.xml b/plugins/linux/src/native/build.xml
index f055249..c323163 100644
--- a/plugins/linux/src/native/build.xml
+++ b/plugins/linux/src/native/build.xml
@@ -6,50 +6,43 @@
<!-- The idea is that both Ant and NetBeans have to know what the package root is -->
<!-- for the classes in your application. -->
<project name="JInput Linux port, Native code" basedir="." default="compileNativeJinputLib">
-
- <!-- Don't worry if you don't know the Ant syntax completely or need help on some tasks! -->
- <!-- The standard Ant documentation is bundled. See Help | Help Sets | Ant 1.4.1 Manual. -->
-
+ <property name="libname" value="libjinput-linux.so"/>
+
<target name="init">
- <!-- You can set up any variables you want used throughout the script here. -->
- <!-- property name="hello" value="world"/-->
- <!-- To use e.g. Jikes, uncomment this line. -->
- <!-- (Or make the same change in Tools | Options | Ant Settings | Properties.) -->
- <!-- <property name="build.compiler" value="jikes"/> -->
- <!-- You might like to set up some overridable paths, etc.: -->
- <!-- <property name="mylib" value="../lib/mylib.jar"/> -->
- <mkdir dir="build"/>
- <mkdir dir="apidoc"/>
- </target>
-
- <target name="createNativeDefinitions.java" depends="init">
- <exec dir="." executable="./getDefinitions" os="Linux" output="../java/net/java/games/input/NativeDefinitions.java">
- <arg line="/usr/include/linux/input.h"/>
- </exec>
- </target>
+ </target>
- <target name="createJNIHeaders" depends="init">
- <javah>
- <classpath>
- <pathelement path="."/>
- <pathelement location="jinput.jar"/>
- </classpath>
- <class name="net.java.games.input.LinuxDevice"/>
- <class name="net.java.games.input.LinuxEnvironmentPlugin"/>
- <class name="net.java.games.input.LinuxKeyboard"/>
- </javah>
- </target>
-
- <target name="compileNativeEventLib" depends="init">
- <exec dir="." executable="g++" os="Linux">
- <arg line="--shared -DLOGTRACE -o libeventInterface.so eventInterface.cpp EventDevice.cpp"/>
- </exec>
- </target>
+ <target depends="init" name="createNativeDefinitions.java">
+ <exec dir="." executable="gawk" os="Linux" output="../java/net/java/games/input/NativeDefinitions.java">
+ <arg line="-f"/>
+ <arg line="getDefinitions"/>
+ <arg line="/usr/include/linux/input.h"/>
+ </exec>
+ </target>
+ <target name="clean">
+ <delete>
+ <fileset dir="." includes="*.o"/>
+ <fileset file="${libname}"/>
+ </delete>
+ </target>
+
<target name="compileNativeJinputLib" depends="init">
- <exec dir="." executable="g++" os="Linux">
- <arg line="-I${java.home}/include -I${java.home}/include/linux -I${java.home}/../include -I${java.home}/../include/linux --shared -DLOGTRACE -o libjinput-linux.so jinput.cpp eventInterface.cpp EventDevice.cpp joystickInterface.cpp JoystickDevice.cpp MixedDevice.cpp"/>
- </exec>
+ <apply dir="." executable="cc" os="Linux" dest="." skipemptyfilesets="true" failonerror="true">
+ <arg line="-O2 -Wall -c -fPIC"/>
+ <arg value="-I${java.home}/include"/>
+ <arg value="-I${java.home}/include/linux"/>
+ <arg value="-I../../../common/src/native"/>
+ <mapper type="glob" from="*.c" to="*.o"/>
+ <fileset dir="." includes="*.c"/>
+ <fileset dir="../../../common/src/native" includes="*.c"/>
+ </apply>
+ <apply dir="." parallel="true" executable="cc" os="Linux" failonerror="true">
+ <arg line="-shared -O2 -Wall -o ${libname}"/>
+ <fileset dir="." includes="*.o"/>
+ </apply>
+ <apply dir="." parallel="true" executable="strip" os="Linux" failonerror="true">
+ <fileset file="${libname}"/>
+ </apply>
</target>
</project>
diff --git a/plugins/linux/src/native/eventInterface.cpp b/plugins/linux/src/native/eventInterface.cpp
deleted file mode 100644
index 346965b..0000000
--- a/plugins/linux/src/native/eventInterface.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/**
- * Copyright (C) 2003 Jeremy Booth ([email protected])
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * The name of the author may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-
-#include <sys/dir.h>
-#include <stdio.h>
-#include <dirent.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <linux/input.h>
-#include <string.h>
-#include <malloc.h>
-#include <unistd.h>
-#include "Device.h"
-#include "EventDevice.h"
-
-#include "logger.h"
-
-int evNumDevices;
-int eventInterfaceVersion;
-Device **evDeviceList;
-int evInited = 0;
-
-int evFileFilter(const struct direct *entry) {
- if (strncmp(entry->d_name, "event", 5) == 0) {
- return 1;
- }
- return 0;
- }
-
-int evGetDeviceFiles(char ***filenames) {
- struct direct **files;
- int num_files, i;
- char dirName[] = {"/dev/input"};
-
- num_files = scandir(dirName, &files, &evFileFilter, alphasort);
-
- *filenames = (char **)malloc(num_files * sizeof(char *));
-
- for(i=0;i<num_files;i++) {
- char *filename = files[i]->d_name;
- char *fullFileName;
-
- fullFileName = (char *)malloc((strlen(dirName) + 1 + strlen(filename) + 1));
- sprintf(fullFileName, "%s/%s", dirName, filename);
- (*filenames)[i] = fullFileName;
- }
-
- return num_files;
-}
-
-int evInit() {
- int fd=-1;
- int i;
- char **deviceFileNames;
- int numDeviceFiles;
-
- numDeviceFiles = evGetDeviceFiles(&deviceFileNames);
- if(numDeviceFiles<0) {
- return -1;
- }
-
- if ((fd = open(deviceFileNames[0], O_RDONLY)) <0) {
- evNumDevices=0;
- evInited=1;
- return 0;
- }
-
- if (ioctl(fd, EVIOCGVERSION, &eventInterfaceVersion)) {
- close(fd);
- evNumDevices=0;
- evInited=1;
- return 0;
- }
-
- if(fd>=0) {close(fd);}
-
- Device *tempDeviceList[numDeviceFiles];
-
- evNumDevices = 0;
- for(i=0;i<numDeviceFiles;i++) {
- EventDevice *tempDevice = new EventDevice(deviceFileNames[i]);
- if(tempDevice->isValidDevice()==1) {
- tempDeviceList[i] = tempDevice;
- evNumDevices++;
- } else {
- tempDeviceList[i] = NULL;
- }
- }
-
- int highDeviceCountNumber = i;
- int evTempDeviceCount = 0;
- // Now we know for certain which devices are open, we can take notes
- evDeviceList = (Device **)malloc(evNumDevices * sizeof(Device *));
- for(i=0;i<evNumDevices;i++) {
- while(tempDeviceList[evTempDeviceCount] == NULL) {
- evTempDeviceCount++;
- }
- evDeviceList[i] = tempDeviceList[evTempDeviceCount];
- LOG_TRACE("Copied temp event device %d to event device %d\n", evTempDeviceCount, i);
- evTempDeviceCount++;
- }
-
- evInited=1;
-
- return 0;
-}
-
-int evGetEventInterfaceVersionNumber() {
- return eventInterfaceVersion;
-}
-
-int evGetNumberDevices() {
- if(evInited) {
- return evNumDevices;
- }
- return -1;
-}
-
-void evGetDevices(Device **theirDeviceList) {
- int i;
- for(i=0;i<evNumDevices;i++) {
- theirDeviceList[i] = evDeviceList[i];
- }
-}
diff --git a/plugins/linux/src/native/eventInterfaceTypes.h b/plugins/linux/src/native/eventInterfaceTypes.h
deleted file mode 100644
index c8ffd6e..0000000
--- a/plugins/linux/src/native/eventInterfaceTypes.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#if !defined(eventInterfaceTypes_h)
-#define eventInterfaceTypes_h
-
-#include <linux/input.h>
-#include <stdint.h>
-
-#define getBit(bit, bitField) (bitField[bit/8] & (1 << (bit%8)))
-
-struct input_devinfo {
- uint16_t bustype;
- uint16_t vendor;
- uint16_t product;
- uint16_t version;
-};
-
-
-/** removed for compatability with input.h --JPK
-struct input_absinfo {
- int value;
- int minimum;
- int maximum;
- int fuzz;
- int flat;
-};
-*/
-
-#endif //eventInterfaceTypes_h
diff --git a/plugins/linux/src/native/getDefinitions b/plugins/linux/src/native/getDefinitions
index 1a15fbe..e5d127d 100644
--- a/plugins/linux/src/native/getDefinitions
+++ b/plugins/linux/src/native/getDefinitions
@@ -29,7 +29,7 @@ NR == 1 {
printf("package net.java.games.input;\n\n")
printf("\n");
printf("/**\n * This file is generated from %s please do not edit\n */\n", FILENAME);
- printf("public class NativeDefinitions {\n")
+ printf("class NativeDefinitions {\n")
}
/#define ABS_/ {
printf(" public static final int %s = %s;\n", $2, $3)
@@ -46,6 +46,15 @@ NR == 1 {
/#define BUS_/ {
printf(" public static final int %s = %s;\n", $2, $3)
}
+/#define EV_/ {
+ printf(" public static final int %s = %s;\n", $2, $3)
+}
+/#define FF_/ {
+ printf(" public static final int %s = %s;\n", $2, $3)
+}
+/#define USAGE_/ {
+ printf(" public static final int %s = %s;\n", $2, $3)
+}
END {
printf("}\n");
}
diff --git a/plugins/linux/src/native/jinput.cpp b/plugins/linux/src/native/jinput.cpp
deleted file mode 100644
index 40f0d29..0000000
--- a/plugins/linux/src/native/jinput.cpp
+++ /dev/null
@@ -1,357 +0,0 @@
-/**
- * Copyright (C) 2003 Jeremy Booth ([email protected])
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * The name of the author may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <malloc.h>
-#include <string.h>
-
-#include "net_java_games_input_JInputLibrary.h"
-
-#include "Device.h"
-#include "EventDevice.h"
-#include "JoystickDevice.h"
-#include "MixedDevice.h"
-#include "eventInterface.h"
-#include "joystickInterface.h"
-#include "logger.h"
-
-Device **jinputDeviceList;
-int jinputNumDevices;
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: nativeInit
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_nativeInit
- (JNIEnv *, jclass) {
-
- LOG_TRACE("Initing event interface\n");
- if(evInit()!=0) {
- fprintf(stderr, "Could not find any working event devices\n");
-// return -1;
- }
- LOG_TRACE("Initing joystick interface\n");
- if(jsInit()!=0) {
- fprintf(stderr, "Could not find any working joystick devices\n");
-// return -1;
- }
-
- LOG_TRACE("Getting the number of event devices\n");
- int numEventDevices = evGetNumberDevices();
- EventDevice *eventDevices[numEventDevices];
-
- LOG_TRACE("Getting %d event devices\n", numEventDevices);
- evGetDevices((Device **)eventDevices);
-
- LOG_TRACE("Getting the number of joystick devices\n");
- int numJoysticks = jsGetNumberDevices();
- JoystickDevice *jsDevices[numJoysticks];
- LOG_TRACE("Getting %d joystick devices\n", numJoysticks);
- jsGetDevices((Device **)jsDevices);
-
-
- int i;
- int j;
- int joystickPtr = 0;
- jinputDeviceList = (Device **)malloc((numEventDevices + numJoysticks) * sizeof(Device *));
- for(i=0;i<numEventDevices;i++) {
- EventDevice *eventDevice = eventDevices[i];
- int deviceCountCache = jinputNumDevices;
-
- for(j=joystickPtr;j<numJoysticks;j++) {
- JoystickDevice *jsDevice = jsDevices[j];
- LOG_TRACE("Getting device information for event device %d and joystick %d\n", i, j);
- if((jsDevice->getNumberButtons() == eventDevice->getNumberButtons()) && (jsDevice->getNumberAbsAxes() == (eventDevice->getNumberAbsAxes() + eventDevice->getNumberRelAxes()))) {
- const char *jsName = jsDevice->getName();
- const char *eventDeviceName = eventDevice->getName();
-
- if(strcmp(jsName, eventDeviceName) == 0) {
- // The current event device is the curre joystick device too
- LOG_TRACE("Creating a mixed device with id %d, combining event device %d and joystick device %d\n", jinputNumDevices, i, j);
- jinputDeviceList[jinputNumDevices] = new MixedDevice(jsDevice, eventDevice);
- jsDevices[j] = NULL;
- j++;
- jinputNumDevices++;
- joystickPtr = j;
- j = numJoysticks;
- }
- }
- /*if(jinputNumDevices == deviceCountCache) {
- fprintf(stderr, "event device \"%s\" doesn't match js \"%s\"\n", eventDevice->getName(), jsDevice->getName());
- fprintf(stderr, "event device has %d rel axes, %d abs axis and %d buttons\n", eventDevice->getNumberRelAxes(), eventDevice->getNumberAbsAxes(), eventDevice->getNumberButtons());
- fprintf(stderr, "js device has %d axes and %d buttons\n", jsDevice->getNumberAbsAxes(), jsDevice->getNumberButtons());
- } else {
- fprintf(stderr, "event device %s did match js %s\n", eventDevice->getName(), jsDevice->getName());
- }*/
-
- }
-
- if(jinputNumDevices == deviceCountCache) {
- jinputDeviceList[jinputNumDevices] = eventDevice;
- jinputNumDevices++;
- }
- }
-
- for(i=0;i<numJoysticks;i++) {
- if(jsDevices[i]!=NULL) {
- LOG_TRACE("Copying joystick device %d to jinput device list %d\n", i, jinputNumDevices);
- jinputDeviceList[jinputNumDevices] = jsDevices[i];
- jinputNumDevices++;
- }
- }
-
- return(0);
-
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getDeviceName
- * Signature: (I)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_net_java_games_input_JInputLibrary_getDeviceName
- (JNIEnv *env, jclass, jint deviceID) {
-
- LOG_TRACE("Gettign device name for jinput device %d.\n", deviceID);
- LOG_TRACE("jinput device %d is %d\n", deviceID, jinputDeviceList[deviceID]);
- LOG_TRACE("Gettign device name for jinput device %d, (%s)\n", deviceID, jinputDeviceList[deviceID]->getName());
- return env->NewStringUTF(jinputDeviceList[deviceID]->getName());
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getNumAbsAxes
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getNumAbsAxes
- (JNIEnv *env, jclass, jint deviceID) {
-
- LOG_TRACE("Gettign number of absolute axes for jinput device %d (%d)\n", deviceID, jinputDeviceList[deviceID]->getNumberAbsAxes());
- return jinputDeviceList[deviceID]->getNumberAbsAxes();
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getNumRelAxes
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getNumRelAxes
- (JNIEnv *env, jclass, jint deviceID) {
-
- LOG_TRACE("Gettign number of relative axes for jinput device %d (%d)\n", deviceID, jinputDeviceList[deviceID]->getNumberRelAxes());
- return jinputDeviceList[deviceID]->getNumberRelAxes();
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getNumButtons
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getNumButtons
- (JNIEnv *, jclass, jint deviceID) {
-
- LOG_TRACE("Gettign number of buttons for jinput device %d (%d)\n", deviceID, jinputDeviceList[deviceID]->getNumberButtons());
- return jinputDeviceList[deviceID]->getNumberButtons();
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getNumberOfDevices
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getNumberOfDevices
- (JNIEnv *, jclass) {
-
- return jinputNumDevices;
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getSupportedAbsAxes
- * Signature: (I[I)V
- */
-JNIEXPORT void JNICALL Java_net_java_games_input_JInputLibrary_getSupportedAbsAxes
- (JNIEnv *env, jclass, jint deviceID, jintArray axesData) {
-
- jint *axisReturns = env->GetIntArrayElements(axesData, 0);
-
- LOG_TRACE("Getting suported absolute axes for jinput device %d\n", deviceID);
- jinputDeviceList[deviceID]->getSupportedAbsAxes(axisReturns);
-
- env->ReleaseIntArrayElements(axesData, axisReturns, 0);
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getSupportedRelAxes
- * Signature: (I[I)V
- */
-JNIEXPORT void JNICALL Java_net_java_games_input_JInputLibrary_getSupportedRelAxes
- (JNIEnv *env, jclass, jint deviceID, jintArray axesData) {
-
- jint *axisReturns = env->GetIntArrayElements(axesData, 0);
-
- LOG_TRACE("Getting suported relative axes for jinput device %d\n", deviceID);
- jinputDeviceList[deviceID]->getSupportedRelAxes(axisReturns);
-
- env->ReleaseIntArrayElements(axesData, axisReturns, 0);
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getSupportedButtons
- * Signature: (I[I)V
- */
-JNIEXPORT void JNICALL Java_net_java_games_input_JInputLibrary_getSupportedButtons
- (JNIEnv *env, jclass, jint deviceID, jintArray buttonData) {
-
- jint *buttonDataElements = env->GetIntArrayElements(buttonData, 0);
-
- LOG_TRACE("Getting supported buttons for jinput device %d\n", deviceID);
- jinputDeviceList[deviceID]->getSupportedButtons(buttonDataElements);
-
- env->ReleaseIntArrayElements(buttonData, buttonDataElements, 0);
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: poll
- * Signature: (I[I[I[I)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_poll
- (JNIEnv *env, jclass, jint deviceID, jintArray buttons, jintArray relAxes, jintArray absAxes) {
-
- jint *buttonElements = env->GetIntArrayElements(buttons, 0);
- jint *relAxesElements = env->GetIntArrayElements(relAxes, 0);
- jint *absAxesElements = env->GetIntArrayElements(absAxes, 0);
-
- LOG_POLL_TRACE("Polling jinput device %d\n", deviceID);
- int retval = jinputDeviceList[deviceID]->poll();
- LOG_POLL_TRACE("Getting polled data for device %d\n", deviceID);
- jinputDeviceList[deviceID]->getPolledData(relAxesElements, absAxesElements, buttonElements);
-
- env->ReleaseIntArrayElements(buttons, buttonElements, 0);
- env->ReleaseIntArrayElements(relAxes, relAxesElements, 0);
- env->ReleaseIntArrayElements(absAxes, absAxesElements, 0);
-
- return retval;
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getAbsAxisFuzz
- * Signature: (II)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getAbsAxisFuzz
- (JNIEnv *, jclass, jint deviceID, jint axisID) {
-
- LOG_TRACE("Getting fuzz data for axis %d on device %d\n", axisID, deviceID);
- return jinputDeviceList[deviceID]->getAbsAxisFuzz(axisID);
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getAbsAxisMaximum
- * Signature: (II)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getAbsAxisMaximum
- (JNIEnv *, jclass, jint deviceID, jint axisID) {
-
- LOG_TRACE("Getting absolute axes maximum value data for axis %d on device %d\n", axisID, deviceID);
- return jinputDeviceList[deviceID]->getAbsAxisMaximum(axisID);
-}
-
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getAbsAxisMinimum
- * Signature: (II)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getAbsAxisMinimum
- (JNIEnv *, jclass, jint deviceID, jint axisID) {
-
- LOG_TRACE("Getting absolute axes minimum value data for axis %d on device %d\n", axisID, deviceID);
- return jinputDeviceList[deviceID]->getAbsAxisMinimum(axisID);
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getNativePortType
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getNativePortType
- (JNIEnv *, jclass, jint deviceID) {
-
- LOG_TRACE("Getting bus type for device %d\n", deviceID);
- return jinputDeviceList[deviceID]->getBusType();
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getFFEnabled
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL Java_net_java_games_input_JInputLibrary_getFFEnabled
- (JNIEnv *, jclass, jint deviceID) {
-
- LOG_TRACE("Getting FFEnabled status for device %d\n", deviceID);
- if(jinputDeviceList[deviceID]->getFFEnabled()) {
- //LOG_TRACE("jinput lib thinks device %d is ff enabled\n", deviceID);
- return JNI_TRUE;
- }
- //LOG_TRACE("jinput lib thinks device %d is ff disabled\n", deviceID);
- return JNI_FALSE;
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: nativeRumble
- * Signature: (IF)V
- */
-JNIEXPORT void JNICALL Java_net_java_games_input_JInputLibrary_nativeRumble
- (JNIEnv *, jclass, jint deviceID, jfloat force) {
- if(jinputDeviceList[deviceID]!=0) {
- LOG_TRACE("Setting rumble on device %d to %d\n", deviceID, force);
- jinputDeviceList[deviceID]->rumble(force);
- }
-}
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: nativeCleanup
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL Java_net_java_games_input_JInputLibrary_nativeCleanup
- (JNIEnv *, jclass, jint deviceID) {
- if(jinputDeviceList[deviceID]!=0) {
- LOG_TRACE("Cleaning up device %d\n", deviceID);
- jinputDeviceList[deviceID]->cleanup();
- free(jinputDeviceList[deviceID]);
- jinputDeviceList[deviceID]=0;
- }
-}
diff --git a/plugins/linux/src/native/joystickInterface.cpp b/plugins/linux/src/native/joystickInterface.cpp
deleted file mode 100644
index da96a61..0000000
--- a/plugins/linux/src/native/joystickInterface.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/**
- * Copyright (C) 2003 Jeremy Booth ([email protected])
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions and
- * the following disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * The name of the author may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
- */
-
-#include <sys/dir.h>
-#include <stdio.h>
-#include <dirent.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <linux/joystick.h>
-#include <string.h>
-#include <malloc.h>
-#include <unistd.h>
-#include "Device.h"
-#include "JoystickDevice.h"
-
-int jsNumDevices;
-int joystickInterfaceVersion;
-Device **jsDeviceList;
-int jsInited = 0;
-
-int jsFileFilter(const struct direct *entry) {
- if (strncmp(entry->d_name, "js", 2) == 0) {
- return 1;
- }
- return 0;
- }
-
-int jsGetDeviceFiles(char ***filenames) {
- struct direct **files;
- int num_files, i;
- char dirName[12];
-
- sprintf(dirName, "/dev/input");
-
- num_files = scandir(dirName, &files, &jsFileFilter, alphasort);
-
- if(num_files==0) {
- sprintf(dirName, "/dev");
- num_files = scandir(dirName, &files, &jsFileFilter, alphasort);
- }
-
- *filenames = (char **)malloc(num_files * sizeof(char *));
-
- for(i=0;i<num_files;i++) {
- char *filename = files[i]->d_name;
- char *fullFileName;
-
- fullFileName = (char *)malloc((strlen(dirName) + 1 + strlen(filename) + 1));
- sprintf(fullFileName, "%s/%s", dirName, filename);
- (*filenames)[i] = fullFileName;
- }
-
- return num_files;
-}
-
-int jsInit() {
- int fd=-1;
- int i;
- char **deviceFileNames;
- int numDeviceFiles;
-
- numDeviceFiles = jsGetDeviceFiles(&deviceFileNames);
- if(numDeviceFiles<0) {
- return -1;
- }
-
- if(numDeviceFiles==0) {
- jsNumDevices = 0;
- jsInited=1;
- return 0;
- }
-
- if ((fd = open(deviceFileNames[0], O_RDONLY)) <0) {
- jsNumDevices = 0;
- jsInited=1;
- return 0;
- }
-
- if (ioctl(fd, JSIOCGVERSION, &joystickInterfaceVersion)) {
- close(fd);
- jsNumDevices = 0;
- jsInited=1;
- return 0;
- }
-
- if(fd>=0) {close(fd);}
-
- Device *tempDeviceList[numDeviceFiles];
-
- jsNumDevices = 0;
- for(i=0;i<numDeviceFiles;i++) {
- JoystickDevice *tempDevice = new JoystickDevice(deviceFileNames[i]);
- // The device has a copy of the name, free the memory
- free(deviceFileNames[i]);
- if(tempDevice->isValidDevice()==1) {
- tempDeviceList[i] = tempDevice;
- jsNumDevices++;
- }
- }
-
- int jsTempDeviceCount = 0;
- // Now we know for certain which devices are open, we can take notes
- jsDeviceList = (Device **)malloc(jsNumDevices * sizeof(Device *));
- for(i=0;i<jsNumDevices;i++) {
- while(tempDeviceList[jsTempDeviceCount] == NULL) {
- jsTempDeviceCount++;
- }
- jsDeviceList[i] = tempDeviceList[jsTempDeviceCount];
- //printf("Copied joystick %d to %d\n", jsTempDeviceCount, i);
- jsTempDeviceCount++;
- }
-
- // Free the file names array, which should now be free anyway.
- free(deviceFileNames);
-
- jsInited=1;
-
- return 0;
-}
-
-int jsGetJoystickInterfaceVersionNumber() {
- return joystickInterfaceVersion;
-}
-
-int jsGetNumberDevices() {
- if(jsInited) {
- return jsNumDevices;
- }
- return -1;
-}
-
-void jsGetDevices(Device **theirDeviceList) {
- int i;
- for(i=0;i<jsNumDevices;i++) {
- theirDeviceList[i] = jsDeviceList[i];
- }
-}
diff --git a/plugins/linux/src/native/logger.h b/plugins/linux/src/native/logger.h
deleted file mode 100644
index d832491..0000000
--- a/plugins/linux/src/native/logger.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifdef LOGTRACE
-#define LOG_TRACE(args...) printf(args)
-#else
-#define LOG_TRACE(args...)
-#endif
-
-#ifdef LOGPOLLTRACE
-#define LOG_POLL_TRACE(args...) LOG_TRACE(args...)
-#else
-#define LOG_POLL_TRACE(args...)
-#endif
diff --git a/plugins/linux/src/native/net_java_games_input_JInputLibrary.h b/plugins/linux/src/native/net_java_games_input_JInputLibrary.h
deleted file mode 100644
index b0428e8..0000000
--- a/plugins/linux/src/native/net_java_games_input_JInputLibrary.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class net_java_games_input_JInputLibrary */
-
-#ifndef _Included_net_java_games_input_JInputLibrary
-#define _Included_net_java_games_input_JInputLibrary
-#ifdef __cplusplus
-extern "C" {
-#endif
-/* Inaccessible static: inited */
-/* Inaccessible static: workerThreadMonitor */
-/* Inaccessible static: shutdown */
-/* Inaccessible static: shutdownThreadMonitor */
-/* Inaccessible static: cleanupDone */
-/* Inaccessible static: rumbler */
-/* Inaccessible static: force */
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getDeviceName
- * Signature: (I)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_net_java_games_input_JInputLibrary_getDeviceName
- (JNIEnv *, jclass, jint);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getNumAbsAxes
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getNumAbsAxes
- (JNIEnv *, jclass, jint);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getNumRelAxes
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getNumRelAxes
- (JNIEnv *, jclass, jint);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getNumButtons
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getNumButtons
- (JNIEnv *, jclass, jint);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: nativeInit
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_nativeInit
- (JNIEnv *, jclass);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getNumberOfDevices
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getNumberOfDevices
- (JNIEnv *, jclass);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getSupportedAbsAxes
- * Signature: (I[I)V
- */
-JNIEXPORT void JNICALL Java_net_java_games_input_JInputLibrary_getSupportedAbsAxes
- (JNIEnv *, jclass, jint, jintArray);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getSupportedRelAxes
- * Signature: (I[I)V
- */
-JNIEXPORT void JNICALL Java_net_java_games_input_JInputLibrary_getSupportedRelAxes
- (JNIEnv *, jclass, jint, jintArray);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getSupportedButtons
- * Signature: (I[I)V
- */
-JNIEXPORT void JNICALL Java_net_java_games_input_JInputLibrary_getSupportedButtons
- (JNIEnv *, jclass, jint, jintArray);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: poll
- * Signature: (I[I[I[I)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_poll
- (JNIEnv *, jclass, jint, jintArray, jintArray, jintArray);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getAbsAxisFuzz
- * Signature: (II)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getAbsAxisFuzz
- (JNIEnv *, jclass, jint, jint);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getAbsAxisMaximum
- * Signature: (II)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getAbsAxisMaximum
- (JNIEnv *, jclass, jint, jint);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getAbsAxisMinimum
- * Signature: (II)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getAbsAxisMinimum
- (JNIEnv *, jclass, jint, jint);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getNativePortType
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_net_java_games_input_JInputLibrary_getNativePortType
- (JNIEnv *, jclass, jint);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: getFFEnabled
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL Java_net_java_games_input_JInputLibrary_getFFEnabled
- (JNIEnv *, jclass, jint);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: nativeRumble
- * Signature: (IF)V
- */
-JNIEXPORT void JNICALL Java_net_java_games_input_JInputLibrary_nativeRumble
- (JNIEnv *, jclass, jint, jfloat);
-
-/*
- * Class: net_java_games_input_JInputLibrary
- * Method: nativeCleanup
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL Java_net_java_games_input_JInputLibrary_nativeCleanup
- (JNIEnv *, jclass, jint);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/plugins/linux/src/native/net_java_games_input_LinuxEventDevice.c b/plugins/linux/src/native/net_java_games_input_LinuxEventDevice.c
new file mode 100644
index 0000000..90eff09
--- /dev/null
+++ b/plugins/linux/src/native/net_java_games_input_LinuxEventDevice.c
@@ -0,0 +1,257 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <linux/input.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "util.h"
+#include "net_java_games_input_LinuxEventDevice.h"
+
+JNIEXPORT jlong JNICALL Java_net_java_games_input_LinuxEventDevice_nOpen(JNIEnv *env, jclass unused, jstring path, jboolean rw_flag) {
+ const char *path_str = (*env)->GetStringUTFChars(env, path, NULL);
+ if (path_str == NULL)
+ return -1;
+ int flags = rw_flag == JNI_TRUE ? O_RDWR : O_RDONLY;
+ flags = flags | O_NONBLOCK;
+ int fd = open(path_str, flags);
+ if (fd == -1)
+ throwIOException(env, "Failed to open device %s (%d)\n", path_str, errno);
+ (*env)->ReleaseStringUTFChars(env, path, path_str);
+ return fd;
+}
+
+JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nClose(JNIEnv *env, jclass unused, jlong fd_address) {
+ int fd = (int)fd_address;
+ int result = close(fd);
+ if (result == -1)
+ throwIOException(env, "Failed to close device (%d)\n", errno);
+}
+
+JNIEXPORT jstring JNICALL Java_net_java_games_input_LinuxEventDevice_nGetName(JNIEnv *env, jclass unused, jlong fd_address) {
+#define BUFFER_SIZE 1024
+ int fd = (int)fd_address;
+ char device_name[BUFFER_SIZE];
+
+ if (ioctl(fd, EVIOCGNAME(BUFFER_SIZE), device_name) == -1) {
+ throwIOException(env, "Failed to get device name (%d)\n", errno);
+ return NULL;
+ }
+ jstring jstr = (*env)->NewStringUTF(env, device_name);
+ return jstr;
+}
+
+JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nGetKeyStates(JNIEnv *env, jclass unused, jlong fd_address, jbyteArray bits_array) {
+ int fd = (int)fd_address;
+ jsize len = (*env)->GetArrayLength(env, bits_array);
+ jbyte *bits = (*env)->GetByteArrayElements(env, bits_array, NULL);
+ if (bits == NULL)
+ return;
+ int res = ioctl(fd, EVIOCGKEY(len), bits);
+ (*env)->ReleaseByteArrayElements(env, bits_array, bits, 0);
+ if (res == -1)
+ throwIOException(env, "Failed to get device key states (%d)\n", errno);
+}
+
+JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxEventDevice_nGetVersion(JNIEnv *env, jclass unused, jlong fd_address) {
+ int fd = (int)fd_address;
+ int version;
+ if (ioctl(fd, EVIOCGVERSION, &version) == -1) {
+ throwIOException(env, "Failed to get device version (%d)\n", errno);
+ return -1;
+ }
+ return version;
+}
+
+JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxEventDevice_nGetNumEffects(JNIEnv *env, jclass unused, jlong fd_address) {
+ int fd = (int)fd_address;
+ int num_effects;
+ if (ioctl(fd, EVIOCGEFFECTS, &num_effects) == -1) {
+ throwIOException(env, "Failed to get number of device effects (%d)\n", errno);
+ return -1;
+ }
+ return num_effects;
+}
+
+JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nGetDeviceUsageBits(JNIEnv *env, jclass unused, jlong fd_address, jbyteArray usages_array) {
+#if EV_VERSION >= 0x010001
+ int fd = (int)fd_address;
+ jsize len = (*env)->GetArrayLength(env, usages_array);
+ jbyte *usages = (*env)->GetByteArrayElements(env, usages_array, NULL);
+ if (usages == NULL)
+ return;
+ int res = ioctl(fd, EVIOCGUSAGE(len), usages);
+ (*env)->ReleaseByteArrayElements(env, usages_array, usages, 0);
+ if (res == -1)
+ throwIOException(env, "Failed to get device usages (%d)\n", errno);
+#endif
+}
+
+JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nGetBits(JNIEnv *env, jclass unused, jlong fd_address, jint evtype, jbyteArray bits_array) {
+ int fd = (int)fd_address;
+ jsize len = (*env)->GetArrayLength(env, bits_array);
+ jbyte *bits = (*env)->GetByteArrayElements(env, bits_array, NULL);
+ if (bits == NULL)
+ return;
+ int res = ioctl(fd, EVIOCGBIT(evtype, len), bits);
+ (*env)->ReleaseByteArrayElements(env, bits_array, bits, 0);
+ if (res == -1)
+ throwIOException(env, "Failed to get device bits (%d)\n", errno);
+}
+
+JNIEXPORT jobject JNICALL Java_net_java_games_input_LinuxEventDevice_nGetInputID(JNIEnv *env, jclass unused, jlong fd_address) {
+ int fd = (int)fd_address;
+ jclass input_id_class = (*env)->FindClass(env, "net/java/games/input/LinuxInputID");
+ if (input_id_class == NULL)
+ return NULL;
+ jmethodID input_id_constructor = (*env)->GetMethodID(env, input_id_class, "<init>", "(IIII)V");
+ if (input_id_constructor == NULL)
+ return NULL;
+ struct input_id id;
+ int result = ioctl(fd, EVIOCGID, &id);
+ if (result == -1) {
+ throwIOException(env, "Failed to get input id for device (%d)\n", errno);
+ return NULL;
+ }
+ return (*env)->NewObject(env, input_id_class, input_id_constructor, (jint)id.bustype, (jint)id.vendor, (jint)id.product, (jint)id.version);
+}
+
+JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nGetAbsInfo(JNIEnv *env, jclass unused, jlong fd_address, jint abs_axis, jobject abs_info_return) {
+ int fd = (int)fd_address;
+ jclass abs_info_class = (*env)->GetObjectClass(env, abs_info_return);
+ if (abs_info_class == NULL)
+ return;
+ jmethodID abs_info_set = (*env)->GetMethodID(env, abs_info_class, "set", "(IIIII)V");
+ if (abs_info_set == NULL)
+ return;
+ struct input_absinfo abs_info;
+ int result = ioctl(fd, EVIOCGABS(abs_axis), &abs_info);
+ if (result == -1) {
+ throwIOException(env, "Failed to get abs info for axis (%d)\n", errno);
+ return;
+ }
+ (*env)->CallVoidMethod(env, abs_info_return, abs_info_set, (jint)abs_info.value, (jint)abs_info.minimum, (jint)abs_info.maximum, (jint)abs_info.fuzz, (jint)abs_info.flat);
+}
+
+JNIEXPORT jboolean JNICALL Java_net_java_games_input_LinuxEventDevice_nGetNextEvent(JNIEnv *env, jclass unused, jlong fd_address, jobject linux_event_return) {
+ int fd = (int)fd_address;
+ jclass linux_event_class = (*env)->GetObjectClass(env, linux_event_return);
+ if (linux_event_class == NULL)
+ return JNI_FALSE;
+ jmethodID linux_event_set = (*env)->GetMethodID(env, linux_event_class, "set", "(JJIII)V");
+ if (linux_event_set == NULL)
+ return JNI_FALSE;
+ struct input_event event;
+ if (read(fd, &event, sizeof(struct input_event)) == -1) {
+ if (errno == EAGAIN)
+ return JNI_FALSE;
+ throwIOException(env, "Failed to read next device event (%d)\n", errno);
+ return JNI_FALSE;
+ }
+ (*env)->CallVoidMethod(env, linux_event_return, linux_event_set, (jlong)event.time.tv_sec, (jlong)event.time.tv_usec, (jint)event.type, (jint)event.code, (jint)event.value);
+ return JNI_TRUE;
+}
+
+JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxEventDevice_nUploadRumbleEffect(JNIEnv *env, jclass unused, jlong fd_address, jint id, jint direction, jint trigger_button, jint trigger_interval, jint replay_length, jint replay_delay, jint strong_magnitude, jint weak_magnitude) {
+ int fd = (int)fd_address;
+ struct ff_effect effect;
+
+ effect.type = FF_RUMBLE;
+ effect.id = id;
+ effect.trigger.button = trigger_button;
+ effect.trigger.interval = trigger_interval;
+ effect.replay.length = replay_length;
+ effect.replay.delay = replay_delay;
+ effect.direction = direction;
+ effect.u.rumble.strong_magnitude = strong_magnitude;
+ effect.u.rumble.weak_magnitude = weak_magnitude;
+
+ if (ioctl(fd, EVIOCSFF, &effect) == -1) {
+ throwIOException(env, "Failed to upload effect (%d)\n", errno);
+ return -1;
+ }
+ return effect.id;
+}
+
+JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxEventDevice_nUploadConstantEffect(JNIEnv *env, jclass unused, jlong fd_address, jint id, jint direction, jint trigger_button, jint trigger_interval, jint replay_length, jint replay_delay, jint constant_level, jint constant_env_attack_length, jint constant_env_attack_level, jint constant_env_fade_length, jint constant_env_fade_level) {
+ int fd = (int)fd_address;
+ struct ff_effect effect;
+
+ effect.type = FF_CONSTANT;
+ effect.id = id;
+ effect.trigger.button = trigger_button;
+ effect.trigger.interval = trigger_interval;
+ effect.replay.length = replay_length;
+ effect.replay.delay = replay_delay;
+ effect.direction = direction;
+ effect.u.constant.level = constant_level;
+ effect.u.constant.envelope.attack_length = constant_env_attack_length;
+ effect.u.constant.envelope.attack_level = constant_env_attack_level;
+ effect.u.constant.envelope.fade_length = constant_env_fade_length;
+ effect.u.constant.envelope.fade_level = constant_env_fade_level;
+
+ if (ioctl(fd, EVIOCSFF, &effect) == -1) {
+ throwIOException(env, "Failed to upload effect (%d)\n", errno);
+ return -1;
+ }
+ return effect.id;
+}
+
+JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nWriteEvent(JNIEnv *env, jclass unused, jlong fd_address, jint type, jint code, jint value) {
+ int fd = (int)fd_address;
+ struct input_event event;
+ event.type = type;
+ event.code = code;
+ event.value = value;
+
+ if (write(fd, &event, sizeof(event)) == -1) {
+ throwIOException(env, "Failed to write to device (%d)\n", errno);
+ }
+}
+
+JNIEXPORT void JNICALL Java_net_java_games_input_LinuxEventDevice_nEraseEffect(JNIEnv *env, jclass unused, jlong fd_address, jint ff_id) {
+ int fd = (int)fd_address;
+ int ff_id_int = ff_id;
+
+ if (ioctl(fd, EVIOCRMFF, &ff_id_int) == -1)
+ throwIOException(env, "Failed to erase effect (%d)\n", errno);
+}
diff --git a/plugins/linux/src/native/net_java_games_input_LinuxJoystickDevice.c b/plugins/linux/src/native/net_java_games_input_LinuxJoystickDevice.c
new file mode 100644
index 0000000..f82023b
--- /dev/null
+++ b/plugins/linux/src/native/net_java_games_input_LinuxJoystickDevice.c
@@ -0,0 +1,128 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <linux/joystick.h>
+#include "util.h"
+#include "net_java_games_input_LinuxJoystickDevice.h"
+
+JNIEXPORT jlong JNICALL Java_net_java_games_input_LinuxJoystickDevice_nOpen(JNIEnv *env, jclass unused, jstring path) {
+ const char *path_str = (*env)->GetStringUTFChars(env, path, NULL);
+ if (path_str == NULL)
+ return -1;
+ int fd = open(path_str, O_RDONLY | O_NONBLOCK);
+ if (fd == -1)
+ throwIOException(env, "Failed to open device %s (%d)\n", path_str, errno);
+ (*env)->ReleaseStringUTFChars(env, path, path_str);
+ return fd;
+}
+
+JNIEXPORT void JNICALL Java_net_java_games_input_LinuxJoystickDevice_nClose(JNIEnv *env, jclass unused, jlong fd_address) {
+ int fd = (int)fd_address;
+ int result = close(fd);
+ if (result == -1)
+ throwIOException(env, "Failed to close device (%d)\n", errno);
+}
+
+JNIEXPORT jstring JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetName(JNIEnv *env, jclass unused, jlong fd_address) {
+#define BUFFER_SIZE 1024
+ int fd = (int)fd_address;
+ char device_name[BUFFER_SIZE];
+
+ if (ioctl(fd, JSIOCGNAME(BUFFER_SIZE), device_name) == -1) {
+ throwIOException(env, "Failed to get device name (%d)\n", errno);
+ return NULL;
+ }
+ jstring jstr = (*env)->NewStringUTF(env, device_name);
+ return jstr;
+}
+
+JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetVersion(JNIEnv *env, jclass unused, jlong fd_address) {
+ int fd = (int)fd_address;
+ __u32 version;
+ if (ioctl(fd, JSIOCGVERSION, &version) == -1) {
+ throwIOException(env, "Failed to get device version (%d)\n", errno);
+ return -1;
+ }
+ return version;
+}
+
+JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetNumButtons(JNIEnv *env, jclass unused, jlong fd_address) {
+ int fd = (int)fd_address;
+ __u8 num_buttons;
+ if (ioctl(fd, JSIOCGBUTTONS, &num_buttons) == -1) {
+ throwIOException(env, "Failed to get number of buttons (%d)\n", errno);
+ return -1;
+ }
+ return num_buttons;
+}
+
+JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetNumAxes(JNIEnv *env, jclass unused, jlong fd_address) {
+ int fd = (int)fd_address;
+ __u8 num_axes;
+ if (ioctl(fd, JSIOCGAXES, &num_axes) == -1) {
+ throwIOException(env, "Failed to get number of buttons (%d)\n", errno);
+ return -1;
+ }
+ return num_axes;
+}
+
+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);
+ if (event_class == NULL)
+ return JNI_FALSE;
+ jmethodID event_set = (*env)->GetMethodID(env, event_class, "set", "(JIII)V");
+ if (event_set == NULL)
+ return JNI_FALSE;
+ struct js_event event;
+ if (read(fd, &event, sizeof(event)) == -1) {
+ if (errno == EAGAIN)
+ return JNI_FALSE;
+ throwIOException(env, "Failed to read next device event (%d)\n", errno);
+ return JNI_FALSE;
+ }
+ (*env)->CallVoidMethod(env, event_return, event_set, (jlong)event.time, (jint)event.value, (jint)event.type, (jint)event.number);
+ return JNI_TRUE;
+}