mirror of
https://github.com/shadowfacts/jinput-arm64.git
synced 2026-04-06 06:53:59 +00:00
Make version 2 the main jinput version
This commit is contained in:
parent
4c91a4eb44
commit
559c008a02
149 changed files with 13218 additions and 10800 deletions
|
|
@ -1,103 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<!-- Written to assume that classpath is rooted in the current directory. -->
|
||||
<!-- So this should be OK if you make this script in the root of a filesystem. -->
|
||||
<!-- If not, you may prefer to adjust the basedir, or move some directories around. -->
|
||||
<!-- The idea is that both Ant and NetBeans have to know what the package root is -->
|
||||
<!-- for the classes in your application. -->
|
||||
<project name="Direct Input Plugin" basedir="." default="all">
|
||||
|
||||
<!-- 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. -->
|
||||
|
||||
<target name="init">
|
||||
<!-- You can set up any variables you want used throughout the script here. -->
|
||||
<property name="hello" value="world"/>
|
||||
<mkdir dir="classes"/>
|
||||
<mkdir dir="bin"/>
|
||||
<!-- 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"/> -->
|
||||
</target>
|
||||
|
||||
<target name="compile" depends="init">
|
||||
<!-- Both srcdir and destdir should be package roots. -->
|
||||
<!-- They could be different of course; in that case NetBeans can also be set -->
|
||||
<!-- up to compile to a different filesystem in the same way; see Compiler Types: -->
|
||||
<javac srcdir="src/java" destdir="classes" debug="true" deprecation="true" source="1.4" target="1.4">
|
||||
<!-- To add something to the classpath: -->
|
||||
<classpath>
|
||||
<pathelement location="lib/jinput.jar"/>
|
||||
<pathelement location="lib/jutils.jar"/>
|
||||
</classpath>
|
||||
<!-- To exclude some files: -->
|
||||
<!--
|
||||
<exclude name="com/foo/SomeFile.java"/>
|
||||
<exclude name="com/foo/somepackage/"/>
|
||||
-->
|
||||
</javac>
|
||||
<exec dir="." executable="g++" os="Windows 2000, Windows XP, Windows 98">
|
||||
<arg line=" -D_STRICT_ANSI -D_JNI_IMPLEMENTATION_"/>
|
||||
<arg line=" -I'${java.home}/../include' -I'${java.home}/../include/win32' -Ic:/dx9/include"/>
|
||||
<arg line=" -o bin/jinput-dxplugin.dll src/native/input.cpp -Wl,--export-all-symbols"/>
|
||||
<arg line=" -shared -Wl,--kill-at -ldxguid -ldinput -ldinput8"/>
|
||||
</exec>
|
||||
<copy file="bin/jinput-dxplugin.dll" todir="../../coreAPI/src/tests/controller" />
|
||||
</target>
|
||||
|
||||
<target name="jar" depends="init,compile">
|
||||
<!-- To make a standalone app: -->
|
||||
<!-- 1. Create a myapp.mf manifest somewhere. -->
|
||||
<!-- 2. Put in it: -->
|
||||
<!-- Manifest-Version: 1.0 -->
|
||||
<!-- Main-Class: com.foo.Main -->
|
||||
<!-- 3. Pass to <jar>: manifest="myapp.mf" -->
|
||||
<jar jarfile="bin/dxinput.jar" compress="true" basedir="classes">
|
||||
<exclude name="**/*.java"/>
|
||||
<exclude name="**/*.form"/>
|
||||
<exclude name="dxinput.mf"/>
|
||||
<exclude name="dxinput.jar"/>
|
||||
<exclude name="apidoc"/>
|
||||
</jar>
|
||||
<copy file="bin/dxinput.jar" todir="../../coreAPI/src/tests/controller" />
|
||||
</target>
|
||||
|
||||
<target name="all" depends="compile,jar" description="Build everything.">
|
||||
<echo message="Application built. Hello ${hello}!"/>
|
||||
</target>
|
||||
|
||||
<target name="test" depends="init,all" description="Try running it.">
|
||||
<echo message="Test by running test on the build.xml for input"/>
|
||||
</target>
|
||||
|
||||
<target name="javadoc" depends="init" description="Javadoc for my API.">
|
||||
<mkdir dir="apidocs"/>
|
||||
<javadoc packagenames="net.*"
|
||||
destdir="apidocs"
|
||||
additionalparam="-source 1.4">
|
||||
<sourcepath>
|
||||
<pathelement location="src/java"/>
|
||||
</sourcepath>
|
||||
<classpath>
|
||||
<pathelement location="lib/jinput.jar"/>
|
||||
<pathelement location="lib/jutils.jar"/>
|
||||
</classpath>
|
||||
</javadoc>
|
||||
</target>
|
||||
|
||||
<target name="clean" depends="init" description="Clean all build products.">
|
||||
<delete>
|
||||
<fileset dir="classes">
|
||||
<include name="**/*.class"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
<delete file="bin/dxinput.jar" failonerror="no"/>
|
||||
<delete file="bin/jinput-dxplugin.dll" failonerror="no"/>
|
||||
<delete file="../../coreAPI/src/tests/controller/dxinput.jar" failonerror="no" />
|
||||
<delete file="../../coreAPI/src/tests/controller/jinput-dxplugin.dll" failonerror="no"/>
|
||||
<delete dir="../../docs/input/win32/apidoc" failonerror="no"/>
|
||||
</target>
|
||||
|
||||
</project>
|
||||
|
|
@ -1,239 +0,0 @@
|
|||
/*
|
||||
* %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 net.java.games.input.AbstractComponent;
|
||||
import net.java.games.input.Component;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author martak
|
||||
* @version
|
||||
*/
|
||||
class DirectInputAxis extends AbstractComponent {
|
||||
|
||||
/**
|
||||
* DIDFT_ constants and macros defined in dinput.h
|
||||
*/
|
||||
private static final int DIDFT_ALL = 0x00000000;
|
||||
private static final int DIDFT_RELAXIS = 0x00000001;
|
||||
private static final int DIDFT_ABSAXIS = 0x00000002;
|
||||
private static final int DIDFT_AXIS = 0x00000003;
|
||||
private static final int DIDFT_PSHBUTTON = 0x00000004;
|
||||
private static final int DIDFT_TGLBUTTON = 0x00000008;
|
||||
private static final int DIDFT_BUTTON = 0x0000000C;
|
||||
private static final int DIDFT_POV = 0x00000010;
|
||||
private static final int DIDFT_COLLECTION = 0x00000040;
|
||||
private static final int DIDFT_NODATA = 0x00000080;
|
||||
private static final int DIDFT_ANYINSTANCE = 0x00FFFF00;
|
||||
private static final int DIDFT_INSTANCEMASK = DIDFT_ANYINSTANCE;
|
||||
private static final int DIDFT_FFACTUATOR = 0x01000000;
|
||||
private static final int DIDFT_FFEFFECTTRIGGER = 0x02000000;
|
||||
private static final int DIDFT_OUTPUT = 0x10000000;
|
||||
private static final int DIDFT_NOCOLLECTION = 0x00FFFF00;
|
||||
private static int DIDFT_MAKEINSTANCE(int n) {
|
||||
return ((n&0xffff) << 8);
|
||||
}
|
||||
private static int DIDFT_GETTYPE(int n) {
|
||||
return (n&0xFF);
|
||||
}
|
||||
private static int DIDFT_GETINSTANCE(int n) {
|
||||
return ((n >> 8)&0xffff);
|
||||
}
|
||||
private static int DIDFT_ENUMCOLLECTION(int n) {
|
||||
return ((n&0xFFFF) << 8);
|
||||
}
|
||||
|
||||
private DirectInputDevice device;
|
||||
/**
|
||||
* DIJOYSTATE structure defined in dinput.h:
|
||||
*
|
||||
* <pre>
|
||||
* typedef struct DIJOYSTATE {
|
||||
* LONG lX;
|
||||
* LONG lY;
|
||||
* LONG lZ;
|
||||
* LONG lRx;
|
||||
* LONG lRy;
|
||||
* LONG lRz;
|
||||
* LONG rglSlider[2];
|
||||
* DWORD rgdwPOV[4];
|
||||
* BYTE rgbButtons[32];
|
||||
* } DIJOYSTATE, *LPDIJOYSTATE;
|
||||
*
|
||||
* 80 bytes total
|
||||
* </pre>
|
||||
*/
|
||||
private int offset;
|
||||
private int type;
|
||||
private int instance;
|
||||
private int bitmask = 0xffffffff;
|
||||
private int bitshift = 0;
|
||||
|
||||
private DirectInputAxis(DirectInputDevice device, Component.Identifier id,
|
||||
int didft, String name) {
|
||||
super(name, id);
|
||||
this.device = device;
|
||||
this.type = DIDFT_GETTYPE(didft);
|
||||
this.instance = DIDFT_GETINSTANCE(didft);
|
||||
if (id == Component.Identifier.Axis.X) {
|
||||
offset = 0;
|
||||
} else if (id == Component.Identifier.Axis.Y) {
|
||||
offset = 1;
|
||||
} else if (id == Component.Identifier.Axis.Z) {
|
||||
offset = 2;
|
||||
} else if (id == Component.Identifier.Axis.RX) {
|
||||
offset = 3;
|
||||
} else if (id == Component.Identifier.Axis.RY) {
|
||||
offset = 4;
|
||||
} else if (id == Component.Identifier.Axis.RZ) {
|
||||
offset = 5;
|
||||
} else if (id == Component.Identifier.Axis.SLIDER) {
|
||||
//System.out.println("Slider on "+name+" instance = "+instance);
|
||||
offset = 6 + (instance>>2);
|
||||
} else if (id == Component.Identifier.Axis.POV) {
|
||||
//System.out.println("POV on "+name+" instance = "+instance);
|
||||
offset = 8 + instance;
|
||||
} else if (id instanceof Component.Identifier.Button) {
|
||||
//System.out.println("Button on "+name+" instance = "+instance);
|
||||
offset = 12 + (instance/4);
|
||||
bitshift = (instance%4)*8;
|
||||
bitmask=0xff;
|
||||
|
||||
//Nasty cludge to get some similarities across platforms.
|
||||
if(name.contains("A Button")) {
|
||||
this.id = Component.Identifier.Button.A;
|
||||
} else if(name.contains("B Button")) {
|
||||
this.id = Component.Identifier.Button.B;
|
||||
} else if(name.contains("C Button")) {
|
||||
this.id = Component.Identifier.Button.C;
|
||||
} else if(name.contains("X Button")) {
|
||||
this.id = Component.Identifier.Button.X;
|
||||
} else if(name.contains("Y Button")) {
|
||||
this.id = Component.Identifier.Button.Y;
|
||||
} else if(name.contains("Z Button")) {
|
||||
this.id = Component.Identifier.Button.Z;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 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 A float between -1.0 and 1.0
|
||||
*/
|
||||
public float getPollData() {
|
||||
int data = 0;
|
||||
try {
|
||||
data = ((device.data[offset] >> bitshift)&bitmask);
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
System.out.println("Tried to get data for axis: " + this.getName() + ", device.data[" + offset + "] does not exists as device.data is only " + device.data.length + " long.");
|
||||
}
|
||||
if ((type&DIDFT_BUTTON) != 0 ) {
|
||||
return (float)((data&0x80)>>7);
|
||||
} else if ((type&DIDFT_AXIS)!=0){ // all axes are set for -32768 to 32738
|
||||
return ((float)data)/32768;
|
||||
} else if ((type&DIDFT_POV)!=0) {
|
||||
if (data == -1) {
|
||||
return Component.POV.OFF;
|
||||
} else if (data == 0.0) {
|
||||
return Component.POV.UP;
|
||||
} else if (data == 4500) {
|
||||
return Component.POV.UP_RIGHT;
|
||||
} else if (data == 9000) {
|
||||
return Component.POV.RIGHT;
|
||||
} else if (data == 13500) {
|
||||
return Component.POV.DOWN_RIGHT;
|
||||
} else if (data == 18000) {
|
||||
return Component.POV.DOWN;
|
||||
} else if (data == 22500) {
|
||||
return Component.POV.DOWN_LEFT;
|
||||
} else if (data == 27000) {
|
||||
return Component.POV.LEFT;
|
||||
} else if (data == 31500) {
|
||||
return Component.POV.UP_LEFT;
|
||||
} else {
|
||||
System.err.print("Unexpected value for DX8 HAT: "+data);
|
||||
return Component.POV.OFF;
|
||||
}
|
||||
} else { // return raw value
|
||||
return (float)data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** 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 true if data has chnaged since last poll, else false
|
||||
*/
|
||||
public boolean isRelative() {
|
||||
return (type & DIDFT_RELAXIS) != 0;
|
||||
}
|
||||
|
||||
/** Returns whether or not the axis is analog, or false if it is digital.
|
||||
* @return true if analog, false if digital
|
||||
*/
|
||||
public boolean isAnalog() {
|
||||
return (type & DIDFT_AXIS) != 0;
|
||||
}
|
||||
|
||||
/** Returns whether or not data polled from this axis is normalized
|
||||
* between the values of -1.0f and 1.0f.
|
||||
* @return true if data is normalized, false if not.
|
||||
*/
|
||||
public boolean isNormalized() {
|
||||
return (type & (DIDFT_BUTTON|DIDFT_AXIS|DIDFT_POV)) != 0;
|
||||
}
|
||||
|
||||
/** Creates a new DirectInputAxis (factory method).
|
||||
* This is a function used internally during set up
|
||||
* @return The new DirectInputAxis object.
|
||||
* @param device The device to attach this axis to.
|
||||
*
|
||||
* @param didft The identifier for the axis as provided by DX8.
|
||||
* @param name A name to give the new axis.
|
||||
* @param id The identifier for the device
|
||||
*/
|
||||
public static DirectInputAxis createAxis(DirectInputDevice device,
|
||||
Component.Identifier id, int didft, String name) {
|
||||
return new DirectInputAxis(device, id, didft, name);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,226 +0,0 @@
|
|||
/*
|
||||
* %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 net.java.games.input.AbstractController;
|
||||
import net.java.games.input.Component;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author martak
|
||||
* @version
|
||||
*/
|
||||
class DirectInputDevice extends AbstractController {
|
||||
|
||||
/**
|
||||
* DIDEVTYPE_ constants from dinput.h header file
|
||||
** JPK NOTE: This changed in DI8. In general this
|
||||
* is fragile anda way shoudl be found to tie these mroe directly
|
||||
* to the header files.
|
||||
*/
|
||||
/* Mike's <=DX7 types
|
||||
private static final int DIDEVTYPEJOYSTICK_UNKNOWN = 1;
|
||||
private static final int DIDEVTYPEJOYSTICK_TRADITIONAL = 2;
|
||||
private static final int DIDEVTYPEJOYSTICK_FLIGHTSTICK = 3;
|
||||
private static final int DIDEVTYPEJOYSTICK_GAMEPAD = 4;
|
||||
private static final int DIDEVTYPEJOYSTICK_RUDDER = 5;
|
||||
private static final int DIDEVTYPEJOYSTICK_WHEEL = 6;
|
||||
private static final int DIDEVTYPEJOYSTICK_HEADTRACKER = 7;
|
||||
*/
|
||||
|
||||
/**
|
||||
* Pointer to the IDirectInputDevice for this device
|
||||
*/
|
||||
private long lpDevice;
|
||||
|
||||
/**
|
||||
* Type of device
|
||||
*/
|
||||
private Type type;
|
||||
|
||||
/**
|
||||
* Do we need to poll data?
|
||||
*/
|
||||
private boolean polled = true;
|
||||
/**
|
||||
* Data when polling, as per the DIJOYSTATE structure in dinput.h;
|
||||
* @see DirectInputAxis for a breakdown of this structure
|
||||
*/
|
||||
int[] data = new int[38];
|
||||
|
||||
/** Array list of rumblers */
|
||||
private ArrayList rumblerList = new ArrayList();
|
||||
|
||||
/**
|
||||
* Private constructor
|
||||
* @param lpDevice A pointer to the IDirectInputDevice for the device.
|
||||
* @param subtype The subtype of device, as defined in the DIDEVTYPE
|
||||
* constants above
|
||||
* @param productName The product name for the device
|
||||
* @param instanceName The name of the device
|
||||
*/
|
||||
private DirectInputDevice(long lpDevice, int subtype, String productName,
|
||||
String instanceName,boolean polled) {
|
||||
super(productName + " " + instanceName);
|
||||
this.lpDevice = lpDevice;
|
||||
this.polled = polled;
|
||||
System.out.println("Creating "+productName+" polling = "+polled);
|
||||
switch(subtype) {
|
||||
/*
|
||||
case DIDEVTYPEJOYSTICK_GAMEPAD:
|
||||
type = Type.GAMEPAD; break;
|
||||
case DIDEVTYPEJOYSTICK_RUDDER:
|
||||
type = Type.RUDDER; break;
|
||||
case DIDEVTYPEJOYSTICK_WHEEL:
|
||||
type = Type.WHEEL; break;
|
||||
case DIDEVTYPEJOYSTICK_HEADTRACKER:
|
||||
type = Type.HEADTRACKER; break;
|
||||
case DIDEVTYPEJOYSTICK_TRADITIONAL: // fall through
|
||||
case DIDEVTYPEJOYSTICK_FLIGHTSTICK: // fall through
|
||||
*/
|
||||
default:
|
||||
type = Type.STICK; break;
|
||||
}
|
||||
components = initDirectInputAxes();
|
||||
}
|
||||
|
||||
/**
|
||||
* Used instead of overriding initAxes because it needs the
|
||||
* pointer to the IDirectInputDevice
|
||||
*/
|
||||
private Component[] initDirectInputAxes() {
|
||||
ArrayList list = new ArrayList();
|
||||
enumObjects(lpDevice, list);
|
||||
Component[] ret = new Component[list.size()];
|
||||
Iterator it = list.iterator();
|
||||
int i = 0;
|
||||
while (it.hasNext()) {
|
||||
ret[i] = (Component)it.next();
|
||||
i++;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback called by enumObjects to add a new axis into the list
|
||||
* @param list This in which to add the new axis
|
||||
* @param id The identifier for the axis, based on GUID
|
||||
* @param didft The combination of DIDFT_ flags that make up the type and
|
||||
* instance number of the axis.
|
||||
* @param name The name to call the axis.
|
||||
*/
|
||||
private void addAxis(ArrayList list, Component.Identifier id, int didft,
|
||||
String name) {
|
||||
list.add(DirectInputAxis.createAxis(this, id, didft, name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback called by enumDevice to add a rumbler
|
||||
*
|
||||
* @param effect the natie effect id
|
||||
* @param axisID The axis ID
|
||||
*/
|
||||
private void addRumbler(long effect, Component.Identifier axisID, String axisName) {
|
||||
rumblerList.add(new DirectInputRumbler(this, effect, axisID, axisName));
|
||||
}
|
||||
|
||||
/** Polls axes for data. Returns false if the controller is no longer valid.
|
||||
* Polling reflects the current state of the device when polled, and is
|
||||
* unbuffered.
|
||||
* @return False if the co troller is no longer valid, else true.
|
||||
*/
|
||||
public boolean poll() {
|
||||
return pollNative(lpDevice, data, polled);
|
||||
}
|
||||
|
||||
/** Returns the type of Controller.
|
||||
* @return The type of the controller.
|
||||
*/
|
||||
public Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/** Returns the zero-based port number for this Controller.
|
||||
* @return The port number.
|
||||
*/
|
||||
public int getPortNumber() {
|
||||
// REMIND : We may be able to parse this from the name string
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the rumbler array
|
||||
*/
|
||||
public Rumbler[] getRumblers() {
|
||||
return (Rumbler[]) rumblerList.toArray(new Rumbler[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Polls the device; native method. The data from the poll is stored in
|
||||
* the data array.
|
||||
*/
|
||||
private native boolean pollNative(long lpDevice, int[] data,
|
||||
boolean polled);
|
||||
|
||||
/**
|
||||
* Enumerates the axes on the device
|
||||
*/
|
||||
private native boolean enumObjects(long lpDevice, ArrayList list);
|
||||
|
||||
/** Creates a new DirectInputDevice (factory method)
|
||||
* This is a function used internally during set up
|
||||
* @param polled Whether this device's driver should actually be
|
||||
* polled during a call to Poll or whether it is an
|
||||
* interrupt driven device that should ignore poll
|
||||
* requests.
|
||||
* @param lpDevice A pointer to the IDirectInputDevice for the device.
|
||||
* @param subtype The subtype of device, as defined in the DIDEVTYPE
|
||||
* constants above
|
||||
* @param productName The product name for the device
|
||||
* @param instanceName The name of the device
|
||||
* @return The new DirectInputDevice object
|
||||
*/
|
||||
public static DirectInputDevice createDevice(long lpDevice, int subtype,
|
||||
String productName, String instanceName, boolean polled) {
|
||||
return new DirectInputDevice(lpDevice, subtype, productName,
|
||||
instanceName,polled);
|
||||
}
|
||||
} // class DirectInputDevice
|
||||
|
|
@ -1,201 +0,0 @@
|
|||
/*
|
||||
* %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.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import net.java.games.input.Controller;
|
||||
import net.java.games.input.ControllerEnvironment;
|
||||
//import sun.security.action.LoadLibraryAction;
|
||||
import net.java.games.util.plugins.Plugin;
|
||||
|
||||
/** DirectInput implementation of controller environment
|
||||
* @author martak
|
||||
* @version 1.0
|
||||
*/
|
||||
public class DirectInputEnvironmentPlugin extends ControllerEnvironment
|
||||
implements Plugin
|
||||
{
|
||||
|
||||
static {
|
||||
/** Mikes old code, causes it to be laoded by wrong loader
|
||||
java.security.AccessController.doPrivileged(
|
||||
new LoadLibraryAction("jinput"));
|
||||
*/
|
||||
if(isSupported()) {
|
||||
System.loadLibrary("jinput-dxplugin");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DIDEVTYPE_ constants from dinput.h header file
|
||||
* JPK NOTE: changed in DX8 so had to be changed. This is
|
||||
* fragile, we should find a way to set them from
|
||||
* the C side sowe can stay up to date with header
|
||||
*/
|
||||
/** DX7 and earlier
|
||||
private static final int DIDEVTYPE_DEVICE = 1;
|
||||
private static final int DIDEVTYPE_MOUSE = 2;
|
||||
private static final int DIDEVTYPE_KEYBOARD = 3;
|
||||
private static final int DIDEVTYPE_JOYSTICK = 4;
|
||||
private static final int DIDEVTYPE_HID = 0x00010000;
|
||||
private static int GET_DIDEVICE_TYPE(int dwDevType) {
|
||||
return (int)((byte)dwDevType);
|
||||
}
|
||||
private static int GET_DIDEVICE_SUBTYPE(int dwDevType) {
|
||||
return (int)((byte)((((short)dwDevType) >> 8) & 0xFF));
|
||||
}
|
||||
**/
|
||||
/* DX8 and 9 */
|
||||
private static final int DI8DEVTYPE_DEVICE = 0x11;
|
||||
private static final int DI8DEVTYPE_MOUSE = 0x12;
|
||||
private static final int DI8DEVTYPE_KEYBOARD = 0x13;
|
||||
private static final int DI8DEVTYPE_JOYSTICK = 0x14;
|
||||
private static final int DI8DEVTYPE_GAMEPAD = 0x15;
|
||||
private static final int DI8DEVTYPE_DRIVING = 0x16;
|
||||
private static final int DI8DEVTYPE_FLIGHT = 0x17;
|
||||
private static final int DI8DEVTYPE_1STPERSON = 0x18;
|
||||
private static final int DI8DEVTYPE_DEVICECTRL = 0x19;
|
||||
private static final int DI8DEVTYPE_SCREENPOINTER = 0x1A;
|
||||
private static final int DI8DEVTYPE_REMOTE = 0x1B;
|
||||
private static final int DI8DEVTYPE_SUPPLEMENTAL = 0x1C;
|
||||
|
||||
private static int GET_DIDEVICE_TYPE(int dwDevType) {
|
||||
return (dwDevType&0xFF);
|
||||
}
|
||||
private static int GET_DIDEVICE_SUBTYPE(int dwDevType) {
|
||||
return (int)((byte)((((short)dwDevType) >> 8) & 0xFF));
|
||||
}
|
||||
|
||||
// Pointer to DirectInput instance
|
||||
private long lpDirectInput;
|
||||
// Permanent array of controllers
|
||||
private Controller[] controllers;
|
||||
|
||||
/** Creates new DirectInputEnvironment */
|
||||
public DirectInputEnvironmentPlugin() {
|
||||
if(isSupported()) {
|
||||
lpDirectInput = directInputCreate();
|
||||
enumControllers();
|
||||
} else {
|
||||
controllers = new Controller[0];
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isSupported() {
|
||||
System.out.println("OS name is: " + System.getProperty("os.name"));
|
||||
if(System.getProperty("os.name").indexOf("Windows")!=-1) {
|
||||
System.out.println("DX8 plugin is supported");
|
||||
return true;
|
||||
}
|
||||
System.out.println("DX8 plugin is not supported");
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Returns a list of all controllers available to this environment,
|
||||
* or an empty array if there are no controllers in this environment.
|
||||
* @return An array of controllers that may be empty.
|
||||
*/
|
||||
public Controller[] getControllers() {
|
||||
return controllers;
|
||||
}
|
||||
|
||||
private void enumControllers() {
|
||||
// If direct input fails, create an empty array
|
||||
if (lpDirectInput == 0) {
|
||||
controllers = new Controller[] {};
|
||||
return;
|
||||
}
|
||||
// Create temporary controller array
|
||||
ArrayList tempDevices = new ArrayList();
|
||||
// Eumerate devices
|
||||
enumDevices(lpDirectInput, tempDevices);
|
||||
// Set up permanent controller array
|
||||
controllers = new Controller[tempDevices.size()];
|
||||
Iterator it = tempDevices.iterator();
|
||||
int i = 0;
|
||||
while (it.hasNext()) {
|
||||
controllers[i] = (Controller)it.next();
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new device, adding it to the list supplied.
|
||||
* @param lpDevice A pointer to the IDirectInputDevice for the device.
|
||||
* @param type The type of device to create, as defined by the constants
|
||||
* in dinput.h (see DI8DEVTYPE constants above).
|
||||
* @param productName The product name for the device
|
||||
* @param instanceName The name of the device
|
||||
*/
|
||||
private void addDevice(ArrayList list, long lpDevice,
|
||||
int type, String productName, String instanceName, boolean polled) {
|
||||
Controller c;
|
||||
int category = GET_DIDEVICE_TYPE(type);
|
||||
int subtype = GET_DIDEVICE_SUBTYPE(type);
|
||||
//System.out.println("Category = "+category);
|
||||
if (category == DI8DEVTYPE_MOUSE) {
|
||||
c = DirectInputMouse.createMouse(lpDevice, subtype, productName,
|
||||
instanceName);
|
||||
} else if (category == DI8DEVTYPE_KEYBOARD) {
|
||||
c = DirectInputKeyboard.createKeyboard(lpDevice, subtype,
|
||||
productName, instanceName);
|
||||
} else {
|
||||
// commented out the assert as we have already got devices that are
|
||||
// gamepad type, but wr are still going to create them as
|
||||
// DirectInputDevices
|
||||
//assert category == DI8DEVTYPE_JOYSTICK;
|
||||
c = DirectInputDevice.createDevice(lpDevice, subtype, productName,
|
||||
instanceName,polled);
|
||||
}
|
||||
if (c != null) {
|
||||
list.add(c);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the direct input instance, or 0 if failed to initialize
|
||||
*/
|
||||
private native long directInputCreate();
|
||||
|
||||
/**
|
||||
* Enumerates all devices, calling createDevice for each one
|
||||
*/
|
||||
private native boolean enumDevices(long lpDirectInput, ArrayList list);
|
||||
} // class DirectInputEnvironment
|
||||
|
|
@ -1,208 +0,0 @@
|
|||
/*
|
||||
* %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 net.java.games.input.AbstractComponent;
|
||||
import net.java.games.input.Component;
|
||||
import net.java.games.input.StandardKeyboard;
|
||||
|
||||
/**
|
||||
* DirectInput keyboard implementation.
|
||||
* @author martak
|
||||
* @version
|
||||
*/
|
||||
class DirectInputKeyboard extends StandardKeyboard {
|
||||
|
||||
/**
|
||||
* DIDEVTYPE_ constants from dinput.h header file
|
||||
*/
|
||||
private static final int DIDEVTYPEKEYBOARD_UNKNOWN = 0;
|
||||
private static final int DIDEVTYPEKEYBOARD_PCXT = 1;
|
||||
private static final int DIDEVTYPEKEYBOARD_OLIVETTI = 2;
|
||||
private static final int DIDEVTYPEKEYBOARD_PCAT = 3;
|
||||
private static final int DIDEVTYPEKEYBOARD_PCENH = 4;
|
||||
private static final int DIDEVTYPEKEYBOARD_NOKIA1050 = 5;
|
||||
private static final int DIDEVTYPEKEYBOARD_NOKIA9140 = 6;
|
||||
private static final int DIDEVTYPEKEYBOARD_NEC98 = 7;
|
||||
private static final int DIDEVTYPEKEYBOARD_NEC98LAPTOP = 8;
|
||||
private static final int DIDEVTYPEKEYBOARD_NEC98106 = 9;
|
||||
private static final int DIDEVTYPEKEYBOARD_JAPAN106 = 10;
|
||||
private static final int DIDEVTYPEKEYBOARD_JAPANAX = 11;
|
||||
private static final int DIDEVTYPEKEYBOARD_J3100 = 12;
|
||||
|
||||
/**
|
||||
* Key index crosstable; maps indices into the data array to virtual keys
|
||||
* in the key array in StandardKeyboard.
|
||||
* For example, the key F11 is at index 84 in the array of keys in
|
||||
* StandardKeyboard, yet it is data element 87 (0x57) in our data array.
|
||||
* <p>
|
||||
* To access the data element of a particular key (F11), we use the
|
||||
* crosstable as follows:
|
||||
* <p><code>
|
||||
* KeyID f11 = StandardKey.KeyID.F11;
|
||||
* int keyIndex = f11.getKeyIndex(); // returns 84
|
||||
* int crossIndex = CROSSTABLE[keyIndex]; // returns 0x57 (87)
|
||||
* </code>
|
||||
* To find a key given the data element index (87), we do a simple search
|
||||
* through the crosstable starting at that index (index 87/0x57 = 0x65) and
|
||||
* looking backwards until we find our key itself, or a lower number
|
||||
* (meaning the key was not found). We can only take advantage of this
|
||||
* algorithm only because on Windows, our crosstable is in increasing order.
|
||||
*/
|
||||
private final static int[] CROSSTABLE = {
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, // _9
|
||||
0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, // Y
|
||||
0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // D
|
||||
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, // BACKSLASH
|
||||
0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, // RSHIFT
|
||||
0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, // F7
|
||||
0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, // NUMPAD5
|
||||
0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x57, 0x58, 0x64, 0x65, // F14
|
||||
0x66, 0x70, 0x79, 0x7B, 0x7D, 0x8D, 0x90, 0x91, 0x92, 0x93, 0x94, // KANJI
|
||||
0x95, 0x96, 0x97, 0x9C, 0x9D, 0xB3, 0xB5, 0xB7, 0xB8, 0xC5, 0xC7, // HOME
|
||||
0xC8, 0xC9, 0xCB, 0xCD, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xDB, 0xDC, // RWIN
|
||||
0xDD, 0xDE, 0xDF // SLEEP
|
||||
};
|
||||
|
||||
/**
|
||||
* Pointer to the IDirectInputDevice for this device
|
||||
*/
|
||||
private long lpDevice;
|
||||
|
||||
/**
|
||||
* Subtype of keyboard, defined by DIDEVTYPE constants
|
||||
*/
|
||||
private int subtype;
|
||||
|
||||
/**
|
||||
* Polling key data
|
||||
*/
|
||||
private byte[] keyData = new byte[256];
|
||||
|
||||
/**
|
||||
* Private constructor
|
||||
* @param lpDevice A pointer to the IDirectInputDevice for the device.
|
||||
* @param subtype The subtype of keyboard, as defined in the DIDEVTYPE
|
||||
* constants above
|
||||
* @param productName The product name for the device
|
||||
* @param instanceName The name of the device
|
||||
*/
|
||||
private DirectInputKeyboard(long lpDevice, int subtype, String productName,
|
||||
String instanceName) {
|
||||
super(productName + " (" + instanceName + ")");
|
||||
this.lpDevice = lpDevice;
|
||||
this.subtype = subtype;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback to rename a given key by index, name
|
||||
* @param index the index in the data array
|
||||
* @param name the name of the key
|
||||
*/
|
||||
private void renameKey(int index, String name) {
|
||||
int keyIndex = index;
|
||||
if (keyIndex > CROSSTABLE.length) {
|
||||
keyIndex = CROSSTABLE.length - 1;
|
||||
}
|
||||
for (; CROSSTABLE[keyIndex] > index; keyIndex--)
|
||||
;
|
||||
if (CROSSTABLE[keyIndex] == index) {
|
||||
Component[] components = getComponents();
|
||||
AbstractComponent key = (AbstractComponent)components[index];
|
||||
if (name != null && name.length() > 0) {
|
||||
//System.out.println("Renaming key " + key.getName() +
|
||||
// " to " + name + " index=" +
|
||||
// index + " keyIndex=" + keyIndex + " CROSSTAB=" +
|
||||
// CROSSTABLE[keyIndex]);
|
||||
key.setName(name);
|
||||
}
|
||||
} else {
|
||||
//System.out.println("Key not found " + name + " index=" + index +
|
||||
// " keyIndex=" + keyIndex + " CROSSTAB=" +
|
||||
// CROSSTABLE[keyIndex]);
|
||||
}
|
||||
}
|
||||
|
||||
/** 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 KB is no longer valid, true otherwise.
|
||||
*/
|
||||
public boolean poll() {
|
||||
return pollNative(lpDevice, keyData);
|
||||
}
|
||||
|
||||
/** Returns whether or not the given key has been pressed since the last
|
||||
* call to poll.
|
||||
* @param key The key whose state to check.
|
||||
* @return true if this key has changed state since last read of its state, false otherwise.
|
||||
*/
|
||||
protected boolean isKeyPressed(Key key) {
|
||||
Component.Identifier.Key id = (Component.Identifier.Key)key.getIdentifier();
|
||||
int keyIndex = id.getKeyIndex();
|
||||
int crossIndex = CROSSTABLE[keyIndex];
|
||||
return ((keyData[crossIndex] & 0x80) != 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Polls the device; native method
|
||||
*/
|
||||
private native boolean pollNative(long lpDevice, byte[] keyData);
|
||||
|
||||
/**
|
||||
* Renames the keys with the name provided by DirectInput
|
||||
*/
|
||||
private native boolean renameKeys(long lpDevice);
|
||||
|
||||
/** Creates a new DirectInputKeyboard (factory method)
|
||||
* This is a function used internally during set up.
|
||||
* @param lpDevice A pointer to the IDirectInputDevice for the device.
|
||||
* @param subtype The subtype of keyboard, as defined in the DIDEVTYPE
|
||||
* constants above
|
||||
* @param productName The product name for the keyboard
|
||||
* @param instanceName The name of the keyboard
|
||||
* @return The new DirectInputKeyboard object.
|
||||
*/
|
||||
public static DirectInputKeyboard createKeyboard(long lpDevice,
|
||||
int subtype, String productName, String instanceName) {
|
||||
DirectInputKeyboard ret = new DirectInputKeyboard(lpDevice, subtype,
|
||||
productName, instanceName);
|
||||
ret.renameKeys(lpDevice);
|
||||
return ret;
|
||||
}
|
||||
} // class DirectInputKeyboard
|
||||
|
|
@ -1,352 +0,0 @@
|
|||
/*
|
||||
* %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 net.java.games.input.AbstractComponent;
|
||||
import net.java.games.input.Component;
|
||||
import net.java.games.input.Mouse;
|
||||
|
||||
/**
|
||||
* DirectInput mouse implementation.
|
||||
* @author martak
|
||||
* @version
|
||||
*/
|
||||
class DirectInputMouse extends Mouse {
|
||||
|
||||
/**
|
||||
* DIDEVTYPE_ constants from dinput.h header file
|
||||
*/
|
||||
private static final int DIDEVTYPEMOUSE_UNKNOWN = 1;
|
||||
private static final int DIDEVTYPEMOUSE_TRADITIONAL = 2;
|
||||
private static final int DIDEVTYPEMOUSE_FINGERSTICK = 3;
|
||||
private static final int DIDEVTYPEMOUSE_TOUCHPAD = 4;
|
||||
private static final int DIDEVTYPEMOUSE_TRACKBALL = 5;
|
||||
|
||||
/**
|
||||
* Pointer to the IDirectInputDevice for this device
|
||||
*/
|
||||
private long lpDevice;
|
||||
|
||||
/**
|
||||
* Type of mouse
|
||||
*/
|
||||
private Type type;
|
||||
|
||||
/**
|
||||
* Mouse data
|
||||
*/
|
||||
private byte[] mouseData = new byte[20];
|
||||
|
||||
/**
|
||||
* Private constructor
|
||||
* @param lpDevice A pointer to the IDirectInputDevice for the device.
|
||||
* @param subtype The subtype of mouse, as defined in the DIDEVTYPE
|
||||
* constants above
|
||||
* @param productName The product name for the device
|
||||
* @param instanceName The name of the device
|
||||
*/
|
||||
private DirectInputMouse(long lpDevice, int subtype, String productName,
|
||||
String instanceName) {
|
||||
super(productName + " " + instanceName);
|
||||
this.lpDevice = lpDevice;
|
||||
buttons = new ButtonsImpl();
|
||||
ball = new BallImpl();
|
||||
switch(subtype) {
|
||||
case DIDEVTYPEMOUSE_FINGERSTICK:
|
||||
type = Type.FINGERSTICK; break;
|
||||
case DIDEVTYPEMOUSE_TOUCHPAD:
|
||||
type = Type.TRACKPAD; break;
|
||||
case DIDEVTYPEMOUSE_TRACKBALL:
|
||||
type = Type.TRACKBALL; break;
|
||||
case DIDEVTYPEMOUSE_TRADITIONAL: // fall through
|
||||
case DIDEVTYPEMOUSE_UNKNOWN: // fall through
|
||||
default:
|
||||
type = Type.MOUSE; break;
|
||||
}
|
||||
renameAxes(lpDevice);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback to rename a given axis by type, name
|
||||
*/
|
||||
private void renameAxis(Component.Identifier id, String name) {
|
||||
AbstractComponent axis;
|
||||
if (id instanceof Component.Identifier.Button) {
|
||||
axis = (AbstractComponent)getButtons().getComponent(id);
|
||||
} else {
|
||||
axis = (AbstractComponent)getBall().getComponent(id);
|
||||
}
|
||||
axis.setName(name);
|
||||
//System.out.println("Renaming " + name);
|
||||
}
|
||||
|
||||
/** 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 mosue is no lonegr valid, true otherwise.
|
||||
*/
|
||||
public boolean poll() {
|
||||
return pollNative(lpDevice, mouseData);
|
||||
}
|
||||
|
||||
/** Returns the type of the Controller.
|
||||
* @return The device type of the controller (logically this
|
||||
* shoudl be some form of "mouse" .)
|
||||
*/
|
||||
public Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/** Creates a new DirectInputMouse (factory method)
|
||||
* This is a function used internally during set up.
|
||||
* @param lpDevice A pointer to the IDirectInputDevice for the device.
|
||||
* @param subtype The subtype of mouse, as defined in the DIDEVTYPE
|
||||
* constants above
|
||||
* @param productName The product name for the keyboard
|
||||
* @param instanceName The name of the keyboard
|
||||
* @return The new DirectInputMouse object.
|
||||
*/
|
||||
public static DirectInputMouse createMouse(long lpDevice, int subtype,
|
||||
String productName, String instanceName) {
|
||||
return new DirectInputMouse(lpDevice, subtype, productName,
|
||||
instanceName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation class representing the mouse ball
|
||||
*/
|
||||
class BallImpl extends Ball {
|
||||
|
||||
private int numAxes;
|
||||
|
||||
/**
|
||||
* Public constructor
|
||||
*/
|
||||
public BallImpl() {
|
||||
super(DirectInputMouse.this.getName() + " ball");
|
||||
numAxes = getNumAxes(lpDevice);
|
||||
x = new BallAxis(Component.Identifier.Axis.X);
|
||||
y = new BallAxis(Component.Identifier.Axis.Y);
|
||||
if(numAxes > 2) {
|
||||
wheel = new BallAxis(Component.Identifier.Axis.SLIDER);
|
||||
}
|
||||
}
|
||||
} // class DirectInputMouse.BallImpl
|
||||
|
||||
/**
|
||||
* Implementation class representing the mouse buttons
|
||||
*/
|
||||
class ButtonsImpl extends Buttons {
|
||||
|
||||
private int numButtons;
|
||||
|
||||
/**
|
||||
* Public constructor
|
||||
*/
|
||||
public ButtonsImpl() {
|
||||
super(DirectInputMouse.this.getName() + " buttons");
|
||||
numButtons = getNumButtons(lpDevice);
|
||||
left = new ButtonImpl(Component.Identifier.Button.LEFT);
|
||||
right = new ButtonImpl(Component.Identifier.Button.RIGHT);
|
||||
if(numButtons>2) {
|
||||
middle = new ButtonImpl(Component.Identifier.Button.MIDDLE);
|
||||
}
|
||||
if(numButtons>3) {
|
||||
side = new ButtonImpl(Component.Identifier.Button.SIDE);
|
||||
}
|
||||
if(numButtons>4) {
|
||||
extra = new ButtonImpl(Component.Identifier.Button.EXTRA);
|
||||
}
|
||||
if(numButtons>5) {
|
||||
forward = new ButtonImpl(Component.Identifier.Button.FORWARD);
|
||||
}
|
||||
if(numButtons>6) {
|
||||
back = new ButtonImpl(Component.Identifier.Button.BACK);
|
||||
}
|
||||
}
|
||||
} // class DirectInputMouse.ButtonsImpl
|
||||
|
||||
/**
|
||||
* Polls the device; native method
|
||||
*/
|
||||
private native boolean pollNative(long lpDevice, byte[] mouseData);
|
||||
|
||||
/**
|
||||
* Renames the axes with the name provided by DirectInput
|
||||
*/
|
||||
private native boolean renameAxes(long lpDevice);
|
||||
|
||||
// another Endolf special
|
||||
/**
|
||||
* Gets the number of buttons the mouse supports
|
||||
*/
|
||||
private native int getNumButtons(long lpDevice);
|
||||
/**
|
||||
* Gets the number of axes the mouse supports
|
||||
*/
|
||||
private native int getNumAxes(long lpDevice);
|
||||
|
||||
/**
|
||||
* Mouse button axis implementation
|
||||
*/
|
||||
class ButtonImpl extends Button {
|
||||
|
||||
/**
|
||||
* Index into the mouseData array
|
||||
*/
|
||||
private final int index;
|
||||
|
||||
/** Public constructor
|
||||
* @param id An ID of a button to create an obejct to represent.
|
||||
*
|
||||
*/
|
||||
public ButtonImpl(Component.Identifier.Button id) {
|
||||
super(id.getName(), id);
|
||||
if (id == Component.Identifier.Button.LEFT) {
|
||||
index = 12;
|
||||
} else if (id == Component.Identifier.Button.RIGHT) {
|
||||
index = 13;
|
||||
} else if (id == Component.Identifier.Button.MIDDLE) {
|
||||
index = 14;
|
||||
} else if (id == Component.Identifier.Button.SIDE) {
|
||||
index = 15;
|
||||
} else if (id == Component.Identifier.Button.EXTRA) {
|
||||
index = 16;
|
||||
} else if (id == Component.Identifier.Button.FORWARD) {
|
||||
index = 17;
|
||||
} else if (id == Component.Identifier.Button.BACK) {
|
||||
index = 18;
|
||||
} else {
|
||||
throw new RuntimeException("Unknown button");
|
||||
}
|
||||
}
|
||||
|
||||
/** 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 state of controller. (Note: DX8 mice actually
|
||||
* queue state so what is returned is the next state,
|
||||
* not necessarily the most current one.)
|
||||
*/
|
||||
public float getPollData() {
|
||||
// Mouse button
|
||||
byte data = mouseData[index];
|
||||
if ((data & 0x80) != 0) {
|
||||
return 1.0f;
|
||||
} else {
|
||||
return 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
/** 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 true if data is relative, otherwise false.
|
||||
*/
|
||||
public boolean isRelative() {
|
||||
return false;
|
||||
}
|
||||
} // class DirectInputMouse.ButtonImpl
|
||||
|
||||
/**
|
||||
* Mouse ball axis implementation
|
||||
*/
|
||||
class BallAxis extends AbstractComponent {
|
||||
|
||||
/**
|
||||
* Starting index into the mouseData array
|
||||
*/
|
||||
private final int index;
|
||||
|
||||
/** Public constructor
|
||||
* @param id An ID for a mouse axis to create an object to represent.
|
||||
*/
|
||||
public BallAxis(Identifier id) {
|
||||
super(id.getName(), id);
|
||||
if (id == Identifier.Axis.X) {
|
||||
index = 0;
|
||||
} else if (id == Identifier.Axis.Y) {
|
||||
index = 4;
|
||||
} else if (id == Identifier.Axis.SLIDER) {
|
||||
index = 8;
|
||||
} else {
|
||||
throw new RuntimeException("Unknown mouse axis");
|
||||
}
|
||||
}
|
||||
|
||||
// Endolf changed this comment, we *are* a mouse axis if we are in here,
|
||||
// and mouse axes no longer are normalised at all
|
||||
/** Returns the data from the last time the control has been polled.
|
||||
*
|
||||
* @return data The total mouse axis change since the last poll
|
||||
*/
|
||||
public float getPollData() {
|
||||
int data = ((int)mouseData[index+3] << 24) |
|
||||
((int)mouseData[index + 2] << 16) |
|
||||
((int)mouseData[index + 1] << 8) |
|
||||
((int)mouseData[index]);
|
||||
return (float)data;
|
||||
}
|
||||
|
||||
/** 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 true if relative, otherwise false.
|
||||
*/
|
||||
public boolean isRelative() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Returns whether or not the axis is analog, or false if it is digital.
|
||||
* @return true if analog, false if digital
|
||||
*/
|
||||
public boolean isAnalog() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Returns whether or not data polled from this axis is normalized between the values of -1.0f and 1.0f.
|
||||
*
|
||||
* @return true if normalized, otherwise false.
|
||||
*/
|
||||
public boolean isNormalized() {
|
||||
return false;
|
||||
}
|
||||
|
||||
} // class DirectInputMouse.MouseBallAxis
|
||||
} // class DirectInputMouse
|
||||
|
|
@ -1,122 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* Implementation of the Rumbler interface for direct x
|
||||
*
|
||||
* @author Endolf
|
||||
*/
|
||||
public class DirectInputRumbler implements Rumbler {
|
||||
|
||||
/** The parent device */
|
||||
private DirectInputDevice device;
|
||||
/** The native effect */
|
||||
private long effect;
|
||||
/** The identifier of the axis we are attached too */
|
||||
private Component.Identifier axisID;
|
||||
/** The name of the axis this rumbler is attached too */
|
||||
private String axisName;
|
||||
|
||||
/**
|
||||
* Creates a new instance of DirectInputRumbler
|
||||
*
|
||||
* @param device The parent device
|
||||
* @param effect The native effect
|
||||
* @param axisID The id of the axis this rumbler is attached too
|
||||
* @param axisName The name of the axis this rumbler is attached too
|
||||
*/
|
||||
public DirectInputRumbler(DirectInputDevice device, long effect, Component.Identifier axisID, String axisName) {
|
||||
this.device = device;
|
||||
this.effect = effect;
|
||||
this.axisID = axisID;
|
||||
this.axisName = axisName;
|
||||
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownHook(this)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the identifier of the axis this rumbler is attached too
|
||||
*
|
||||
* @return The axis id
|
||||
*/
|
||||
public Component.Identifier getAxisIdentifier() {
|
||||
return axisID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the name of the axis this rumbler is attached too
|
||||
*
|
||||
* @return The axis name
|
||||
*/
|
||||
public String getAxisName() {
|
||||
return axisName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rumbles this rumbler at the given intensity.
|
||||
* This will start or stop the effect if necesary.
|
||||
* The intensity is in the range of -1 to 1 and will be clipped if values
|
||||
* outside that range are provided.
|
||||
*
|
||||
* @param intensity The intensity
|
||||
*/
|
||||
public void rumble(float intensity) {
|
||||
if(intensity>1f) {
|
||||
intensity = 1.0f;
|
||||
} else if(intensity<-1f) {
|
||||
intensity = -1.0f;
|
||||
}
|
||||
setRumble(effect, intensity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs the native call(s) to run the effect
|
||||
*
|
||||
* @param effect The native effect
|
||||
* @param intensity The intensity of the rumble
|
||||
*/
|
||||
private native void setRumble(long effect, float intensity);
|
||||
|
||||
private class ShutdownHook implements Runnable {
|
||||
private DirectInputRumbler rumbler;
|
||||
public ShutdownHook(DirectInputRumbler rumbler) {
|
||||
this.rumbler = rumbler;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
if(rumbler!=null) {
|
||||
System.out.println("Reseting rumbler " + getAxisName() + " before exit");
|
||||
rumbler.rumble(0f);
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException e) {
|
||||
//Ignore, we are quitting anyway
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -2,35 +2,37 @@
|
|||
<project basedir="." default="all" name="OSX Plugin">
|
||||
<description>OSX JInput Plugin</description>
|
||||
<property name="src" location="src" />
|
||||
<property name="build" location="classes" />
|
||||
<property name="dist" location="dist" />
|
||||
<property name="build" location="classes"/>
|
||||
<property name="bin" location="bin" />
|
||||
<property name="plugins" location="plugins" />
|
||||
|
||||
<target name="init">
|
||||
<mkdir dir="classes"/>
|
||||
<mkdir dir="dist"/>
|
||||
<mkdir dir="${build}"/>
|
||||
<mkdir dir="${bin}"/>
|
||||
<condition property="macosx">
|
||||
<and>
|
||||
<os family="mac" />
|
||||
<os family="unix" />
|
||||
</and>
|
||||
</condition>
|
||||
</target>
|
||||
|
||||
<target depends="init" name="compile">
|
||||
<javac debug="true" deprecation="true" destdir="${build}" source="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="${dist}/HIDWrapper.jar" compress="true" basedir="${build}">
|
||||
<exclude name="**/*.java"/>
|
||||
<exclude name="HIDWrapper.jar"/>
|
||||
<exclude name="apidoc"/>
|
||||
<jar jarfile="${bin}/HIDWrapper.jar" compress="true" basedir="${build}">
|
||||
<include name="**/*.class"/>
|
||||
</jar>
|
||||
<copy file="${dist}/HIDWrapper.jar" todir="../../coreAPI/src/tests/controller" />
|
||||
</target>
|
||||
|
||||
<target depends="compileNativeJinputLib,jar" description="Build everything." name="all">
|
||||
<echo message="Native OSX JInput library built!"/>
|
||||
</target>
|
||||
|
||||
<target name="javadoc" depends="init" description="Javadoc for OS X plugin for JInput.">
|
||||
|
|
@ -43,23 +45,17 @@
|
|||
<pathelement location="src/java"/>
|
||||
</sourcepath>
|
||||
<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>
|
||||
</javadoc>
|
||||
</target>
|
||||
|
||||
<target description="Clean all build products." name="clean">
|
||||
<delete failonerror="no">
|
||||
<fileset dir="${build}">
|
||||
<include name="**/*.class"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
<delete file="${dist}/HIDWrapper.jar" failonerror="no"/>
|
||||
<delete file="${dist}/libjinput.jnilib" failonerror="no"/>
|
||||
<delete file="../../coreAPI/src/tests/controller/HIDWrapper.jar" failonerror="no" />
|
||||
<delete file="../../coreAPI/src/tests/controller/libjinput.jnilib" 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">
|
||||
|
|
@ -68,14 +64,17 @@
|
|||
<pathelement path="${build}"/>
|
||||
<pathelement location="../../coreAPI/classes"/>
|
||||
</classpath>
|
||||
<class name="net.java.games.input.OSXEnvironmentPlugin"/>
|
||||
<class name="net.java.games.input.OSXHIDDeviceIterator"/>
|
||||
<class name="net.java.games.input.OSXHIDDevice"/>
|
||||
<class name="net.java.games.input.OSXHIDQueue"/>
|
||||
</javah>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="compileNativeJinputLib" depends="init,createJNIHeaders" >
|
||||
<target name="compileNativeJinputLib" depends="init,createJNIHeaders" if="macosx">
|
||||
<ant dir="src/native" target="compileNativeJinputLib"/>
|
||||
<copy file="src/native/libjinput.jnilib" todir="${dist}" />
|
||||
<copy file="${dist}/libjinput.jnilib" todir="../../coreAPI/src/tests/controller" />
|
||||
<copy todir="${bin}">
|
||||
<fileset dir="src/native" includes="*.jnilib"/>
|
||||
</copy>
|
||||
</target>
|
||||
</project>
|
||||
|
|
|
|||
141
plugins/OSX/src/java/net/java/games/input/ButtonUsage.java
Normal file
141
plugins/OSX/src/java/net/java/games/input/ButtonUsage.java
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
* %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.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
/** Button Usages
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class ButtonUsage implements Usage {
|
||||
private final static Map map = new HashMap();
|
||||
|
||||
private final int button_id;
|
||||
|
||||
public final static ButtonUsage map(int button_id) {
|
||||
Integer button_id_obj = new Integer(button_id);
|
||||
ButtonUsage existing = (ButtonUsage)map.get(button_id_obj);
|
||||
if (existing != null)
|
||||
return existing;
|
||||
ButtonUsage new_button = new ButtonUsage(button_id);
|
||||
map.put(button_id_obj, new_button);
|
||||
return new_button;
|
||||
}
|
||||
|
||||
private ButtonUsage(int button_id) {
|
||||
this.button_id = button_id;
|
||||
}
|
||||
|
||||
public final Component.Identifier.Button getIdentifier() {
|
||||
switch (button_id) {
|
||||
case 1:
|
||||
return Component.Identifier.Button._0;
|
||||
case 2:
|
||||
return Component.Identifier.Button._1;
|
||||
case 3:
|
||||
return Component.Identifier.Button._2;
|
||||
case 4:
|
||||
return Component.Identifier.Button._3;
|
||||
case 5:
|
||||
return Component.Identifier.Button._4;
|
||||
case 6:
|
||||
return Component.Identifier.Button._5;
|
||||
case 7:
|
||||
return Component.Identifier.Button._6;
|
||||
case 8:
|
||||
return Component.Identifier.Button._7;
|
||||
case 9:
|
||||
return Component.Identifier.Button._8;
|
||||
case 10:
|
||||
return Component.Identifier.Button._9;
|
||||
case 11:
|
||||
return Component.Identifier.Button._10;
|
||||
case 12:
|
||||
return Component.Identifier.Button._11;
|
||||
case 13:
|
||||
return Component.Identifier.Button._12;
|
||||
case 14:
|
||||
return Component.Identifier.Button._13;
|
||||
case 15:
|
||||
return Component.Identifier.Button._14;
|
||||
case 16:
|
||||
return Component.Identifier.Button._15;
|
||||
case 17:
|
||||
return Component.Identifier.Button._16;
|
||||
case 18:
|
||||
return Component.Identifier.Button._17;
|
||||
case 19:
|
||||
return Component.Identifier.Button._18;
|
||||
case 20:
|
||||
return Component.Identifier.Button._19;
|
||||
case 21:
|
||||
return Component.Identifier.Button._20;
|
||||
case 22:
|
||||
return Component.Identifier.Button._21;
|
||||
case 23:
|
||||
return Component.Identifier.Button._22;
|
||||
case 24:
|
||||
return Component.Identifier.Button._23;
|
||||
case 25:
|
||||
return Component.Identifier.Button._24;
|
||||
case 26:
|
||||
return Component.Identifier.Button._25;
|
||||
case 27:
|
||||
return Component.Identifier.Button._26;
|
||||
case 28:
|
||||
return Component.Identifier.Button._27;
|
||||
case 29:
|
||||
return Component.Identifier.Button._28;
|
||||
case 30:
|
||||
return Component.Identifier.Button._29;
|
||||
case 31:
|
||||
return Component.Identifier.Button._30;
|
||||
case 32:
|
||||
return Component.Identifier.Button._31;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "ButtonUsage (" + button_id + ")";
|
||||
}
|
||||
}
|
||||
74
plugins/OSX/src/java/net/java/games/input/ElementType.java
Normal file
74
plugins/OSX/src/java/net/java/games/input/ElementType.java
Normal file
|
|
@ -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.lang.reflect.Method;
|
||||
|
||||
/** HID Element types
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class ElementType {
|
||||
private final static ElementType[] map = new ElementType[514];
|
||||
|
||||
public final static ElementType INPUT_MISC = new ElementType(1);
|
||||
public final static ElementType INPUT_BUTTON = new ElementType(2);
|
||||
public final static ElementType INPUT_AXIS = new ElementType(3);
|
||||
public final static ElementType INPUT_SCANCODES = new ElementType(4);
|
||||
public final static ElementType OUTPUT = new ElementType(129);
|
||||
public final static ElementType FEATURE = new ElementType(257);
|
||||
public final static ElementType COLLECTION = new ElementType(513);
|
||||
|
||||
private final int type_id;
|
||||
|
||||
public final static ElementType map(int type_id) {
|
||||
if (type_id < 0 || type_id >= map.length)
|
||||
return null;
|
||||
return map[type_id];
|
||||
}
|
||||
|
||||
private ElementType(int type_id) {
|
||||
map[type_id] = this;
|
||||
this.type_id = type_id;
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "ElementType (0x" + Integer.toHexString(type_id) + ")";
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
/*
|
||||
* %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;
|
||||
|
||||
/** Generic Desktop Usages
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class GenericDesktopUsage implements Usage {
|
||||
private final static GenericDesktopUsage[] map = new GenericDesktopUsage[0xFF];
|
||||
|
||||
public final static GenericDesktopUsage POINTER = new GenericDesktopUsage(0x01); /* Physical Collection */
|
||||
public final static GenericDesktopUsage MOUSE = new GenericDesktopUsage(0x02); /* Application Collection */
|
||||
/* 0x03 Reserved */
|
||||
public final static GenericDesktopUsage JOYSTICK = new GenericDesktopUsage(0x04); /* Application Collection */
|
||||
public final static GenericDesktopUsage GAME_PAD = new GenericDesktopUsage(0x05); /* Application Collection */
|
||||
public final static GenericDesktopUsage KEYBOARD = new GenericDesktopUsage(0x06); /* Application Collection */
|
||||
public final static GenericDesktopUsage KEYPAD = new GenericDesktopUsage(0x07); /* Application Collection */
|
||||
public final static GenericDesktopUsage MULTI_AXIS_CONTROLLER = new GenericDesktopUsage(0x08); /* Application Collection */
|
||||
/* 0x09 - 0x2F Reserved */
|
||||
public final static GenericDesktopUsage X = new GenericDesktopUsage(0x30); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage Y = new GenericDesktopUsage(0x31); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage Z = new GenericDesktopUsage(0x32); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage RX = new GenericDesktopUsage(0x33); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage RY = new GenericDesktopUsage(0x34); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage RZ = new GenericDesktopUsage(0x35); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage SLIDER = new GenericDesktopUsage(0x36); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage DIAL = new GenericDesktopUsage(0x37); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage WHEEL = new GenericDesktopUsage(0x38); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage HATSWITCH = new GenericDesktopUsage(0x39); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage COUNTED_BUFFER = new GenericDesktopUsage(0x3A); /* Logical Collection */
|
||||
public final static GenericDesktopUsage BYTE_COUNT = new GenericDesktopUsage(0x3B); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage MOTION_WAKEUP = new GenericDesktopUsage(0x3C); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage START = new GenericDesktopUsage(0x3D); /* On/Off Control */
|
||||
public final static GenericDesktopUsage SELECT = new GenericDesktopUsage(0x3E); /* On/Off Control */
|
||||
/* 0x3F Reserved */
|
||||
public final static GenericDesktopUsage VX = new GenericDesktopUsage(0x40); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VY = new GenericDesktopUsage(0x41); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VZ = new GenericDesktopUsage(0x42); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VBRX = new GenericDesktopUsage(0x43); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VBRY = new GenericDesktopUsage(0x44); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VBRZ = new GenericDesktopUsage(0x45); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VNO = new GenericDesktopUsage(0x46); /* Dynamic Value */
|
||||
/* 0x47 - 0x7F Reserved */
|
||||
public final static GenericDesktopUsage SYSTEM_CONTROL = new GenericDesktopUsage(0x80); /* Application Collection */
|
||||
public final static GenericDesktopUsage SYSTEM_POWER_DOWN = new GenericDesktopUsage(0x81); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_SLEEP = new GenericDesktopUsage(0x82); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_WAKE_UP = new GenericDesktopUsage(0x83); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_CONTEXT_MENU = new GenericDesktopUsage(0x84); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MAIN_MENU = new GenericDesktopUsage(0x85); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_APP_MENU = new GenericDesktopUsage(0x86); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_HELP = new GenericDesktopUsage(0x87); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_EXIT = new GenericDesktopUsage(0x88); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU = new GenericDesktopUsage(0x89); /* Selector */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_RIGHT = new GenericDesktopUsage(0x8A); /* Re-Trigger Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_LEFT = new GenericDesktopUsage(0x8B); /* Re-Trigger Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_UP = new GenericDesktopUsage(0x8C); /* Re-Trigger Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_DOWN = new GenericDesktopUsage(0x8D); /* Re-Trigger Control */
|
||||
/* 0x8E - 0x8F Reserved */
|
||||
public final static GenericDesktopUsage DPAD_UP = new GenericDesktopUsage(0x90); /* On/Off Control */
|
||||
public final static GenericDesktopUsage DPAD_DOWN = new GenericDesktopUsage(0x91); /* On/Off Control */
|
||||
public final static GenericDesktopUsage DPAD_RIGHT = new GenericDesktopUsage(0x92); /* On/Off Control */
|
||||
public final static GenericDesktopUsage DPAD_LEFT = new GenericDesktopUsage(0x93); /* On/Off Control */
|
||||
/* 0x94 - 0xFFFF Reserved */
|
||||
|
||||
private final int usage_id;
|
||||
|
||||
public final static GenericDesktopUsage map(int usage_id) {
|
||||
if (usage_id < 0 || usage_id >= map.length)
|
||||
return null;
|
||||
return map[usage_id];
|
||||
}
|
||||
|
||||
private GenericDesktopUsage(int usage_id) {
|
||||
map[usage_id] = this;
|
||||
this.usage_id = usage_id;
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "GenericDesktopUsage (0x" + Integer.toHexString(usage_id) + ")";
|
||||
}
|
||||
|
||||
public final Component.Identifier getIdentifier() {
|
||||
if (this == GenericDesktopUsage.X) {
|
||||
return Component.Identifier.Axis.X;
|
||||
} else if (this == GenericDesktopUsage.Y) {
|
||||
return Component.Identifier.Axis.Y;
|
||||
} else if (this == GenericDesktopUsage.Z) {
|
||||
return Component.Identifier.Axis.Z;
|
||||
} else if (this == GenericDesktopUsage.RX) {
|
||||
return Component.Identifier.Axis.RX;
|
||||
} else if (this == GenericDesktopUsage.RY) {
|
||||
return Component.Identifier.Axis.RY;
|
||||
} else if (this == GenericDesktopUsage.RZ) {
|
||||
return Component.Identifier.Axis.RZ;
|
||||
} else if (this == GenericDesktopUsage.SLIDER) {
|
||||
return Component.Identifier.Axis.SLIDER;
|
||||
} else if (this == GenericDesktopUsage.HATSWITCH) {
|
||||
return Component.Identifier.Axis.POV;
|
||||
} else if (this == GenericDesktopUsage.SELECT) {
|
||||
return Component.Identifier.Button.SELECT;
|
||||
} else
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
package net.java.games.input;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: gpierce
|
||||
* Date: Aug 2, 2003
|
||||
* Time: 2:57:15 PM
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public interface InputController
|
||||
{
|
||||
public void addControllerElement( InputControllerElement element );
|
||||
}
|
||||
|
|
@ -1,195 +0,0 @@
|
|||
package net.java.games.input;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: gpierce
|
||||
* Date: Aug 2, 2003
|
||||
* Time: 2:59:26 PM
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class InputControllerElement
|
||||
{
|
||||
private long hidCookie;
|
||||
private int elementType;
|
||||
private int usagePage;
|
||||
private int usage;
|
||||
|
||||
private int rawMin;
|
||||
private int rawMax;
|
||||
private int scaledMin;
|
||||
private int scaledMax;
|
||||
|
||||
private int dataBitSize;
|
||||
|
||||
private boolean isRelative;
|
||||
private boolean isWrapping;
|
||||
private boolean isNonLinear;
|
||||
private boolean hasPreferredState;
|
||||
private boolean hasNullState;
|
||||
|
||||
public InputControllerElement()
|
||||
{
|
||||
}
|
||||
|
||||
public InputControllerElement(long hidCookie, int elementType, int usage, int usagePage,
|
||||
int rawMin, int rawMax, int scaledMin, int scaledMax,
|
||||
int dataBitSize, boolean isRelative, boolean isWrapping,
|
||||
boolean isNonLinear, boolean hasPreferredState, boolean hasNullState )
|
||||
{
|
||||
this.hidCookie = hidCookie;
|
||||
this.elementType = elementType;
|
||||
this.usage = usage;
|
||||
this.usagePage = usagePage;
|
||||
this.rawMin = rawMin;
|
||||
this.rawMax = rawMax;
|
||||
this.scaledMin = scaledMin;
|
||||
this.scaledMax = scaledMax;
|
||||
this.dataBitSize = dataBitSize;
|
||||
this.isRelative = isRelative;
|
||||
this.isWrapping = isWrapping;
|
||||
this.isNonLinear = isNonLinear;
|
||||
this.hasPreferredState = hasPreferredState;
|
||||
this.hasNullState = hasNullState;
|
||||
}
|
||||
|
||||
public long getHidCookie()
|
||||
{
|
||||
return hidCookie;
|
||||
}
|
||||
|
||||
public void setHidCookie(long hidCookie)
|
||||
{
|
||||
this.hidCookie = hidCookie;
|
||||
}
|
||||
|
||||
public int getElementType()
|
||||
{
|
||||
return elementType;
|
||||
}
|
||||
|
||||
public void setElementType(int elementType)
|
||||
{
|
||||
this.elementType = elementType;
|
||||
}
|
||||
|
||||
public int getUsagePage()
|
||||
{
|
||||
return usagePage;
|
||||
}
|
||||
|
||||
public void setUsagePage(int usagePage)
|
||||
{
|
||||
this.usagePage = usagePage;
|
||||
}
|
||||
|
||||
public int getUsage()
|
||||
{
|
||||
return usage;
|
||||
}
|
||||
|
||||
public void setUsage(int usage)
|
||||
{
|
||||
this.usage = usage;
|
||||
}
|
||||
|
||||
public int getRawMin()
|
||||
{
|
||||
return rawMin;
|
||||
}
|
||||
|
||||
public void setRawMin(int rawMin)
|
||||
{
|
||||
this.rawMin = rawMin;
|
||||
}
|
||||
|
||||
public int getRawMax()
|
||||
{
|
||||
return rawMax;
|
||||
}
|
||||
|
||||
public void setRawMax(int rawMax)
|
||||
{
|
||||
this.rawMax = rawMax;
|
||||
}
|
||||
|
||||
public int getScaledMin()
|
||||
{
|
||||
return scaledMin;
|
||||
}
|
||||
|
||||
public void setScaledMin(int scaledMin)
|
||||
{
|
||||
this.scaledMin = scaledMin;
|
||||
}
|
||||
|
||||
public int getScaledMax()
|
||||
{
|
||||
return scaledMax;
|
||||
}
|
||||
|
||||
public void setScaledMax(int scaledMax)
|
||||
{
|
||||
this.scaledMax = scaledMax;
|
||||
}
|
||||
|
||||
public int getDataBitSize()
|
||||
{
|
||||
return dataBitSize;
|
||||
}
|
||||
|
||||
public void setDataBitSize(int dataBitSize)
|
||||
{
|
||||
this.dataBitSize = dataBitSize;
|
||||
}
|
||||
|
||||
public boolean isRelative()
|
||||
{
|
||||
return isRelative;
|
||||
}
|
||||
|
||||
public void setRelative(boolean relative)
|
||||
{
|
||||
isRelative = relative;
|
||||
}
|
||||
|
||||
public boolean isWrapping()
|
||||
{
|
||||
return isWrapping;
|
||||
}
|
||||
|
||||
public void setWrapping(boolean wrapping)
|
||||
{
|
||||
isWrapping = wrapping;
|
||||
}
|
||||
|
||||
public boolean isNonLinear()
|
||||
{
|
||||
return isNonLinear;
|
||||
}
|
||||
|
||||
public void setNonLinear(boolean nonLinear)
|
||||
{
|
||||
isNonLinear = nonLinear;
|
||||
}
|
||||
|
||||
public boolean isHasPreferredState()
|
||||
{
|
||||
return hasPreferredState;
|
||||
}
|
||||
|
||||
public void setHasPreferredState(boolean hasPreferredState)
|
||||
{
|
||||
this.hasPreferredState = hasPreferredState;
|
||||
}
|
||||
|
||||
public boolean isHasNullState()
|
||||
{
|
||||
return hasNullState;
|
||||
}
|
||||
|
||||
public void setHasNullState(boolean hasNullState)
|
||||
{
|
||||
this.hasNullState = hasNullState;
|
||||
}
|
||||
|
||||
}
|
||||
251
plugins/OSX/src/java/net/java/games/input/KeyboardUsage.java
Normal file
251
plugins/OSX/src/java/net/java/games/input/KeyboardUsage.java
Normal file
|
|
@ -0,0 +1,251 @@
|
|||
/*
|
||||
* %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.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
/** Mapping from Keyboard HID usages to Component.Identifier.Key
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class KeyboardUsage implements Usage {
|
||||
private final static KeyboardUsage[] map = new KeyboardUsage[0xFF];
|
||||
|
||||
public static final KeyboardUsage ERRORROLLOVER = new KeyboardUsage(0x01); /* ErrorRollOver */
|
||||
public static final KeyboardUsage POSTFAIL = new KeyboardUsage(0x02); /* POSTFail */
|
||||
public static final KeyboardUsage ERRORUNDEFINED = new KeyboardUsage(0x03); /* ErrorUndefined */
|
||||
public static final KeyboardUsage A = new KeyboardUsage(Component.Identifier.Key.A, 0x04); /* a or A */
|
||||
public static final KeyboardUsage B = new KeyboardUsage(Component.Identifier.Key.B, 0x05); /* b or B */
|
||||
public static final KeyboardUsage C = new KeyboardUsage(Component.Identifier.Key.C, 0x06); /* c or C */
|
||||
public static final KeyboardUsage D = new KeyboardUsage(Component.Identifier.Key.D, 0x07); /* d or D */
|
||||
public static final KeyboardUsage E = new KeyboardUsage(Component.Identifier.Key.E, 0x08); /* e or E */
|
||||
public static final KeyboardUsage F = new KeyboardUsage(Component.Identifier.Key.F, 0x09); /* f or F */
|
||||
public static final KeyboardUsage G = new KeyboardUsage(Component.Identifier.Key.G, 0x0A); /* g or G */
|
||||
public static final KeyboardUsage H = new KeyboardUsage(Component.Identifier.Key.H, 0x0B); /* h or H */
|
||||
public static final KeyboardUsage I = new KeyboardUsage(Component.Identifier.Key.I, 0x0C); /* i or I */
|
||||
public static final KeyboardUsage J = new KeyboardUsage(Component.Identifier.Key.J, 0x0D); /* j or J */
|
||||
public static final KeyboardUsage K = new KeyboardUsage(Component.Identifier.Key.K, 0x0E); /* k or K */
|
||||
public static final KeyboardUsage L = new KeyboardUsage(Component.Identifier.Key.L, 0x0F); /* l or L */
|
||||
public static final KeyboardUsage M = new KeyboardUsage(Component.Identifier.Key.M, 0x10); /* m or M */
|
||||
public static final KeyboardUsage N = new KeyboardUsage(Component.Identifier.Key.N, 0x11); /* n or N */
|
||||
public static final KeyboardUsage O = new KeyboardUsage(Component.Identifier.Key.O, 0x12); /* o or O */
|
||||
public static final KeyboardUsage P = new KeyboardUsage(Component.Identifier.Key.P, 0x13); /* p or P */
|
||||
public static final KeyboardUsage Q = new KeyboardUsage(Component.Identifier.Key.Q, 0x14); /* q or Q */
|
||||
public static final KeyboardUsage R = new KeyboardUsage(Component.Identifier.Key.R, 0x15); /* r or R */
|
||||
public static final KeyboardUsage S = new KeyboardUsage(Component.Identifier.Key.S, 0x16); /* s or S */
|
||||
public static final KeyboardUsage T = new KeyboardUsage(Component.Identifier.Key.T, 0x17); /* t or T */
|
||||
public static final KeyboardUsage U = new KeyboardUsage(Component.Identifier.Key.U, 0x18); /* u or U */
|
||||
public static final KeyboardUsage V = new KeyboardUsage(Component.Identifier.Key.V, 0x19); /* v or V */
|
||||
public static final KeyboardUsage W = new KeyboardUsage(Component.Identifier.Key.W, 0x1A); /* w or W */
|
||||
public static final KeyboardUsage X = new KeyboardUsage(Component.Identifier.Key.X, 0x1B); /* x or X */
|
||||
public static final KeyboardUsage Y = new KeyboardUsage(Component.Identifier.Key.Y, 0x1C); /* y or Y */
|
||||
public static final KeyboardUsage Z = new KeyboardUsage(Component.Identifier.Key.Z, 0x1D); /* z or Z */
|
||||
public static final KeyboardUsage _1 = new KeyboardUsage(Component.Identifier.Key._1, 0x1E); /* 1 or ! */
|
||||
public static final KeyboardUsage _2 = new KeyboardUsage(Component.Identifier.Key._2, 0x1F); /* 2 or @ */
|
||||
public static final KeyboardUsage _3 = new KeyboardUsage(Component.Identifier.Key._3, 0x20); /* 3 or # */
|
||||
public static final KeyboardUsage _4 = new KeyboardUsage(Component.Identifier.Key._4, 0x21); /* 4 or $ */
|
||||
public static final KeyboardUsage _5 = new KeyboardUsage(Component.Identifier.Key._5, 0x22); /* 5 or % */
|
||||
public static final KeyboardUsage _6 = new KeyboardUsage(Component.Identifier.Key._6, 0x23); /* 6 or ^ */
|
||||
public static final KeyboardUsage _7 = new KeyboardUsage(Component.Identifier.Key._7, 0x24); /* 7 or & */
|
||||
public static final KeyboardUsage _8 = new KeyboardUsage(Component.Identifier.Key._8, 0x25); /* 8 or * */
|
||||
public static final KeyboardUsage _9 = new KeyboardUsage(Component.Identifier.Key._9, 0x26); /* 9 or ( */
|
||||
public static final KeyboardUsage _0 = new KeyboardUsage(Component.Identifier.Key._0, 0x27); /* 0 or ) */
|
||||
public static final KeyboardUsage ENTER = new KeyboardUsage(Component.Identifier.Key.RETURN, 0x28); /* Return (Enter) */
|
||||
public static final KeyboardUsage ESCAPE = new KeyboardUsage(Component.Identifier.Key.ESCAPE, 0x29); /* Escape */
|
||||
public static final KeyboardUsage BACKSPACE = new KeyboardUsage(Component.Identifier.Key.BACK, 0x2A); /* Delete (Backspace) */
|
||||
public static final KeyboardUsage TAB = new KeyboardUsage(Component.Identifier.Key.TAB, 0x2B); /* Tab */
|
||||
public static final KeyboardUsage SPACEBAR = new KeyboardUsage(Component.Identifier.Key.SPACE, 0x2C); /* Spacebar */
|
||||
public static final KeyboardUsage HYPHEN = new KeyboardUsage(Component.Identifier.Key.MINUS, 0x2D); /* - or _ */
|
||||
public static final KeyboardUsage EQUALSIGN = new KeyboardUsage(Component.Identifier.Key.EQUALS, 0x2E); /* = or + */
|
||||
public static final KeyboardUsage OPENBRACKET = new KeyboardUsage(Component.Identifier.Key.LBRACKET, 0x2F); /* [ or { */
|
||||
public static final KeyboardUsage CLOSEBRACKET = new KeyboardUsage(Component.Identifier.Key.RBRACKET, 0x30); /* ] or } */
|
||||
public static final KeyboardUsage BACKSLASH = new KeyboardUsage(Component.Identifier.Key.BACKSLASH, 0x31); /* \ or | */
|
||||
public static final KeyboardUsage NONUSPOUNT = new KeyboardUsage(Component.Identifier.Key.PERIOD, 0x32); /* Non-US # or _ */
|
||||
public static final KeyboardUsage SEMICOLON = new KeyboardUsage(Component.Identifier.Key.SEMICOLON, 0x33); /* ; or : */
|
||||
public static final KeyboardUsage QUOTE = new KeyboardUsage(Component.Identifier.Key.APOSTROPHE, 0x34); /* ' or " */
|
||||
public static final KeyboardUsage TILDE = new KeyboardUsage(Component.Identifier.Key.GRAVE, 0x35); /* Grave Accent and Tilde */
|
||||
public static final KeyboardUsage COMMA = new KeyboardUsage(Component.Identifier.Key.COMMA, 0x36); /* , or < */
|
||||
public static final KeyboardUsage PERIOD = new KeyboardUsage(Component.Identifier.Key.PERIOD, 0x37); /* . or > */
|
||||
public static final KeyboardUsage SLASH = new KeyboardUsage(Component.Identifier.Key.SLASH, 0x38); /* / or ? */
|
||||
public static final KeyboardUsage CAPSLOCK = new KeyboardUsage(Component.Identifier.Key.CAPITAL, 0x39); /* Caps Lock */
|
||||
public static final KeyboardUsage F1 = new KeyboardUsage(Component.Identifier.Key.F1, 0x3A); /* F1 */
|
||||
public static final KeyboardUsage F2 = new KeyboardUsage(Component.Identifier.Key.F2, 0x3B); /* F2 */
|
||||
public static final KeyboardUsage F3 = new KeyboardUsage(Component.Identifier.Key.F3, 0x3C); /* F3 */
|
||||
public static final KeyboardUsage F4 = new KeyboardUsage(Component.Identifier.Key.F4, 0x3D); /* F4 */
|
||||
public static final KeyboardUsage F5 = new KeyboardUsage(Component.Identifier.Key.F5, 0x3E); /* F5 */
|
||||
public static final KeyboardUsage F6 = new KeyboardUsage(Component.Identifier.Key.F6, 0x3F); /* F6 */
|
||||
public static final KeyboardUsage F7 = new KeyboardUsage(Component.Identifier.Key.F7, 0x40); /* F7 */
|
||||
public static final KeyboardUsage F8 = new KeyboardUsage(Component.Identifier.Key.F8, 0x41); /* F8 */
|
||||
public static final KeyboardUsage F9 = new KeyboardUsage(Component.Identifier.Key.F9, 0x42); /* F9 */
|
||||
public static final KeyboardUsage F10 = new KeyboardUsage(Component.Identifier.Key.F10, 0x43); /* F10 */
|
||||
public static final KeyboardUsage F11 = new KeyboardUsage(Component.Identifier.Key.F11, 0x44); /* F11 */
|
||||
public static final KeyboardUsage F12 = new KeyboardUsage(Component.Identifier.Key.F12, 0x45); /* F12 */
|
||||
public static final KeyboardUsage PRINTSCREEN = new KeyboardUsage(Component.Identifier.Key.SYSRQ, 0x46); /* PrintScreen */
|
||||
public static final KeyboardUsage SCROLLLOCK = new KeyboardUsage(Component.Identifier.Key.SCROLL, 0x47); /* Scroll Lock */
|
||||
public static final KeyboardUsage PAUSE = new KeyboardUsage(Component.Identifier.Key.PAUSE, 0x48); /* Pause */
|
||||
public static final KeyboardUsage INSERT = new KeyboardUsage(Component.Identifier.Key.INSERT, 0x49); /* Insert */
|
||||
public static final KeyboardUsage HOME = new KeyboardUsage(Component.Identifier.Key.HOME, 0x4A); /* Home */
|
||||
public static final KeyboardUsage PAGEUP = new KeyboardUsage(Component.Identifier.Key.PAGEUP, 0x4B); /* Page Up */
|
||||
public static final KeyboardUsage DELETE = new KeyboardUsage(Component.Identifier.Key.DELETE, 0x4C); /* Delete Forward */
|
||||
public static final KeyboardUsage END = new KeyboardUsage(Component.Identifier.Key.END, 0x4D); /* End */
|
||||
public static final KeyboardUsage PAGEDOWN = new KeyboardUsage(Component.Identifier.Key.PAGEDOWN, 0x4E); /* Page Down */
|
||||
public static final KeyboardUsage RIGHTARROW = new KeyboardUsage(Component.Identifier.Key.RIGHT, 0x4F); /* Right Arrow */
|
||||
public static final KeyboardUsage LEFTARROW = new KeyboardUsage(Component.Identifier.Key.LEFT, 0x50); /* Left Arrow */
|
||||
public static final KeyboardUsage DOWNARROW = new KeyboardUsage(Component.Identifier.Key.DOWN, 0x51); /* Down Arrow */
|
||||
public static final KeyboardUsage UPARROW = new KeyboardUsage(Component.Identifier.Key.UP, 0x52); /* Up Arrow */
|
||||
public static final KeyboardUsage KEYPAD_NUMLOCK = new KeyboardUsage(Component.Identifier.Key.NUMLOCK, 0x53); /* Keypad NumLock or Clear */
|
||||
public static final KeyboardUsage KEYPAD_SLASH = new KeyboardUsage(Component.Identifier.Key.DIVIDE, 0x54); /* Keypad / */
|
||||
public static final KeyboardUsage KEYPAD_ASTERICK = new KeyboardUsage(0x55); /* Keypad * */
|
||||
public static final KeyboardUsage KEYPAD_HYPHEN = new KeyboardUsage(Component.Identifier.Key.SUBTRACT, 0x56); /* Keypad - */
|
||||
public static final KeyboardUsage KEYPAD_PLUS = new KeyboardUsage(Component.Identifier.Key.ADD, 0x57); /* Keypad + */
|
||||
public static final KeyboardUsage KEYPAD_ENTER = new KeyboardUsage(Component.Identifier.Key.NUMPADENTER, 0x58); /* Keypad Enter */
|
||||
public static final KeyboardUsage KEYPAD_1 = new KeyboardUsage(Component.Identifier.Key.NUMPAD1, 0x59); /* Keypad 1 or End */
|
||||
public static final KeyboardUsage KEYPAD_2 = new KeyboardUsage(Component.Identifier.Key.NUMPAD2, 0x5A); /* Keypad 2 or Down Arrow */
|
||||
public static final KeyboardUsage KEYPAD_3 = new KeyboardUsage(Component.Identifier.Key.NUMPAD3, 0x5B); /* Keypad 3 or Page Down */
|
||||
public static final KeyboardUsage KEYPAD_4 = new KeyboardUsage(Component.Identifier.Key.NUMPAD4, 0x5C); /* Keypad 4 or Left Arrow */
|
||||
public static final KeyboardUsage KEYPAD_5 = new KeyboardUsage(Component.Identifier.Key.NUMPAD5, 0x5D); /* Keypad 5 */
|
||||
public static final KeyboardUsage KEYPAD_6 = new KeyboardUsage(Component.Identifier.Key.NUMPAD6, 0x5E); /* Keypad 6 or Right Arrow */
|
||||
public static final KeyboardUsage KEYPAD_7 = new KeyboardUsage(Component.Identifier.Key.NUMPAD7, 0x5F); /* Keypad 7 or Home */
|
||||
public static final KeyboardUsage KEYPAD_8 = new KeyboardUsage(Component.Identifier.Key.NUMPAD8, 0x60); /* Keypad 8 or Up Arrow */
|
||||
public static final KeyboardUsage KEYPAD_9 = new KeyboardUsage(Component.Identifier.Key.NUMPAD9, 0x61); /* Keypad 9 or Page Up */
|
||||
public static final KeyboardUsage KEYPAD_0 = new KeyboardUsage(Component.Identifier.Key.NUMPAD0, 0x62); /* Keypad 0 or Insert */
|
||||
public static final KeyboardUsage KEYPAD_PERIOD = new KeyboardUsage(Component.Identifier.Key.DECIMAL, 0x63); /* Keypad . or Delete */
|
||||
public static final KeyboardUsage NONUSBACKSLASH = new KeyboardUsage(Component.Identifier.Key.BACKSLASH, 0x64); /* Non-US \ or | */
|
||||
public static final KeyboardUsage APPLICATION = new KeyboardUsage(Component.Identifier.Key.APPS, 0x65); /* Application */
|
||||
public static final KeyboardUsage POWER = new KeyboardUsage(Component.Identifier.Key.POWER, 0x66); /* Power */
|
||||
public static final KeyboardUsage KEYPAD_EQUALSIGN = new KeyboardUsage(Component.Identifier.Key.NUMPADEQUAL, 0x67); /* Keypad = */
|
||||
public static final KeyboardUsage F13 = new KeyboardUsage(Component.Identifier.Key.F13, 0x68); /* F13 */
|
||||
public static final KeyboardUsage F14 = new KeyboardUsage(Component.Identifier.Key.F14, 0x69); /* F14 */
|
||||
public static final KeyboardUsage F15 = new KeyboardUsage(Component.Identifier.Key.F15, 0x6A); /* F15 */
|
||||
public static final KeyboardUsage F16 = new KeyboardUsage(0x6B); /* F16 */
|
||||
public static final KeyboardUsage F17 = new KeyboardUsage(0x6C); /* F17 */
|
||||
public static final KeyboardUsage F18 = new KeyboardUsage(0x6D); /* F18 */
|
||||
public static final KeyboardUsage F19 = new KeyboardUsage(0x6E); /* F19 */
|
||||
public static final KeyboardUsage F20 = new KeyboardUsage(0x6F); /* F20 */
|
||||
public static final KeyboardUsage F21 = new KeyboardUsage(0x70); /* F21 */
|
||||
public static final KeyboardUsage F22 = new KeyboardUsage(0x71); /* F22 */
|
||||
public static final KeyboardUsage F23 = new KeyboardUsage(0x72); /* F23 */
|
||||
public static final KeyboardUsage F24 = new KeyboardUsage(0x73); /* F24 */
|
||||
public static final KeyboardUsage EXECUTE = new KeyboardUsage(0x74); /* Execute */
|
||||
public static final KeyboardUsage HELP = new KeyboardUsage(0x75); /* Help */
|
||||
public static final KeyboardUsage MENU = new KeyboardUsage(0x76); /* Menu */
|
||||
public static final KeyboardUsage SELECT = new KeyboardUsage(0x77); /* Select */
|
||||
public static final KeyboardUsage STOP = new KeyboardUsage(Component.Identifier.Key.STOP, 0x78); /* Stop */
|
||||
public static final KeyboardUsage AGAIN = new KeyboardUsage(0x79); /* Again */
|
||||
public static final KeyboardUsage UNDO = new KeyboardUsage(0x7A); /* Undo */
|
||||
public static final KeyboardUsage CUT = new KeyboardUsage(0x7B); /* Cut */
|
||||
public static final KeyboardUsage COPY = new KeyboardUsage(0x7C); /* Copy */
|
||||
public static final KeyboardUsage PASTE = new KeyboardUsage(0x7D); /* Paste */
|
||||
public static final KeyboardUsage FIND = new KeyboardUsage(0x7E); /* Find */
|
||||
public static final KeyboardUsage MUTE = new KeyboardUsage(0x7F); /* Mute */
|
||||
public static final KeyboardUsage VOLUMEUP = new KeyboardUsage(0x80); /* Volume Up */
|
||||
public static final KeyboardUsage VOLUMEDOWN = new KeyboardUsage(0x81); /* Volume Down */
|
||||
public static final KeyboardUsage LOCKINGCAPSLOCK = new KeyboardUsage(Component.Identifier.Key.CAPITAL, 0x82); /* Locking Caps Lock */
|
||||
public static final KeyboardUsage LOCKINGNUMLOCK = new KeyboardUsage(Component.Identifier.Key.NUMLOCK, 0x83); /* Locking Num Lock */
|
||||
public static final KeyboardUsage LOCKINGSCROLLLOCK = new KeyboardUsage(Component.Identifier.Key.SCROLL, 0x84); /* Locking Scroll Lock */
|
||||
public static final KeyboardUsage KEYPAD_COMMA = new KeyboardUsage(Component.Identifier.Key.COMMA, 0x85); /* Keypad Comma */
|
||||
public static final KeyboardUsage KEYPAD_EQUALSSIGNAS400 = new KeyboardUsage(0x86); /* Keypad Equal Sign for AS/400 */
|
||||
public static final KeyboardUsage INTERNATIONAL1 = new KeyboardUsage(0x87); /* International1 */
|
||||
public static final KeyboardUsage INTERNATIONAL2 = new KeyboardUsage(0x88); /* International2 */
|
||||
public static final KeyboardUsage INTERNATIONAL3 = new KeyboardUsage(0x89); /* International3 */
|
||||
public static final KeyboardUsage INTERNATIONAL4 = new KeyboardUsage(0x8A); /* International4 */
|
||||
public static final KeyboardUsage INTERNATIONAL5 = new KeyboardUsage(0x8B); /* International5 */
|
||||
public static final KeyboardUsage INTERNATIONAL6 = new KeyboardUsage(0x8C); /* International6 */
|
||||
public static final KeyboardUsage INTERNATIONAL7 = new KeyboardUsage(0x8D); /* International7 */
|
||||
public static final KeyboardUsage INTERNATIONAL8 = new KeyboardUsage(0x8E); /* International8 */
|
||||
public static final KeyboardUsage INTERNATIONAL9 = new KeyboardUsage(0x8F); /* International9 */
|
||||
public static final KeyboardUsage LANG1 = new KeyboardUsage(0x90); /* LANG1 */
|
||||
public static final KeyboardUsage LANG2 = new KeyboardUsage(0x91); /* LANG2 */
|
||||
public static final KeyboardUsage LANG3 = new KeyboardUsage(0x92); /* LANG3 */
|
||||
public static final KeyboardUsage LANG4 = new KeyboardUsage(0x93); /* LANG4 */
|
||||
public static final KeyboardUsage LANG5 = new KeyboardUsage(0x94); /* LANG5 */
|
||||
public static final KeyboardUsage LANG6 = new KeyboardUsage(0x95); /* LANG6 */
|
||||
public static final KeyboardUsage LANG7 = new KeyboardUsage(0x96); /* LANG7 */
|
||||
public static final KeyboardUsage LANG8 = new KeyboardUsage(0x97); /* LANG8 */
|
||||
public static final KeyboardUsage LANG9 = new KeyboardUsage(0x98); /* LANG9 */
|
||||
public static final KeyboardUsage ALTERNATEERASE = new KeyboardUsage(0x99); /* AlternateErase */
|
||||
public static final KeyboardUsage SYSREQORATTENTION = new KeyboardUsage(Component.Identifier.Key.SYSRQ, 0x9A); /* SysReq/Attention */
|
||||
public static final KeyboardUsage CANCEL = new KeyboardUsage(0x9B); /* Cancel */
|
||||
public static final KeyboardUsage CLEAR = new KeyboardUsage(0x9C); /* Clear */
|
||||
public static final KeyboardUsage PRIOR = new KeyboardUsage(Component.Identifier.Key.PAGEUP, 0x9D); /* Prior */
|
||||
public static final KeyboardUsage RETURN = new KeyboardUsage(Component.Identifier.Key.RETURN, 0x9E); /* Return */
|
||||
public static final KeyboardUsage SEPARATOR = new KeyboardUsage(0x9F); /* Separator */
|
||||
public static final KeyboardUsage OUT = new KeyboardUsage(0xA0); /* Out */
|
||||
public static final KeyboardUsage OPER = new KeyboardUsage(0xA1); /* Oper */
|
||||
public static final KeyboardUsage CLEARORAGAIN = new KeyboardUsage(0xA2); /* Clear/Again */
|
||||
public static final KeyboardUsage CRSELORPROPS = new KeyboardUsage(0xA3); /* CrSel/Props */
|
||||
public static final KeyboardUsage EXSEL = new KeyboardUsage(0xA4); /* ExSel */
|
||||
/* 0xA5-0xDF Reserved */
|
||||
public static final KeyboardUsage LEFTCONTROL = new KeyboardUsage(Component.Identifier.Key.LCONTROL, 0xE0); /* Left Control */
|
||||
public static final KeyboardUsage LEFTSHIFT = new KeyboardUsage(Component.Identifier.Key.LSHIFT, 0xE1); /* Left Shift */
|
||||
public static final KeyboardUsage LEFTALT = new KeyboardUsage(Component.Identifier.Key.LALT, 0xE2); /* Left Alt */
|
||||
public static final KeyboardUsage LEFTGUI = new KeyboardUsage(Component.Identifier.Key.LWIN, 0xE3); /* Left GUI */
|
||||
public static final KeyboardUsage RIGHTCONTROL = new KeyboardUsage(Component.Identifier.Key.RCONTROL, 0xE4); /* Right Control */
|
||||
public static final KeyboardUsage RIGHTSHIFT = new KeyboardUsage(Component.Identifier.Key.RSHIFT, 0xE5); /* Right Shift */
|
||||
public static final KeyboardUsage RIGHTALT = new KeyboardUsage(Component.Identifier.Key.RALT, 0xE6); /* Right Alt */
|
||||
public static final KeyboardUsage RIGHTGUI = new KeyboardUsage(Component.Identifier.Key.RWIN, 0xE7); /* Right GUI */
|
||||
|
||||
private final int usage;
|
||||
private final Component.Identifier.Key identifier;
|
||||
|
||||
public final Component.Identifier.Key getIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
|
||||
public final static KeyboardUsage map(int usage) {
|
||||
if (usage < 0 || usage >= map.length)
|
||||
return null;
|
||||
return map[usage];
|
||||
}
|
||||
|
||||
private KeyboardUsage(int usage) {
|
||||
this(Component.Identifier.Key.UNKNOWN, usage);
|
||||
}
|
||||
|
||||
private KeyboardUsage(Component.Identifier.Key id, int usage) {
|
||||
this.identifier = id;
|
||||
this.usage = usage;
|
||||
map[usage] = this;
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "KeyboardUsage (0x" + Integer.toHexString(usage) + ")";
|
||||
}
|
||||
}
|
||||
|
|
@ -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 an OSX AbstractController
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXAbstractController extends AbstractController {
|
||||
private final PortType port;
|
||||
private final OSXHIDQueue queue;
|
||||
private final Type type;
|
||||
|
||||
protected OSXAbstractController(OSXHIDDevice device, OSXHIDQueue queue, Component[] components, Controller[] children, Rumbler[] rumblers, Type type) {
|
||||
super(device.getProductName(), components, children, rumblers);
|
||||
this.queue = queue;
|
||||
this.type = type;
|
||||
this.port = device.getPortType();
|
||||
}
|
||||
|
||||
protected final boolean getNextDeviceEvent(Event event) throws IOException {
|
||||
return OSXControllers.getNextDeviceEvent(event, queue);
|
||||
}
|
||||
|
||||
protected final void setDeviceEventQueueSize(int size) throws IOException {
|
||||
queue.setQueueDepth(size);
|
||||
}
|
||||
|
||||
public Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public final PortType getPortType() {
|
||||
return port;
|
||||
}
|
||||
}
|
||||
70
plugins/OSX/src/java/net/java/games/input/OSXComponent.java
Normal file
70
plugins/OSX/src/java/net/java/games/input/OSXComponent.java
Normal file
|
|
@ -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 an OSX Component
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
class OSXComponent extends AbstractComponent {
|
||||
private final OSXHIDElement element;
|
||||
|
||||
public OSXComponent(Component.Identifier id, OSXHIDElement element) {
|
||||
super(id.getName(), id);
|
||||
this.element = element;
|
||||
}
|
||||
|
||||
public final boolean isRelative() {
|
||||
return element.isRelative();
|
||||
}
|
||||
|
||||
public boolean isAnalog() {
|
||||
return element.isAnalog();
|
||||
}
|
||||
|
||||
public final OSXHIDElement getElement() {
|
||||
return element;
|
||||
}
|
||||
|
||||
protected float poll() throws IOException {
|
||||
return OSXControllers.poll(element);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* %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 OSX specific Controllers
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXControllers {
|
||||
private final static OSXEvent osx_event = new OSXEvent();
|
||||
|
||||
public final static synchronized float poll(OSXHIDElement element) throws IOException {
|
||||
element.getElementValue(osx_event);
|
||||
return element.convertValue(osx_event.getValue());
|
||||
}
|
||||
|
||||
/* synchronized to protect osx_event */
|
||||
public final static synchronized boolean getNextDeviceEvent(Event event, OSXHIDQueue queue) throws IOException {
|
||||
if (queue.getNextEvent(osx_event)) {
|
||||
OSXComponent component = queue.mapEvent(osx_event);
|
||||
event.set(component, component.getElement().convertValue(osx_event.getValue()), osx_event.getNanos());
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -38,447 +38,194 @@
|
|||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.security.AccessController;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.HashMap;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import net.java.games.input.Controller;
|
||||
import net.java.games.input.ControllerEnvironment;
|
||||
import net.java.games.util.plugins.Plugin;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
|
||||
/** OSX HIDManager implementation of controller environment
|
||||
/** OSX HIDManager implementation
|
||||
* @author elias
|
||||
* @author gregorypierce
|
||||
* @version 1.0
|
||||
*/
|
||||
public class OSXEnvironmentPlugin extends ControllerEnvironment implements Plugin
|
||||
{
|
||||
|
||||
|
||||
public static final int HID_DEVICE_MOUSE = 0x02;
|
||||
public static final int HID_DEVICE_JOYSTICK = 0x04;
|
||||
public static final int HID_DEVICE_GAMEPAD = 0x05;
|
||||
public static final int HID_DEVICE_KEYBOARD = 0x06;
|
||||
|
||||
|
||||
public static final int HID_USAGE_POINTER = 0x01;
|
||||
public static final int HID_USAGE_XAXIS = 0x30;
|
||||
public static final int HID_USAGE_YAXIS = 0x31;
|
||||
public static final int HID_USAGE_ZAXIS = 0x32;
|
||||
public static final int HID_USAGE_XAXIS_ROTATION = 0x33;
|
||||
public static final int HID_USAGE_YAXIS_ROTATION = 0x34;
|
||||
public static final int HID_USAGE_ZAXIS_ROTATION = 0x35;
|
||||
public static final int HID_USAGE_SLIDER = 0x36;
|
||||
public static final int HID_USAGE_DIAL = 0x37;
|
||||
public static final int HID_USAGE_WHEEL = 0x38;
|
||||
public static final int HID_USAGE_HAT = 0x39;
|
||||
public static final int HID_USAGE_DPAD_UP = 0x90;
|
||||
public static final int HID_USAGE_DPAD_DOWN = 0x91;
|
||||
public static final int HID_USAGE_DPAD_LEFT = 0x92;
|
||||
public static final int HID_USAGE_DPAD_RIGHT = 0x93;
|
||||
|
||||
|
||||
public static final int HID_USAGE_KEYBOARD_ERRORROLLOVER = 0x01; /* ErrorRollOver */
|
||||
public static final int HID_USAGE_KEYBOARD_POSTFAIL = 0x02; /* POSTFail */
|
||||
public static final int HID_USAGE_KEYBOARD_ERRORUNDEFINED = 0x03; /* ErrorUndefined */
|
||||
public static final int HID_USAGE_KEYBOARD_A = 0x04; /* a or A */
|
||||
public static final int HID_USAGE_KEYBOARD_B = 0x05; /* b or B */
|
||||
public static final int HID_USAGE_KEYBOARD_C = 0x06; /* c or C */
|
||||
public static final int HID_USAGE_KEYBOARD_D = 0x07; /* d or D */
|
||||
public static final int HID_USAGE_KEYBOARD_E = 0x08; /* e or E */
|
||||
public static final int HID_USAGE_KEYBOARD_F = 0x09; /* f or F */
|
||||
public static final int HID_USAGE_KEYBOARD_G = 0x0A; /* g or G */
|
||||
public static final int HID_USAGE_KEYBOARD_H = 0x0B; /* h or H */
|
||||
public static final int HID_USAGE_KEYBOARD_I = 0x0C; /* i or I */
|
||||
public static final int HID_USAGE_KEYBOARD_J = 0x0D; /* j or J */
|
||||
public static final int HID_USAGE_KEYBOARD_K = 0x0E; /* k or K */
|
||||
public static final int HID_USAGE_KEYBOARD_L = 0x0F; /* l or L */
|
||||
public static final int HID_USAGE_KEYBOARD_M = 0x10; /* m or M */
|
||||
public static final int HID_USAGE_KEYBOARD_N = 0x11; /* n or N */
|
||||
public static final int HID_USAGE_KEYBOARD_O = 0x12; /* o or O */
|
||||
public static final int HID_USAGE_KEYBOARD_P = 0x13; /* p or P */
|
||||
public static final int HID_USAGE_KEYBOARD_Q = 0x14; /* q or Q */
|
||||
public static final int HID_USAGE_KEYBOARD_R = 0x15; /* r or R */
|
||||
public static final int HID_USAGE_KEYBOARD_S = 0x16; /* s or S */
|
||||
public static final int HID_USAGE_KEYBOARD_T = 0x17; /* t or T */
|
||||
public static final int HID_USAGE_KEYBOARD_U = 0x18; /* u or U */
|
||||
public static final int HID_USAGE_KEYBOARD_V = 0x19; /* v or V */
|
||||
public static final int HID_USAGE_KEYBOARD_W = 0x1A; /* w or W */
|
||||
public static final int HID_USAGE_KEYBOARD_X = 0x1B; /* x or X */
|
||||
public static final int HID_USAGE_KEYBOARD_Y = 0x1C; /* y or Y */
|
||||
public static final int HID_USAGE_KEYBOARD_Z = 0x1D; /* z or Z */
|
||||
public static final int HID_USAGE_KEYBOARD_1 = 0x1E; /* 1 or ! */
|
||||
public static final int HID_USAGE_KEYBOARD_2 = 0x1F; /* 2 or @ */
|
||||
public static final int HID_USAGE_KEYBOARD_3 = 0x20; /* 3 or # */
|
||||
public static final int HID_USAGE_KEYBOARD_4 = 0x21; /* 4 or $ */
|
||||
public static final int HID_USAGE_KEYBOARD_5 = 0x22; /* 5 or % */
|
||||
public static final int HID_USAGE_KEYBOARD_6 = 0x23; /* 6 or ^ */
|
||||
public static final int HID_USAGE_KEYBOARD_7 = 0x24; /* 7 or & */
|
||||
public static final int HID_USAGE_KEYBOARD_8 = 0x25; /* 8 or * */
|
||||
public static final int HID_USAGE_KEYBOARD_9 = 0x26; /* 9 or ( */
|
||||
public static final int HID_USAGE_KEYBOARD_0 = 0x27; /* 0 or ) */
|
||||
public static final int HID_USAGE_KEYBOARD_ENTER = 0x28; /* Return (Enter) */
|
||||
public static final int HID_USAGE_KEYBOARD_ESCAPE = 0x29; /* Escape */
|
||||
public static final int HID_USAGE_KEYBOARD_BACKSPACE = 0x2A; /* Delete (Backspace) */
|
||||
public static final int HID_USAGE_KEYBOARD_TAB = 0x2B; /* Tab */
|
||||
public static final int HID_USAGE_KEYBOARD_SPACEBAR = 0x2C; /* Spacebar */
|
||||
public static final int HID_USAGE_KEYBOARD_HYPHEN = 0x2D; /* - or _ */
|
||||
public static final int HID_USAGE_KEYBOARD_EQUALSIGN = 0x2E; /* = or + */
|
||||
public static final int HID_USAGE_KEYBOARD_OPENBRACKET = 0x2F; /* [ or { */
|
||||
public static final int HID_USAGE_KEYBOARD_CLOSEBRACKET = 0x30; /* ] or } */
|
||||
public static final int HID_USAGE_KEYBOARD_BACKSLASH = 0x31; /* \ or | */
|
||||
public static final int HID_USAGE_KEYBOARD_NONUSPOUNT = 0x32; /* Non-US # or _ */
|
||||
public static final int HID_USAGE_KEYBOARD_SEMICOLON = 0x33; /* ; or : */
|
||||
public static final int HID_USAGE_KEYBOARD_QUOTE = 0x34; /* ' or " */
|
||||
public static final int HID_USAGE_KEYBOARD_TILDE = 0x35; /* Grave Accent and Tilde */
|
||||
public static final int HID_USAGE_KEYBOARD_COMMA = 0x36; /* , or < */
|
||||
public static final int HID_USAGE_KEYBOARD_PERIOD = 0x37; /* . or > */
|
||||
public static final int HID_USAGE_KEYBOARD_SLASH = 0x38; /* / or ? */
|
||||
public static final int HID_USAGE_KEYBOARD_CAPSLOCK = 0x39; /* Caps Lock */
|
||||
public static final int HID_USAGE_KEYBOARD_F1 = 0x3A; /* F1 */
|
||||
public static final int HID_USAGE_KEYBOARD_F2 = 0x3B; /* F2 */
|
||||
public static final int HID_USAGE_KEYBOARD_F3 = 0x3C; /* F3 */
|
||||
public static final int HID_USAGE_KEYBOARD_F4 = 0x3D; /* F4 */
|
||||
public static final int HID_USAGE_KEYBOARD_F5 = 0x3E; /* F5 */
|
||||
public static final int HID_USAGE_KEYBOARD_F6 = 0x3F; /* F6 */
|
||||
public static final int HID_USAGE_KEYBOARD_F7 = 0x40; /* F7 */
|
||||
public static final int HID_USAGE_KEYBOARD_F8 = 0x41; /* F8 */
|
||||
public static final int HID_USAGE_KEYBOARD_F9 = 0x42; /* F9 */
|
||||
public static final int HID_USAGE_KEYBOARD_F10 = 0x43; /* F10 */
|
||||
public static final int HID_USAGE_KEYBOARD_F11 = 0x44; /* F11 */
|
||||
public static final int HID_USAGE_KEYBOARD_F12 = 0x45; /* F12 */
|
||||
public static final int HID_USAGE_KEYBOARD_PRINTSCREEN = 0x46; /* Print Screen */
|
||||
public static final int HID_USAGE_KEYBOARD_SCROLLLOCK = 0x47; /* Scroll Lock */
|
||||
public static final int HID_USAGE_KEYBOARD_PAUSE = 0x48; /* Pause */
|
||||
public static final int HID_USAGE_KEYBOARD_INSERT = 0x49; /* Insert */
|
||||
public static final int HID_USAGE_KEYBOARD_HOME = 0x4A; /* Home */
|
||||
public static final int HID_USAGE_KEYBOARD_PAGEUP = 0x4B; /* Page Up */
|
||||
public static final int HID_USAGE_KEYBOARD_DELETE = 0x4C; /* Delete Forward */
|
||||
public static final int HID_USAGE_KEYBOARD_END = 0x4D; /* End */
|
||||
public static final int HID_USAGE_KEYBOARD_PAGEDOWN = 0x4E; /* Page Down */
|
||||
public static final int HID_USAGE_KEYBOARD_RIGHTARROW = 0x4F; /* Right Arrow */
|
||||
public static final int HID_USAGE_KEYBOARD_LEFTARROW = 0x50; /* Left Arrow */
|
||||
public static final int HID_USAGE_KEYBOARD_DOWNARROW = 0x51; /* Down Arrow */
|
||||
public static final int HID_USAGE_KEYBOARD_UPARROW = 0x52; /* Up Arrow */
|
||||
public static final int HID_USAGE_KEYPAD_NUMLOCK = 0x53; /* Keypad NumLock or Clear */
|
||||
public static final int HID_USAGE_KEYPAD_SLASH = 0x54; /* Keypad / */
|
||||
public static final int HID_USAGE_KEYPAD_ASTERICK = 0x55; /* Keypad * */
|
||||
public static final int HID_USAGE_KEYPAD_HYPHEN = 0x56; /* Keypad - */
|
||||
public static final int HID_USAGE_KEYPAD_PLUS = 0x57; /* Keypad + */
|
||||
public static final int HID_USAGE_KEYPAD_ENTER = 0x58; /* Keypad Enter */
|
||||
public static final int HID_USAGE_KEYPAD_1 = 0x59; /* Keypad 1 or End */
|
||||
public static final int HID_USAGE_KEYPAD_2 = 0x5A; /* Keypad 2 or Down Arrow */
|
||||
public static final int HID_USAGE_KEYPAD_3 = 0x5B; /* Keypad 3 or Page Down */
|
||||
public static final int HID_USAGE_KEYPAD_4 = 0x5C; /* Keypad 4 or Left Arrow */
|
||||
public static final int HID_USAGE_KEYPAD_5 = 0x5D; /* Keypad 5 */
|
||||
public static final int HID_USAGE_KEYPAD_6 = 0x5E; /* Keypad 6 or Right Arrow */
|
||||
public static final int HID_USAGE_KEYPAD_7 = 0x5F; /* Keypad 7 or Home */
|
||||
public static final int HID_USAGE_KEYPAD_8 = 0x60; /* Keypad 8 or Up Arrow */
|
||||
public static final int HID_USAGE_KEYPAD_9 = 0x61; /* Keypad 9 or Page Up */
|
||||
public static final int HID_USAGE_KEYPAD_0 = 0x62; /* Keypad 0 or Insert */
|
||||
public static final int HID_USAGE_KEYPAD_PERIOD = 0x63; /* Keypad . or Delete */
|
||||
public static final int HID_USAGE_KEYBOARD_NONUSBACKSLASH = 0x64; /* Non-US \ or | */
|
||||
public static final int HID_USAGE_KEYBOARD_APPLICATION = 0x65; /* Application */
|
||||
public static final int HID_USAGE_KEYBOARD_POWER = 0x66; /* Power */
|
||||
public static final int HID_USAGE_KEYPAD_EQUALSIGN = 0x67; /* Keypad = */
|
||||
public static final int HID_USAGE_KEYBOARD_F13 = 0x68; /* F13 */
|
||||
public static final int HID_USAGE_KEYBOARD_F14 = 0x69; /* F14 */
|
||||
public static final int HID_USAGE_KEYBOARD_F15 = 0x6A; /* F15 */
|
||||
public static final int HID_USAGE_KEYBOARD_F16 = 0x6B; /* F16 */
|
||||
public static final int HID_USAGE_KEYBOARD_F17 = 0x6C; /* F17 */
|
||||
public static final int HID_USAGE_KEYBOARD_F18 = 0x6D; /* F18 */
|
||||
public static final int HID_USAGE_KEYBOARD_F19 = 0x6E; /* F19 */
|
||||
public static final int HID_USAGE_KEYBOARD_F20 = 0x6F; /* F20 */
|
||||
public static final int HID_USAGE_KEYBOARD_F21 = 0x70; /* F21 */
|
||||
public static final int HID_USAGE_KEYBOARD_F22 = 0x71; /* F22 */
|
||||
public static final int HID_USAGE_KEYBOARD_F23 = 0x72; /* F23 */
|
||||
public static final int HID_USAGE_KEYBOARD_F24 = 0x73; /* F24 */
|
||||
public static final int HID_USAGE_KEYBOARD_EXECUTE = 0x74; /* Execute */
|
||||
public static final int HID_USAGE_KEYBOARD_HELP = 0x75; /* Help */
|
||||
public static final int HID_USAGE_KEYBOARD_MENU = 0x76; /* Menu */
|
||||
public static final int HID_USAGE_KEYBOARD_SELECT = 0x77; /* Select */
|
||||
public static final int HID_USAGE_KEYBOARD_STOP = 0x78; /* Stop */
|
||||
public static final int HID_USAGE_KEYBOARD_AGAIN = 0x79; /* Again */
|
||||
public static final int HID_USAGE_KEYBOARD_UNDO = 0x7A; /* Undo */
|
||||
public static final int HID_USAGE_KEYBOARD_CUT = 0x7B; /* Cut */
|
||||
public static final int HID_USAGE_KEYBOARD_COPY = 0x7C; /* Copy */
|
||||
public static final int HID_USAGE_KEYBOARD_PASTE = 0x7D; /* Paste */
|
||||
public static final int HID_USAGE_KEYBOARD_FIND = 0x7E; /* Find */
|
||||
public static final int HID_USAGE_KEYBOARD_MUTE = 0x7F; /* Mute */
|
||||
public static final int HID_USAGE_KEYBOARD_VOLUMEUP = 0x80; /* Volume Up */
|
||||
public static final int HID_USAGE_KEYBOARD_VOLUMEDOWN = 0x81; /* Volume Down */
|
||||
public static final int HID_USAGE_KEYBOARD_LOCKINGCAPSLOCK = 0x82; /* Locking Caps Lock */
|
||||
public static final int HID_USAGE_KEYBOARD_LOCKINGNUMLOCK = 0x83; /* Locking Num Lock */
|
||||
public static final int HID_USAGE_KEYBOARD_LOCKINGSCROLLLOCK = 0x84; /* Locking Scroll Lock */
|
||||
public static final int HID_USAGE_KEYPAD_COMMA = 0x85; /* Keypad Comma */
|
||||
public static final int HID_USAGE_KEYPAD_EQUALSSIGNAS400 = 0x86; /* Keypad Equal Sign for AS/400 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL1 = 0x87; /* International1 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL2 = 0x88; /* International2 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL3 = 0x89; /* International3 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL4 = 0x8A; /* International4 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL5 = 0x8B; /* International5 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL6 = 0x8C; /* International6 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL7 = 0x8D; /* International7 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL8 = 0x8E; /* International8 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL9 = 0x8F; /* International9 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG1 = 0x90; /* LANG1 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG2 = 0x91; /* LANG2 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG3 = 0x92; /* LANG3 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG4 = 0x93; /* LANG4 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG5 = 0x94; /* LANG5 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG6 = 0x95; /* LANG6 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG7 = 0x96; /* LANG7 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG8 = 0x97; /* LANG8 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG9 = 0x98; /* LANG9 */
|
||||
public static final int HID_USAGE_KEYBOARD_ALTERNATEERASE = 0x99; /* AlternateErase */
|
||||
public static final int HID_USAGE_KEYBOARD_SYSREQORATTENTION = 0x9A; /* SysReq/Attention */
|
||||
public static final int HID_USAGE_KEYBOARD_CANCEL = 0x9B; /* Cancel */
|
||||
public static final int HID_USAGE_KEYBOARD_CLEAR = 0x9C; /* Clear */
|
||||
public static final int HID_USAGE_KEYBOARD_PRIOR = 0x9D; /* Prior */
|
||||
public static final int HID_USAGE_KEYBOARD_RETURN = 0x9E; /* Return */
|
||||
public static final int HID_USAGE_KEYBOARD_SEPARATOR = 0x9F; /* Separator */
|
||||
public static final int HID_USAGE_KEYBOARD_OUT = 0xA0; /* Out */
|
||||
public static final int HID_USAGE_KEYBOARD_OPER = 0xA1; /* Oper */
|
||||
public static final int HID_USAGE_KEYBOARD_CLEARORAGAIN = 0xA2; /* Clear/Again */
|
||||
public static final int HID_USAGE_KEYBOARD_CRSELORPROPS = 0xA3; /* CrSel/Props */
|
||||
public static final int HID_USAGE_KEYBOARD_EXSEL = 0xA4; /* ExSel */
|
||||
/* 0xA5-0xDF Reserved */
|
||||
public static final int HID_USAGE_KEYBOARD_LEFTCONTROL = 0xE0; /* Left Control */
|
||||
public static final int HID_USAGE_KEYBOARD_LEFTSHIFT = 0xE1; /* Left Shift */
|
||||
public static final int HID_USAGE_KEYBOARD_LEFTALT = 0xE2; /* Left Alt */
|
||||
public static final int HID_USAGE_KEYBOARD_LEFTGUI = 0xE3; /* Left GUI */
|
||||
public static final int HID_USAGE_KEYBOARD_RIGHTCONTROL = 0xE4; /* Right Control */
|
||||
public static final int HID_USAGE_KEYBOARD_RIGHTSHIFT = 0xE5; /* Right Shift */
|
||||
public static final int HID_USAGE_KEYBOARD_RIGHTALT = 0xE6; /* Right Alt */
|
||||
public static final int HID_USAGE_KEYBOARD_RIGHTGUI = 0xE7; /* Right GUI */
|
||||
/* 0xE8-0xFFFF Reserved */
|
||||
public static final int HID_USAGE_KEYBOARD__RESERVED = 0xFFFF;
|
||||
|
||||
|
||||
public static final int HID_USAGEPAGE_UNDEFINED = 0x00;
|
||||
public static final int HID_USAGEPAGE_GENERICDESKTOP = 0x01;
|
||||
public static final int HID_USAGEPAGE_SIMULATION = 0x02;
|
||||
public static final int HID_USAGEPAGE_VR = 0x03;
|
||||
public static final int HID_USAGEPAGE_SPORT = 0x04;
|
||||
public static final int HID_USAGEPAGE_GAME = 0x05;
|
||||
public static final int HID_USAGEPAGE_KEYBOARD = 0x07; /* USB Device Class Definition for Human Interface Devices (HID). Note: the usage type for all key codes is Selector (Sel). */
|
||||
public static final int HID_USAGEPAGE_LED = 0x08;
|
||||
public static final int HID_USAGEPAGE_BUTTON = 0x09;
|
||||
public static final int HID_USAGEPAGE_ORDINAL = 0x0A;
|
||||
public static final int HID_USAGEPAGE_TELEPHONY = 0x0B;
|
||||
public static final int HID_USAGEPAGE_CONSUMER = 0x0C;
|
||||
public static final int HID_USAGEPAGE_DIGITIZER = 0x0D;
|
||||
public static final int HID_USAGEPAGE_PID = 0x0F; /* USB Physical Interface Device definitions for force feedback and related devices. */
|
||||
public static final int HID_USAGEPAGE_UNICODE = 0x10;
|
||||
public static final int HID_USAGEPAGE_ALPHANUMERIC_DISPLAY = 0x14;
|
||||
public static final int HID_USAGEPAGE_POWERDEVICE = 0x84; /* Power Device Page */
|
||||
public static final int HID_USAGEPAGE_BATTERY_SYSTEM = 0x85; /* Battery System Page */
|
||||
public static final int HID_USAGEPAGE_BARCODE_SCANNER = 0x8C; /* (Point of Sale) USB Device Class Definition for Bar Code Scanner Devices */
|
||||
public static final int HID_USAGEPAGE_SCALE = 0x8D; /* (Point of Sale) USB Device Class Definition for Scale Devices */
|
||||
public static final int HID_USAGEPAGE_CAMERA_CONTROL = 0x90; /* USB Device Class Definition for Image Class Devices */
|
||||
public static final int HID_USAGEPAGE_ARCADE = 0x91; /* OAAF Definitions for arcade and coinop related Devices */
|
||||
public static final int HID_USAGEPAGE_VENDOR_DEFINED_START = 0xFF00;
|
||||
|
||||
|
||||
public static final int HID_ELEMENTTYPE_INPUT_MISC = 1;
|
||||
public static final int HID_ELEMENTTYPE_INPUT_BUTTON = 2;
|
||||
public static final int HID_ELEMENTTYPE_INPUT_AXIS = 3;
|
||||
public static final int HID_ELEMENTTYPE_INPUT_SCANCODES = 4;
|
||||
public static final int HID_ELEMENTTYPE_OUTPUT = 129;
|
||||
public static final int HID_ELEMENTTYPE_FEATURE = 257;
|
||||
public static final int HID_ELEMENTTYPE_COLLECTION = 513;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static
|
||||
{
|
||||
System.loadLibrary("jinput");
|
||||
public final class OSXEnvironmentPlugin extends ControllerEnvironment implements Plugin {
|
||||
static {
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
if (isMacOSXEqualsOrBetterThan(10, 4)) {
|
||||
System.loadLibrary("jinput-osx");
|
||||
} else {
|
||||
// If we're not on 10.4 or later, try to load the legacy library first
|
||||
try {
|
||||
System.loadLibrary("jinput-osx-legacy");
|
||||
} catch (UnsatisfiedLinkError e) {
|
||||
System.loadLibrary("jinput-osx");
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public native void hidCreate();
|
||||
public native void hidDispose();
|
||||
public native void enumDevices();
|
||||
private final static boolean isMacOSXEqualsOrBetterThan(int major_required, int minor_required) {
|
||||
String os_version = System.getProperty("os.version");
|
||||
StringTokenizer version_tokenizer = new StringTokenizer(os_version, ".");
|
||||
int major;
|
||||
int minor;
|
||||
try {
|
||||
String major_str = version_tokenizer.nextToken();
|
||||
String minor_str = version_tokenizer.nextToken();
|
||||
major = Integer.parseInt(major_str);
|
||||
minor = Integer.parseInt(minor_str);
|
||||
} catch (Exception e) {
|
||||
ControllerEnvironment.logln("Exception occurred while trying to determine OS version: " + e);
|
||||
// Best guess, no
|
||||
return false;
|
||||
}
|
||||
return major > major_required || (major == major_required && minor >= minor_required);
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens an input device and returns the address of the input queue for that device
|
||||
*/
|
||||
public native long openDevice( long lpDevice, int queueDepth );
|
||||
public native void closeDevice( long lpDevice, long lpQueue );
|
||||
private final Controller[] controllers;
|
||||
|
||||
public OSXEnvironmentPlugin() {
|
||||
this.controllers = enumerateControllers();
|
||||
}
|
||||
|
||||
/**
|
||||
* Polls a device and returns the element top most on the input queue. The elements that
|
||||
* are returned are only those that have had their hidCookies registered with registerDeviceElement.
|
||||
* @param lpQueue
|
||||
* @return
|
||||
*/
|
||||
public native int pollDevice( long lpQueue );
|
||||
public native int pollElement( long lpDevice, long hidCookie );
|
||||
public native void registerDeviceElement( long lpQueue, long hidCookie );
|
||||
public native void deregisterDeviceElement( long lpQueue, long hidCookie );
|
||||
public final Controller[] getControllers() {
|
||||
return controllers;
|
||||
}
|
||||
|
||||
private final static void addElements(OSXHIDQueue queue, List elements, List components, boolean map_mouse_buttons) throws IOException {
|
||||
Iterator it = elements.iterator();
|
||||
while (it.hasNext()) {
|
||||
OSXHIDElement element = (OSXHIDElement)it.next();
|
||||
Component.Identifier id = element.getIdentifier();
|
||||
if (id == null)
|
||||
continue;
|
||||
if (map_mouse_buttons) {
|
||||
if (id == Component.Identifier.Button._0) {
|
||||
id = Component.Identifier.Button.LEFT;
|
||||
} else if (id == Component.Identifier.Button._1) {
|
||||
id = Component.Identifier.Button.RIGHT;
|
||||
} else if (id == Component.Identifier.Button._2) {
|
||||
id = Component.Identifier.Button.MIDDLE;
|
||||
}
|
||||
}
|
||||
OSXComponent component = new OSXComponent(id, element);
|
||||
components.add(component);
|
||||
queue.addElement(element, component);
|
||||
}
|
||||
}
|
||||
|
||||
private HashMap devices = new HashMap();
|
||||
private final static Keyboard createKeyboardFromDevice(OSXHIDDevice device, List elements) throws IOException {
|
||||
List components = new ArrayList();
|
||||
OSXHIDQueue queue = device.createQueue(AbstractController.EVENT_QUEUE_DEPTH);
|
||||
try {
|
||||
addElements(queue, elements, components, false);
|
||||
} catch (IOException e) {
|
||||
queue.release();
|
||||
throw e;
|
||||
}
|
||||
Component[] components_array = new Component[components.size()];
|
||||
components.toArray(components_array);
|
||||
Keyboard keyboard = new OSXKeyboard(device, queue, components_array, new Controller[]{}, new Rumbler[]{});
|
||||
return keyboard;
|
||||
}
|
||||
|
||||
private final static Mouse createMouseFromDevice(OSXHIDDevice device, List elements) throws IOException {
|
||||
List components = new ArrayList();
|
||||
OSXHIDQueue queue = device.createQueue(AbstractController.EVENT_QUEUE_DEPTH);
|
||||
try {
|
||||
addElements(queue, elements, components, true);
|
||||
} catch (IOException e) {
|
||||
queue.release();
|
||||
throw e;
|
||||
}
|
||||
Component[] components_array = new Component[components.size()];
|
||||
components.toArray(components_array);
|
||||
Mouse mouse = new OSXMouse(device, queue, components_array, new Controller[]{}, new Rumbler[]{});
|
||||
if (mouse.getLeft() != null && mouse.getX() != null && mouse.getY() != null) {
|
||||
return mouse;
|
||||
} else {
|
||||
queue.release();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private final static AbstractController createControllerFromDevice(OSXHIDDevice device, List elements, Controller.Type type) throws IOException {
|
||||
List components = new ArrayList();
|
||||
OSXHIDQueue queue = device.createQueue(AbstractController.EVENT_QUEUE_DEPTH);
|
||||
try {
|
||||
addElements(queue, elements, components, false);
|
||||
} catch (IOException e) {
|
||||
queue.release();
|
||||
throw e;
|
||||
}
|
||||
Component[] components_array = new Component[components.size()];
|
||||
components.toArray(components_array);
|
||||
AbstractController controller = new OSXAbstractController(device, queue, components_array, new Controller[]{}, new Rumbler[]{}, type);
|
||||
return controller;
|
||||
}
|
||||
|
||||
public OSXEnvironmentPlugin()
|
||||
{
|
||||
System.out.println("net.java.games.input.OSXEnvironmentPlugin instance created");
|
||||
private final static void createControllersFromDevice(OSXHIDDevice device, List controllers) throws IOException {
|
||||
UsagePair usage_pair = device.getUsagePair();
|
||||
if (usage_pair == null)
|
||||
return;
|
||||
List elements = device.getElements();
|
||||
if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && (usage_pair.getUsage() == GenericDesktopUsage.MOUSE ||
|
||||
usage_pair.getUsage() == GenericDesktopUsage.POINTER)) {
|
||||
Controller mouse = createMouseFromDevice(device, elements);
|
||||
if (mouse != null)
|
||||
controllers.add(mouse);
|
||||
} else if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && (usage_pair.getUsage() == GenericDesktopUsage.KEYBOARD ||
|
||||
usage_pair.getUsage() == GenericDesktopUsage.KEYPAD)) {
|
||||
Controller keyboard = createKeyboardFromDevice(device, elements);
|
||||
if (keyboard != null)
|
||||
controllers.add(keyboard);
|
||||
} else if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && usage_pair.getUsage() == GenericDesktopUsage.JOYSTICK) {
|
||||
Controller joystick = createControllerFromDevice(device, elements, Controller.Type.STICK);
|
||||
if (joystick != null)
|
||||
controllers.add(joystick);
|
||||
} else if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && usage_pair.getUsage() == GenericDesktopUsage.GAME_PAD) {
|
||||
Controller game_pad = createControllerFromDevice(device, elements, Controller.Type.GAMEPAD);
|
||||
if (game_pad != null)
|
||||
controllers.add(game_pad);
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("Creating HID engine");
|
||||
hidCreate();
|
||||
|
||||
System.out.println("Enumerating devices");
|
||||
enumDevices();
|
||||
}
|
||||
|
||||
public void finalize()
|
||||
{
|
||||
System.out.println("Disposing HID engine");
|
||||
hidDispose();
|
||||
}
|
||||
|
||||
public Controller[] getControllers()
|
||||
{
|
||||
return (Controller[])(devices.values().toArray( new Controller[0]));
|
||||
}
|
||||
|
||||
public Controller createController( long lpDevice, String productName, int usage )
|
||||
{
|
||||
|
||||
switch (usage)
|
||||
{
|
||||
case (HID_DEVICE_MOUSE):
|
||||
System.out.println("Found mouse [" + productName + "] device address [" + lpDevice + "]");
|
||||
return new OSXMouse( this, lpDevice, productName );
|
||||
case (HID_DEVICE_JOYSTICK):
|
||||
System.out.println("Found joystick [" + productName + "] device address [" + lpDevice + "]");
|
||||
return new OSXJoystick( this, lpDevice, productName );
|
||||
case (HID_DEVICE_GAMEPAD):
|
||||
System.out.println("Found gamepad [" + productName + "] device address [" + lpDevice + "]");
|
||||
return new OSXGamepad( this, lpDevice, productName );
|
||||
case (HID_DEVICE_KEYBOARD):
|
||||
System.out.println("Found keyboard [" + productName + "] device address [" + lpDevice + "]");
|
||||
return new OSXKeyboard( this, lpDevice, productName );
|
||||
|
||||
default:
|
||||
System.out.println("Found device of unknown or unsupported type. Usage[" + usage + "], ProductName[" + productName + "] - ignoring");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a controller to the device list
|
||||
* @param lpDevice
|
||||
* @param productName
|
||||
* @param usage
|
||||
*/
|
||||
private void addController( long lpDevice, String productName, int usage )
|
||||
{
|
||||
Controller controller = null;
|
||||
|
||||
controller = createController( lpDevice, productName, usage );
|
||||
|
||||
if ( controller != null )
|
||||
{
|
||||
devices.put( new Long(lpDevice), controller );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an InputControllerElement to a device. This method is invoked from native code.
|
||||
* @param lpDevice
|
||||
* @param elementCookie
|
||||
* @param elementType
|
||||
* @param usage
|
||||
* @param usagePage
|
||||
* @param rawMin
|
||||
* @param rawMax
|
||||
* @param scaledMin
|
||||
* @param scaledMax
|
||||
* @param dataBitSize
|
||||
* @param isRelative
|
||||
* @param isWrapping
|
||||
* @param isNonLinear
|
||||
* @param hasPreferredState
|
||||
* @param hasNullState
|
||||
*/
|
||||
private void addControllerElement( long lpDevice,
|
||||
long elementCookie,
|
||||
int elementType,
|
||||
int usage,
|
||||
int usagePage,
|
||||
int rawMin,
|
||||
int rawMax,
|
||||
int scaledMin,
|
||||
int scaledMax,
|
||||
int dataBitSize,
|
||||
boolean isRelative,
|
||||
boolean isWrapping,
|
||||
boolean isNonLinear,
|
||||
boolean hasPreferredState,
|
||||
boolean hasNullState)
|
||||
{
|
||||
InputControllerElement element = new InputControllerElement( elementCookie, elementType, usage, usagePage,
|
||||
rawMin, rawMax, scaledMin, scaledMax,
|
||||
dataBitSize, isRelative, isWrapping, isNonLinear,
|
||||
hasPreferredState, hasNullState );
|
||||
|
||||
|
||||
InputController inputController = (InputController)devices.get( new Long( lpDevice) );
|
||||
if ( inputController != null )
|
||||
{
|
||||
inputController.addControllerElement( element );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void testDevice( long lpDevice )
|
||||
{
|
||||
System.out.println("Opening device ");
|
||||
long lpQueue = openDevice( lpDevice, 32 );
|
||||
|
||||
for ( int i = 0; i < 50; i++ )
|
||||
{
|
||||
try
|
||||
{
|
||||
pollDevice( lpQueue );
|
||||
Thread.sleep(10);
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
System.out.println("Interrupted" + e );
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("Closing device");
|
||||
closeDevice( lpDevice, lpQueue );
|
||||
}
|
||||
|
||||
public static void main (String args[])
|
||||
{
|
||||
System.out.println("Started net.java.games.input.OSXEnvironmentPlugin");
|
||||
OSXEnvironmentPlugin newjni = new OSXEnvironmentPlugin();
|
||||
|
||||
//newjni.hidCreate();
|
||||
|
||||
//newjni.enumDevices();
|
||||
|
||||
|
||||
Controller[] controllers = newjni.getControllers();
|
||||
|
||||
for ( int i = 0; i < controllers.length; i++ )
|
||||
{
|
||||
System.out.println("Controller [" + controllers[i].getName() +"] enumerated...");
|
||||
}
|
||||
|
||||
//newjni.hidDispose();
|
||||
|
||||
System.out.println("Done");
|
||||
}
|
||||
|
||||
}
|
||||
private final static Controller[] enumerateControllers() {
|
||||
List controllers = new ArrayList();
|
||||
try {
|
||||
OSXHIDDeviceIterator it = new OSXHIDDeviceIterator();
|
||||
try {
|
||||
OSXHIDDevice device;
|
||||
while ((device = it.next()) != null) {
|
||||
boolean device_used = false;
|
||||
try {
|
||||
int old_size = controllers.size();
|
||||
createControllersFromDevice(device, controllers);
|
||||
device_used = old_size != controllers.size();
|
||||
} catch (IOException e) {
|
||||
ControllerEnvironment.logln("Failed to create controllers from device: " + device.getProductName());
|
||||
}
|
||||
if (!device_used)
|
||||
device.release();
|
||||
}
|
||||
} finally {
|
||||
it.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
ControllerEnvironment.log("Failed to enumerate device: " + e.getMessage());
|
||||
return new Controller[]{};
|
||||
}
|
||||
Controller[] controllers_array = new Controller[controllers.size()];
|
||||
controllers.toArray(controllers_array);
|
||||
return controllers_array;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
73
plugins/OSX/src/java/net/java/games/input/OSXEvent.java
Normal file
73
plugins/OSX/src/java/net/java/games/input/OSXEvent.java
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* %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;
|
||||
|
||||
/** OSX Event structure corresponding to IOHIDEventStruct
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
class OSXEvent {
|
||||
private long type;
|
||||
private long cookie;
|
||||
private int value;
|
||||
private long nanos;
|
||||
|
||||
public void set(long type, long cookie, int value, long nanos) {
|
||||
this.type = type;
|
||||
this.cookie = cookie;
|
||||
this.value = value;
|
||||
this.nanos = nanos;
|
||||
}
|
||||
|
||||
public long getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public long getCookie() {
|
||||
return cookie;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public long getNanos() {
|
||||
return nanos;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
package net.java.games.input;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: gpierce
|
||||
* Date: Aug 2, 2003
|
||||
* Time: 3:59:09 PM
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class OSXGamepad extends AbstractController implements InputController
|
||||
{
|
||||
private OSXEnvironmentPlugin plugin;
|
||||
private long lpDevice;
|
||||
private long lpQueue;
|
||||
|
||||
public OSXGamepad( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
|
||||
{
|
||||
super( productName );
|
||||
|
||||
this.plugin = plugin;
|
||||
this.lpDevice = lpDevice;
|
||||
|
||||
openDevice();
|
||||
}
|
||||
public boolean poll()
|
||||
{
|
||||
plugin.pollDevice( lpQueue );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void openDevice()
|
||||
{
|
||||
this.lpQueue = plugin.openDevice( this.lpDevice, 32 );
|
||||
}
|
||||
|
||||
public void closeDevice()
|
||||
{
|
||||
plugin.closeDevice( this.lpDevice, this.lpQueue );
|
||||
}
|
||||
|
||||
public void pollDevice()
|
||||
{
|
||||
plugin.pollDevice( this.lpQueue );
|
||||
}
|
||||
|
||||
public void addControllerElement(InputControllerElement element)
|
||||
{
|
||||
switch ( element.getElementType() )
|
||||
{
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_MISC:
|
||||
System.out.println("*Adding misc component");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_BUTTON:
|
||||
System.out.println("*Adding button");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_AXIS:
|
||||
System.out.println("*Adding axis");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_SCANCODES:
|
||||
System.out.println("*Adding scancode");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_OUTPUT:
|
||||
System.out.println("*Adding forcefeedback");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_FEATURE:
|
||||
|
||||
System.out.println("*Adding feature");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_COLLECTION:
|
||||
System.out.println("*Adding collection");
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
318
plugins/OSX/src/java/net/java/games/input/OSXHIDDevice.java
Normal file
318
plugins/OSX/src/java/net/java/games/input/OSXHIDDevice.java
Normal file
|
|
@ -0,0 +1,318 @@
|
|||
/*
|
||||
* %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;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
import java.util.Iterator;
|
||||
|
||||
/** OSX HIDManager implementation
|
||||
* @author elias
|
||||
* @author gregorypierce
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXHIDDevice {
|
||||
private final static int AXIS_DEFAULT_MIN_VALUE = 0;
|
||||
private final static int AXIS_DEFAULT_MAX_VALUE = 64*1024;
|
||||
|
||||
private final static String kIOHIDTransportKey = "Transport";
|
||||
private final static String kIOHIDVendorIDKey = "VendorID";
|
||||
private final static String kIOHIDVendorIDSourceKey = "VendorIDSource";
|
||||
private final static String kIOHIDProductIDKey = "ProductID";
|
||||
private final static String kIOHIDVersionNumberKey = "VersionNumber";
|
||||
private final static String kIOHIDManufacturerKey = "Manufacturer";
|
||||
private final static String kIOHIDProductKey = "Product";
|
||||
private final static String kIOHIDSerialNumberKey = "SerialNumber";
|
||||
private final static String kIOHIDCountryCodeKey = "CountryCode";
|
||||
private final static String kIOHIDLocationIDKey = "LocationID";
|
||||
private final static String kIOHIDDeviceUsageKey = "DeviceUsage";
|
||||
private final static String kIOHIDDeviceUsagePageKey = "DeviceUsagePage";
|
||||
private final static String kIOHIDDeviceUsagePairsKey = "DeviceUsagePairs";
|
||||
private final static String kIOHIDPrimaryUsageKey = "PrimaryUsage";
|
||||
private final static String kIOHIDPrimaryUsagePageKey = "PrimaryUsagePage";
|
||||
private final static String kIOHIDMaxInputReportSizeKey = "MaxInputReportSize";
|
||||
private final static String kIOHIDMaxOutputReportSizeKey = "MaxOutputReportSize";
|
||||
private final static String kIOHIDMaxFeatureReportSizeKey = "MaxFeatureReportSize";
|
||||
|
||||
private final static String kIOHIDElementKey = "Elements";
|
||||
|
||||
private final static String kIOHIDElementCookieKey = "ElementCookie";
|
||||
private final static String kIOHIDElementTypeKey = "Type";
|
||||
private final static String kIOHIDElementCollectionTypeKey = "CollectionType";
|
||||
private final static String kIOHIDElementUsageKey = "Usage";
|
||||
private final static String kIOHIDElementUsagePageKey = "UsagePage";
|
||||
private final static String kIOHIDElementMinKey = "Min";
|
||||
private final static String kIOHIDElementMaxKey = "Max";
|
||||
private final static String kIOHIDElementScaledMinKey = "ScaledMin";
|
||||
private final static String kIOHIDElementScaledMaxKey = "ScaledMax";
|
||||
private final static String kIOHIDElementSizeKey = "Size";
|
||||
private final static String kIOHIDElementReportSizeKey = "ReportSize";
|
||||
private final static String kIOHIDElementReportCountKey = "ReportCount";
|
||||
private final static String kIOHIDElementReportIDKey = "ReportID";
|
||||
private final static String kIOHIDElementIsArrayKey = "IsArray";
|
||||
private final static String kIOHIDElementIsRelativeKey = "IsRelative";
|
||||
private final static String kIOHIDElementIsWrappingKey = "IsWrapping";
|
||||
private final static String kIOHIDElementIsNonLinearKey = "IsNonLinear";
|
||||
private final static String kIOHIDElementHasPreferredStateKey = "HasPreferredState";
|
||||
private final static String kIOHIDElementHasNullStateKey = "HasNullState";
|
||||
private final static String kIOHIDElementUnitKey = "Unit";
|
||||
private final static String kIOHIDElementUnitExponentKey = "UnitExponent";
|
||||
private final static String kIOHIDElementNameKey = "Name";
|
||||
private final static String kIOHIDElementValueLocationKey = "ValueLocation";
|
||||
private final static String kIOHIDElementDuplicateIndexKey = "DuplicateIndex";
|
||||
private final static String kIOHIDElementParentCollectionKey = "ParentCollection";
|
||||
|
||||
private final long device_address;
|
||||
private final long device_interface_address;
|
||||
private final Map properties;
|
||||
|
||||
private boolean released;
|
||||
|
||||
public OSXHIDDevice(long device_address, long device_interface_address) throws IOException {
|
||||
this.device_address = device_address;
|
||||
this.device_interface_address = device_interface_address;
|
||||
this.properties = getDeviceProperties();
|
||||
open();
|
||||
}
|
||||
|
||||
public final Controller.PortType getPortType() {
|
||||
String transport = (String)properties.get(kIOHIDTransportKey);
|
||||
if (transport == null)
|
||||
return Controller.PortType.UNKNOWN;
|
||||
if (transport.equals("USB")) {
|
||||
return Controller.PortType.USB;
|
||||
} else {
|
||||
return Controller.PortType.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
public final String getProductName() {
|
||||
return (String)properties.get(kIOHIDProductKey);
|
||||
}
|
||||
|
||||
private final OSXHIDElement createElementFromElementProperties(Map element_properties) {
|
||||
/* long size = getLongFromProperties(element_properties, kIOHIDElementSizeKey);
|
||||
// ignore elements that can't fit into the 32 bit value field of a hid event
|
||||
if (size > 32)
|
||||
return null;*/
|
||||
long element_cookie = getLongFromProperties(element_properties, kIOHIDElementCookieKey);
|
||||
int element_type_id = getIntFromProperties(element_properties, kIOHIDElementTypeKey);
|
||||
ElementType element_type = ElementType.map(element_type_id);
|
||||
int min = (int)getLongFromProperties(element_properties, kIOHIDElementMinKey, AXIS_DEFAULT_MIN_VALUE);
|
||||
int max = (int)getLongFromProperties(element_properties, kIOHIDElementMaxKey, AXIS_DEFAULT_MAX_VALUE);
|
||||
/* long scaled_min = getLongFromProperties(element_properties, kIOHIDElementScaledMinKey, Long.MIN_VALUE);
|
||||
long scaled_max = getLongFromProperties(element_properties, kIOHIDElementScaledMaxKey, Long.MAX_VALUE);*/
|
||||
UsagePair device_usage_pair = getUsagePair();
|
||||
boolean default_relative = device_usage_pair != null && (device_usage_pair.getUsage() == GenericDesktopUsage.POINTER || device_usage_pair.getUsage() == GenericDesktopUsage.MOUSE);
|
||||
|
||||
boolean is_relative = getBooleanFromProperties(element_properties, kIOHIDElementIsRelativeKey, default_relative);
|
||||
/* boolean is_wrapping = getBooleanFromProperties(element_properties, kIOHIDElementIsWrappingKey);
|
||||
boolean is_non_linear = getBooleanFromProperties(element_properties, kIOHIDElementIsNonLinearKey);
|
||||
boolean has_preferred_state = getBooleanFromProperties(element_properties, kIOHIDElementHasPreferredStateKey);
|
||||
boolean has_null_state = getBooleanFromProperties(element_properties, kIOHIDElementHasNullStateKey);*/
|
||||
int usage = getIntFromProperties(element_properties, kIOHIDElementUsageKey);
|
||||
int usage_page = getIntFromProperties(element_properties, kIOHIDElementUsagePageKey);
|
||||
UsagePair usage_pair = createUsagePair(usage_page, usage);
|
||||
if (usage_pair == null || (element_type != ElementType.INPUT_MISC && element_type != ElementType.INPUT_BUTTON && element_type != ElementType.INPUT_AXIS)) {
|
||||
//System.out.println("element_type = 0x" + element_type + " | usage = " + usage + " | usage_page = " + usage_page);
|
||||
return null;
|
||||
} else {
|
||||
return new OSXHIDElement(this, usage_pair, element_cookie, element_type, min, max, is_relative);
|
||||
}
|
||||
}
|
||||
|
||||
private final void addElements(List elements, Map properties) {
|
||||
Object[] elements_properties = (Object[])properties.get(kIOHIDElementKey);
|
||||
if (elements_properties == null)
|
||||
return;
|
||||
for (int i = 0; i < elements_properties.length; i++) {
|
||||
Map element_properties = (Map)elements_properties[i];
|
||||
OSXHIDElement element = createElementFromElementProperties(element_properties);
|
||||
if (element != null) {
|
||||
elements.add(element);
|
||||
}
|
||||
addElements(elements, element_properties);
|
||||
}
|
||||
}
|
||||
|
||||
public final List getElements() {
|
||||
List elements = new ArrayList();
|
||||
addElements(elements, properties);
|
||||
return elements;
|
||||
}
|
||||
|
||||
private final static long getLongFromProperties(Map properties, String key, long default_value) {
|
||||
Long long_obj = (Long)properties.get(key);
|
||||
if (long_obj == null)
|
||||
return default_value;
|
||||
return long_obj.longValue();
|
||||
}
|
||||
|
||||
private final static boolean getBooleanFromProperties(Map properties, String key, boolean default_value) {
|
||||
return getLongFromProperties(properties, key, default_value ? 1 : 0) != 0;
|
||||
}
|
||||
|
||||
private final static int getIntFromProperties(Map properties, String key) {
|
||||
return (int)getLongFromProperties(properties, key);
|
||||
}
|
||||
|
||||
private final static long getLongFromProperties(Map properties, String key) {
|
||||
Long long_obj = (Long)properties.get(key);
|
||||
return long_obj.longValue();
|
||||
}
|
||||
|
||||
private final static UsagePair createUsagePair(int usage_page_id, int usage_id) {
|
||||
UsagePage usage_page = UsagePage.map(usage_page_id);
|
||||
if (usage_page != null) {
|
||||
Usage usage = usage_page.mapUsage(usage_id);
|
||||
if (usage != null)
|
||||
return new UsagePair(usage_page, usage);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public final UsagePair getUsagePair() {
|
||||
int usage_page_id = getIntFromProperties(properties, kIOHIDPrimaryUsagePageKey);
|
||||
int usage_id = getIntFromProperties(properties, kIOHIDPrimaryUsageKey);
|
||||
return createUsagePair(usage_page_id, usage_id);
|
||||
}
|
||||
|
||||
/*
|
||||
public final List getUsagePairs() {
|
||||
List usage_pairs_list = new ArrayList();
|
||||
Object[] usage_pairs = (Object[])properties.get(kIOHIDDeviceUsagePairsKey);
|
||||
if (usage_pairs == null) {
|
||||
int usage_page_id = getIntFromProperties(properties, kIOHIDPrimaryUsagePageKey);
|
||||
int usage_id = getIntFromProperties(properties, kIOHIDPrimaryUsageKey);
|
||||
UsagePair pair = createUsagePair(usage_page_id, usage_id);
|
||||
if (pair != null)
|
||||
usage_pairs_list.add(pair);
|
||||
}
|
||||
for (int i = 0; i < usage_pairs.length; i++) {
|
||||
Map usage_pair = (Map)usage_pairs[i];
|
||||
int usage_page_id = getIntFromProperties(usage_pair, kIOHIDDeviceUsagePageKey);
|
||||
int usage_id = getIntFromProperties(usage_pair, kIOHIDDeviceUsageKey);
|
||||
UsagePair pair = createUsagePair(usage_page_id, usage_id);
|
||||
if (pair != null)
|
||||
usage_pairs_list.add(pair);
|
||||
}
|
||||
return usage_pairs_list;
|
||||
}
|
||||
*/
|
||||
private final void dumpProperties() {
|
||||
System.out.println(toString());
|
||||
dumpMap("", properties);
|
||||
}
|
||||
|
||||
private final static void dumpArray(String prefix, Object[] array) {
|
||||
System.out.println(prefix + "{");
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
dumpObject(prefix + "\t", array[i]);
|
||||
System.out.println(prefix + ",");
|
||||
}
|
||||
System.out.println(prefix + "}");
|
||||
}
|
||||
|
||||
private final static void dumpMap(String prefix, Map map) {
|
||||
Iterator keys = map.keySet().iterator();
|
||||
while (keys.hasNext()) {
|
||||
Object key = keys.next();
|
||||
Object value = map.get(key);
|
||||
dumpObject(prefix, key);
|
||||
dumpObject(prefix + "\t", value);
|
||||
}
|
||||
}
|
||||
|
||||
private final static void dumpObject(String prefix, Object obj) {
|
||||
if (obj instanceof Long) {
|
||||
Long l = (Long)obj;
|
||||
System.out.println(prefix + "0x" + Long.toHexString(l.longValue()));
|
||||
} else if (obj instanceof Map)
|
||||
dumpMap(prefix, (Map)obj);
|
||||
else if (obj.getClass().isArray())
|
||||
dumpArray(prefix, (Object[])obj);
|
||||
else
|
||||
System.out.println(prefix + obj);
|
||||
}
|
||||
|
||||
private final Map getDeviceProperties() throws IOException {
|
||||
return nGetDeviceProperties(device_address);
|
||||
}
|
||||
private final static native Map nGetDeviceProperties(long device_address) throws IOException;
|
||||
|
||||
public final synchronized void release() throws IOException {
|
||||
try {
|
||||
close();
|
||||
} finally {
|
||||
released = true;
|
||||
nReleaseDevice(device_address, device_interface_address);
|
||||
}
|
||||
}
|
||||
private final static native void nReleaseDevice(long device_address, long device_interface_address);
|
||||
|
||||
public final synchronized void getElementValue(long element_cookie, OSXEvent event) throws IOException {
|
||||
checkReleased();
|
||||
nGetElementValue(device_interface_address, element_cookie, event);
|
||||
}
|
||||
private final static native void nGetElementValue(long device_interface_address, long element_cookie, OSXEvent event) throws IOException;
|
||||
|
||||
public final synchronized OSXHIDQueue createQueue(int queue_depth) throws IOException {
|
||||
checkReleased();
|
||||
long queue_address = nCreateQueue(device_interface_address);
|
||||
return new OSXHIDQueue(queue_address, queue_depth);
|
||||
}
|
||||
private final static native long nCreateQueue(long device_interface_address) throws IOException;
|
||||
|
||||
private final void open() throws IOException {
|
||||
nOpen(device_interface_address);
|
||||
}
|
||||
private final static native void nOpen(long device_interface_address) throws IOException;
|
||||
|
||||
private final void close() throws IOException {
|
||||
nClose(device_interface_address);
|
||||
}
|
||||
private final static native void nClose(long device_interface_address) throws IOException;
|
||||
|
||||
private final void checkReleased() throws IOException {
|
||||
if (released)
|
||||
throw new IOException();
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
/** OSX HIDManager implementation
|
||||
* @author elias
|
||||
* @author gregorypierce
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXHIDDeviceIterator {
|
||||
private final long iterator_address;
|
||||
|
||||
public OSXHIDDeviceIterator() throws IOException {
|
||||
this.iterator_address = nCreateIterator();
|
||||
}
|
||||
private final static native long nCreateIterator();
|
||||
|
||||
public final void close(){
|
||||
nReleaseIterator(iterator_address);
|
||||
}
|
||||
private final static native void nReleaseIterator(long iterator_address);
|
||||
|
||||
public final OSXHIDDevice next() throws IOException {
|
||||
return nNext(iterator_address);
|
||||
}
|
||||
private final static native OSXHIDDevice nNext(long iterator_address) throws IOException;
|
||||
}
|
||||
143
plugins/OSX/src/java/net/java/games/input/OSXHIDElement.java
Normal file
143
plugins/OSX/src/java/net/java/games/input/OSXHIDElement.java
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
/*
|
||||
* %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 an OSX HID Element
|
||||
* @author elias
|
||||
* @author gregorypierce
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXHIDElement {
|
||||
private final OSXHIDDevice device;
|
||||
private final UsagePair usage_pair;
|
||||
private final long element_cookie;
|
||||
private final ElementType element_type;
|
||||
private final int min;
|
||||
private final int max;
|
||||
private final Component.Identifier identifier;
|
||||
private final boolean is_relative;
|
||||
|
||||
public OSXHIDElement(OSXHIDDevice device, UsagePair usage_pair, long element_cookie, ElementType element_type, int min, int max, boolean is_relative) {
|
||||
this.device = device;
|
||||
this.usage_pair = usage_pair;
|
||||
this.element_cookie = element_cookie;
|
||||
this.element_type = element_type;
|
||||
this.min = min;
|
||||
this.max = max;
|
||||
this.identifier = computeIdentifier();
|
||||
this.is_relative = is_relative;
|
||||
}
|
||||
|
||||
private final Component.Identifier computeIdentifier() {
|
||||
if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP) {
|
||||
return ((GenericDesktopUsage)usage_pair.getUsage()).getIdentifier();
|
||||
} else if (usage_pair.getUsagePage() == UsagePage.BUTTON) {
|
||||
return ((ButtonUsage)usage_pair.getUsage()).getIdentifier();
|
||||
} else if (usage_pair.getUsagePage() == UsagePage.KEYBOARD_OR_KEYPAD) {
|
||||
return ((KeyboardUsage)usage_pair.getUsage()).getIdentifier();
|
||||
} else
|
||||
return null;
|
||||
}
|
||||
|
||||
final Component.Identifier getIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
|
||||
final long getCookie() {
|
||||
return element_cookie;
|
||||
}
|
||||
|
||||
final ElementType getType() {
|
||||
return element_type;
|
||||
}
|
||||
|
||||
final boolean isRelative() {
|
||||
return is_relative && identifier instanceof Component.Identifier.Axis;
|
||||
}
|
||||
|
||||
final boolean isAnalog() {
|
||||
return identifier instanceof Component.Identifier.Axis && identifier != Component.Identifier.Axis.POV;
|
||||
}
|
||||
|
||||
private UsagePair getUsagePair() {
|
||||
return usage_pair;
|
||||
}
|
||||
|
||||
final void getElementValue(OSXEvent event) throws IOException {
|
||||
device.getElementValue(element_cookie, event);
|
||||
}
|
||||
|
||||
final float convertValue(float value) {
|
||||
if (identifier == Component.Identifier.Axis.POV) {
|
||||
switch ((int)value) {
|
||||
case 0:
|
||||
return Component.POV.UP;
|
||||
case 1:
|
||||
return Component.POV.UP_RIGHT;
|
||||
case 2:
|
||||
return Component.POV.RIGHT;
|
||||
case 3:
|
||||
return Component.POV.DOWN_RIGHT;
|
||||
case 4:
|
||||
return Component.POV.DOWN;
|
||||
case 5:
|
||||
return Component.POV.DOWN_LEFT;
|
||||
case 6:
|
||||
return Component.POV.LEFT;
|
||||
case 7:
|
||||
return Component.POV.UP_LEFT;
|
||||
case 8:
|
||||
return Component.POV.OFF;
|
||||
default:
|
||||
return Component.POV.OFF;
|
||||
}
|
||||
} else if (identifier instanceof Component.Identifier.Axis && !is_relative) {
|
||||
if (min == max)
|
||||
return 0;
|
||||
else if (value > max)
|
||||
value = max;
|
||||
else if (value < min)
|
||||
value = min;
|
||||
return 2*(value - min)/(max - min) - 1;
|
||||
} else
|
||||
return value;
|
||||
}
|
||||
}
|
||||
141
plugins/OSX/src/java/net/java/games/input/OSXHIDQueue.java
Normal file
141
plugins/OSX/src/java/net/java/games/input/OSXHIDQueue.java
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
* %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;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXHIDQueue {
|
||||
private final Map map = new HashMap();
|
||||
private final long queue_address;
|
||||
|
||||
private boolean released;
|
||||
|
||||
public OSXHIDQueue(long address, int queue_depth) throws IOException {
|
||||
this.queue_address = address;
|
||||
try {
|
||||
createQueue(queue_depth);
|
||||
} catch (IOException e) {
|
||||
release();
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
public final synchronized void setQueueDepth(int queue_depth) throws IOException {
|
||||
checkReleased();
|
||||
stop();
|
||||
close();
|
||||
createQueue(queue_depth);
|
||||
}
|
||||
|
||||
private final void createQueue(int queue_depth) throws IOException {
|
||||
open(queue_depth);
|
||||
try {
|
||||
start();
|
||||
} catch (IOException e) {
|
||||
close();
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
public final OSXComponent mapEvent(OSXEvent event) {
|
||||
return (OSXComponent)map.get(new Long(event.getCookie()));
|
||||
}
|
||||
|
||||
private final void open(int queue_depth) throws IOException {
|
||||
nOpen(queue_address, queue_depth);
|
||||
}
|
||||
private final static native void nOpen(long queue_address, int queue_depth) throws IOException;
|
||||
|
||||
private final void close() throws IOException {
|
||||
nClose(queue_address);
|
||||
}
|
||||
private final static native void nClose(long queue_address) throws IOException;
|
||||
|
||||
private final void start() throws IOException {
|
||||
nStart(queue_address);
|
||||
}
|
||||
private final static native void nStart(long queue_address) throws IOException;
|
||||
|
||||
private final void stop() throws IOException {
|
||||
nStop(queue_address);
|
||||
}
|
||||
private final static native void nStop(long queue_address) throws IOException;
|
||||
|
||||
public final synchronized void release() throws IOException {
|
||||
if (!released) {
|
||||
released = true;
|
||||
try {
|
||||
stop();
|
||||
close();
|
||||
} finally {
|
||||
nReleaseQueue(queue_address);
|
||||
}
|
||||
}
|
||||
}
|
||||
private final static native void nReleaseQueue(long queue_address) throws IOException;
|
||||
|
||||
public final void addElement(OSXHIDElement element, OSXComponent component) throws IOException {
|
||||
nAddElement(queue_address, element.getCookie());
|
||||
map.put(new Long(element.getCookie()), component);
|
||||
}
|
||||
private final static native void nAddElement(long queue_address, long cookie) throws IOException;
|
||||
|
||||
public final void removeElement(OSXHIDElement element) throws IOException {
|
||||
nRemoveElement(queue_address, element.getCookie());
|
||||
map.remove(new Long(element.getCookie()));
|
||||
}
|
||||
private final static native void nRemoveElement(long queue_address, long cookie) throws IOException;
|
||||
|
||||
public final synchronized boolean getNextEvent(OSXEvent event) throws IOException {
|
||||
checkReleased();
|
||||
return nGetNextEvent(queue_address, event);
|
||||
}
|
||||
private final static native boolean nGetNextEvent(long queue_address, OSXEvent event) throws IOException;
|
||||
|
||||
private final void checkReleased() throws IOException {
|
||||
if (released)
|
||||
throw new IOException("Queue is released");
|
||||
}
|
||||
}
|
||||
|
|
@ -1,280 +0,0 @@
|
|||
package net.java.games.input;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* Joystick class which recognizes most of the enhanced joystick features
|
||||
* including:
|
||||
* x, y, and z axis
|
||||
* x, y axis rotation
|
||||
* slider
|
||||
* hat
|
||||
*
|
||||
*/
|
||||
public class OSXJoystick extends AbstractController implements InputController
|
||||
{
|
||||
private OSXEnvironmentPlugin plugin;
|
||||
private long lpDevice;
|
||||
private long lpQueue;
|
||||
private int buttonCount = 0;
|
||||
private List buttons = new ArrayList();
|
||||
|
||||
private Axis xAxis = null;
|
||||
private Axis yAxis = null;
|
||||
private Axis zAxis = null;
|
||||
private Axis xAxisRotation = null;
|
||||
private Axis yAxisRotation = null;
|
||||
private Axis zAxisRotation = null;
|
||||
private Axis slider = null;
|
||||
private Axis hat = null;
|
||||
|
||||
public OSXJoystick( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
|
||||
{
|
||||
super( productName );
|
||||
|
||||
this.plugin = plugin;
|
||||
this.lpDevice = lpDevice;
|
||||
|
||||
openDevice();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of the Controller.
|
||||
*/
|
||||
public Type getType() {
|
||||
return Type.STICK;
|
||||
}
|
||||
|
||||
public boolean poll()
|
||||
{
|
||||
plugin.pollDevice( lpQueue );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void openDevice()
|
||||
{
|
||||
this.lpQueue = plugin.openDevice( this.lpDevice, 32 );
|
||||
}
|
||||
|
||||
public void closeDevice()
|
||||
{
|
||||
plugin.closeDevice( this.lpDevice, this.lpQueue );
|
||||
}
|
||||
|
||||
public void pollDevice()
|
||||
{
|
||||
plugin.pollDevice( this.lpQueue );
|
||||
}
|
||||
|
||||
public Component[] getComponents() {
|
||||
List cpList = new ArrayList(buttons);
|
||||
if (xAxis != null) cpList.add(xAxis);
|
||||
if (yAxis != null) cpList.add(yAxis);
|
||||
if (zAxis != null) cpList.add(zAxis);
|
||||
if (xAxisRotation != null) cpList.add(xAxisRotation);
|
||||
if (yAxisRotation != null) cpList.add(yAxisRotation);
|
||||
if (zAxisRotation != null) cpList.add(zAxisRotation);
|
||||
if (slider != null) cpList.add(slider);
|
||||
if (hat != null) cpList.add(hat);
|
||||
Component[] ca = new Component[cpList.size()];
|
||||
return (Component[]) cpList.toArray(ca);
|
||||
}
|
||||
|
||||
|
||||
public void addControllerElement(InputControllerElement element)
|
||||
{
|
||||
|
||||
switch ( element.getElementType() )
|
||||
{
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_BUTTON:
|
||||
Button button = null;
|
||||
switch (buttonCount) {
|
||||
case 0:
|
||||
button = new Button(Component.Identifier.Button.TRIGGER, element);
|
||||
break;
|
||||
case 1:
|
||||
button = new Button(Component.Identifier.Button._2, element);
|
||||
break;
|
||||
case 2:
|
||||
button = new Button(Component.Identifier.Button._3, element);
|
||||
break;
|
||||
case 3:
|
||||
button = new Button(Component.Identifier.Button._4, element);
|
||||
break;
|
||||
case 4:
|
||||
button = new Button(Component.Identifier.Button._5, element);
|
||||
break;
|
||||
case 5:
|
||||
button = new Button(Component.Identifier.Button._6, element);
|
||||
break;
|
||||
case 6:
|
||||
button = new Button(Component.Identifier.Button._7, element);
|
||||
break;
|
||||
case 7:
|
||||
button = new Button(Component.Identifier.Button._8, element);
|
||||
break;
|
||||
case 8:
|
||||
button = new Button(Component.Identifier.Button._9, element);
|
||||
break;
|
||||
default:
|
||||
String name = String.valueOf(buttonCount + 1);
|
||||
button = new Button(new Component.Identifier.Button(name), element);
|
||||
break;
|
||||
}
|
||||
buttons.add(button);
|
||||
buttonCount++;
|
||||
System.out.println("Adding button [" + buttonCount + "]");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_MISC:
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_AXIS:
|
||||
switch (element.getUsage()) {
|
||||
case OSXEnvironmentPlugin.HID_USAGE_XAXIS:
|
||||
xAxis = new Axis(Component.Identifier.Axis.X, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_YAXIS:
|
||||
yAxis = new Axis(Component.Identifier.Axis.Y, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_ZAXIS:
|
||||
zAxis = new Axis(Component.Identifier.Axis.Z, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_XAXIS_ROTATION:
|
||||
xAxisRotation = new Axis(Component.Identifier.Axis.RX, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_YAXIS_ROTATION:
|
||||
yAxisRotation = new Axis(Component.Identifier.Axis.RY, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_ZAXIS_ROTATION:
|
||||
zAxisRotation = new Axis(Component.Identifier.Axis.RZ, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_SLIDER:
|
||||
slider = new Axis(Component.Identifier.Axis.SLIDER, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_HAT:
|
||||
hat = new Axis(Component.Identifier.Axis.POV, element);
|
||||
break;
|
||||
default:
|
||||
System.out.println("*Unknown axis");
|
||||
break;
|
||||
}
|
||||
|
||||
System.out.println("*Adding axis");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_SCANCODES:
|
||||
System.out.println("*Adding scancode");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_OUTPUT:
|
||||
System.out.println("*Adding forcefeedback");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_FEATURE:
|
||||
|
||||
System.out.println("*Adding feature");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_COLLECTION:
|
||||
System.out.println("*Adding collection");
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mouse button axis implementation
|
||||
*/
|
||||
class Button extends AbstractComponent
|
||||
{
|
||||
|
||||
private long hidCookie;
|
||||
private boolean isRelative;
|
||||
|
||||
|
||||
|
||||
/** Public constructor
|
||||
* @param id An ID of a button to create an obejct to represent.
|
||||
*
|
||||
*/
|
||||
public Button(Component.Identifier.Button id, InputControllerElement element)
|
||||
{
|
||||
super(id.getName(), id);
|
||||
this.hidCookie = element.getHidCookie();
|
||||
this.isRelative = element.isRelative();
|
||||
}
|
||||
|
||||
/** 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 state of controller. (Note: DX8 mice actually
|
||||
* queue state so what is returned is the next state,
|
||||
* not necessarily the most current one.)
|
||||
*/
|
||||
public float getPollData()
|
||||
{
|
||||
return (float) plugin.pollElement( lpDevice, hidCookie );
|
||||
}
|
||||
|
||||
/** 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 true if data is relative, otherwise false.
|
||||
*/
|
||||
public boolean isRelative()
|
||||
{
|
||||
return isRelative;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Mouse button axis implementation
|
||||
*/
|
||||
class Axis extends AbstractComponent
|
||||
{
|
||||
|
||||
private long hidCookie;
|
||||
private boolean isRelative;
|
||||
|
||||
/** Public constructor
|
||||
* @param id An ID of a button to create an obejct to represent.
|
||||
*
|
||||
*/
|
||||
public Axis(Component.Identifier id, InputControllerElement element)
|
||||
{
|
||||
super(id.getName(), id);
|
||||
this.hidCookie = element.getHidCookie();
|
||||
this.isRelative = element.isRelative();
|
||||
}
|
||||
|
||||
/** 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 state of controller. (Note: DX8 mice actually
|
||||
* queue state so what is returned is the next state,
|
||||
* not necessarily the most current one.)
|
||||
*/
|
||||
public float getPollData()
|
||||
{
|
||||
return (float) plugin.pollElement( lpDevice, hidCookie );
|
||||
}
|
||||
|
||||
/** 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 true if data is relative, otherwise false.
|
||||
*/
|
||||
public boolean isRelative()
|
||||
{
|
||||
return isRelative;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,253 +1,68 @@
|
|||
/*
|
||||
* %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.util.HashMap;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: gpierce
|
||||
* Date: Aug 2, 2003
|
||||
* Time: 3:57:58 PM
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class OSXKeyboard extends StandardKeyboard implements InputController
|
||||
{
|
||||
/** Represents an OSX Keyboard
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXKeyboard extends Keyboard {
|
||||
private final PortType port;
|
||||
private final OSXHIDQueue queue;
|
||||
|
||||
protected OSXKeyboard(OSXHIDDevice device, OSXHIDQueue queue, Component[] components, Controller[] children, Rumbler[] rumblers) {
|
||||
super(device.getProductName(), components, children, rumblers);
|
||||
this.queue = queue;
|
||||
this.port = device.getPortType();
|
||||
}
|
||||
|
||||
private final static int[] CROSSTABLE = {
|
||||
0x00, // VOID
|
||||
0x29, // ESCAPE
|
||||
0x1E, // _1
|
||||
0x1F, // _2
|
||||
0x20, // _3
|
||||
0x21, // _4
|
||||
0x22, // _5
|
||||
0x23, // _6
|
||||
0x24, // _7
|
||||
0x25, // _8
|
||||
0x26, // _9
|
||||
0x27, // _0
|
||||
0x2D, // MINUS
|
||||
0x2E, // EQUALS
|
||||
0x2A, // BACK
|
||||
0x2B, // TAB
|
||||
0x14, // Q
|
||||
0x1A, // W
|
||||
0x08, // E
|
||||
0x15, // R
|
||||
0x17, // T
|
||||
0x1C, // Y
|
||||
0x18, // U
|
||||
0x0C, // I
|
||||
0x12, // O
|
||||
0x13, // P
|
||||
0x2F, // [
|
||||
0x30, // ]
|
||||
0x28, // RETURN
|
||||
0xE0, // LEFT CONTROL
|
||||
0x04, // A
|
||||
0x16, // S
|
||||
0x07, // D
|
||||
0x09, // F
|
||||
0x0A, // G
|
||||
0x0B, // H
|
||||
0x0D, // J
|
||||
0x0E, // K
|
||||
0x0F, // L
|
||||
0x33, // ;
|
||||
0x34, // '
|
||||
0x35, // ~
|
||||
0xE1, // /
|
||||
0x31, // BACKSLASH (\)
|
||||
0x1D, // Z
|
||||
0x1B, // X
|
||||
0x06, // C
|
||||
0x19, // V
|
||||
0x05, // B
|
||||
0x11, // N
|
||||
0x10, // M
|
||||
0x36, // ,
|
||||
0x37, // .
|
||||
0x38, // SLASH (/)
|
||||
0xE5, // RSHIFT
|
||||
0x55, // MULT (*)
|
||||
0xE2, // LEFT ALT
|
||||
0x2C, // SPACE
|
||||
0x39, // CAPSLOCK
|
||||
0x3A, // F1
|
||||
0x3B, // F2
|
||||
0x3C, // F3
|
||||
0x3D, // F4
|
||||
0x3E, // F5
|
||||
0x3F, // F6
|
||||
0x40, // F7
|
||||
0x41, // F8
|
||||
0x42, // F9
|
||||
0x43, // F10
|
||||
0x53, // NUMLOCK
|
||||
0x47, // SCROLLLOCK
|
||||
0x5F, // NUMPAD7
|
||||
0x60, // NUMPAD8
|
||||
0x61, // NUMPAD9
|
||||
0x56, // SUBTRACT (KEYPAD -)
|
||||
0x5C, // NUMPAD4
|
||||
0x5D, // NUMPAD5
|
||||
0x5E, // NUMPAD6
|
||||
0x57, // ADD (KEYPAD +)
|
||||
0x59, // NUMPAD1
|
||||
0x5A, // NUMPAD2
|
||||
0x5B, // NUMPAD3
|
||||
0x62, // NUMPAD0
|
||||
0x63, // DECIMAL (KEYPAD .)
|
||||
0x44, // F11
|
||||
0x45, // F12
|
||||
0x68, // F13
|
||||
0x69, // F14
|
||||
0x6A, // F15
|
||||
0x87, // KANA
|
||||
0x88, // CONVERT
|
||||
0x89, // NONCONVERT
|
||||
0x8A, // YEN
|
||||
0x67, // NUMPAD=
|
||||
0x8B, // CIRCUMFLEX
|
||||
0x8C, // AT
|
||||
0x8D, // COLON
|
||||
0x9F, // UNDERLINE
|
||||
0x8E, // KANJI
|
||||
0x78, // STOP
|
||||
0x8F, // AX
|
||||
0x90, // UNLABELED
|
||||
0x58, // NUMPAD ENTER
|
||||
0xE4, // RIGHT CONTROL
|
||||
0x85, // NUMPAD COMMA
|
||||
0x54, // DIVIDE ( NUMPAD /)
|
||||
0x9A, // SYSREQ
|
||||
0xE6, // RIGHT ALT
|
||||
0x48, // PAUSE
|
||||
0x4A, // HOME
|
||||
0x52, // UP
|
||||
0x9D, // PRIOR
|
||||
0x50, // LEFT
|
||||
0x4F, // RIGHT
|
||||
0x4D, // END
|
||||
0x51, // DOWN
|
||||
0xA2, // NEXT
|
||||
0x49, // INSERT
|
||||
0x4C, // DELETE
|
||||
0xE3, // LEFT WIN
|
||||
0xE7, // RIGHT WIN
|
||||
0x65, // APPS
|
||||
0x66, // POWER
|
||||
0x66 // SLEEP
|
||||
};
|
||||
protected final boolean getNextDeviceEvent(Event event) throws IOException {
|
||||
return OSXControllers.getNextDeviceEvent(event, queue);
|
||||
}
|
||||
|
||||
protected final void setDeviceEventQueueSize(int size) throws IOException {
|
||||
queue.setQueueDepth(size);
|
||||
}
|
||||
|
||||
private OSXEnvironmentPlugin plugin;
|
||||
private long lpDevice;
|
||||
private long lpQueue;
|
||||
private HashMap keys = new HashMap();
|
||||
|
||||
private static int[] COOKIETABLE = new int[CROSSTABLE.length ];
|
||||
|
||||
public OSXKeyboard( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
|
||||
{
|
||||
super( productName );
|
||||
|
||||
this.plugin = plugin;
|
||||
this.lpDevice = lpDevice;
|
||||
|
||||
openDevice();
|
||||
}
|
||||
|
||||
public void openDevice()
|
||||
{
|
||||
this.lpQueue = plugin.openDevice( this.lpDevice, 256 );
|
||||
}
|
||||
|
||||
public void closeDevice()
|
||||
{
|
||||
plugin.closeDevice( this.lpDevice, this.lpQueue );
|
||||
}
|
||||
|
||||
public void addControllerElement(InputControllerElement element)
|
||||
{
|
||||
System.out.println("Adding keyboard elements usage page[" + element.getUsagePage() + "] usage [" + element.getUsage() + "] type [" + element.getElementType() + "]" );
|
||||
|
||||
switch( element.getUsagePage() )
|
||||
{
|
||||
case OSXEnvironmentPlugin.HID_USAGEPAGE_KEYBOARD:
|
||||
|
||||
System.out.println("Found keyboard element");
|
||||
|
||||
if ( element.getElementType() == OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_BUTTON )
|
||||
{
|
||||
// register this key with the queue system as all buttons are retrieved from the
|
||||
// input controllers queue
|
||||
//
|
||||
System.out.println("Registering button-key (usage page [" + element.getUsagePage() + "], usage[" + element.getUsage() + "], elementType [" + element.getElementType() + "], hidCookie [" + element.getHidCookie() + "])");
|
||||
|
||||
|
||||
if ( keys.get( new Long( element.getUsage() )) == null )
|
||||
{
|
||||
plugin.registerDeviceElement( lpQueue, element.getHidCookie() );
|
||||
|
||||
keys.put( new Long( element.getUsage() ), element );
|
||||
System.out.println("Registered key [" + element.getHidCookie() + "]");
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("Ignoring key [" + element.getHidCookie() + "] already enumerated.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("Ignoring non-button-key (usage page [" + element.getUsagePage() + "], usage[" + element.getUsage() + "], elementType [" + element.getElementType() + "], hidCookie [" + element.getHidCookie() + "])");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
public boolean poll()
|
||||
{
|
||||
plugin.pollDevice( lpQueue );
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/** Returns whether or not the given key has been pressed since the last
|
||||
* call to poll.
|
||||
* @param key The key whose state to check.
|
||||
* @return true if this key has changed state since last read of its state, false otherwise.
|
||||
*/
|
||||
protected boolean isKeyPressed(Keyboard.Key key)
|
||||
{
|
||||
Component.Identifier.Key id = (Component.Identifier.Key) key.getIdentifier();
|
||||
int keyIndex = id.getKeyIndex();
|
||||
|
||||
// get that key code out of the crosstable and find the proper InputControllerElement/button for that key
|
||||
//
|
||||
//TODO: Optimize this - put the usages in another array the same size as the crosstable so the hidCookies
|
||||
// can be retrieved directly without the Long creation
|
||||
int usage = CROSSTABLE[keyIndex];
|
||||
InputControllerElement element = (InputControllerElement) keys.get( new Long(usage) );
|
||||
|
||||
|
||||
if ( element != null )
|
||||
{
|
||||
int value = plugin.pollElement( lpDevice, element.getHidCookie() );
|
||||
|
||||
System.out.println("Key Poll result [" + value + "]");
|
||||
if ( value == 1 )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
public final PortType getPortType() {
|
||||
return port;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,251 +1,68 @@
|
|||
/*
|
||||
* %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;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: gpierce
|
||||
* Date: Aug 2, 2003
|
||||
* Time: 3:57:00 PM
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class OSXMouse extends Mouse implements InputController
|
||||
{
|
||||
private OSXEnvironmentPlugin plugin;
|
||||
private long lpDevice;
|
||||
private long lpQueue;
|
||||
private int buttonCount = 0;
|
||||
import java.io.IOException;
|
||||
|
||||
/** Represents an OSX Mouse
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXMouse extends Mouse {
|
||||
private final PortType port;
|
||||
private final OSXHIDQueue queue;
|
||||
|
||||
protected OSXMouse(OSXHIDDevice device, OSXHIDQueue queue, Component[] components, Controller[] children, Rumbler[] rumblers) {
|
||||
super(device.getProductName(), components, children, rumblers);
|
||||
this.queue = queue;
|
||||
this.port = device.getPortType();
|
||||
}
|
||||
|
||||
public OSXMouse( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
|
||||
{
|
||||
super( productName );
|
||||
protected final boolean getNextDeviceEvent(Event event) throws IOException {
|
||||
return OSXControllers.getNextDeviceEvent(event, queue);
|
||||
}
|
||||
|
||||
this.plugin = plugin;
|
||||
this.lpDevice = lpDevice;
|
||||
|
||||
openDevice();
|
||||
|
||||
buttons = new ButtonsImpl();
|
||||
ball = new BallImpl();
|
||||
}
|
||||
|
||||
public void openDevice()
|
||||
{
|
||||
this.lpQueue = plugin.openDevice( this.lpDevice, 32 );
|
||||
}
|
||||
|
||||
public void closeDevice()
|
||||
{
|
||||
plugin.closeDevice( this.lpDevice, this.lpQueue );
|
||||
}
|
||||
|
||||
public boolean poll()
|
||||
{
|
||||
plugin.pollDevice( this.lpQueue );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void addControllerElement(InputControllerElement element)
|
||||
{
|
||||
|
||||
switch ( element.getUsagePage() )
|
||||
{
|
||||
case OSXEnvironmentPlugin.HID_USAGEPAGE_BUTTON:
|
||||
buttonCount ++;
|
||||
System.out.println("Adding button [" + buttonCount + "]");
|
||||
((ButtonsImpl)buttons).addButton(element);
|
||||
break;
|
||||
|
||||
|
||||
case OSXEnvironmentPlugin.HID_USAGEPAGE_GENERICDESKTOP:
|
||||
switch( element.getUsage() )
|
||||
{
|
||||
case OSXEnvironmentPlugin.HID_USAGE_POINTER:
|
||||
System.out.println("Adding pointer - this will contain axis");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_USAGE_XAXIS:
|
||||
((BallImpl)ball).addXAxis(element);
|
||||
System.out.println("Adding X Axis") ;
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_USAGE_YAXIS:
|
||||
((BallImpl)ball).addYAxis(element);
|
||||
System.out.println("Adding Y Axis");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_USAGE_WHEEL:
|
||||
((BallImpl)ball).addWheelAxis(element);
|
||||
System.out.println("Adding wheel");
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation class representing the mouse ball
|
||||
*/
|
||||
class BallImpl extends Ball
|
||||
{
|
||||
/**
|
||||
* Public constructor
|
||||
*/
|
||||
public BallImpl()
|
||||
{
|
||||
super(OSXMouse.this.getName() + " ball");
|
||||
}
|
||||
|
||||
public void addXAxis( InputControllerElement element )
|
||||
{
|
||||
x = new BallAxis(Component.Identifier.Axis.X, element );
|
||||
}
|
||||
|
||||
public void addYAxis( InputControllerElement element )
|
||||
{
|
||||
y = new BallAxis( Component.Identifier.Axis.Y, element );
|
||||
}
|
||||
|
||||
public void addWheelAxis( InputControllerElement element )
|
||||
{
|
||||
wheel = new BallAxis( Component.Identifier.Axis.SLIDER, element );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Implementation class representing the mouse buttons
|
||||
*/
|
||||
class ButtonsImpl extends Buttons
|
||||
{
|
||||
/**
|
||||
* Public constructor
|
||||
*/
|
||||
public ButtonsImpl()
|
||||
{
|
||||
super(OSXMouse.this.getName() + " buttons");
|
||||
}
|
||||
|
||||
public void addButton( InputControllerElement element )
|
||||
{
|
||||
if ( left == null )
|
||||
{
|
||||
left = new ButtonImpl( Component.Identifier.Button.LEFT, element );
|
||||
}
|
||||
else if ( right == null )
|
||||
{
|
||||
right = new ButtonImpl( Component.Identifier.Button.RIGHT, element );
|
||||
}
|
||||
else if ( middle == null )
|
||||
{
|
||||
middle = new ButtonImpl( Component.Identifier.Button.MIDDLE, element );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mouse button axis implementation
|
||||
*/
|
||||
class ButtonImpl extends Button
|
||||
{
|
||||
|
||||
private long hidCookie;
|
||||
private boolean isRelative;
|
||||
|
||||
|
||||
/** Public constructor
|
||||
* @param id An ID of a button to create an obejct to represent.
|
||||
*
|
||||
*/
|
||||
public ButtonImpl(Component.Identifier.Button id, InputControllerElement element)
|
||||
{
|
||||
super(id.getName(), id);
|
||||
this.hidCookie = element.getHidCookie();
|
||||
this.isRelative = element.isRelative();
|
||||
}
|
||||
|
||||
/** 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 state of controller. (Note: DX8 mice actually
|
||||
* queue state so what is returned is the next state,
|
||||
* not necessarily the most current one.)
|
||||
*/
|
||||
public float getPollData()
|
||||
{
|
||||
return (float) plugin.pollElement( lpDevice, hidCookie );
|
||||
}
|
||||
|
||||
/** 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 true if data is relative, otherwise false.
|
||||
*/
|
||||
public boolean isRelative()
|
||||
{
|
||||
return isRelative;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Mouse ball axis implementation
|
||||
*/
|
||||
class BallAxis extends AbstractComponent
|
||||
{
|
||||
|
||||
private long hidCookie;
|
||||
private boolean isRelative;
|
||||
|
||||
/** Public constructor
|
||||
* @param id An ID for a mouse axis to create an object to represent.
|
||||
*/
|
||||
public BallAxis(Component.Identifier.Axis id, InputControllerElement element)
|
||||
{
|
||||
super(id.getName(), id);
|
||||
|
||||
this.hidCookie = element.getHidCookie();
|
||||
this.isRelative = element.isRelative();
|
||||
}
|
||||
|
||||
/** 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 data. (Note that mice queue state in DX8 so what
|
||||
* is returned is the next stae in the queue, not
|
||||
* necessarily the most current one.)
|
||||
*/
|
||||
public float getPollData()
|
||||
{
|
||||
return (float) plugin.pollElement( lpDevice, hidCookie );
|
||||
}
|
||||
|
||||
/** 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 true if relative, otherwise false.
|
||||
*/
|
||||
public boolean isRelative()
|
||||
{
|
||||
return isRelative;
|
||||
}
|
||||
|
||||
/** Returns whether or not the axis is analog, or false if it is digital.
|
||||
* @return true if analog, false if digital
|
||||
*/
|
||||
public boolean isAnalog()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
protected final void setDeviceEventQueueSize(int size) throws IOException {
|
||||
queue.setQueueDepth(size);
|
||||
}
|
||||
|
||||
public final PortType getPortType() {
|
||||
return port;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
46
plugins/OSX/src/java/net/java/games/input/Usage.java
Normal file
46
plugins/OSX/src/java/net/java/games/input/Usage.java
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* %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;
|
||||
|
||||
/** Generic Desktop Usages
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
public interface Usage {
|
||||
}
|
||||
114
plugins/OSX/src/java/net/java/games/input/UsagePage.java
Normal file
114
plugins/OSX/src/java/net/java/games/input/UsagePage.java
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* %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.lang.reflect.Method;
|
||||
|
||||
/** HID Usage pages
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class UsagePage {
|
||||
private final static UsagePage[] map = new UsagePage[0xFF];
|
||||
|
||||
public final static UsagePage UNDEFINED = new UsagePage(0x00);
|
||||
public final static UsagePage GENERIC_DESKTOP = new UsagePage(0x01, GenericDesktopUsage.class);
|
||||
public final static UsagePage SIMULATION = new UsagePage(0x02);
|
||||
public final static UsagePage VR = new UsagePage(0x03);
|
||||
public final static UsagePage SPORT = new UsagePage(0x04);
|
||||
public final static UsagePage GAME = new UsagePage(0x05);
|
||||
/* Reserved 0x06 */
|
||||
public final static UsagePage KEYBOARD_OR_KEYPAD = new UsagePage(0x07, KeyboardUsage.class); /* USB Device Class Definition for Human Interface Devices (HID). Note: the usage type for all key codes is Selector (Sel). */
|
||||
public final static UsagePage LEDS = new UsagePage(0x08);
|
||||
public final static UsagePage BUTTON = new UsagePage(0x09, ButtonUsage.class);
|
||||
public final static UsagePage ORDINAL = new UsagePage(0x0A);
|
||||
public final static UsagePage TELEPHONY = new UsagePage(0x0B);
|
||||
public final static UsagePage CONSUMER = new UsagePage(0x0C);
|
||||
public final static UsagePage DIGITIZER = new UsagePage(0x0D);
|
||||
/* Reserved 0x0E */
|
||||
public final static UsagePage PID = new UsagePage(0x0F); /* USB Physical Interface Device definitions for force feedback and related devices. */
|
||||
public final static UsagePage UNICODE = new UsagePage(0x10);
|
||||
/* Reserved 0x11 - 0x13 */
|
||||
public final static UsagePage ALPHANUMERIC_DISPLAY = new UsagePage(0x14);
|
||||
/* Reserved 0x15 - 0x7F */
|
||||
/* Monitor 0x80 - 0x83 USB Device Class Definition for Monitor Devices */
|
||||
/* Power 0x84 - 0x87 USB Device Class Definition for Power Devices */
|
||||
public final static UsagePage POWER_DEVICE = new UsagePage(0x84); /* Power Device Page */
|
||||
public final static UsagePage BATTERY_SYSTEM = new UsagePage(0x85); /* Battery System Page */
|
||||
/* Reserved 0x88 - 0x8B */
|
||||
public final static UsagePage BAR_CODE_SCANNER = new UsagePage(0x8C); /* (Point of Sale) USB Device Class Definition for Bar Code Scanner Devices */
|
||||
public final static UsagePage SCALE = new UsagePage(0x8D); /* (Point of Sale) USB Device Class Definition for Scale Devices */
|
||||
/* ReservedPointofSalepages 0x8E - 0X8F */
|
||||
public final static UsagePage CAMERACONTROL= new UsagePage(0x90); /* USB Device Class Definition for Image Class Devices */
|
||||
public final static UsagePage ARCADE = new UsagePage(0x91); /* OAAF Definitions for arcade and coinop related Devices */
|
||||
private final Class usage_class;
|
||||
private final int usage_page_id;
|
||||
|
||||
public final static UsagePage map(int page_id) {
|
||||
if (page_id < 0 || page_id >= map.length)
|
||||
return null;
|
||||
return map[page_id];
|
||||
}
|
||||
|
||||
private UsagePage(int page_id, Class usage_class) {
|
||||
map[page_id] = this;
|
||||
this.usage_class = usage_class;
|
||||
this.usage_page_id = page_id;
|
||||
}
|
||||
|
||||
private UsagePage(int page_id) {
|
||||
this(page_id, null);
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "UsagePage (0x" + Integer.toHexString(usage_page_id) + ")";
|
||||
}
|
||||
|
||||
public final Usage mapUsage(int usage_id) {
|
||||
if (usage_class == null)
|
||||
return null;
|
||||
try {
|
||||
Method map_method = usage_class.getMethod("map", new Class[]{int.class});
|
||||
Object result = map_method.invoke(null, new Object[]{new Integer(usage_id)});
|
||||
return (Usage)result;
|
||||
} catch (Exception e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
76
plugins/OSX/src/java/net/java/games/input/UsagePair.java
Normal file
76
plugins/OSX/src/java/net/java/games/input/UsagePair.java
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* %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;
|
||||
|
||||
/** Usage/Page pair
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
class UsagePair {
|
||||
private final UsagePage usage_page;
|
||||
private final Usage usage;
|
||||
|
||||
public UsagePair(UsagePage usage_page, Usage usage) {
|
||||
this.usage_page = usage_page;
|
||||
this.usage = usage;
|
||||
}
|
||||
|
||||
public final UsagePage getUsagePage() {
|
||||
return usage_page;
|
||||
}
|
||||
|
||||
public final Usage getUsage() {
|
||||
return usage;
|
||||
}
|
||||
|
||||
public final int hashCode() {
|
||||
return usage.hashCode() ^ usage_page.hashCode();
|
||||
}
|
||||
|
||||
public final boolean equals(Object other) {
|
||||
if (!(other instanceof UsagePair))
|
||||
return false;
|
||||
UsagePair other_pair = (UsagePair)other;
|
||||
return other_pair.usage.equals(usage) && other_pair.usage_page.equals(usage_page);
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "UsagePair: (page = " + usage_page + ", usage = " + usage + ")";
|
||||
}
|
||||
}
|
||||
|
|
@ -1,23 +1,67 @@
|
|||
<?xml version="1.0" ?>
|
||||
<project name="OS X Plugin, Native code" basedir="." default="compileNativeJinputLib">
|
||||
<description>OSX JInput Native Plugin</description>
|
||||
<property name="src" location="src" />
|
||||
<property name="build" location="classes" />
|
||||
<property name="dist" location="../../dist" />
|
||||
<property name="plugins" location="plugins" />
|
||||
|
||||
<target name="init">
|
||||
<mkdir dir="build"/>
|
||||
</target>
|
||||
<description>OSX JInput Native Plugin</description>
|
||||
|
||||
<target name="compileNativeJinputLib" depends="init">
|
||||
<exec dir="." executable="cc" os="Mac OS X">
|
||||
|
||||
<arg line="-c -I${java.home}/include jinputjnilib.c"/>
|
||||
</exec>
|
||||
<exec dir="." executable="cc" os="Mac OS X">
|
||||
<arg line="-bundle -o libjinput.jnilib jinputjnilib.o -framework JavaVM -framework CoreFoundation -framework IOKit "/>
|
||||
</exec>
|
||||
</target>
|
||||
<target name="init">
|
||||
<mkdir dir="universal"/>
|
||||
<mkdir dir="legacy"/>
|
||||
</target>
|
||||
|
||||
<target name="clean">
|
||||
<delete failonerror="false">
|
||||
<fileset dir="universal"/>
|
||||
<fileset dir="legacy"/>
|
||||
</delete>
|
||||
</target>
|
||||
|
||||
<target name="compile">
|
||||
<apply dir="${dstdir}" executable="${compiler}" os="Mac OS X" skipemptyfilesets="true" failonerror="true" dest="${dstdir}">
|
||||
<arg line="${cflags} -O2 -Wall -c -fPIC -I${sdkroot}/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers -I../../../../common/src/native -I.."/>
|
||||
<mapper type="glob" from="*.c" to="*.o"/>
|
||||
<fileset dir="." includes="*.c"/>
|
||||
<fileset dir="../../../common/src/native" includes="*.c"/>
|
||||
</apply>
|
||||
</target>
|
||||
|
||||
<target name="link">
|
||||
<apply dir="." parallel="true" executable="${linker}" os="Mac OS X" failonerror="true">
|
||||
<arg line="${linkerflags} -dynamiclib -o ${libname} -framework JavaVM -framework CoreFoundation -framework IOKit -framework CoreServices"/>
|
||||
<fileset dir="${objdir}" includes="*.o"/>
|
||||
</apply>
|
||||
<apply dir="." parallel="true" executable="strip" os="Mac OS X" failonerror="true">
|
||||
<arg line="-S -X"/>
|
||||
<fileset dir="." includes="*.jnilib"/>
|
||||
</apply>
|
||||
</target>
|
||||
|
||||
<target name="compileNativeJinputLib" depends="init">
|
||||
<property name="universal_sdkroot" location="/Developer/SDKs/MacOSX10.4u.sdk"/>
|
||||
<property name="legacy_sdkroot" location="/Developer/SDKs/MacOSX10.3.9.sdk"/>
|
||||
<property name="universal_flags" value="-isysroot ${universal_sdkroot} -arch i386 -arch ppc"/>
|
||||
<antcall target="compile">
|
||||
<param name="dstdir" location="universal"/>
|
||||
<param name="compiler" value="gcc-4.0"/>
|
||||
<param name="sdkroot" location="${universal_sdkroot}"/>
|
||||
<param name="cflags" value="${universal_flags}"/>
|
||||
</antcall>
|
||||
<antcall target="link">
|
||||
<param name="objdir" location="universal"/>
|
||||
<param name="libname" value="libjinput-osx.jnilib"/>
|
||||
<param name="linker" value="gcc-4.0"/>
|
||||
<!-- <param name="linkerflags" value="${universal_flags} -Wl,-syslibroot,${universal_sdkroot}"/>-->
|
||||
<param name="linkerflags" value="${universal_flags}"/>
|
||||
</antcall>
|
||||
<antcall target="compile">
|
||||
<param name="dstdir" location="legacy"/>
|
||||
<param name="compiler" value="gcc-3.3"/>
|
||||
<param name="sdkroot" location="${legacy_sdkroot}"/>
|
||||
<param name="cflags" value=""/>
|
||||
</antcall>
|
||||
<antcall target="link">
|
||||
<param name="objdir" location="legacy"/>
|
||||
<param name="libname" value="libjinput-osx-legacy.jnilib"/>
|
||||
<param name="linker" value="gcc-3.3"/>
|
||||
<param name="linkerflags" value=""/>
|
||||
</antcall>
|
||||
</target>
|
||||
</project>
|
||||
|
|
|
|||
|
|
@ -1,839 +0,0 @@
|
|||
/*
|
||||
* %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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <ctype.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sysexits.h>
|
||||
#include <mach/mach.h>
|
||||
#include <mach/mach_error.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
#include <IOKit/hid/IOHIDKeys.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <Carbon/Carbon.h>
|
||||
#include "net_java_games_input_OSXEnvironmentPlugin.h"
|
||||
|
||||
Boolean init( JNIEnv * env );
|
||||
void createMasterPort();
|
||||
void disposeMasterPort();
|
||||
|
||||
|
||||
void createHIDDevice(io_object_t hidDevice, IOHIDDeviceInterface ***hidDeviceInterface);
|
||||
IOReturn openDevice(IOHIDDeviceInterface ***hidDeviceInterface);
|
||||
IOReturn closeDevice(IOHIDDeviceInterface ***hidDeviceInterface);
|
||||
|
||||
|
||||
Boolean showDictionaryElement (CFDictionaryRef dictionary, CFStringRef key);
|
||||
void showProperty(const void * key, const void * value);
|
||||
void displayCFProperty(CFStringRef object, CFTypeRef value);
|
||||
void CFObjectShow( CFTypeRef value );
|
||||
void CFObjectSend( CFTypeRef value );
|
||||
|
||||
jclass CLASS_JNIWrapper = NULL;
|
||||
jmethodID MID_AddController = NULL;
|
||||
jmethodID MID_AddControllerElement = NULL;
|
||||
mach_port_t masterPort = NULL;
|
||||
io_iterator_t hidObjectIterator;
|
||||
|
||||
long elementCookie;
|
||||
long elementType;
|
||||
long usage;
|
||||
long usagePage;
|
||||
long min;
|
||||
long max;
|
||||
long scaledMin;
|
||||
long scaledMax;
|
||||
long size;
|
||||
jboolean isRelative;
|
||||
jboolean isWrapping;
|
||||
jboolean isNonLinear;
|
||||
|
||||
|
||||
JNIEnv * lpEnv;
|
||||
jlong lpDevice;
|
||||
jobject lpObj;
|
||||
jboolean completeElement = JNI_FALSE;
|
||||
|
||||
|
||||
|
||||
|
||||
Boolean showDictionaryElement (CFDictionaryRef dictionary, CFStringRef key)
|
||||
{
|
||||
CFTypeRef value = CFDictionaryGetValue (dictionary, key);
|
||||
if (value)
|
||||
{
|
||||
const char * c = CFStringGetCStringPtr (key, CFStringGetSystemEncoding ());
|
||||
if (c)
|
||||
{
|
||||
printf ("%s", c);
|
||||
}
|
||||
else
|
||||
{
|
||||
CFIndex bufferSize = CFStringGetLength (key) + 1;
|
||||
char * buffer = (char *)malloc (bufferSize);
|
||||
if (buffer)
|
||||
{
|
||||
if (CFStringGetCString (key, buffer, bufferSize, CFStringGetSystemEncoding ()))
|
||||
printf ("%s", buffer);
|
||||
free(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
printf("=");
|
||||
|
||||
CFObjectShow( value );
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
return (value != NULL);
|
||||
}
|
||||
|
||||
static void showCFArray (const void * value, void * parameter)
|
||||
{
|
||||
if (CFGetTypeID (value) != CFDictionaryGetTypeID ())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CFObjectShow(value);
|
||||
}
|
||||
|
||||
void CFObjectShow( CFTypeRef value )
|
||||
{
|
||||
CFTypeID type = CFGetTypeID(value);
|
||||
if (type == CFArrayGetTypeID())
|
||||
{
|
||||
CFRange range = {0, CFArrayGetCount (value)};
|
||||
|
||||
//Show an element array containing one or more element dictionaries
|
||||
CFArrayApplyFunction (value, range, showCFArray, 0);
|
||||
}
|
||||
else if (type == CFBooleanGetTypeID())
|
||||
{
|
||||
printf(CFBooleanGetValue(value) ? "true" : "false");
|
||||
}
|
||||
else if (type == CFDictionaryGetTypeID())
|
||||
{
|
||||
printf("Map\n");
|
||||
|
||||
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementCookieKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementCollectionTypeKey));
|
||||
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementMinKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementMaxKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementScaledMinKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementScaledMaxKey));
|
||||
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementSizeKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementIsRelativeKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementIsWrappingKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementIsNonLinearKey));
|
||||
#ifdef kIOHIDElementHasPreferredStateKey
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementHasPreferredStateKey));
|
||||
#else
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementHasPreferedStateKey));
|
||||
#endif
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementHasNullStateKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementVendorSpecificKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementUnitKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementUnitExponentKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementNameKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementKey));
|
||||
|
||||
printf("\n\n\n");
|
||||
}
|
||||
else if (type == CFNumberGetTypeID())
|
||||
{
|
||||
long number;
|
||||
if (CFNumberGetValue (value, kCFNumberLongType, &number))
|
||||
{
|
||||
printf("0x%lx (%ld)", number, number);
|
||||
}
|
||||
}
|
||||
else if (type == CFStringGetTypeID())
|
||||
{
|
||||
const char * c = CFStringGetCStringPtr (value, CFStringGetSystemEncoding ());
|
||||
if (c)
|
||||
{
|
||||
printf ("%s", c);
|
||||
}
|
||||
else
|
||||
{
|
||||
CFIndex bufferSize = CFStringGetLength (value) + 1;
|
||||
char * buffer = (char *)malloc (bufferSize);
|
||||
if (buffer)
|
||||
{
|
||||
if (CFStringGetCString (value, buffer, bufferSize, CFStringGetSystemEncoding ()))
|
||||
{
|
||||
printf ("%s", buffer);
|
||||
}
|
||||
|
||||
free(buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
Boolean init(JNIEnv* env)
|
||||
{
|
||||
CLASS_JNIWrapper = (*env)->FindClass(env,"net/java/games/input/OSXEnvironmentPlugin");
|
||||
if ( CLASS_JNIWrapper == NULL )
|
||||
{
|
||||
printf("Class OSXEnvironmentPlugin not found... \n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MID_AddController = (*env)->GetMethodID(env, CLASS_JNIWrapper, "addController", "(JLjava/lang/String;I)V");
|
||||
if (MID_AddController == NULL)
|
||||
{
|
||||
printf("Method addController not found... \n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MID_AddControllerElement = (*env)->GetMethodID(env, CLASS_JNIWrapper, "addControllerElement", "(JJIIIIIIIIZZZZZ)V");
|
||||
if (MID_AddControllerElement == NULL)
|
||||
{
|
||||
printf("Method addControllerElement not found... \n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void createMasterPort()
|
||||
{
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
//Get a Mach port to initiate communication with I/O Kit.
|
||||
//
|
||||
ioReturnValue = IOMasterPort(bootstrap_port, &masterPort);
|
||||
}
|
||||
|
||||
void disposeMasterPort()
|
||||
{
|
||||
//Free master port if we created one.
|
||||
//
|
||||
if (masterPort)
|
||||
{
|
||||
mach_port_deallocate(mach_task_self(), masterPort);
|
||||
}
|
||||
}
|
||||
|
||||
void createHIDDevice( io_object_t hidDevice, IOHIDDeviceInterface ***hidDeviceInterface )
|
||||
{
|
||||
io_name_t className;
|
||||
IOCFPlugInInterface **plugInInterface = NULL;
|
||||
HRESULT plugInResult = S_OK;
|
||||
SInt32 score = 0;
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = IOObjectGetClass(hidDevice, className);
|
||||
if ( ioReturnValue != kIOReturnSuccess )
|
||||
{
|
||||
printf("Failed to get IOObject class name.");
|
||||
}
|
||||
|
||||
printf("Found device type [%s]\n", className);
|
||||
|
||||
ioReturnValue = IOCreatePlugInInterfaceForService(hidDevice,
|
||||
kIOHIDDeviceUserClientTypeID,
|
||||
kIOCFPlugInInterfaceID,
|
||||
&plugInInterface,
|
||||
&score);
|
||||
|
||||
if (ioReturnValue == kIOReturnSuccess)
|
||||
{
|
||||
//Call a method of the intermediate plug-in to create the device
|
||||
//interface
|
||||
//
|
||||
plugInResult = (*plugInInterface)->QueryInterface(plugInInterface,
|
||||
CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID),
|
||||
(LPVOID) hidDeviceInterface);
|
||||
if ( plugInResult != S_OK )
|
||||
{
|
||||
printf("Couldn't create HID class device interface");
|
||||
}
|
||||
|
||||
(*plugInInterface)->Release(plugInInterface);
|
||||
}
|
||||
}
|
||||
|
||||
IOReturn openDevice(IOHIDDeviceInterface ***hidDeviceInterface)
|
||||
{
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
//todo, change this to be controlled from the java layer at each device
|
||||
//
|
||||
ioReturnValue = (**hidDeviceInterface)->open(*hidDeviceInterface, 0 );
|
||||
if ( ioReturnValue != kIOReturnSuccess )
|
||||
{
|
||||
printf("Unable to open device - return [%d]\n", ioReturnValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Successfully opened device \n");
|
||||
}
|
||||
|
||||
return ioReturnValue;
|
||||
}
|
||||
|
||||
IOReturn closeDevice(IOHIDDeviceInterface ***hidDeviceInterface)
|
||||
{
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = (**hidDeviceInterface)->close(*hidDeviceInterface);
|
||||
if ( ioReturnValue != kIOReturnSuccess )
|
||||
{
|
||||
printf("Unable to close device - return [%d]\n", ioReturnValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Successfully closed device \n");
|
||||
}
|
||||
|
||||
// release the device interface
|
||||
//
|
||||
(**hidDeviceInterface)->Release(*hidDeviceInterface);
|
||||
|
||||
return ioReturnValue;
|
||||
}
|
||||
|
||||
static void sendCFArray(const void * value, void * parameter)
|
||||
{
|
||||
if (CFGetTypeID (value) != CFDictionaryGetTypeID ())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CFObjectSend(value);
|
||||
}
|
||||
|
||||
void CFObjectSend( CFTypeRef value )
|
||||
{
|
||||
CFTypeID type = CFGetTypeID(value);
|
||||
if (type == CFArrayGetTypeID())
|
||||
{
|
||||
CFRange range = {0, CFArrayGetCount (value)};
|
||||
|
||||
//Show an element array containing one or more element dictionaries
|
||||
CFArrayApplyFunction (value, range, sendCFArray, 0);
|
||||
}
|
||||
else if (type == CFDictionaryGetTypeID())
|
||||
{
|
||||
// printf("Sending Map\n");
|
||||
|
||||
|
||||
CFTypeRef val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementCookieKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val , kCFNumberLongType, &elementCookie);
|
||||
printf("ElementCookie - 0x%lx (%ld) \n", elementCookie, elementCookie);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementTypeKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &elementType);
|
||||
printf("element Type - 0x%lx (%ld) \n", elementType, elementType);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementUsageKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &usage);
|
||||
printf("usage - 0x%lx (%ld) \n", usage, usage);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementUsagePageKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &usagePage);
|
||||
printf("usage page- 0x%lx (%ld) \n", usagePage, usagePage);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementMinKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &min);
|
||||
//printf("min - 0x%lx (%ld) \n", min, min);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementMaxKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &max);
|
||||
//printf("max - 0x%lx (%ld) \n", max, max);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementScaledMinKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &scaledMin);
|
||||
//printf("scaledMin - 0x%lx (%ld) \n", scaledMin, scaledMin);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementScaledMaxKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &scaledMax);
|
||||
//printf("scaledMax - 0x%lx (%ld) \n", scaledMax, scaledMax);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementSizeKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &size);
|
||||
//printf("Size - 0x%lx (%ld) \n", size, size);
|
||||
}
|
||||
|
||||
jboolean isRelative = JNI_FALSE;
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementIsRelativeKey) );
|
||||
if ( val )
|
||||
{
|
||||
isRelative = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
|
||||
|
||||
jboolean isWrapping = JNI_FALSE;
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementIsWrappingKey) );
|
||||
if ( val )
|
||||
{
|
||||
isWrapping = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
|
||||
|
||||
jboolean isNonLinear = JNI_FALSE;
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementIsNonLinearKey) );
|
||||
if ( val )
|
||||
{
|
||||
isNonLinear = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
|
||||
|
||||
jboolean hasPreferredState = JNI_FALSE;
|
||||
#ifdef kIOHIDElementHasPreferredStateKey
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementHasPreferredStateKey) );
|
||||
if ( val )
|
||||
{
|
||||
hasPreferredState = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
#else
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementHasPreferedStateKey) );
|
||||
if ( val )
|
||||
{
|
||||
hasPreferredState = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
#endif
|
||||
|
||||
jboolean hasNullState = JNI_FALSE;
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementHasNullStateKey) );
|
||||
if ( val )
|
||||
{
|
||||
hasNullState = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
|
||||
(*lpEnv)->CallVoidMethod(lpEnv, lpObj, MID_AddControllerElement,
|
||||
(jlong)(long)lpDevice,
|
||||
(jlong)(long)elementCookie,
|
||||
(jint)(long)elementType,
|
||||
(jint)(long)usage,
|
||||
(jint)(long)usagePage,
|
||||
(jint)(long)min,
|
||||
(jint)(long)max,
|
||||
(jint)(long)scaledMin,
|
||||
(jint)(long)scaledMax,
|
||||
(jint)(long)size,
|
||||
(jboolean)isRelative,
|
||||
(jboolean)isWrapping,
|
||||
(jboolean)isNonLinear,
|
||||
(jboolean)hasPreferredState,
|
||||
(jboolean)hasNullState);
|
||||
|
||||
// printf("End of element definition \n");
|
||||
|
||||
|
||||
|
||||
CFTypeRef object = CFDictionaryGetValue (value, CFSTR(kIOHIDElementKey));
|
||||
if (object)
|
||||
{
|
||||
CFObjectSend( object );
|
||||
}
|
||||
|
||||
printf("\n\n\n");
|
||||
}
|
||||
}
|
||||
|
||||
void addControllerElements( CFMutableDictionaryRef dictionary, CFStringRef key )
|
||||
{
|
||||
printf("Adding controller elements\n");
|
||||
|
||||
CFTypeRef value = CFDictionaryGetValue (dictionary, key);
|
||||
if (value)
|
||||
{
|
||||
CFRange range = {0, CFArrayGetCount (value)};
|
||||
CFArrayApplyFunction (value, range, sendCFArray, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: hidCreate
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_hidCreate
|
||||
(JNIEnv * env, jobject obj)
|
||||
{
|
||||
if ( init( env ) )
|
||||
{
|
||||
createMasterPort();
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: hidDispose
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_hidDispose
|
||||
(JNIEnv * env, jobject obj)
|
||||
{
|
||||
disposeMasterPort();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: enumDevices
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_enumDevices
|
||||
(JNIEnv * env, jobject obj)
|
||||
{
|
||||
|
||||
lpEnv = env;
|
||||
lpObj = obj;
|
||||
|
||||
CFMutableDictionaryRef hidMatchDictionary = NULL;
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
Boolean noMatchingDevices = false;
|
||||
|
||||
// Set up a matching dictionary to search the I/O Registry by class
|
||||
// name for all HID class devices
|
||||
//
|
||||
hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
|
||||
|
||||
// Now search I/O Registry for matching devices.
|
||||
//
|
||||
ioReturnValue = IOServiceGetMatchingServices(masterPort, hidMatchDictionary, &hidObjectIterator);
|
||||
|
||||
noMatchingDevices = ((ioReturnValue != kIOReturnSuccess) | (hidObjectIterator == NULL));
|
||||
|
||||
// If search is unsuccessful, print message .
|
||||
//
|
||||
if (noMatchingDevices)
|
||||
{
|
||||
printf("No matching HID class devices found.");
|
||||
return;
|
||||
}
|
||||
|
||||
// IOServiceGetMatchingServices consumes a reference to the
|
||||
// dictionary, so we don't need to release the dictionary ref.
|
||||
//
|
||||
hidMatchDictionary = NULL;
|
||||
|
||||
io_object_t hidDevice = NULL;
|
||||
IOHIDDeviceInterface **hidDeviceInterface = NULL;
|
||||
CFMutableDictionaryRef properties = 0;
|
||||
char path[512];
|
||||
kern_return_t result;
|
||||
|
||||
|
||||
while ((hidDevice = IOIteratorNext(hidObjectIterator)))
|
||||
{
|
||||
result = IORegistryEntryGetPath(hidDevice, kIOServicePlane, path);
|
||||
|
||||
if ( result == KERN_SUCCESS )
|
||||
{
|
||||
result = IORegistryEntryCreateCFProperties(hidDevice,
|
||||
&properties,
|
||||
kCFAllocatorDefault,
|
||||
kNilOptions);
|
||||
}
|
||||
|
||||
if ((result == KERN_SUCCESS) && properties)
|
||||
{
|
||||
//showDictionaryElement(properties, CFSTR(kIOHIDTransportKey));
|
||||
//showDictionaryElement(properties, CFSTR(kIOHIDVendorKey));
|
||||
//printf("ProductID: "); showDictionaryElement(properties, CFSTR(kIOHIDProductIDKey));
|
||||
//printf("VersionNumber: "); showDictionaryElement(properties, CFSTR(kIOHIDVersionNumberKey));
|
||||
//printf("Manufacturer: "); showDictionaryElement(properties, CFSTR(kIOHIDManufacturerKey));
|
||||
//printf("ProductKey: "); showDictionaryElement(properties, CFSTR(kIOHIDProductKey));
|
||||
//printf("SerialNumber: "); showDictionaryElement(properties, CFSTR(kIOHIDSerialNumberKey));
|
||||
//showDictionaryElement(properties, CFSTR(kIOHIDLocationIDKey));
|
||||
//printf("PrimaryUsage: "); showDictionaryElement(properties, CFSTR(kIOHIDPrimaryUsageKey));
|
||||
//showDictionaryElement(properties, CFSTR(kIOHIDPrimaryUsagePageKey));
|
||||
//showDictionaryElement(properties, CFSTR(kIOHIDElementKey));
|
||||
|
||||
|
||||
|
||||
// get the product name
|
||||
//
|
||||
CFTypeRef productName = CFDictionaryGetValue (properties, CFSTR(kIOHIDProductKey));
|
||||
|
||||
// get the usage for this product
|
||||
//
|
||||
long usage;
|
||||
CFNumberGetValue ( CFDictionaryGetValue( properties, CFSTR(kIOHIDPrimaryUsageKey) ), kCFNumberLongType, &usage);
|
||||
|
||||
|
||||
createHIDDevice( hidDevice, &hidDeviceInterface );
|
||||
|
||||
IOObjectRelease( hidDevice );
|
||||
|
||||
if ( hidDeviceInterface != NULL )
|
||||
{
|
||||
(*env)->CallVoidMethod(env, obj, MID_AddController,
|
||||
(jlong)(long)hidDeviceInterface,
|
||||
(*env)->NewStringUTF( env, CFStringGetCStringPtr( productName, CFStringGetSystemEncoding()) ),
|
||||
(jint)usage );
|
||||
lpEnv = env;
|
||||
lpDevice = (jlong)(long)hidDeviceInterface;
|
||||
|
||||
addControllerElements( properties, CFSTR(kIOHIDElementKey) );
|
||||
|
||||
|
||||
}
|
||||
|
||||
//Release the properties dictionary
|
||||
CFRelease(properties);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
IOObjectRelease(hidObjectIterator);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: openDevice
|
||||
* Signature: (JI)J
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_openDevice
|
||||
(JNIEnv * env, jobject obj, jlong lpDevice, jint queueDepth)
|
||||
{
|
||||
IOHIDDeviceInterface **hidDeviceInterface = NULL;
|
||||
hidDeviceInterface = (IOHIDDeviceInterface **) (long)lpDevice;
|
||||
openDevice( &hidDeviceInterface );
|
||||
|
||||
|
||||
IOHIDQueueInterface **queue = NULL;
|
||||
queue = (*hidDeviceInterface)->allocQueue(hidDeviceInterface);
|
||||
|
||||
if (queue)
|
||||
{
|
||||
// create a queue and specify how deep they want the input queue to be
|
||||
//
|
||||
(*queue)->create( queue, 0, (int)queueDepth );
|
||||
printf("InputQueue created %lx with depth %d \n", (long) queue, (int)queueDepth );
|
||||
|
||||
// start the input queue
|
||||
//
|
||||
(*queue)->start( queue );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Unable to create queue for device! \n");
|
||||
}
|
||||
|
||||
return (jlong)(long)queue;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: closeDevice
|
||||
* Signature: (JJ)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_closeDevice
|
||||
(JNIEnv * env, jobject obj, jlong lpDevice, jlong lpQueue)
|
||||
{
|
||||
IOHIDDeviceInterface **hidDeviceInterface = NULL;
|
||||
hidDeviceInterface = (IOHIDDeviceInterface **) (long)lpDevice;
|
||||
|
||||
IOHIDQueueInterface **queue = NULL;
|
||||
queue = (IOHIDQueueInterface **)(long)lpQueue;
|
||||
|
||||
// stop the queue
|
||||
//
|
||||
(*queue)->stop(queue);
|
||||
|
||||
// dispose of the queue
|
||||
//
|
||||
(*queue)->dispose(queue);
|
||||
|
||||
// release the queue
|
||||
//
|
||||
(*queue)->Release(queue);
|
||||
|
||||
// close the input device
|
||||
//
|
||||
closeDevice( &hidDeviceInterface );
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: pollDevice
|
||||
* Signature: (J)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_pollDevice
|
||||
(JNIEnv * env, jobject obj, jlong lpQueue)
|
||||
{
|
||||
IOHIDEventStruct event;
|
||||
|
||||
IOHIDQueueInterface **queue = NULL;
|
||||
queue = (IOHIDQueueInterface **)(long)lpQueue;
|
||||
|
||||
AbsoluteTime zeroTime = {0,0};
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = (*queue)->getNextEvent(queue, &event, zeroTime, 0);
|
||||
if ( ioReturnValue == kIOReturnSuccess )
|
||||
{
|
||||
printf("Queue getNextEvent return value: %ld\n", (long)ioReturnValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Queue event[%lx] %ld\n", (unsigned long) event.elementCookie, event.value );
|
||||
}
|
||||
|
||||
return (jint) event.value;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: pollDevice
|
||||
* Signature: (JJ)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_pollElement
|
||||
(JNIEnv * env, jobject obj, jlong lpDevice, jlong hidCookie)
|
||||
{
|
||||
IOHIDDeviceInterface **hidDeviceInterface = NULL;
|
||||
hidDeviceInterface = (IOHIDDeviceInterface **) (long)lpDevice;
|
||||
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(long)hidCookie;
|
||||
|
||||
IOHIDEventStruct event;
|
||||
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = (*hidDeviceInterface)->getElementValue(hidDeviceInterface, cookie, &event);
|
||||
if ( ioReturnValue == kIOReturnSuccess )
|
||||
{
|
||||
printf("Queue getNextEvent return value: %ld\n", (long)ioReturnValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Queue event[%lx] %ld\n", (unsigned long) event.elementCookie, event.value );
|
||||
}
|
||||
|
||||
return (jint) event.value;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: registerDeviceElement
|
||||
* Signature: (JJ)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_registerDeviceElement
|
||||
(JNIEnv * env, jobject obj, jlong lpQueue, jlong hidCookie)
|
||||
{
|
||||
IOHIDQueueInterface **queue = NULL;
|
||||
queue = (IOHIDQueueInterface **)(long)lpQueue;
|
||||
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(long)hidCookie;
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = (*queue)->addElement(queue, cookie, 0);
|
||||
if ( ioReturnValue == kIOReturnSuccess )
|
||||
{
|
||||
printf("Registered pollElement: %ld\n", (long)cookie );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Failed to add poll element: %ld\n", (long)cookie );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: deregisterDeviceElement
|
||||
* Signature: (JJ)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_deregisterDeviceElement
|
||||
(JNIEnv * env, jobject obj, jlong lpQueue, jlong hidCookie)
|
||||
{
|
||||
IOHIDQueueInterface **queue = NULL;
|
||||
queue = (IOHIDQueueInterface **)(long)lpQueue;
|
||||
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(long)hidCookie;
|
||||
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = (*queue)->removeElement(queue, cookie );
|
||||
if ( ioReturnValue == kIOReturnSuccess )
|
||||
{
|
||||
printf("Removed pollElement: %ld\n", (long)cookie );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Failed to remove poll element: %ld\n", (long)cookie );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
197
plugins/OSX/src/native/macosxutil.c
Normal file
197
plugins/OSX/src/native/macosxutil.c
Normal file
|
|
@ -0,0 +1,197 @@
|
|||
/*
|
||||
* %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 <CoreServices/CoreServices.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <jni.h>
|
||||
#include "util.h"
|
||||
#include "macosxutil.h"
|
||||
|
||||
typedef struct {
|
||||
JNIEnv *env;
|
||||
jobject map;
|
||||
} dict_context_t;
|
||||
|
||||
typedef struct {
|
||||
JNIEnv *env;
|
||||
jobjectArray array;
|
||||
jsize index;
|
||||
} array_context_t;
|
||||
|
||||
static jobject createObjectFromCFObject(JNIEnv *env, CFTypeRef cfobject);
|
||||
|
||||
static jstring createStringFromCFString(JNIEnv *env, CFStringRef cfstring) {
|
||||
CFIndex unicode_length = CFStringGetLength(cfstring);
|
||||
CFIndex utf8_length = CFStringGetMaximumSizeForEncoding(unicode_length, kCFStringEncodingUTF8);
|
||||
// Allocate buffer large enough, plus \0 terminator
|
||||
char *buffer = (char *)malloc(utf8_length + 1);
|
||||
if (buffer == NULL)
|
||||
return NULL;
|
||||
Boolean result = CFStringGetCString(cfstring, buffer, utf8_length + 1, kCFStringEncodingUTF8);
|
||||
if (!result) {
|
||||
free(buffer);
|
||||
return NULL;
|
||||
}
|
||||
jstring str = (*env)->NewStringUTF(env, buffer);
|
||||
free(buffer);
|
||||
return str;
|
||||
}
|
||||
|
||||
static jobject createDoubleObjectFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
|
||||
double value;
|
||||
Boolean result = CFNumberGetValue(cfnumber, kCFNumberDoubleType, &value);
|
||||
if (!result)
|
||||
return NULL;
|
||||
return newJObject(env, "java/lang/Double", "(D)V", (jdouble)value);
|
||||
}
|
||||
|
||||
static jobject createLongObjectFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
|
||||
SInt64 value;
|
||||
Boolean result = CFNumberGetValue(cfnumber, kCFNumberSInt64Type, &value);
|
||||
if (!result)
|
||||
return NULL;
|
||||
return newJObject(env, "java/lang/Long", "(J)V", (jlong)value);
|
||||
}
|
||||
|
||||
static jobject createNumberFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
|
||||
CFNumberType number_type = CFNumberGetType(cfnumber);
|
||||
switch (number_type) {
|
||||
case kCFNumberSInt8Type:
|
||||
case kCFNumberSInt16Type:
|
||||
case kCFNumberSInt32Type:
|
||||
case kCFNumberSInt64Type:
|
||||
case kCFNumberCharType:
|
||||
case kCFNumberShortType:
|
||||
case kCFNumberIntType:
|
||||
case kCFNumberLongType:
|
||||
case kCFNumberLongLongType:
|
||||
case kCFNumberCFIndexType:
|
||||
return createLongObjectFromCFNumber(env, cfnumber);
|
||||
case kCFNumberFloat32Type:
|
||||
case kCFNumberFloat64Type:
|
||||
case kCFNumberFloatType:
|
||||
case kCFNumberDoubleType:
|
||||
return createDoubleObjectFromCFNumber(env, cfnumber);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void createArrayEntries(const void *value, void *context) {
|
||||
array_context_t *array_context = (array_context_t *)context;
|
||||
jobject jval = createObjectFromCFObject(array_context->env, value);
|
||||
(*array_context->env)->SetObjectArrayElement(array_context->env, array_context->array, array_context->index++, jval);
|
||||
(*array_context->env)->DeleteLocalRef(array_context->env, jval);
|
||||
}
|
||||
|
||||
static jobject createArrayFromCFArray(JNIEnv *env, CFArrayRef cfarray) {
|
||||
jclass Object_class = (*env)->FindClass(env, "java/lang/Object");
|
||||
if (Object_class == NULL)
|
||||
return NULL;
|
||||
CFIndex size = CFArrayGetCount(cfarray);
|
||||
CFRange range = {0, size};
|
||||
jobjectArray array = (*env)->NewObjectArray(env, size, Object_class, NULL);
|
||||
array_context_t array_context;
|
||||
array_context.env = env;
|
||||
array_context.array = array;
|
||||
array_context.index = 0;
|
||||
CFArrayApplyFunction(cfarray, range, createArrayEntries, &array_context);
|
||||
return array;
|
||||
}
|
||||
|
||||
static jobject createObjectFromCFObject(JNIEnv *env, CFTypeRef cfobject) {
|
||||
CFTypeID type_id = CFGetTypeID(cfobject);
|
||||
if (type_id == CFDictionaryGetTypeID()) {
|
||||
return createMapFromCFDictionary(env, cfobject);
|
||||
} else if (type_id == CFArrayGetTypeID()) {
|
||||
return createArrayFromCFArray(env, cfobject);
|
||||
} else if (type_id == CFStringGetTypeID()) {
|
||||
return createStringFromCFString(env, cfobject);
|
||||
} else if (type_id == CFNumberGetTypeID()) {
|
||||
return createNumberFromCFNumber(env, cfobject);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void createMapKeys(const void *key, const void *value, void *context) {
|
||||
dict_context_t *dict_context = (dict_context_t *)context;
|
||||
|
||||
jclass Map_class = (*dict_context->env)->GetObjectClass(dict_context->env, dict_context->map);
|
||||
if (Map_class == NULL)
|
||||
return;
|
||||
jmethodID map_put = (*dict_context->env)->GetMethodID(dict_context->env, Map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
||||
if (map_put == NULL)
|
||||
return;
|
||||
jobject jkey = createObjectFromCFObject(dict_context->env, key);
|
||||
jobject jvalue = createObjectFromCFObject(dict_context->env, value);
|
||||
if (jkey == NULL || jvalue == NULL)
|
||||
return;
|
||||
(*dict_context->env)->CallObjectMethod(dict_context->env, dict_context->map, map_put, jkey, jvalue);
|
||||
(*dict_context->env)->DeleteLocalRef(dict_context->env, jkey);
|
||||
(*dict_context->env)->DeleteLocalRef(dict_context->env, jvalue);
|
||||
}
|
||||
|
||||
jobject createMapFromCFDictionary(JNIEnv *env, CFDictionaryRef dict) {
|
||||
jobject map = newJObject(env, "java/util/HashMap", "()V");
|
||||
if (map == NULL)
|
||||
return NULL;
|
||||
dict_context_t dict_context;
|
||||
dict_context.env = env;
|
||||
dict_context.map = map;
|
||||
CFDictionaryApplyFunction(dict, createMapKeys, &dict_context);
|
||||
return map;
|
||||
}
|
||||
|
||||
void copyEvent(JNIEnv *env, IOHIDEventStruct *event, jobject event_return) {
|
||||
jclass OSXEvent_class = (*env)->GetObjectClass(env, event_return);
|
||||
if (OSXEvent_class == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
jmethodID OSXEvent_set = (*env)->GetMethodID(env, OSXEvent_class, "set", "(JJIJ)V");
|
||||
if (OSXEvent_set == NULL) {
|
||||
return;
|
||||
}
|
||||
Nanoseconds nanos = AbsoluteToNanoseconds(event->timestamp);
|
||||
uint64_t nanos64= *((uint64_t *)&nanos);
|
||||
(*env)->CallVoidMethod(env, event_return, OSXEvent_set, (jlong)event->type, (jlong)(intptr_t)event->elementCookie, (jint)event->value, (jlong)nanos64);
|
||||
}
|
||||
48
plugins/OSX/src/native/macosxutil.h
Normal file
48
plugins/OSX/src/native/macosxutil.h
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* %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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <jni.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
|
||||
extern jobject createMapFromCFDictionary(JNIEnv *env, CFDictionaryRef dict);
|
||||
extern void copyEvent(JNIEnv *env, IOHIDEventStruct *event, jobject event_return);
|
||||
118
plugins/OSX/src/native/net_java_games_input_OSXHIDDevice.c
Normal file
118
plugins/OSX/src/native/net_java_games_input_OSXHIDDevice.c
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
/*
|
||||
* %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 <IOKit/IOTypes.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
#include <IOKit/hid/IOHIDKeys.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include "net_java_games_input_OSXHIDDevice.h"
|
||||
#include "util.h"
|
||||
#include "macosxutil.h"
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nReleaseDevice(JNIEnv *env, jclass unused, jlong device_address, jlong interface_address) {
|
||||
io_object_t hidDevice = (io_object_t)device_address;
|
||||
IOHIDDeviceInterface **device_interface = (IOHIDDeviceInterface **)(intptr_t)interface_address;;
|
||||
(*device_interface)->Release(device_interface);
|
||||
IOObjectRelease(hidDevice);
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL Java_net_java_games_input_OSXHIDDevice_nGetDeviceProperties(JNIEnv *env, jclass unused, jlong device_address) {
|
||||
io_object_t hidDevice = (io_object_t)device_address;
|
||||
CFMutableDictionaryRef properties;
|
||||
|
||||
kern_return_t result = IORegistryEntryCreateCFProperties(hidDevice,
|
||||
&properties,
|
||||
kCFAllocatorDefault,
|
||||
kNilOptions);
|
||||
if (result != KERN_SUCCESS) {
|
||||
throwIOException(env, "Failed to create properties for device (%ld)", result);
|
||||
return NULL;
|
||||
}
|
||||
jobject map = createMapFromCFDictionary(env, properties);
|
||||
CFRelease(properties);
|
||||
return map;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nOpen
|
||||
(JNIEnv * env, jclass unused, jlong lpDevice) {
|
||||
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
|
||||
IOReturn ioReturnValue = (*hidDeviceInterface)->open(hidDeviceInterface, 0);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Device open failed: %d", ioReturnValue);
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nClose
|
||||
(JNIEnv * env, jclass unused, jlong lpDevice) {
|
||||
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
|
||||
IOReturn ioReturnValue = (*hidDeviceInterface)->close(hidDeviceInterface);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Device close failed: %d", ioReturnValue);
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nGetElementValue
|
||||
(JNIEnv * env, jclass unused, jlong lpDevice, jlong hidCookie, jobject event_return) {
|
||||
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)hidCookie;
|
||||
IOHIDEventStruct event;
|
||||
|
||||
IOReturn ioReturnValue = (*hidDeviceInterface)->getElementValue(hidDeviceInterface, cookie, &event);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Device getElementValue failed: %d", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
copyEvent(env, &event, event_return);
|
||||
if (event.longValue != NULL) {
|
||||
free(event.longValue);
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT jlong JNICALL Java_net_java_games_input_OSXHIDDevice_nCreateQueue(JNIEnv *env, jclass unused, jlong device_address) {
|
||||
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)device_address;
|
||||
IOHIDQueueInterface **queue = (*hidDeviceInterface)->allocQueue(hidDeviceInterface);
|
||||
|
||||
if (queue == NULL) {
|
||||
throwIOException(env, "Could not allocate queue");
|
||||
return 0;
|
||||
}
|
||||
return (jlong)(intptr_t)queue;
|
||||
}
|
||||
|
|
@ -0,0 +1,143 @@
|
|||
/*
|
||||
* %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 <IOKit/IOTypes.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
#include <IOKit/hid/IOHIDKeys.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include "net_java_games_input_OSXHIDDeviceIterator.h"
|
||||
#include "util.h"
|
||||
|
||||
JNIEXPORT jlong JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nCreateIterator(JNIEnv *env, jclass unused) {
|
||||
io_iterator_t hidObjectIterator;
|
||||
// Set up a matching dictionary to search the I/O Registry by class
|
||||
// name for all HID class devices
|
||||
//
|
||||
CFMutableDictionaryRef hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
|
||||
|
||||
// Now search I/O Registry for matching devices.
|
||||
// IOServiceGetMatchingServices consumes a reference to the dictionary so we don't have to release it
|
||||
IOReturn ioReturnValue = IOServiceGetMatchingServices(kIOMasterPortDefault, hidMatchDictionary, &hidObjectIterator);
|
||||
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Failed to create iterator (%ld)\n", ioReturnValue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (hidObjectIterator == IO_OBJECT_NULL) {
|
||||
throwIOException(env, "Failed to create iterator\n");
|
||||
return 0;
|
||||
}
|
||||
return (jlong)hidObjectIterator;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nReleaseIterator(JNIEnv *env, jclass unused, jlong address) {
|
||||
io_iterator_t iterator = (io_iterator_t)address;
|
||||
IOObjectRelease(iterator);
|
||||
}
|
||||
|
||||
static IOHIDDeviceInterface **createHIDDevice(JNIEnv *env, io_object_t hidDevice) {
|
||||
// io_name_t className;
|
||||
IOHIDDeviceInterface **hidDeviceInterface;
|
||||
IOCFPlugInInterface **plugInInterface;
|
||||
SInt32 score;
|
||||
|
||||
/* ioReturnValue = IOObjectGetClass(hidDevice, className);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
printfJava(env, "Failed to get IOObject class name.");
|
||||
}
|
||||
|
||||
printfJava(env, "Found device type [%s]\n", className);
|
||||
*/
|
||||
IOReturn ioReturnValue = IOCreatePlugInInterfaceForService(hidDevice,
|
||||
kIOHIDDeviceUserClientTypeID,
|
||||
kIOCFPlugInInterfaceID,
|
||||
&plugInInterface,
|
||||
&score);
|
||||
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Couldn't create plugin for device interface (%ld)\n", ioReturnValue);
|
||||
return NULL;
|
||||
}
|
||||
//Call a method of the intermediate plug-in to create the device
|
||||
//interface
|
||||
//
|
||||
HRESULT plugInResult = (*plugInInterface)->QueryInterface(plugInInterface,
|
||||
CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID),
|
||||
(LPVOID)&hidDeviceInterface);
|
||||
(*plugInInterface)->Release(plugInInterface);
|
||||
if (plugInResult != S_OK) {
|
||||
throwIOException(env, "Couldn't create HID class device interface (%ld)\n", plugInResult);
|
||||
return NULL;
|
||||
}
|
||||
return hidDeviceInterface;
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nNext(JNIEnv *env, jclass unused, jlong address) {
|
||||
io_iterator_t iterator = (io_iterator_t)address;
|
||||
io_object_t hidDevice;
|
||||
// io_string_t path;
|
||||
// kern_return_t result;
|
||||
|
||||
hidDevice = IOIteratorNext(iterator);
|
||||
if (hidDevice == MACH_PORT_NULL)
|
||||
return NULL;
|
||||
/* IOResult result = IORegistryEntryGetPath(hidDevice, kIOServicePlane, path);
|
||||
|
||||
if (result != KERN_SUCCESS) {
|
||||
IOObjectRelease(hidDevice);
|
||||
throwIOException("Failed to get device path (%ld)\n", result);
|
||||
return NULL;
|
||||
}
|
||||
*/
|
||||
IOHIDDeviceInterface **device_interface = createHIDDevice(env, hidDevice);
|
||||
if (device_interface == NULL) {
|
||||
IOObjectRelease(hidDevice);
|
||||
return NULL;
|
||||
}
|
||||
jobject device_object = newJObject(env, "net/java/games/input/OSXHIDDevice", "(JJ)V", (jlong)hidDevice, (jlong)(intptr_t)device_interface);
|
||||
if (device_object == NULL) {
|
||||
(*device_interface)->Release(device_interface);
|
||||
IOObjectRelease(hidDevice);
|
||||
return NULL;
|
||||
}
|
||||
return device_object;
|
||||
}
|
||||
135
plugins/OSX/src/native/net_java_games_input_OSXHIDQueue.c
Normal file
135
plugins/OSX/src/native/net_java_games_input_OSXHIDQueue.c
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* %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 <IOKit/IOTypes.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
#include <IOKit/hid/IOHIDKeys.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include "net_java_games_input_OSXHIDQueue.h"
|
||||
#include "util.h"
|
||||
#include "macosxutil.h"
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nOpen(JNIEnv *env, jclass unused, jlong address, jint queue_depth) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOReturn ioReturnValue = (*queue)->create(queue, 0, queue_depth);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue open failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nStart(JNIEnv *env, jclass unused, jlong address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOReturn ioReturnValue = (*queue)->start(queue);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue start failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nStop(JNIEnv *env, jclass unused, jlong address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOReturn ioReturnValue = (*queue)->stop(queue);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue stop failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nClose(JNIEnv *env, jclass unused, jlong address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOReturn ioReturnValue = (*queue)->dispose(queue);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue dispose failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nReleaseQueue(JNIEnv *env, jclass unused, jlong address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOReturn ioReturnValue = (*queue)->Release(queue);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue Release failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nAddElement(JNIEnv *env, jclass unused, jlong address, jlong cookie_address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)cookie_address;
|
||||
|
||||
IOReturn ioReturnValue = (*queue)->addElement(queue, cookie, 0);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue addElement failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nRemoveElement(JNIEnv *env, jclass unused, jlong address, jlong cookie_address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)cookie_address;
|
||||
|
||||
IOReturn ioReturnValue = (*queue)->removeElement(queue, cookie);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue removeElement failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_net_java_games_input_OSXHIDQueue_nGetNextEvent(JNIEnv *env, jclass unused, jlong address, jobject event_return) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOHIDEventStruct event;
|
||||
|
||||
AbsoluteTime zeroTime = {0, 0};
|
||||
IOReturn ioReturnValue = (*queue)->getNextEvent(queue, &event, zeroTime, 0);
|
||||
if (ioReturnValue == kIOReturnUnderrun) {
|
||||
return JNI_FALSE;
|
||||
} else if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue getNextEvent failed: %d\n", ioReturnValue);
|
||||
return JNI_FALSE;
|
||||
}
|
||||
copyEvent(env, &event, event_return);
|
||||
if (event.longValue != NULL) {
|
||||
free(event.longValue);
|
||||
}
|
||||
return JNI_TRUE;
|
||||
}
|
||||
|
|
@ -9,23 +9,19 @@
|
|||
<target depends="init" name="compile">
|
||||
<javac debug="true" deprecation="true" destdir="classes" source="1.4" target="1.4" srcdir="src">
|
||||
<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/awtinput.jar" compress="true" basedir="classes">
|
||||
<exclude name="**/*.java"/>
|
||||
<exclude name="awtinput.jar"/>
|
||||
<exclude name="apidoc"/>
|
||||
<include name="**/*.class"/>
|
||||
</jar>
|
||||
<copy file="bin/awtinput.jar" todir="../../coreAPI/src/tests/controller" />
|
||||
</target>
|
||||
|
||||
<target depends="jar" description="Build everything." name="all">
|
||||
<echo message="Application built."/>
|
||||
</target>
|
||||
|
||||
<target name="javadoc" depends="init" description="Javadoc for AWT plugin for JInput.">
|
||||
|
|
@ -38,21 +34,18 @@
|
|||
<pathelement location="src"/>
|
||||
</sourcepath>
|
||||
<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>
|
||||
</javadoc>
|
||||
</target>
|
||||
|
||||
<target description="Clean all build products." name="clean">
|
||||
<delete failonerror="no">
|
||||
<fileset dir="classes">
|
||||
<include name="**/*.class"/>
|
||||
</fileset>
|
||||
<fileset dir="classes"/>
|
||||
</delete>
|
||||
<delete file="bin/awtinput.jar" failonerror="no"/>
|
||||
<delete file="../../coreAPI/src/tests/controller/awtinput.jar" failonerror="no" />
|
||||
<delete file="apidoc" failonerror="no"/>
|
||||
<delete dir="bin/awtinput.jar" failonerror="no"/>
|
||||
<delete dir="apidoc" failonerror="no"/>
|
||||
</target>
|
||||
|
||||
</project>
|
||||
|
|
|
|||
|
|
@ -1,79 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2004 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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 Jeremy
|
||||
*
|
||||
* TODO To change the template for this generated type comment go to
|
||||
* Window - Preferences - Java - Code Style - Code Templates
|
||||
*/
|
||||
public class AWTButton extends AbstractComponent {
|
||||
|
||||
private boolean value = false;
|
||||
|
||||
/**
|
||||
* @param name
|
||||
* @param id
|
||||
*/
|
||||
protected AWTButton(String name, Identifier id) {
|
||||
super(name, id);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see net.java.games.input.Component#isRelative()
|
||||
*/
|
||||
public boolean isRelative() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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(value) {
|
||||
return 1.0f;
|
||||
} else {
|
||||
return 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
void setValue(boolean value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
|
|
@ -31,24 +31,16 @@ import net.java.games.util.plugins.Plugin;
|
|||
|
||||
/**
|
||||
* @author Jeremy
|
||||
*
|
||||
* TODO To change the template for this generated type comment go to
|
||||
* Window - Preferences - Java - Code Style - Code Templates
|
||||
* @author elias
|
||||
*/
|
||||
public class AWTEnvironmentPlugin extends ControllerEnvironment implements Plugin {
|
||||
|
||||
/** The two controllers */
|
||||
private Controller[] controllers = new Controller[2];
|
||||
private final Controller[] controllers;
|
||||
|
||||
public AWTEnvironmentPlugin() {
|
||||
this.controllers = new Controller[]{new AWTKeyboard(), new AWTMouse()};
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see net.java.games.input.ControllerEnvironment#getControllers()
|
||||
*/
|
||||
public Controller[] getControllers() {
|
||||
if((controllers[0] == null) && (controllers[1] == null)) {
|
||||
controllers[0] = new AWTKeyboard("AWTKeyboard");
|
||||
controllers[1] = new AWTMouse("AWTMouse");
|
||||
}
|
||||
return controllers;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
289
plugins/awt/src/net/java/games/input/AWTKeyMap.java
Normal file
289
plugins/awt/src/net/java/games/input/AWTKeyMap.java
Normal file
|
|
@ -0,0 +1,289 @@
|
|||
/**
|
||||
* Copyright (C) 2004 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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.awt.event.KeyEvent;
|
||||
|
||||
/**
|
||||
* @author Jeremy
|
||||
* @author elias
|
||||
*/
|
||||
final class AWTKeyMap {
|
||||
public final static Component.Identifier.Key mapKeyCode(int key_code) {
|
||||
switch (key_code) {
|
||||
case KeyEvent.VK_0:
|
||||
return Component.Identifier.Key._0;
|
||||
case KeyEvent.VK_1:
|
||||
return Component.Identifier.Key._1;
|
||||
case KeyEvent.VK_2:
|
||||
return Component.Identifier.Key._2;
|
||||
case KeyEvent.VK_3:
|
||||
return Component.Identifier.Key._3;
|
||||
case KeyEvent.VK_4:
|
||||
return Component.Identifier.Key._4;
|
||||
case KeyEvent.VK_5:
|
||||
return Component.Identifier.Key._5;
|
||||
case KeyEvent.VK_6:
|
||||
return Component.Identifier.Key._6;
|
||||
case KeyEvent.VK_7:
|
||||
return Component.Identifier.Key._7;
|
||||
case KeyEvent.VK_8:
|
||||
return Component.Identifier.Key._8;
|
||||
case KeyEvent.VK_9:
|
||||
return Component.Identifier.Key._9;
|
||||
|
||||
case KeyEvent.VK_Q:
|
||||
return Component.Identifier.Key.Q;
|
||||
case KeyEvent.VK_W:
|
||||
return Component.Identifier.Key.W;
|
||||
case KeyEvent.VK_E:
|
||||
return Component.Identifier.Key.E;
|
||||
case KeyEvent.VK_R:
|
||||
return Component.Identifier.Key.R;
|
||||
case KeyEvent.VK_T:
|
||||
return Component.Identifier.Key.T;
|
||||
case KeyEvent.VK_Y:
|
||||
return Component.Identifier.Key.Y;
|
||||
case KeyEvent.VK_U:
|
||||
return Component.Identifier.Key.U;
|
||||
case KeyEvent.VK_I:
|
||||
return Component.Identifier.Key.I;
|
||||
case KeyEvent.VK_O:
|
||||
return Component.Identifier.Key.O;
|
||||
case KeyEvent.VK_P:
|
||||
return Component.Identifier.Key.P;
|
||||
case KeyEvent.VK_A:
|
||||
return Component.Identifier.Key.A;
|
||||
case KeyEvent.VK_S:
|
||||
return Component.Identifier.Key.S;
|
||||
case KeyEvent.VK_D:
|
||||
return Component.Identifier.Key.D;
|
||||
case KeyEvent.VK_F:
|
||||
return Component.Identifier.Key.F;
|
||||
case KeyEvent.VK_G:
|
||||
return Component.Identifier.Key.G;
|
||||
case KeyEvent.VK_H:
|
||||
return Component.Identifier.Key.H;
|
||||
case KeyEvent.VK_J:
|
||||
return Component.Identifier.Key.J;
|
||||
case KeyEvent.VK_K:
|
||||
return Component.Identifier.Key.K;
|
||||
case KeyEvent.VK_L:
|
||||
return Component.Identifier.Key.L;
|
||||
case KeyEvent.VK_Z:
|
||||
return Component.Identifier.Key.Z;
|
||||
case KeyEvent.VK_X:
|
||||
return Component.Identifier.Key.X;
|
||||
case KeyEvent.VK_C:
|
||||
return Component.Identifier.Key.C;
|
||||
case KeyEvent.VK_V:
|
||||
return Component.Identifier.Key.V;
|
||||
case KeyEvent.VK_B:
|
||||
return Component.Identifier.Key.B;
|
||||
case KeyEvent.VK_N:
|
||||
return Component.Identifier.Key.N;
|
||||
case KeyEvent.VK_M:
|
||||
return Component.Identifier.Key.M;
|
||||
|
||||
case KeyEvent.VK_F1:
|
||||
return Component.Identifier.Key.F1;
|
||||
case KeyEvent.VK_F2:
|
||||
return Component.Identifier.Key.F2;
|
||||
case KeyEvent.VK_F3:
|
||||
return Component.Identifier.Key.F3;
|
||||
case KeyEvent.VK_F4:
|
||||
return Component.Identifier.Key.F4;
|
||||
case KeyEvent.VK_F5:
|
||||
return Component.Identifier.Key.F5;
|
||||
case KeyEvent.VK_F6:
|
||||
return Component.Identifier.Key.F6;
|
||||
case KeyEvent.VK_F7:
|
||||
return Component.Identifier.Key.F7;
|
||||
case KeyEvent.VK_F8:
|
||||
return Component.Identifier.Key.F8;
|
||||
case KeyEvent.VK_F9:
|
||||
return Component.Identifier.Key.F9;
|
||||
case KeyEvent.VK_F10:
|
||||
return Component.Identifier.Key.F10;
|
||||
case KeyEvent.VK_F11:
|
||||
return Component.Identifier.Key.F11;
|
||||
case KeyEvent.VK_F12:
|
||||
return Component.Identifier.Key.F12;
|
||||
|
||||
case KeyEvent.VK_ESCAPE:
|
||||
return Component.Identifier.Key.ESCAPE;
|
||||
case KeyEvent.VK_MINUS:
|
||||
return Component.Identifier.Key.MINUS;
|
||||
case KeyEvent.VK_EQUALS:
|
||||
return Component.Identifier.Key.EQUALS;
|
||||
case KeyEvent.VK_BACK_SPACE:
|
||||
return Component.Identifier.Key.BACKSLASH;
|
||||
case KeyEvent.VK_TAB:
|
||||
return Component.Identifier.Key.TAB;
|
||||
case KeyEvent.VK_OPEN_BRACKET:
|
||||
return Component.Identifier.Key.LBRACKET;
|
||||
case KeyEvent.VK_CLOSE_BRACKET:
|
||||
return Component.Identifier.Key.RBRACKET;
|
||||
case KeyEvent.VK_SEMICOLON:
|
||||
return Component.Identifier.Key.SEMICOLON;
|
||||
case KeyEvent.VK_QUOTE:
|
||||
return Component.Identifier.Key.APOSTROPHE;
|
||||
case KeyEvent.VK_NUMBER_SIGN:
|
||||
return Component.Identifier.Key.GRAVE;
|
||||
case KeyEvent.VK_BACK_SLASH:
|
||||
return Component.Identifier.Key.BACKSLASH;
|
||||
case KeyEvent.VK_PERIOD:
|
||||
return Component.Identifier.Key.PERIOD;
|
||||
case KeyEvent.VK_SLASH:
|
||||
return Component.Identifier.Key.SLASH;
|
||||
case KeyEvent.VK_MULTIPLY:
|
||||
return Component.Identifier.Key.MULTIPLY;
|
||||
case KeyEvent.VK_SPACE:
|
||||
return Component.Identifier.Key.SPACE;
|
||||
case KeyEvent.VK_CAPS_LOCK:
|
||||
return Component.Identifier.Key.CAPITAL;
|
||||
case KeyEvent.VK_NUM_LOCK:
|
||||
return Component.Identifier.Key.NUMLOCK;
|
||||
case KeyEvent.VK_SCROLL_LOCK:
|
||||
return Component.Identifier.Key.SCROLL;
|
||||
case KeyEvent.VK_NUMPAD7:
|
||||
return Component.Identifier.Key.NUMPAD7;
|
||||
case KeyEvent.VK_NUMPAD8:
|
||||
return Component.Identifier.Key.NUMPAD8;
|
||||
case KeyEvent.VK_NUMPAD9:
|
||||
return Component.Identifier.Key.NUMPAD9;
|
||||
case KeyEvent.VK_SUBTRACT:
|
||||
return Component.Identifier.Key.SUBTRACT;
|
||||
case KeyEvent.VK_NUMPAD4:
|
||||
return Component.Identifier.Key.NUMPAD4;
|
||||
case KeyEvent.VK_NUMPAD5:
|
||||
return Component.Identifier.Key.NUMPAD5;
|
||||
case KeyEvent.VK_NUMPAD6:
|
||||
return Component.Identifier.Key.NUMPAD6;
|
||||
case KeyEvent.VK_ADD:
|
||||
return Component.Identifier.Key.ADD;
|
||||
case KeyEvent.VK_NUMPAD1:
|
||||
return Component.Identifier.Key.NUMPAD1;
|
||||
case KeyEvent.VK_NUMPAD2:
|
||||
return Component.Identifier.Key.NUMPAD2;
|
||||
case KeyEvent.VK_NUMPAD3:
|
||||
return Component.Identifier.Key.NUMPAD3;
|
||||
case KeyEvent.VK_NUMPAD0:
|
||||
return Component.Identifier.Key.NUMPAD0;
|
||||
case KeyEvent.VK_DECIMAL:
|
||||
return Component.Identifier.Key.DECIMAL;
|
||||
|
||||
case KeyEvent.VK_KANA:
|
||||
return Component.Identifier.Key.KANA;
|
||||
case KeyEvent.VK_CONVERT:
|
||||
return Component.Identifier.Key.CONVERT;
|
||||
case KeyEvent.VK_NONCONVERT:
|
||||
return Component.Identifier.Key.NOCONVERT;
|
||||
|
||||
case KeyEvent.VK_CIRCUMFLEX:
|
||||
return Component.Identifier.Key.CIRCUMFLEX;
|
||||
case KeyEvent.VK_AT:
|
||||
return Component.Identifier.Key.AT;
|
||||
case KeyEvent.VK_COLON:
|
||||
return Component.Identifier.Key.COLON;
|
||||
case KeyEvent.VK_UNDERSCORE:
|
||||
return Component.Identifier.Key.UNDERLINE;
|
||||
case KeyEvent.VK_KANJI:
|
||||
return Component.Identifier.Key.KANJI;
|
||||
|
||||
case KeyEvent.VK_STOP:
|
||||
return Component.Identifier.Key.STOP;
|
||||
|
||||
case KeyEvent.VK_DIVIDE:
|
||||
return Component.Identifier.Key.DIVIDE;
|
||||
|
||||
case KeyEvent.VK_PAUSE:
|
||||
return Component.Identifier.Key.PAUSE;
|
||||
case KeyEvent.VK_HOME:
|
||||
return Component.Identifier.Key.HOME;
|
||||
case KeyEvent.VK_UP:
|
||||
return Component.Identifier.Key.UP;
|
||||
case KeyEvent.VK_PAGE_UP:
|
||||
return Component.Identifier.Key.PAGEUP;
|
||||
case KeyEvent.VK_LEFT:
|
||||
return Component.Identifier.Key.LEFT;
|
||||
case KeyEvent.VK_RIGHT:
|
||||
return Component.Identifier.Key.RIGHT;
|
||||
case KeyEvent.VK_END:
|
||||
return Component.Identifier.Key.END;
|
||||
case KeyEvent.VK_DOWN:
|
||||
return Component.Identifier.Key.DOWN;
|
||||
case KeyEvent.VK_PAGE_DOWN:
|
||||
return Component.Identifier.Key.PAGEDOWN;
|
||||
case KeyEvent.VK_INSERT:
|
||||
return Component.Identifier.Key.INSERT;
|
||||
case KeyEvent.VK_DELETE:
|
||||
return Component.Identifier.Key.DELETE;
|
||||
default:
|
||||
return Component.Identifier.Key.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
public final static Component.Identifier.Key map(KeyEvent event) {
|
||||
int key_code = event.getKeyCode();
|
||||
int key_location = event.getKeyLocation();
|
||||
switch (key_code) {
|
||||
case KeyEvent.VK_CONTROL:
|
||||
if (key_location == KeyEvent.KEY_LOCATION_RIGHT)
|
||||
return Component.Identifier.Key.RCONTROL;
|
||||
else
|
||||
return Component.Identifier.Key.LCONTROL;
|
||||
case KeyEvent.VK_SHIFT:
|
||||
if (key_location == KeyEvent.KEY_LOCATION_RIGHT)
|
||||
return Component.Identifier.Key.RSHIFT;
|
||||
else
|
||||
return Component.Identifier.Key.LSHIFT;
|
||||
case KeyEvent.VK_ALT:
|
||||
if (key_location == KeyEvent.KEY_LOCATION_RIGHT)
|
||||
return Component.Identifier.Key.RALT;
|
||||
else
|
||||
return Component.Identifier.Key.LALT;
|
||||
//this is 1.5 only
|
||||
/* case KeyEvent.VK_WINDOWS:
|
||||
if (key_location == KeyEvent.KEY_LOCATION_RIGHT)
|
||||
return Component.Identifier.Key.RWIN;
|
||||
else
|
||||
return Component.Identifier.Key.LWIN;*/
|
||||
case KeyEvent.VK_ENTER:
|
||||
if (key_location == KeyEvent.KEY_LOCATION_NUMPAD)
|
||||
return Component.Identifier.Key.NUMPADENTER;
|
||||
else
|
||||
return Component.Identifier.Key.RETURN;
|
||||
case KeyEvent.VK_COMMA:
|
||||
if (key_location == KeyEvent.KEY_LOCATION_NUMPAD)
|
||||
return Component.Identifier.Key.NUMPADCOMMA;
|
||||
else
|
||||
return Component.Identifier.Key.COMMA;
|
||||
default:
|
||||
return mapKeyCode(key_code);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -30,233 +30,142 @@ import java.awt.Toolkit;
|
|||
import java.awt.event.AWTEventListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
/**
|
||||
* @author Jeremy
|
||||
*
|
||||
* TODO To change the template for this generated type comment go to
|
||||
* Window - Preferences - Java - Code Style - Code Templates
|
||||
* @author elias
|
||||
*/
|
||||
public class AWTKeyboard extends StandardKeyboard implements AWTEventListener {
|
||||
|
||||
private boolean[] buttonValues;
|
||||
final class AWTKeyboard extends Keyboard implements AWTEventListener {
|
||||
private final List awt_events = new ArrayList();
|
||||
private Event[] processed_events;
|
||||
private int processed_events_index;
|
||||
|
||||
private int[] buttonMap;
|
||||
|
||||
/**
|
||||
* @param name
|
||||
*/
|
||||
protected AWTKeyboard(String name) {
|
||||
super(name);
|
||||
|
||||
buttonValues = new boolean[getComponents().length];
|
||||
buttonMap = new int[65535]; //has to be this big, as the values of KeyEvent keys are large
|
||||
|
||||
buttonMap[KeyEvent.VK_0] = Component.Identifier.Key._0.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_1] = Component.Identifier.Key._1.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_2] = Component.Identifier.Key._2.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_3] = Component.Identifier.Key._3.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_4] = Component.Identifier.Key._4.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_5] = Component.Identifier.Key._5.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_6] = Component.Identifier.Key._6.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_7] = Component.Identifier.Key._7.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_8] = Component.Identifier.Key._8.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_9] = Component.Identifier.Key._9.getKeyIndex();
|
||||
|
||||
buttonMap[KeyEvent.VK_Q] = Component.Identifier.Key.Q.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_W] = Component.Identifier.Key.W.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_E] = Component.Identifier.Key.E.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_R] = Component.Identifier.Key.R.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_T] = Component.Identifier.Key.T.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_Y] = Component.Identifier.Key.Y.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_U] = Component.Identifier.Key.U.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_I] = Component.Identifier.Key.I.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_O] = Component.Identifier.Key.O.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_P] = Component.Identifier.Key.P.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_A] = Component.Identifier.Key.A.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_S] = Component.Identifier.Key.S.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_D] = Component.Identifier.Key.D.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F] = Component.Identifier.Key.F.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_G] = Component.Identifier.Key.G.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_H] = Component.Identifier.Key.H.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_J] = Component.Identifier.Key.J.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_K] = Component.Identifier.Key.K.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_L] = Component.Identifier.Key.L.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_Z] = Component.Identifier.Key.Z.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_X] = Component.Identifier.Key.X.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_C] = Component.Identifier.Key.C.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_V] = Component.Identifier.Key.V.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_B] = Component.Identifier.Key.B.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_N] = Component.Identifier.Key.N.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_M] = Component.Identifier.Key.M.getKeyIndex();
|
||||
|
||||
buttonMap[KeyEvent.VK_F1] = Component.Identifier.Key.F1.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F2] = Component.Identifier.Key.F2.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F3] = Component.Identifier.Key.F3.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F4] = Component.Identifier.Key.F4.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F5] = Component.Identifier.Key.F5.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F6] = Component.Identifier.Key.F6.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F7] = Component.Identifier.Key.F7.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F8] = Component.Identifier.Key.F8.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F9] = Component.Identifier.Key.F9.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F10] = Component.Identifier.Key.F10.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F11] = Component.Identifier.Key.F11.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_F12] = Component.Identifier.Key.F12.getKeyIndex();
|
||||
|
||||
buttonMap[KeyEvent.VK_ESCAPE] = Component.Identifier.Key.ESCAPE.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_MINUS] = Component.Identifier.Key.MINUS.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_EQUALS] = Component.Identifier.Key.EQUALS.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_BACK_SPACE] = Component.Identifier.Key.BACKSLASH.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_TAB] = Component.Identifier.Key.TAB.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_OPEN_BRACKET] = Component.Identifier.Key.LBRACKET.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_CLOSE_BRACKET] = Component.Identifier.Key.RBRACKET.getKeyIndex();
|
||||
//Enter is a special one
|
||||
//Control is a special one
|
||||
buttonMap[KeyEvent.VK_SEMICOLON] = Component.Identifier.Key.SEMICOLON.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_QUOTE] = Component.Identifier.Key.APOSTROPHE.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUMBER_SIGN] = Component.Identifier.Key.GRAVE.getKeyIndex();
|
||||
//Shift is a special one
|
||||
buttonMap[KeyEvent.VK_BACK_SLASH] = Component.Identifier.Key.BACKSLASH.getKeyIndex();
|
||||
//Comma is special
|
||||
buttonMap[KeyEvent.VK_PERIOD] = Component.Identifier.Key.PERIOD.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_SLASH] = Component.Identifier.Key.SLASH.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_MULTIPLY] = Component.Identifier.Key.MULTIPLY.getKeyIndex();
|
||||
//Alt is a special one
|
||||
buttonMap[KeyEvent.VK_SPACE] = Component.Identifier.Key.SPACE.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_CAPS_LOCK] = Component.Identifier.Key.CAPITAL.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUM_LOCK] = Component.Identifier.Key.NUMLOCK.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_SCROLL_LOCK] = Component.Identifier.Key.SCROLL.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUMPAD7] = Component.Identifier.Key.NUMPAD7.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUMPAD8] = Component.Identifier.Key.NUMPAD8.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUMPAD9] = Component.Identifier.Key.NUMPAD9.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_SUBTRACT] = Component.Identifier.Key.SUBTRACT.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUMPAD4] = Component.Identifier.Key.NUMPAD4.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUMPAD5] = Component.Identifier.Key.NUMPAD5.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUMPAD6] = Component.Identifier.Key.NUMPAD6.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_ADD] = Component.Identifier.Key.ADD.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUMPAD1] = Component.Identifier.Key.NUMPAD1.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUMPAD2] = Component.Identifier.Key.NUMPAD2.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUMPAD3] = Component.Identifier.Key.NUMPAD3.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NUMPAD0] = Component.Identifier.Key.NUMPAD0.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_DECIMAL] = Component.Identifier.Key.DECIMAL.getKeyIndex();
|
||||
|
||||
buttonMap[KeyEvent.VK_KANA] = Component.Identifier.Key.KANA.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_CONVERT] = Component.Identifier.Key.CONVERT.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_NONCONVERT] = Component.Identifier.Key.NOCONVERT.getKeyIndex();
|
||||
|
||||
buttonMap[KeyEvent.VK_CIRCUMFLEX] = Component.Identifier.Key.CIRCUMFLEX.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_AT] = Component.Identifier.Key.AT.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_COLON] = Component.Identifier.Key.COLON.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_UNDERSCORE] = Component.Identifier.Key.UNDERLINE.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_KANJI] = Component.Identifier.Key.KANJI.getKeyIndex();
|
||||
|
||||
buttonMap[KeyEvent.VK_STOP] = Component.Identifier.Key.STOP.getKeyIndex();
|
||||
|
||||
buttonMap[KeyEvent.VK_DIVIDE] = Component.Identifier.Key.DIVIDE.getKeyIndex();
|
||||
|
||||
buttonMap[KeyEvent.VK_PAUSE] = Component.Identifier.Key.PAUSE.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_HOME] = Component.Identifier.Key.HOME.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_UP] = Component.Identifier.Key.UP.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_PAGE_UP] = Component.Identifier.Key.PAGEUP.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_LEFT] = Component.Identifier.Key.LEFT.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_RIGHT] = Component.Identifier.Key.RIGHT.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_END] = Component.Identifier.Key.END.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_DOWN] = Component.Identifier.Key.DOWN.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_PAGE_DOWN] = Component.Identifier.Key.PAGEDOWN.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_INSERT] = Component.Identifier.Key.INSERT.getKeyIndex();
|
||||
buttonMap[KeyEvent.VK_DELETE] = Component.Identifier.Key.DELETE.getKeyIndex();
|
||||
|
||||
//Windows key is a special one
|
||||
|
||||
// start working
|
||||
protected AWTKeyboard() {
|
||||
super("AWTKeyboard", createComponents(), new Controller[]{}, new Rumbler[]{});
|
||||
Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
|
||||
}
|
||||
resizeEventQueue(EVENT_QUEUE_DEPTH);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see net.java.games.input.Keyboard#isKeyPressed(net.java.games.input.Keyboard.Key)
|
||||
*/
|
||||
protected boolean isKeyPressed(Key key) {
|
||||
int keyId = ((Component.Identifier.Key)key.getIdentifier()).getKeyIndex();
|
||||
return buttonValues[keyId];
|
||||
}
|
||||
private final static Component[] createComponents() {
|
||||
List components = new ArrayList();
|
||||
Field[] vkey_fields = KeyEvent.class.getFields();
|
||||
for (int i = 0; i < vkey_fields.length; i++) {
|
||||
Field vkey_field = vkey_fields[i];
|
||||
try {
|
||||
if (Modifier.isStatic(vkey_field.getModifiers()) && vkey_field.getType() == int.class &&
|
||||
vkey_field.getName().startsWith("VK_")) {
|
||||
int vkey_code = vkey_field.getInt(null);
|
||||
Component.Identifier.Key key_id = AWTKeyMap.mapKeyCode(vkey_code);
|
||||
if (key_id != Component.Identifier.Key.UNKNOWN)
|
||||
components.add(new Key(key_id));
|
||||
}
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
components.add(new Key(Component.Identifier.Key.RCONTROL));
|
||||
components.add(new Key(Component.Identifier.Key.LCONTROL));
|
||||
components.add(new Key(Component.Identifier.Key.RSHIFT));
|
||||
components.add(new Key(Component.Identifier.Key.LSHIFT));
|
||||
components.add(new Key(Component.Identifier.Key.RALT));
|
||||
components.add(new Key(Component.Identifier.Key.LALT));
|
||||
components.add(new Key(Component.Identifier.Key.NUMPADENTER));
|
||||
components.add(new Key(Component.Identifier.Key.RETURN));
|
||||
components.add(new Key(Component.Identifier.Key.NUMPADCOMMA));
|
||||
components.add(new Key(Component.Identifier.Key.COMMA));
|
||||
return (Component[])components.toArray(new Component[]{});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see net.java.games.input.Controller#poll()
|
||||
*/
|
||||
public boolean poll() {
|
||||
return true;
|
||||
}
|
||||
private final void resizeEventQueue(int size) {
|
||||
processed_events = new Event[size];
|
||||
for (int i = 0; i < processed_events.length; i++)
|
||||
processed_events[i] = new Event();
|
||||
processed_events_index = 0;
|
||||
}
|
||||
|
||||
protected final void setDeviceEventQueueSize(int size) throws IOException {
|
||||
resizeEventQueue(size);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see java.awt.event.AWTEventListener#eventDispatched(java.awt.AWTEvent)
|
||||
*/
|
||||
public void eventDispatched(AWTEvent event) {
|
||||
if(event instanceof KeyEvent) {
|
||||
KeyEvent keyEvent = (KeyEvent)event;
|
||||
if(keyEvent.getID() == KeyEvent.KEY_PRESSED) {
|
||||
//the key was pressed
|
||||
//System.out.println("Key pressed KeyCode: " + keyEvent.getKeyCode() + " KeyChar: " + keyEvent.getKeyChar());
|
||||
buttonValues[findKeyIndex(keyEvent)] = true;
|
||||
} else if(keyEvent.getID() == KeyEvent.KEY_RELEASED) {
|
||||
KeyEvent nextPress = (KeyEvent)Toolkit.getDefaultToolkit().getSystemEventQueue().peekEvent(KeyEvent.KEY_PRESSED);
|
||||
|
||||
if ((nextPress == null) || (nextPress.getWhen() != keyEvent.getWhen())) {
|
||||
//the key came really came up
|
||||
//System.out.println("Key released KeyCode: " + keyEvent.getKeyCode() + " KeyChar: " + keyEvent.getKeyChar());
|
||||
buttonValues[findKeyIndex(keyEvent)] = false;
|
||||
}
|
||||
} else {
|
||||
//System.out.println("AWTKeyboard: Ignoring event " + keyEvent.getID());
|
||||
}
|
||||
} else {
|
||||
throw new IllegalArgumentException("AWTKeyboard not expecting event of type " + event.getClass().getName());
|
||||
public final synchronized void eventDispatched(AWTEvent event) {
|
||||
if (event instanceof KeyEvent)
|
||||
awt_events.add(event);
|
||||
}
|
||||
|
||||
public final synchronized void pollDevice() throws IOException {
|
||||
for (int i = 0; i < awt_events.size(); i++) {
|
||||
KeyEvent event = (KeyEvent)awt_events.get(i);
|
||||
processEvent(event);
|
||||
}
|
||||
awt_events.clear();
|
||||
}
|
||||
|
||||
private final void processEvent(KeyEvent event) {
|
||||
Component.Identifier.Key key_id = AWTKeyMap.map(event);
|
||||
if (key_id == null)
|
||||
return;
|
||||
Key key = (Key)getComponent(key_id);
|
||||
if (key == null)
|
||||
return;
|
||||
long nanos = event.getWhen()*1000000L;
|
||||
if (event.getID() == KeyEvent.KEY_PRESSED) {
|
||||
//the key was pressed
|
||||
addEvent(key, 1, nanos);
|
||||
} else if (event.getID() == KeyEvent.KEY_RELEASED) {
|
||||
KeyEvent nextPress = (KeyEvent)Toolkit.getDefaultToolkit().getSystemEventQueue().peekEvent(KeyEvent.KEY_PRESSED);
|
||||
if ((nextPress == null) || (nextPress.getWhen() != event.getWhen())) {
|
||||
//the key came really came up
|
||||
addEvent(key, 0, nanos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int findKeyIndex(KeyEvent keyEvent) {
|
||||
int buttonIndex = 0;
|
||||
if(keyEvent.getKeyCode() == KeyEvent.VK_CONTROL) {
|
||||
if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_LEFT) {
|
||||
buttonIndex = Component.Identifier.Key.LCONTROL.getKeyIndex();
|
||||
} else if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT) {
|
||||
buttonIndex = Component.Identifier.Key.RCONTROL.getKeyIndex();
|
||||
}
|
||||
} else if(keyEvent.getKeyCode() == KeyEvent.VK_SHIFT) {
|
||||
if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_LEFT) {
|
||||
buttonIndex = Component.Identifier.Key.LSHIFT.getKeyIndex();
|
||||
} else if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT) {
|
||||
buttonIndex = Component.Identifier.Key.RSHIFT.getKeyIndex();
|
||||
}
|
||||
} else if(keyEvent.getKeyCode() == KeyEvent.VK_ALT) {
|
||||
if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_LEFT) {
|
||||
buttonIndex = Component.Identifier.Key.LALT.getKeyIndex();
|
||||
} else if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT) {
|
||||
buttonIndex = Component.Identifier.Key.RALT.getKeyIndex();
|
||||
}
|
||||
//this is 1.5 only
|
||||
/* } else if(keyEvent.getKeyCode() == KeyEvent.VK_WINDOWS) {
|
||||
if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_LEFT) {
|
||||
buttonIndex = Component.Identifier.Key.LWIN.getKeyIndex();
|
||||
} else if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT) {
|
||||
buttonIndex = Component.Identifier.Key.RWIN.getKeyIndex();
|
||||
}*/
|
||||
} else if(keyEvent.getKeyCode() == KeyEvent.VK_ENTER) {
|
||||
if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD) {
|
||||
buttonIndex = Component.Identifier.Key.NUMPADENTER.getKeyIndex();
|
||||
} else {
|
||||
buttonIndex = Component.Identifier.Key.RETURN.getKeyIndex();
|
||||
}
|
||||
} else if(keyEvent.getKeyCode() == KeyEvent.VK_COMMA) {
|
||||
if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD) {
|
||||
buttonIndex = Component.Identifier.Key.NUMPADCOMMA.getKeyIndex();
|
||||
} else {
|
||||
buttonIndex = Component.Identifier.Key.COMMA.getKeyIndex();
|
||||
}
|
||||
} else {
|
||||
buttonIndex = buttonMap[keyEvent.getKeyCode()];
|
||||
}
|
||||
if(buttonIndex == 0 ) {
|
||||
System.out.println("Unrecognised key: " + keyEvent.getKeyCode() + " (" + keyEvent.getKeyLocation() + " " + keyEvent.getKeyChar() + ")");
|
||||
}
|
||||
return buttonIndex;
|
||||
}
|
||||
private final void addEvent(Key key, float value, long nanos) {
|
||||
key.setValue(value);
|
||||
if (processed_events_index < processed_events.length)
|
||||
processed_events[processed_events_index++].set(key, value, nanos);
|
||||
}
|
||||
|
||||
protected final synchronized boolean getNextDeviceEvent(Event event) throws IOException {
|
||||
if (processed_events_index == 0)
|
||||
return false;
|
||||
processed_events_index--;
|
||||
event.set(processed_events[0]);
|
||||
Event tmp = processed_events[0];
|
||||
processed_events[0] = processed_events[processed_events_index];
|
||||
processed_events[processed_events_index] = tmp;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private final static class Key extends AbstractComponent {
|
||||
private float value;
|
||||
|
||||
public Key(Component.Identifier.Key key_id) {
|
||||
super(key_id.getName(), key_id);
|
||||
}
|
||||
|
||||
public final void setValue(float value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
protected final float poll() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public final boolean isAnalog() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public final boolean isRelative() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,165 +33,190 @@ import java.awt.event.AWTEventListener;
|
|||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseWheelEvent;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @author Jeremy
|
||||
*
|
||||
* TODO To change the template for this generated type comment go to
|
||||
* Window - Preferences - Java - Code Style - Code Templates
|
||||
* @author elias
|
||||
*/
|
||||
public class AWTMouse extends Mouse implements AWTEventListener {
|
||||
|
||||
private AWTAxis xMove = new AWTAxis("X", Component.Identifier.Axis.X);
|
||||
private AWTAxis yMove = new AWTAxis("Y", Component.Identifier.Axis.Y);
|
||||
private AWTAxis zMove = new AWTAxis("Wheel", Component.Identifier.Axis.SLIDER);
|
||||
|
||||
private AWTButton button1 = new AWTButton("Left", Component.Identifier.Button.LEFT);
|
||||
private AWTButton button2 = new AWTButton("Middle", Component.Identifier.Button.MIDDLE);
|
||||
private AWTButton button3 = new AWTButton("Right", Component.Identifier.Button.RIGHT);
|
||||
|
||||
private Point oldMouseLocation = new Point(0,0);
|
||||
private Point newMouseLocation = new Point(0,0);
|
||||
private int scrollAmount = 0;
|
||||
private boolean button1Value = false;
|
||||
private boolean button2Value = false;
|
||||
private boolean button3Value = false;
|
||||
final class AWTMouse extends Mouse implements AWTEventListener {
|
||||
private final static int EVENT_X = 1;
|
||||
private final static int EVENT_Y = 2;
|
||||
private final static int EVENT_BUTTON = 4;
|
||||
|
||||
/**
|
||||
* @param name
|
||||
*/
|
||||
protected AWTMouse(String name) {
|
||||
super(name);
|
||||
private final List awt_events = new ArrayList();
|
||||
private final List processed_awt_events = new ArrayList();
|
||||
|
||||
private int event_state = EVENT_X;
|
||||
|
||||
protected AWTMouse() {
|
||||
super("AWTMouse", createComponents(), new Controller[]{}, new Rumbler[]{});
|
||||
Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_WHEEL_EVENT_MASK);
|
||||
this.ball = new AWTMouseBall(xMove, yMove, zMove);
|
||||
this.buttons = new AWTMouseButtons(new AWTMouseButton(button1), new AWTMouseButton(button2), new AWTMouseButton(button3));
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see net.java.games.input.Controller#poll()
|
||||
*/
|
||||
public boolean poll() {
|
||||
button1.setValue(button1Value);
|
||||
button2.setValue(button2Value);
|
||||
button3.setValue(button3Value);
|
||||
|
||||
zMove.setValue(scrollAmount);
|
||||
scrollAmount = 0;
|
||||
|
||||
//System.out.println("old mouse location " + oldMouseLocation);
|
||||
//System.out.println("new mouse location " + newMouseLocation);
|
||||
yMove.setValue((float)(newMouseLocation.getY() - oldMouseLocation.getY()));
|
||||
xMove.setValue((float)(newMouseLocation.getX() - oldMouseLocation.getX()));
|
||||
oldMouseLocation.setLocation(newMouseLocation.getLocation());
|
||||
//newMouseLocation.setLocation(0,0);
|
||||
|
||||
return true;
|
||||
}
|
||||
private final static Component[] createComponents() {
|
||||
return new Component[]{new Axis(Component.Identifier.Axis.X),
|
||||
new Axis(Component.Identifier.Axis.Y),
|
||||
new Axis(Component.Identifier.Axis.Z),
|
||||
new Button(Component.Identifier.Button.LEFT),
|
||||
new Button(Component.Identifier.Button.MIDDLE),
|
||||
new Button(Component.Identifier.Button.RIGHT)};
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see java.awt.event.AWTEventListener#eventDispatched(java.awt.AWTEvent)
|
||||
*/
|
||||
public void eventDispatched(AWTEvent event) {
|
||||
//System.out.println("AWTMouse: From: " + arg0.getSource() + " - " + arg0);
|
||||
if(event instanceof MouseWheelEvent) {
|
||||
private final void processButtons(int button_enum, float value) {
|
||||
Button button = getButton(button_enum);
|
||||
if (button != null)
|
||||
button.setValue(value);
|
||||
}
|
||||
|
||||
private final Button getButton(int button_enum) {
|
||||
switch (button_enum) {
|
||||
case MouseEvent.BUTTON1:
|
||||
return (Button)getLeft();
|
||||
case MouseEvent.BUTTON2:
|
||||
return (Button)getMiddle();
|
||||
case MouseEvent.BUTTON3:
|
||||
return (Button)getRight();
|
||||
case MouseEvent.NOBUTTON:
|
||||
default:
|
||||
// Unknown button
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private final void processEvent(AWTEvent event) throws IOException {
|
||||
if (event instanceof MouseWheelEvent) {
|
||||
MouseWheelEvent mwe = (MouseWheelEvent)event;
|
||||
scrollAmount += mwe.getWheelRotation();
|
||||
//System.out.println("New scroll amount: " + scrollAmount);
|
||||
}
|
||||
if(event instanceof MouseEvent) {
|
||||
Axis wheel = (Axis)getWheel();
|
||||
wheel.setValue(wheel.poll() + mwe.getWheelRotation());
|
||||
} else if (event instanceof MouseEvent) {
|
||||
MouseEvent me = (MouseEvent)event;
|
||||
newMouseLocation.setLocation(me.getPoint());
|
||||
//System.out.println("Mouse moved to " + newMouseLocation);
|
||||
if(me.getID() == MouseEvent.MOUSE_PRESSED) {
|
||||
//System.out.println("Button was pressed");
|
||||
if(me.getButton() == MouseEvent.BUTTON1) {
|
||||
//System.out.println("Button 1 was pressed");
|
||||
button1Value = true;
|
||||
} else if(me.getButton() == MouseEvent.BUTTON2) {
|
||||
//System.out.println("Button 2 was pressed");
|
||||
button2Value = true;
|
||||
} else if(me.getButton() == MouseEvent.BUTTON3) {
|
||||
//System.out.println("Button 3 was pressed");
|
||||
button3Value = true;
|
||||
}
|
||||
} else if(me.getID() == MouseEvent.MOUSE_RELEASED) {
|
||||
//ystem.out.println("Button was released");
|
||||
if(me.getButton() == MouseEvent.BUTTON1) {
|
||||
//System.out.println("Button 1 was released");
|
||||
button1Value = false;
|
||||
} else if(me.getButton() == MouseEvent.BUTTON2) {
|
||||
//System.out.println("Button 2 was released");
|
||||
button2Value = false;
|
||||
} else if(me.getButton() == MouseEvent.BUTTON3) {
|
||||
//System.out.println("Button 3 was released");
|
||||
button3Value = false;
|
||||
}
|
||||
} else {
|
||||
//System.out.println("Mouse event ID " + me.getID() + " (" + me.getClass().getName() + ")");
|
||||
}
|
||||
} else {
|
||||
System.out.println("AWTMouse got an event of type " + event.getClass().getName());
|
||||
}
|
||||
}
|
||||
Axis x = (Axis)getX();
|
||||
Axis y = (Axis)getY();
|
||||
x.setValue(me.getX());
|
||||
y.setValue(me.getY());
|
||||
switch (me.getID()) {
|
||||
case MouseEvent.MOUSE_PRESSED:
|
||||
processButtons(me.getButton(), 1f);
|
||||
break;
|
||||
case MouseEvent.MOUSE_RELEASED:
|
||||
processButtons(me.getButton(), 0f);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Mouse ball under AWT
|
||||
*/
|
||||
private class AWTMouseBall extends Ball {
|
||||
/** Constructs the new mouse ball
|
||||
* @param x The x axis
|
||||
* @param y The y axis
|
||||
* @param wheel The mouse wheel axis
|
||||
*/
|
||||
public AWTMouseBall(Component x, Component y, Component wheel) {
|
||||
super(AWTMouse.this.getName() + " ball");
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.wheel = wheel;
|
||||
public final synchronized void pollDevice() throws IOException {
|
||||
Axis wheel = (Axis)getWheel();
|
||||
wheel.setValue(0);
|
||||
for (int i = 0; i < awt_events.size(); i++) {
|
||||
AWTEvent event = (AWTEvent)awt_events.get(i);
|
||||
processEvent(event);
|
||||
processed_awt_events.add(event);
|
||||
}
|
||||
}
|
||||
awt_events.clear();
|
||||
}
|
||||
|
||||
/** Mouse buttons under AWT
|
||||
*/
|
||||
private class AWTMouseButtons extends Buttons {
|
||||
/** Creates the new mouse's buttons
|
||||
* @param left Left mouse button
|
||||
* @param right Right mouse button
|
||||
* @param middle Middle mouse button
|
||||
*/
|
||||
public AWTMouseButtons(Button left, Button right, Button middle) {
|
||||
super(AWTMouse.this.getName() + " buttons");
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
this.middle = middle;
|
||||
}
|
||||
}
|
||||
protected final synchronized boolean getNextDeviceEvent(Event event) throws IOException {
|
||||
while (true) {
|
||||
if (processed_awt_events.isEmpty())
|
||||
return false;
|
||||
AWTEvent awt_event = (AWTEvent)processed_awt_events.get(0);
|
||||
if (awt_event instanceof MouseWheelEvent) {
|
||||
MouseWheelEvent awt_wheel_event = (MouseWheelEvent)awt_event;
|
||||
long nanos = awt_wheel_event.getWhen()*1000000L;
|
||||
event.set(getWheel(), awt_wheel_event.getWheelRotation(), nanos);
|
||||
processed_awt_events.remove(0);
|
||||
} else if (awt_event instanceof MouseEvent) {
|
||||
MouseEvent mouse_event = (MouseEvent)awt_event;
|
||||
long nanos = mouse_event.getWhen()*1000000L;
|
||||
switch (event_state) {
|
||||
case EVENT_X:
|
||||
event_state = EVENT_Y;
|
||||
event.set(getX(), mouse_event.getX(), nanos);
|
||||
return true;
|
||||
case EVENT_Y:
|
||||
event_state = EVENT_BUTTON;
|
||||
event.set(getY(), mouse_event.getY(), nanos);
|
||||
return true;
|
||||
case EVENT_BUTTON:
|
||||
processed_awt_events.remove(0);
|
||||
event_state = EVENT_X;
|
||||
Button button = getButton(mouse_event.getButton());
|
||||
if (button != null) {
|
||||
switch (mouse_event.getID()) {
|
||||
case MouseEvent.MOUSE_PRESSED:
|
||||
event.set(button, 1f, nanos);
|
||||
return true;
|
||||
case MouseEvent.MOUSE_RELEASED:
|
||||
event.set(button, 0f, nanos);
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Unknown event state: " + event_state);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** AWT specific mouse buttons
|
||||
*/
|
||||
private class AWTMouseButton extends Mouse.Button {
|
||||
/** The real Axis
|
||||
*/
|
||||
private Component realAxis;
|
||||
|
||||
/** Construct an AWT mouse button from the given axis
|
||||
* @param axis The axis that holds the data
|
||||
*/
|
||||
public AWTMouseButton(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();
|
||||
}
|
||||
}
|
||||
public final synchronized void eventDispatched(AWTEvent event) {
|
||||
awt_events.add(event);
|
||||
}
|
||||
|
||||
final static class Axis extends AbstractComponent {
|
||||
private float value;
|
||||
|
||||
public Axis(Component.Identifier.Axis axis_id) {
|
||||
super(axis_id.getName(), axis_id);
|
||||
}
|
||||
|
||||
public final boolean isRelative() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public final boolean isAnalog() {
|
||||
return true;
|
||||
}
|
||||
|
||||
protected final void setValue(float value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
protected final float poll() throws IOException {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
final static class Button extends AbstractComponent {
|
||||
private float value;
|
||||
|
||||
public Button(Component.Identifier.Button button_id) {
|
||||
super(button_id.getName(), button_id);
|
||||
}
|
||||
|
||||
protected final void setValue(float value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
protected final float poll() throws IOException {
|
||||
return value;
|
||||
}
|
||||
|
||||
public final boolean isAnalog() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public final boolean isRelative() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
118
plugins/common/src/native/util.c
Normal file
118
plugins/common/src/native/util.c
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
/*
|
||||
* %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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <jni.h>
|
||||
#include "util.h"
|
||||
|
||||
static jstring sprintfJavaString(JNIEnv *env, const char *format, va_list ap) {
|
||||
#define BUFFER_SIZE 4000
|
||||
char buffer[BUFFER_SIZE];
|
||||
jstring str;
|
||||
#ifdef _WIN32
|
||||
_vsnprintf(buffer, BUFFER_SIZE, format, ap);
|
||||
#else
|
||||
vsnprintf(buffer, BUFFER_SIZE, format, ap);
|
||||
#endif
|
||||
buffer[BUFFER_SIZE - 1] = '\0';
|
||||
str = (*env)->NewStringUTF(env, buffer);
|
||||
return str;
|
||||
}
|
||||
|
||||
void printfJava(JNIEnv *env, const char *format, ...) {
|
||||
jstring str;
|
||||
jclass org_lwjgl_LWJGLUtil_class;
|
||||
jmethodID log_method;
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
str = sprintfJavaString(env, format, ap);
|
||||
va_end(ap);
|
||||
org_lwjgl_LWJGLUtil_class = (*env)->FindClass(env, "net/java/games/input/ControllerEnvironment");
|
||||
if (org_lwjgl_LWJGLUtil_class == NULL)
|
||||
return;
|
||||
log_method = (*env)->GetStaticMethodID(env, org_lwjgl_LWJGLUtil_class, "log", "(Ljava/lang/String;)V");
|
||||
if (log_method == NULL)
|
||||
return;
|
||||
(*env)->CallStaticVoidMethod(env, org_lwjgl_LWJGLUtil_class, log_method, str);
|
||||
}
|
||||
|
||||
static void throwException(JNIEnv * env, const char *exception_name, const char *format, va_list ap) {
|
||||
jstring str;
|
||||
jobject exception;
|
||||
|
||||
if ((*env)->ExceptionCheck(env) == JNI_TRUE)
|
||||
return; // The JVM crashes if we try to throw two exceptions from one native call
|
||||
str = sprintfJavaString(env, format, ap);
|
||||
exception = newJObject(env, exception_name, "(Ljava/lang/String;)V", str);
|
||||
(*env)->Throw(env, exception);
|
||||
}
|
||||
|
||||
void throwRuntimeException(JNIEnv * env, const char *format, ...) {
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
throwException(env, "java/lang/RuntimeException", format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void throwIOException(JNIEnv * env, const char *format, ...) {
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
throwException(env, "java/io/IOException", format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
jobject newJObject(JNIEnv * env, const char *class_name, const char *constructor_signature, ...) {
|
||||
va_list ap;
|
||||
jclass clazz;
|
||||
jmethodID constructor;
|
||||
jobject obj;
|
||||
|
||||
clazz = (*env)->FindClass(env, class_name);
|
||||
if (clazz == NULL)
|
||||
return NULL;
|
||||
constructor = (*env)->GetMethodID(env, clazz, "<init>", constructor_signature);
|
||||
if (constructor == NULL)
|
||||
return NULL;
|
||||
va_start(ap, constructor_signature);
|
||||
obj = (*env)->NewObjectV(env, clazz, constructor, ap);
|
||||
va_end(ap);
|
||||
return obj;
|
||||
}
|
||||
|
||||
48
plugins/common/src/native/util.h
Normal file
48
plugins/common/src/native/util.h
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* %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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <jni.h>
|
||||
|
||||
extern void printfJava(JNIEnv *env, const char *format, ...);
|
||||
extern void throwRuntimeException(JNIEnv * env, const char *format, ...);
|
||||
extern void throwIOException(JNIEnv * env, const char *format, ...);
|
||||
extern jobject newJObject(JNIEnv * env, const char *class_name, const char *constructor_signature, ...);
|
||||
|
||||
|
|
@ -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>
|
||||
<class name="net.java.games.input.LinuxEventDevice"/>
|
||||
<class name="net.java.games.input.LinuxJoystickDevice"/>
|
||||
</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>
|
||||
</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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
#include <stdint.h>
|
||||
#include <linux/input.h>
|
||||
#include "eventInterfaceTypes.h"
|
||||
#include "Device.h"
|
||||
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;
|
||||
}
|
||||
|
||||
class JoystickDevice : public Device {
|
||||
public final String toString() {
|
||||
return "AbsInfo: value = " + value + " | min = " + minimum + " | max = " + maximum + " | fuzz = " + fuzz + " | flat = " + flat;
|
||||
}
|
||||
|
||||
private:
|
||||
int fd;
|
||||
int inited;
|
||||
char *name;
|
||||
int numButtons;
|
||||
int *absAxesData;
|
||||
uint8_t *buttonData;
|
||||
int numAbsAxes;
|
||||
public final int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
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 getMax() {
|
||||
return maximum;
|
||||
}
|
||||
|
||||
#endif //eventInterface_eventDevice_h
|
||||
final int getMin() {
|
||||
return minimum;
|
||||
}
|
||||
|
||||
final int getFlat() {
|
||||
return flat;
|
||||
}
|
||||
|
||||
final int getFuzz() {
|
||||
return fuzz;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,192 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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 (jeremy@newdawnsoftware.com)
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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 LinuxAxisDescriptor {
|
||||
private int type;
|
||||
private int code;
|
||||
|
||||
public final void set(int type, int code) {
|
||||
this.type = type;
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public final int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public final int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public final int hashCode() {
|
||||
return type ^ code;
|
||||
}
|
||||
|
||||
public final boolean equals(Object other) {
|
||||
if (!(other instanceof LinuxAxisDescriptor))
|
||||
return false;
|
||||
LinuxAxisDescriptor descriptor = (LinuxAxisDescriptor)other;
|
||||
return descriptor.type == type && descriptor.code == code;
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "LinuxAxis: type = 0x" + Integer.toHexString(type) + ", code = 0x" + Integer.toHexString(code);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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"
|
||||
/**
|
||||
* @author elias
|
||||
*/
|
||||
final class LinuxConstantFF extends LinuxForceFeedbackEffect {
|
||||
public LinuxConstantFF(LinuxEventDevice device) throws IOException {
|
||||
super(device);
|
||||
}
|
||||
|
||||
int evGetEventInterfaceVersionNumber();
|
||||
int evInit();
|
||||
int evGetNumberDevices();
|
||||
void evGetDevices(Device **deviceList);
|
||||
|
||||
#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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 (jeremy@newdawnsoftware.com)
|
||||
* @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 (jeremy@newdawnsoftware.com)
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
import java.io.IOException;
|
||||
|
||||
#include <stdint.h>
|
||||
#include <linux/input.h>
|
||||
#include "eventInterfaceTypes.h"
|
||||
#include "Device.h"
|
||||
#include "EventDevice.h"
|
||||
#include "JoystickDevice.h"
|
||||
#include "MixedDevice.h"
|
||||
abstract class LinuxDeviceTask {
|
||||
public final static int INPROGRESS = 1;
|
||||
public final static int COMPLETED = 2;
|
||||
public final static int FAILED = 3;
|
||||
|
||||
private Object result;
|
||||
private IOException exception;
|
||||
private int state = INPROGRESS;
|
||||
|
||||
public final void doExecute() {
|
||||
try {
|
||||
result = execute();
|
||||
state = COMPLETED;
|
||||
} catch (IOException e) {
|
||||
exception = e;
|
||||
state = FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
class MixedDevice : public Device {
|
||||
public final IOException getException() {
|
||||
return exception;
|
||||
}
|
||||
|
||||
private:
|
||||
JoystickDevice *joystickDevice;
|
||||
EventDevice *eventDevice;
|
||||
public final Object getResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
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();
|
||||
};
|
||||
|
||||
#endif //eventInterface_eventDevice_h
|
||||
public final int getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
protected abstract Object execute() throws IOException;
|
||||
}
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Linux doesn't have proper support for force feedback
|
||||
* from different threads since it relies on PIDs
|
||||
* to determine ownership of a particular effect slot.
|
||||
* Therefore we have to hack around this by
|
||||
* making sure everything related to FF
|
||||
* (including the final device close that performs
|
||||
* and implicit deletion of all the process' effects)
|
||||
* is run on a single thread.
|
||||
*/
|
||||
final class LinuxDeviceThread extends Thread {
|
||||
private final List tasks = new ArrayList();
|
||||
|
||||
public LinuxDeviceThread() {
|
||||
setDaemon(true);
|
||||
start();
|
||||
}
|
||||
|
||||
public synchronized final void run() {
|
||||
while (true) {
|
||||
if (!tasks.isEmpty()) {
|
||||
LinuxDeviceTask task = (LinuxDeviceTask)tasks.remove(0);
|
||||
task.doExecute();
|
||||
synchronized (task) {
|
||||
task.notify();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
wait();
|
||||
} catch (InterruptedException e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final Object execute(LinuxDeviceTask task) throws IOException {
|
||||
synchronized (this) {
|
||||
tasks.add(task);
|
||||
notify();
|
||||
}
|
||||
synchronized (task) {
|
||||
while (task.getState() == LinuxDeviceTask.INPROGRESS) {
|
||||
try {
|
||||
task.wait();
|
||||
} catch (InterruptedException e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
switch (task.getState()) {
|
||||
case LinuxDeviceTask.COMPLETED:
|
||||
return task.getResult();
|
||||
case LinuxDeviceTask.FAILED:
|
||||
throw task.getException();
|
||||
default:
|
||||
throw new RuntimeException("Invalid task state: " + task.getState());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -26,27 +26,47 @@
|
|||
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 (jeremy@newdawnsoftware.com)
|
||||
*/
|
||||
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();
|
||||
private final static LinuxDeviceThread device_thread = new LinuxDeviceThread();
|
||||
|
||||
/** 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 final static Object execute(LinuxDeviceTask task) throws IOException {
|
||||
return device_thread.execute(task);
|
||||
}
|
||||
|
||||
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 +74,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];
|
||||
}
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 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 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
53
plugins/linux/src/java/net/java/games/input/LinuxEvent.java
Normal file
53
plugins/linux/src/java/net/java/games/input/LinuxEvent.java
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,115 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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 (jeremy@newdawnsoftware.com)
|
||||
*/
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,393 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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 synchronized final void close() throws IOException {
|
||||
if (closed)
|
||||
return;
|
||||
closed = true;
|
||||
LinuxEnvironmentPlugin.execute(new LinuxDeviceTask() {
|
||||
protected final Object execute() throws IOException {
|
||||
nClose(fd);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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;
|
||||
private final WriteTask write_task = new WriteTask();
|
||||
private final UploadTask upload_task = new UploadTask();
|
||||
|
||||
public LinuxForceFeedbackEffect(LinuxEventDevice device) throws IOException {
|
||||
this.device = device;
|
||||
this.ff_id = upload_task.doUpload(-1, 0);
|
||||
}
|
||||
|
||||
protected abstract int upload(int id, float intensity) throws IOException;
|
||||
|
||||
protected final LinuxEventDevice getDevice() {
|
||||
return device;
|
||||
}
|
||||
|
||||
public synchronized final void rumble(float intensity) {
|
||||
try {
|
||||
if (intensity > 0) {
|
||||
upload_task.doUpload(ff_id, intensity);
|
||||
write_task.write(1);
|
||||
} else {
|
||||
write_task.write(0);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
ControllerEnvironment.logln("Failed to rumble: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Erase doesn't seem to be implemented on Logitech joysticks,
|
||||
* so we'll rely on the kernel cleaning up on device close
|
||||
*/
|
||||
/*
|
||||
public final void erase() throws IOException {
|
||||
device.eraseEffect(ff_id);
|
||||
}
|
||||
*/
|
||||
public final String getAxisName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public final Component.Identifier getAxisIdentifier() {
|
||||
return null;
|
||||
}
|
||||
|
||||
private final class UploadTask extends LinuxDeviceTask {
|
||||
private int id;
|
||||
private float intensity;
|
||||
|
||||
public final int doUpload(int id, float intensity) throws IOException {
|
||||
this.id = id;
|
||||
this.intensity = intensity;
|
||||
LinuxEnvironmentPlugin.execute(this);
|
||||
return this.id;
|
||||
}
|
||||
|
||||
protected final Object execute() throws IOException {
|
||||
this.id = upload(id, intensity);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private final class WriteTask extends LinuxDeviceTask {
|
||||
private int value;
|
||||
|
||||
public final void write(int value) throws IOException {
|
||||
this.value = value;
|
||||
LinuxEnvironmentPlugin.execute(this);
|
||||
}
|
||||
|
||||
protected final Object execute() throws IOException {
|
||||
device.writeEvent(NativeDefinitions.EV_FF, ff_id, value);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,185 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
#include "Device.h"
|
||||
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;
|
||||
}
|
||||
|
||||
int jsGetJoystickInterfaceVersionNumber();
|
||||
int jsInit();
|
||||
int jsGetNumberDevices();
|
||||
void jsGetDevices(Device **deviceList);
|
||||
public final int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
#endif //joystickInterface_h
|
||||
public final int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public final int getNumber() {
|
||||
return number;
|
||||
}
|
||||
|
||||
public final long getNanos() {
|
||||
return nanos;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,175 +1,68 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
/*
|
||||
* %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 (jeremy@newdawnsoftware.com)
|
||||
*/
|
||||
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;
|
||||
|
||||
/*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);
|
||||
}
|
||||
/** 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;
|
||||
}
|
||||
|
||||
protected final boolean getNextDeviceEvent(Event event) throws IOException {
|
||||
return LinuxControllers.getNextDeviceEvent(event, device);
|
||||
}
|
||||
|
||||
public final void pollDevice() throws IOException {
|
||||
device.pollKeyStates();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,168 +1,68 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
/*
|
||||
* %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 (jeremy@newdawnsoftware.com)
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,315 +30,25 @@ package net.java.games.input;
|
|||
* Key.Identifiers
|
||||
* @author Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
95
plugins/linux/src/java/net/java/games/input/LinuxPOV.java
Normal file
95
plugins/linux/src/java/net/java/games/input/LinuxPOV.java
Normal file
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (C) 2004 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
|
|
@ -25,51 +25,30 @@
|
|||
*/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @author Jeremy
|
||||
*
|
||||
* TODO To change the template for this generated type comment go to
|
||||
* Window - Preferences - Java - Code Style - Code Templates
|
||||
* @author elias
|
||||
*/
|
||||
public class AWTAxis extends AbstractComponent {
|
||||
|
||||
private float value = 0.0f;
|
||||
|
||||
/**
|
||||
* @param name
|
||||
* @param id
|
||||
*/
|
||||
protected AWTAxis(String name, Identifier id) {
|
||||
super(name, id);
|
||||
final class LinuxRumbleFF extends LinuxForceFeedbackEffect {
|
||||
public LinuxRumbleFF(LinuxEventDevice device) throws IOException {
|
||||
super(device);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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() {
|
||||
return value;
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see net.java.games.input.Component#isRelative()
|
||||
*/
|
||||
public boolean isRelative() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 true;
|
||||
}
|
||||
|
||||
void setValue(float value) {
|
||||
this.value = value;
|
||||
}
|
||||
return getDevice().uploadRumbleEffect(id, 0, 0, 0, -1, 0, strong_magnitude, weak_magnitude);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,72 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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 (jeremy@newdawnsoftware.com)
|
||||
*/
|
||||
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
|
||||
|
|
@ -1,481 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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);
|
||||
}
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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
|
||||
|
|
@ -1,200 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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);
|
||||
}
|
||||
|
|
@ -1,134 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,147 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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];
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,357 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,160 +0,0 @@
|
|||
/**
|
||||
* Copyright (C) 2003 Jeremy Booth (jeremy@newdawnsoftware.com)
|
||||
*
|
||||
* 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];
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
257
plugins/linux/src/native/net_java_games_input_LinuxEventDevice.c
Normal file
257
plugins/linux/src/native/net_java_games_input_LinuxEventDevice.c
Normal file
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
86
plugins/windows/build.xml
Normal file
86
plugins/windows/build.xml
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
<?xml version="1.0"?>
|
||||
<project name="Direct Input Plugin" basedir="." default="all">
|
||||
<target name="init">
|
||||
<mkdir dir="classes"/>
|
||||
<mkdir dir="bin"/>
|
||||
<condition property="dx8" >
|
||||
<os family="Windows" />
|
||||
</condition>
|
||||
</target>
|
||||
|
||||
<target name="compile" depends="init">
|
||||
<javac srcdir="src/java" destdir="classes" debug="true" deprecation="true" source="1.4" target="1.4">
|
||||
<!-- To add something to the classpath: -->
|
||||
<classpath>
|
||||
<pathelement location="../../coreAPI/bin/jinput-core.jar"/>
|
||||
<pathelement location="../../lib/jutils.jar"/>
|
||||
</classpath>
|
||||
</javac>
|
||||
</target>
|
||||
|
||||
<target depends="init,compile" name="create_jniheaders">
|
||||
<javah destdir="src/native/dx8">
|
||||
<classpath>
|
||||
<pathelement path="classes"/>
|
||||
<pathelement location="../../coreAPI/classes"/>
|
||||
</classpath>
|
||||
<class name="net.java.games.input.IDirectInput"/>
|
||||
<class name="net.java.games.input.IDirectInputDevice"/>
|
||||
<class name="net.java.games.input.IDirectInputEffect"/>
|
||||
</javah>
|
||||
<javah destdir="src/native">
|
||||
<classpath>
|
||||
<pathelement path="classes"/>
|
||||
<pathelement location="../../coreAPI/classes"/>
|
||||
</classpath>
|
||||
<class name="net.java.games.input.DummyWindow"/>
|
||||
</javah>
|
||||
<javah destdir="src/native/raw">
|
||||
<classpath>
|
||||
<pathelement path="classes"/>
|
||||
<pathelement location="../../coreAPI/bin/jinput-core.jar"/>
|
||||
</classpath>
|
||||
<class name="net.java.games.input.RawInputEnvironmentPlugin"/>
|
||||
<class name="net.java.games.input.RawInputEventQueue"/>
|
||||
<class name="net.java.games.input.RawDevice"/>
|
||||
</javah>
|
||||
</target>
|
||||
|
||||
<target name="compile_native" depends="init,create_jniheaders" if="dx8">
|
||||
<ant dir="src/native" target="compile"/>
|
||||
<copy todir="bin">
|
||||
<fileset dir="src/native" includes="*.dll"/>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="jar" depends="init,compile">
|
||||
<jar jarfile="bin/dxinput.jar" compress="true" basedir="classes">
|
||||
<include name="**/*.class"/>
|
||||
</jar>
|
||||
</target>
|
||||
|
||||
<target name="all" depends="compile,compile_native,jar" description="Build everything.">
|
||||
</target>
|
||||
|
||||
<target name="javadoc" depends="init" description="Javadoc for my API.">
|
||||
<mkdir dir="apidocs"/>
|
||||
<javadoc packagenames="net.*"
|
||||
destdir="apidocs"
|
||||
additionalparam="-source 1.4">
|
||||
<sourcepath>
|
||||
<pathelement location="src/java"/>
|
||||
</sourcepath>
|
||||
<classpath>
|
||||
<pathelement location="../../bin/jinput-core.jar"/>
|
||||
<pathelement location="../../lib/jutils.jar"/>
|
||||
</classpath>
|
||||
</javadoc>
|
||||
</target>
|
||||
|
||||
<target name="clean" depends="init" description="Clean all build products.">
|
||||
<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>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* %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;
|
||||
|
||||
/**
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class DIAbstractController extends AbstractController {
|
||||
private final IDirectInputDevice device;
|
||||
private final Controller.Type type;
|
||||
|
||||
protected DIAbstractController(IDirectInputDevice device, Component[] components, Controller[] children, Rumbler[] rumblers, Controller.Type type) {
|
||||
super(device.getProductName(), components, children, rumblers);
|
||||
this.device = device;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public final void pollDevice() throws IOException {
|
||||
device.pollAll();
|
||||
}
|
||||
|
||||
protected final boolean getNextDeviceEvent(Event event) throws IOException {
|
||||
return DIControllers.getNextDeviceEvent(event, device);
|
||||
}
|
||||
|
||||
protected final void setDeviceEventQueueSize(int size) throws IOException {
|
||||
device.setBufferSize(size);
|
||||
}
|
||||
|
||||
public final Controller.Type getType() {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class DIComponent extends AbstractComponent {
|
||||
private final DIDeviceObject object;
|
||||
|
||||
public DIComponent(Component.Identifier identifier, DIDeviceObject object) {
|
||||
super(object.getName(), identifier);
|
||||
this.object = object;
|
||||
}
|
||||
|
||||
public final boolean isRelative() {
|
||||
return object.isRelative();
|
||||
}
|
||||
|
||||
public final boolean isAnalog() {
|
||||
return object.isAnalog();
|
||||
}
|
||||
|
||||
public final float getDeadZone() {
|
||||
return object.getDeadzone();
|
||||
}
|
||||
|
||||
public final DIDeviceObject getDeviceObject() {
|
||||
return object;
|
||||
}
|
||||
|
||||
protected final float poll() throws IOException {
|
||||
return DIControllers.poll(this, object);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* %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;
|
||||
|
||||
/**
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class DIControllers {
|
||||
private final static DIDeviceObjectData di_event = new DIDeviceObjectData();
|
||||
|
||||
/* synchronized to protect di_event */
|
||||
public final static synchronized boolean getNextDeviceEvent(Event event, IDirectInputDevice device) throws IOException {
|
||||
if (!device.getNextEvent(di_event))
|
||||
return false;
|
||||
DIDeviceObject object = device.mapEvent(di_event);
|
||||
int event_value;
|
||||
if (object.isRelative()) {
|
||||
event_value = object.getRelativeEventValue(di_event.getData());
|
||||
} else {
|
||||
event_value = di_event.getData();
|
||||
}
|
||||
DIComponent component = device.mapObject(object);
|
||||
event.set(component, component.getDeviceObject().convertValue(event_value), di_event.getNanos());
|
||||
return true;
|
||||
}
|
||||
|
||||
public final static float poll(Component component, DIDeviceObject object) throws IOException {
|
||||
int poll_data = object.getDevice().getPollData(object);
|
||||
float result;
|
||||
if (object.isRelative()) {
|
||||
result = object.getRelativePollValue(poll_data);
|
||||
} else {
|
||||
result = poll_data;
|
||||
}
|
||||
return object.convertValue(result);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,207 @@
|
|||
/*
|
||||
* %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;
|
||||
|
||||
/** Java wrapper for DIDEVICEOBJECTINSTANCE
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class DIDeviceObject {
|
||||
//DirectInput scales wheel deltas by 120
|
||||
private final static int WHEEL_SCALE = 120;
|
||||
|
||||
private final IDirectInputDevice device;
|
||||
private final byte[] guid;
|
||||
private final int identifier;
|
||||
private final int type;
|
||||
private final int instance;
|
||||
private final int guid_type;
|
||||
private final int flags;
|
||||
private final String name;
|
||||
private final Component.Identifier id;
|
||||
private final int format_offset;
|
||||
private final long min;
|
||||
private final long max;
|
||||
private final int deadzone;
|
||||
|
||||
/* These are used for emulating relative axes */
|
||||
private int last_poll_value;
|
||||
private int last_event_value;
|
||||
|
||||
public DIDeviceObject(IDirectInputDevice device, Component.Identifier id, byte[] guid, int guid_type, int identifier, int type, int instance, int flags, String name, int format_offset) throws IOException {
|
||||
this.device = device;
|
||||
this.id = id;
|
||||
this.guid = guid;
|
||||
this.identifier = identifier;
|
||||
this.type = type;
|
||||
this.instance = instance;
|
||||
this.guid_type = guid_type;
|
||||
this.flags = flags;
|
||||
this.name = name;
|
||||
this.format_offset = format_offset;
|
||||
if (isAxis() && !isRelative()) {
|
||||
long[] range = device.getRangeProperty(identifier);
|
||||
this.min = range[0];
|
||||
this.max = range[1];
|
||||
this.deadzone = device.getDeadzoneProperty(identifier);
|
||||
} else {
|
||||
this.min = IDirectInputDevice.DIPROPRANGE_NOMIN;
|
||||
this.max = IDirectInputDevice.DIPROPRANGE_NOMAX;
|
||||
this.deadzone = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public final synchronized int getRelativePollValue(int current_abs_value) {
|
||||
int rel_value = current_abs_value - last_poll_value;
|
||||
last_poll_value = current_abs_value;
|
||||
return rel_value;
|
||||
}
|
||||
|
||||
public final synchronized int getRelativeEventValue(int current_abs_value) {
|
||||
int rel_value = current_abs_value - last_event_value;
|
||||
last_event_value = current_abs_value;
|
||||
return rel_value;
|
||||
}
|
||||
|
||||
public final int getGUIDType() {
|
||||
return guid_type;
|
||||
}
|
||||
|
||||
public final int getFormatOffset() {
|
||||
return format_offset;
|
||||
}
|
||||
|
||||
public final IDirectInputDevice getDevice() {
|
||||
return device;
|
||||
}
|
||||
|
||||
public final int getDIIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
|
||||
public final Component.Identifier getIdentifier() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public final String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public final int getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public final int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public final byte[] getGUID() {
|
||||
return guid;
|
||||
}
|
||||
|
||||
public final int getFlags() {
|
||||
return flags;
|
||||
}
|
||||
|
||||
public final long getMin() {
|
||||
return min;
|
||||
}
|
||||
|
||||
public final long getMax() {
|
||||
return max;
|
||||
}
|
||||
|
||||
public final float getDeadzone() {
|
||||
return deadzone;
|
||||
}
|
||||
|
||||
public final boolean isButton() {
|
||||
return (type & IDirectInputDevice.DIDFT_BUTTON) != 0;
|
||||
}
|
||||
|
||||
private final boolean isAxis() {
|
||||
return (type & IDirectInputDevice.DIDFT_AXIS) != 0;
|
||||
}
|
||||
|
||||
public final boolean isRelative() {
|
||||
return isAxis() && (type & IDirectInputDevice.DIDFT_RELAXIS) != 0;
|
||||
}
|
||||
|
||||
public final boolean isAnalog() {
|
||||
return isAxis() && id != Component.Identifier.Axis.POV;
|
||||
}
|
||||
|
||||
public final float convertValue(float value) {
|
||||
if (getDevice().getType() == IDirectInputDevice.DI8DEVTYPE_MOUSE && id == Component.Identifier.Axis.Z) {
|
||||
return value/WHEEL_SCALE;
|
||||
} else if (isButton()) {
|
||||
return (((int)value) & 0x80) != 0 ? 1 : 0;
|
||||
} else if (id == Component.Identifier.Axis.POV) {
|
||||
int int_value = (int)value;
|
||||
if ((int_value & 0xFFFF) == 0xFFFF)
|
||||
return Component.POV.OFF;
|
||||
// DirectInput returns POV directions in hundredths of degree clockwise from north
|
||||
int slice = 360*100/16;
|
||||
if (int_value >= 0 && int_value < slice)
|
||||
return Component.POV.UP;
|
||||
else if (int_value < 3*slice)
|
||||
return Component.POV.UP_RIGHT;
|
||||
else if (int_value < 5*slice)
|
||||
return Component.POV.RIGHT;
|
||||
else if (int_value < 7*slice)
|
||||
return Component.POV.DOWN_RIGHT;
|
||||
else if (int_value < 9*slice)
|
||||
return Component.POV.DOWN;
|
||||
else if (int_value < 11*slice)
|
||||
return Component.POV.DOWN_LEFT;
|
||||
else if (int_value < 13*slice)
|
||||
return Component.POV.LEFT;
|
||||
else if (int_value < 15*slice)
|
||||
return Component.POV.UP_LEFT;
|
||||
else
|
||||
return Component.POV.UP;
|
||||
} else if (isAxis() && !isRelative()) {
|
||||
return 2*(value - min)/(float)(max - min) - 1;
|
||||
} else
|
||||
return value;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* %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;
|
||||
|
||||
/** Java wrapper for DIDEVICEOBJECTDATA
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class DIDeviceObjectData {
|
||||
private int format_offset;
|
||||
private int data;
|
||||
private int millis;
|
||||
private int sequence;
|
||||
|
||||
public final void set(int format_offset, int data, int millis, int sequence) {
|
||||
this.format_offset = format_offset;
|
||||
this.data = data;
|
||||
this.millis = millis;
|
||||
this.sequence = sequence;
|
||||
}
|
||||
|
||||
public final void set(DIDeviceObjectData other) {
|
||||
set(other.format_offset, other.data, other.millis, other.sequence);
|
||||
}
|
||||
|
||||
public final int getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public final int getFormatOffset() {
|
||||
return format_offset;
|
||||
}
|
||||
|
||||
public final long getNanos() {
|
||||
return millis*1000000L;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* %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;
|
||||
|
||||
/** Java wrapper for DIEFFECTINFO
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class DIEffectInfo {
|
||||
private final IDirectInputDevice device;
|
||||
private final byte[] guid;
|
||||
private final int guid_id;
|
||||
private final int effect_type;
|
||||
private final int static_params;
|
||||
private final int dynamic_params;
|
||||
private final String name;
|
||||
|
||||
public DIEffectInfo(IDirectInputDevice device, byte[] guid, int guid_id, int effect_type, int static_params, int dynamic_params, String name) {
|
||||
this.device = device;
|
||||
this.guid = guid;
|
||||
this.guid_id = guid_id;
|
||||
this.effect_type = effect_type;
|
||||
this.static_params = static_params;
|
||||
this.dynamic_params = dynamic_params;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public final byte[] getGUID() {
|
||||
return guid;
|
||||
}
|
||||
|
||||
public final int getGUIDId() {
|
||||
return guid_id;
|
||||
}
|
||||
|
||||
public final int getDynamicParams() {
|
||||
return dynamic_params;
|
||||
}
|
||||
|
||||
public final int getEffectType() {
|
||||
return effect_type;
|
||||
}
|
||||
|
||||
public final String getName() {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,544 @@
|
|||
/*
|
||||
* %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;
|
||||
|
||||
/**
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class DIIdentifierMap {
|
||||
public final static int DIK_ESCAPE = 0x01;
|
||||
public final static int DIK_1 = 0x02;
|
||||
public final static int DIK_2 = 0x03;
|
||||
public final static int DIK_3 = 0x04;
|
||||
public final static int DIK_4 = 0x05;
|
||||
public final static int DIK_5 = 0x06;
|
||||
public final static int DIK_6 = 0x07;
|
||||
public final static int DIK_7 = 0x08;
|
||||
public final static int DIK_8 = 0x09;
|
||||
public final static int DIK_9 = 0x0A;
|
||||
public final static int DIK_0 = 0x0B;
|
||||
public final static int DIK_MINUS = 0x0C; /* - on main keyboard */
|
||||
public final static int DIK_EQUALS = 0x0D;
|
||||
public final static int DIK_BACK = 0x0E; /* backspace */
|
||||
public final static int DIK_TAB = 0x0F;
|
||||
public final static int DIK_Q = 0x10;
|
||||
public final static int DIK_W = 0x11;
|
||||
public final static int DIK_E = 0x12;
|
||||
public final static int DIK_R = 0x13;
|
||||
public final static int DIK_T = 0x14;
|
||||
public final static int DIK_Y = 0x15;
|
||||
public final static int DIK_U = 0x16;
|
||||
public final static int DIK_I = 0x17;
|
||||
public final static int DIK_O = 0x18;
|
||||
public final static int DIK_P = 0x19;
|
||||
public final static int DIK_LBRACKET = 0x1A;
|
||||
public final static int DIK_RBRACKET = 0x1B;
|
||||
public final static int DIK_RETURN = 0x1C; /* Enter on main keyboard */
|
||||
public final static int DIK_LCONTROL = 0x1D;
|
||||
public final static int DIK_A = 0x1E;
|
||||
public final static int DIK_S = 0x1F;
|
||||
public final static int DIK_D = 0x20;
|
||||
public final static int DIK_F = 0x21;
|
||||
public final static int DIK_G = 0x22;
|
||||
public final static int DIK_H = 0x23;
|
||||
public final static int DIK_J = 0x24;
|
||||
public final static int DIK_K = 0x25;
|
||||
public final static int DIK_L = 0x26;
|
||||
public final static int DIK_SEMICOLON = 0x27;
|
||||
public final static int DIK_APOSTROPHE = 0x28;
|
||||
public final static int DIK_GRAVE = 0x29; /* accent grave */
|
||||
public final static int DIK_LSHIFT = 0x2A;
|
||||
public final static int DIK_BACKSLASH = 0x2B;
|
||||
public final static int DIK_Z = 0x2C;
|
||||
public final static int DIK_X = 0x2D;
|
||||
public final static int DIK_C = 0x2E;
|
||||
public final static int DIK_V = 0x2F;
|
||||
public final static int DIK_B = 0x30;
|
||||
public final static int DIK_N = 0x31;
|
||||
public final static int DIK_M = 0x32;
|
||||
public final static int DIK_COMMA = 0x33;
|
||||
public final static int DIK_PERIOD = 0x34; /* . on main keyboard */
|
||||
public final static int DIK_SLASH = 0x35; /* / on main keyboard */
|
||||
public final static int DIK_RSHIFT = 0x36;
|
||||
public final static int DIK_MULTIPLY = 0x37; /* * on numeric keypad */
|
||||
public final static int DIK_LMENU = 0x38; /* left Alt */
|
||||
public final static int DIK_SPACE = 0x39;
|
||||
public final static int DIK_CAPITAL = 0x3A;
|
||||
public final static int DIK_F1 = 0x3B;
|
||||
public final static int DIK_F2 = 0x3C;
|
||||
public final static int DIK_F3 = 0x3D;
|
||||
public final static int DIK_F4 = 0x3E;
|
||||
public final static int DIK_F5 = 0x3F;
|
||||
public final static int DIK_F6 = 0x40;
|
||||
public final static int DIK_F7 = 0x41;
|
||||
public final static int DIK_F8 = 0x42;
|
||||
public final static int DIK_F9 = 0x43;
|
||||
public final static int DIK_F10 = 0x44;
|
||||
public final static int DIK_NUMLOCK = 0x45;
|
||||
public final static int DIK_SCROLL = 0x46; /* Scroll Lock */
|
||||
public final static int DIK_NUMPAD7 = 0x47;
|
||||
public final static int DIK_NUMPAD8 = 0x48;
|
||||
public final static int DIK_NUMPAD9 = 0x49;
|
||||
public final static int DIK_SUBTRACT = 0x4A; /* - on numeric keypad */
|
||||
public final static int DIK_NUMPAD4 = 0x4B;
|
||||
public final static int DIK_NUMPAD5 = 0x4C;
|
||||
public final static int DIK_NUMPAD6 = 0x4D;
|
||||
public final static int DIK_ADD = 0x4E; /* + on numeric keypad */
|
||||
public final static int DIK_NUMPAD1 = 0x4F;
|
||||
public final static int DIK_NUMPAD2 = 0x50;
|
||||
public final static int DIK_NUMPAD3 = 0x51;
|
||||
public final static int DIK_NUMPAD0 = 0x52;
|
||||
public final static int DIK_DECIMAL = 0x53; /* . on numeric keypad */
|
||||
public final static int DIK_OEM_102 = 0x56; /* <> or \| on RT 102-key keyboard (Non-U.S.) */
|
||||
public final static int DIK_F11 = 0x57;
|
||||
public final static int DIK_F12 = 0x58;
|
||||
public final static int DIK_F13 = 0x64; /* (NEC PC98) */
|
||||
public final static int DIK_F14 = 0x65; /* (NEC PC98) */
|
||||
public final static int DIK_F15 = 0x66; /* (NEC PC98) */
|
||||
public final static int DIK_KANA = 0x70; /* (Japanese keyboard) */
|
||||
public final static int DIK_ABNT_C1 = 0x73; /* /? on Brazilian keyboard */
|
||||
public final static int DIK_CONVERT = 0x79; /* (Japanese keyboard) */
|
||||
public final static int DIK_NOCONVERT = 0x7B; /* (Japanese keyboard) */
|
||||
public final static int DIK_YEN = 0x7D; /* (Japanese keyboard) */
|
||||
public final static int DIK_ABNT_C2 = 0x7E; /* Numpad . on Brazilian keyboard */
|
||||
public final static int DIK_NUMPADEQUALS = 0x8D; /* = on numeric keypad (NEC PC98) */
|
||||
public final static int DIK_PREVTRACK = 0x90; /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */
|
||||
public final static int DIK_AT = 0x91; /* (NEC PC98) */
|
||||
public final static int DIK_COLON = 0x92; /* (NEC PC98) */
|
||||
public final static int DIK_UNDERLINE = 0x93; /* (NEC PC98) */
|
||||
public final static int DIK_KANJI = 0x94; /* (Japanese keyboard) */
|
||||
public final static int DIK_STOP = 0x95; /* (NEC PC98) */
|
||||
public final static int DIK_AX = 0x96; /* (Japan AX) */
|
||||
public final static int DIK_UNLABELED = 0x97; /* (J3100) */
|
||||
public final static int DIK_NEXTTRACK = 0x99; /* Next Track */
|
||||
public final static int DIK_NUMPADENTER = 0x9C; /* Enter on numeric keypad */
|
||||
public final static int DIK_RCONTROL = 0x9D;
|
||||
public final static int DIK_MUTE = 0xA0; /* Mute */
|
||||
public final static int DIK_CALCULATOR = 0xA1; /* Calculator */
|
||||
public final static int DIK_PLAYPAUSE = 0xA2; /* Play / Pause */
|
||||
public final static int DIK_MEDIASTOP = 0xA4; /* Media Stop */
|
||||
public final static int DIK_VOLUMEDOWN = 0xAE; /* Volume - */
|
||||
public final static int DIK_VOLUMEUP = 0xB0; /* Volume + */
|
||||
public final static int DIK_WEBHOME = 0xB2; /* Web home */
|
||||
public final static int DIK_NUMPADCOMMA = 0xB3; /* , on numeric keypad (NEC PC98) */
|
||||
public final static int DIK_DIVIDE = 0xB5; /* / on numeric keypad */
|
||||
public final static int DIK_SYSRQ = 0xB7;
|
||||
public final static int DIK_RMENU = 0xB8; /* right Alt */
|
||||
public final static int DIK_PAUSE = 0xC5; /* Pause */
|
||||
public final static int DIK_HOME = 0xC7; /* Home on arrow keypad */
|
||||
public final static int DIK_UP = 0xC8; /* UpArrow on arrow keypad */
|
||||
public final static int DIK_PRIOR = 0xC9; /* PgUp on arrow keypad */
|
||||
public final static int DIK_LEFT = 0xCB; /* LeftArrow on arrow keypad */
|
||||
public final static int DIK_RIGHT = 0xCD; /* RightArrow on arrow keypad */
|
||||
public final static int DIK_END = 0xCF; /* End on arrow keypad */
|
||||
public final static int DIK_DOWN = 0xD0; /* DownArrow on arrow keypad */
|
||||
public final static int DIK_NEXT = 0xD1; /* PgDn on arrow keypad */
|
||||
public final static int DIK_INSERT = 0xD2; /* Insert on arrow keypad */
|
||||
public final static int DIK_DELETE = 0xD3; /* Delete on arrow keypad */
|
||||
public final static int DIK_LWIN = 0xDB; /* Left Windows key */
|
||||
public final static int DIK_RWIN = 0xDC; /* Right Windows key */
|
||||
public final static int DIK_APPS = 0xDD; /* AppMenu key */
|
||||
public final static int DIK_POWER = 0xDE; /* System Power */
|
||||
public final static int DIK_SLEEP = 0xDF; /* System Sleep */
|
||||
public final static int DIK_WAKE = 0xE3; /* System Wake */
|
||||
public final static int DIK_WEBSEARCH = 0xE5; /* Web Search */
|
||||
public final static int DIK_WEBFAVORITES = 0xE6; /* Web Favorites */
|
||||
public final static int DIK_WEBREFRESH = 0xE7; /* Web Refresh */
|
||||
public final static int DIK_WEBSTOP = 0xE8; /* Web Stop */
|
||||
public final static int DIK_WEBFORWARD = 0xE9; /* Web Forward */
|
||||
public final static int DIK_WEBBACK = 0xEA; /* Web Back */
|
||||
public final static int DIK_MYCOMPUTER = 0xEB; /* My Computer */
|
||||
public final static int DIK_MAIL = 0xEC; /* Mail */
|
||||
public final static int DIK_MEDIASELECT = 0xED; /* Media Select */
|
||||
|
||||
public final static Component.Identifier.Key getKeyIdentifier(int key_code) {
|
||||
switch (key_code) {
|
||||
case DIK_ESCAPE:
|
||||
return Component.Identifier.Key.ESCAPE;
|
||||
case DIK_1:
|
||||
return Component.Identifier.Key._1;
|
||||
case DIK_2:
|
||||
return Component.Identifier.Key._2;
|
||||
case DIK_3:
|
||||
return Component.Identifier.Key._3;
|
||||
case DIK_4:
|
||||
return Component.Identifier.Key._4;
|
||||
case DIK_5:
|
||||
return Component.Identifier.Key._5;
|
||||
case DIK_6:
|
||||
return Component.Identifier.Key._6;
|
||||
case DIK_7:
|
||||
return Component.Identifier.Key._7;
|
||||
case DIK_8:
|
||||
return Component.Identifier.Key._8;
|
||||
case DIK_9:
|
||||
return Component.Identifier.Key._9;
|
||||
case DIK_0:
|
||||
return Component.Identifier.Key._0;
|
||||
case DIK_MINUS:
|
||||
return Component.Identifier.Key.MINUS;
|
||||
case DIK_EQUALS:
|
||||
return Component.Identifier.Key.EQUALS;
|
||||
case DIK_BACK:
|
||||
return Component.Identifier.Key.BACK;
|
||||
case DIK_TAB:
|
||||
return Component.Identifier.Key.TAB;
|
||||
case DIK_Q:
|
||||
return Component.Identifier.Key.Q;
|
||||
case DIK_W:
|
||||
return Component.Identifier.Key.W;
|
||||
case DIK_E:
|
||||
return Component.Identifier.Key.E;
|
||||
case DIK_R:
|
||||
return Component.Identifier.Key.R;
|
||||
case DIK_T:
|
||||
return Component.Identifier.Key.T;
|
||||
case DIK_Y:
|
||||
return Component.Identifier.Key.Y;
|
||||
case DIK_U:
|
||||
return Component.Identifier.Key.U;
|
||||
case DIK_I:
|
||||
return Component.Identifier.Key.I;
|
||||
case DIK_O:
|
||||
return Component.Identifier.Key.O;
|
||||
case DIK_P:
|
||||
return Component.Identifier.Key.P;
|
||||
case DIK_LBRACKET:
|
||||
return Component.Identifier.Key.LBRACKET;
|
||||
case DIK_RBRACKET:
|
||||
return Component.Identifier.Key.RBRACKET;
|
||||
case DIK_RETURN:
|
||||
return Component.Identifier.Key.RETURN;
|
||||
case DIK_LCONTROL:
|
||||
return Component.Identifier.Key.LCONTROL;
|
||||
case DIK_A:
|
||||
return Component.Identifier.Key.A;
|
||||
case DIK_S:
|
||||
return Component.Identifier.Key.S;
|
||||
case DIK_D:
|
||||
return Component.Identifier.Key.D;
|
||||
case DIK_F:
|
||||
return Component.Identifier.Key.F;
|
||||
case DIK_G:
|
||||
return Component.Identifier.Key.G;
|
||||
case DIK_H:
|
||||
return Component.Identifier.Key.H;
|
||||
case DIK_J:
|
||||
return Component.Identifier.Key.J;
|
||||
case DIK_K:
|
||||
return Component.Identifier.Key.K;
|
||||
case DIK_L:
|
||||
return Component.Identifier.Key.L;
|
||||
case DIK_SEMICOLON:
|
||||
return Component.Identifier.Key.SEMICOLON;
|
||||
case DIK_APOSTROPHE:
|
||||
return Component.Identifier.Key.APOSTROPHE;
|
||||
case DIK_GRAVE:
|
||||
return Component.Identifier.Key.GRAVE;
|
||||
case DIK_LSHIFT:
|
||||
return Component.Identifier.Key.LSHIFT;
|
||||
case DIK_BACKSLASH:
|
||||
return Component.Identifier.Key.BACKSLASH;
|
||||
case DIK_Z:
|
||||
return Component.Identifier.Key.Z;
|
||||
case DIK_X:
|
||||
return Component.Identifier.Key.X;
|
||||
case DIK_C:
|
||||
return Component.Identifier.Key.C;
|
||||
case DIK_V:
|
||||
return Component.Identifier.Key.V;
|
||||
case DIK_B:
|
||||
return Component.Identifier.Key.B;
|
||||
case DIK_N:
|
||||
return Component.Identifier.Key.N;
|
||||
case DIK_M:
|
||||
return Component.Identifier.Key.M;
|
||||
case DIK_COMMA:
|
||||
return Component.Identifier.Key.COMMA;
|
||||
case DIK_PERIOD:
|
||||
return Component.Identifier.Key.PERIOD;
|
||||
case DIK_SLASH:
|
||||
return Component.Identifier.Key.SLASH;
|
||||
case DIK_RSHIFT:
|
||||
return Component.Identifier.Key.RSHIFT;
|
||||
case DIK_MULTIPLY:
|
||||
return Component.Identifier.Key.MULTIPLY;
|
||||
case DIK_LMENU:
|
||||
return Component.Identifier.Key.LALT;
|
||||
case DIK_SPACE:
|
||||
return Component.Identifier.Key.SPACE;
|
||||
case DIK_CAPITAL:
|
||||
return Component.Identifier.Key.CAPITAL;
|
||||
case DIK_F1:
|
||||
return Component.Identifier.Key.F1;
|
||||
case DIK_F2:
|
||||
return Component.Identifier.Key.F2;
|
||||
case DIK_F3:
|
||||
return Component.Identifier.Key.F3;
|
||||
case DIK_F4:
|
||||
return Component.Identifier.Key.F4;
|
||||
case DIK_F5:
|
||||
return Component.Identifier.Key.F5;
|
||||
case DIK_F6:
|
||||
return Component.Identifier.Key.F6;
|
||||
case DIK_F7:
|
||||
return Component.Identifier.Key.F7;
|
||||
case DIK_F8:
|
||||
return Component.Identifier.Key.F8;
|
||||
case DIK_F9:
|
||||
return Component.Identifier.Key.F9;
|
||||
case DIK_F10:
|
||||
return Component.Identifier.Key.F10;
|
||||
case DIK_NUMLOCK:
|
||||
return Component.Identifier.Key.NUMLOCK;
|
||||
case DIK_SCROLL:
|
||||
return Component.Identifier.Key.SCROLL;
|
||||
case DIK_NUMPAD7:
|
||||
return Component.Identifier.Key.NUMPAD7;
|
||||
case DIK_NUMPAD8:
|
||||
return Component.Identifier.Key.NUMPAD8;
|
||||
case DIK_NUMPAD9:
|
||||
return Component.Identifier.Key.NUMPAD9;
|
||||
case DIK_SUBTRACT:
|
||||
return Component.Identifier.Key.SUBTRACT;
|
||||
case DIK_NUMPAD4:
|
||||
return Component.Identifier.Key.NUMPAD4;
|
||||
case DIK_NUMPAD5:
|
||||
return Component.Identifier.Key.NUMPAD5;
|
||||
case DIK_NUMPAD6:
|
||||
return Component.Identifier.Key.NUMPAD6;
|
||||
case DIK_ADD:
|
||||
return Component.Identifier.Key.ADD;
|
||||
case DIK_NUMPAD1:
|
||||
return Component.Identifier.Key.NUMPAD1;
|
||||
case DIK_NUMPAD2:
|
||||
return Component.Identifier.Key.NUMPAD2;
|
||||
case DIK_NUMPAD3:
|
||||
return Component.Identifier.Key.NUMPAD3;
|
||||
case DIK_NUMPAD0:
|
||||
return Component.Identifier.Key.NUMPAD0;
|
||||
case DIK_DECIMAL:
|
||||
return Component.Identifier.Key.DECIMAL;
|
||||
case DIK_F11:
|
||||
return Component.Identifier.Key.F11;
|
||||
case DIK_F12:
|
||||
return Component.Identifier.Key.F12;
|
||||
case DIK_F13:
|
||||
return Component.Identifier.Key.F13;
|
||||
case DIK_F14:
|
||||
return Component.Identifier.Key.F14;
|
||||
case DIK_F15:
|
||||
return Component.Identifier.Key.F15;
|
||||
case DIK_KANA:
|
||||
return Component.Identifier.Key.KANA;
|
||||
case DIK_CONVERT:
|
||||
return Component.Identifier.Key.CONVERT;
|
||||
case DIK_NOCONVERT:
|
||||
return Component.Identifier.Key.NOCONVERT;
|
||||
case DIK_YEN:
|
||||
return Component.Identifier.Key.YEN;
|
||||
case DIK_NUMPADEQUALS:
|
||||
return Component.Identifier.Key.NUMPADEQUAL;
|
||||
case DIK_AT:
|
||||
return Component.Identifier.Key.AT;
|
||||
case DIK_COLON:
|
||||
return Component.Identifier.Key.COLON;
|
||||
case DIK_UNDERLINE:
|
||||
return Component.Identifier.Key.UNDERLINE;
|
||||
case DIK_KANJI:
|
||||
return Component.Identifier.Key.KANJI;
|
||||
case DIK_STOP:
|
||||
return Component.Identifier.Key.STOP;
|
||||
case DIK_AX:
|
||||
return Component.Identifier.Key.AX;
|
||||
case DIK_UNLABELED:
|
||||
return Component.Identifier.Key.UNLABELED;
|
||||
case DIK_NUMPADENTER:
|
||||
return Component.Identifier.Key.NUMPADENTER;
|
||||
case DIK_RCONTROL:
|
||||
return Component.Identifier.Key.RCONTROL;
|
||||
case DIK_NUMPADCOMMA:
|
||||
return Component.Identifier.Key.NUMPADCOMMA;
|
||||
case DIK_DIVIDE:
|
||||
return Component.Identifier.Key.DIVIDE;
|
||||
case DIK_SYSRQ:
|
||||
return Component.Identifier.Key.SYSRQ;
|
||||
case DIK_RMENU:
|
||||
return Component.Identifier.Key.RALT;
|
||||
case DIK_PAUSE:
|
||||
return Component.Identifier.Key.PAUSE;
|
||||
case DIK_HOME:
|
||||
return Component.Identifier.Key.HOME;
|
||||
case DIK_UP:
|
||||
return Component.Identifier.Key.UP;
|
||||
case DIK_PRIOR:
|
||||
return Component.Identifier.Key.PAGEUP;
|
||||
case DIK_LEFT:
|
||||
return Component.Identifier.Key.LEFT;
|
||||
case DIK_RIGHT:
|
||||
return Component.Identifier.Key.RIGHT;
|
||||
case DIK_END:
|
||||
return Component.Identifier.Key.END;
|
||||
case DIK_DOWN:
|
||||
return Component.Identifier.Key.DOWN;
|
||||
case DIK_NEXT:
|
||||
return Component.Identifier.Key.PAGEDOWN;
|
||||
case DIK_INSERT:
|
||||
return Component.Identifier.Key.INSERT;
|
||||
case DIK_DELETE:
|
||||
return Component.Identifier.Key.DELETE;
|
||||
case DIK_LWIN:
|
||||
return Component.Identifier.Key.LWIN;
|
||||
case DIK_RWIN:
|
||||
return Component.Identifier.Key.RWIN;
|
||||
case DIK_APPS:
|
||||
return Component.Identifier.Key.APPS;
|
||||
case DIK_POWER:
|
||||
return Component.Identifier.Key.POWER;
|
||||
case DIK_SLEEP:
|
||||
return Component.Identifier.Key.SLEEP;
|
||||
/* Unassigned keys */
|
||||
case DIK_ABNT_C1:
|
||||
case DIK_ABNT_C2:
|
||||
case DIK_PREVTRACK:
|
||||
case DIK_PLAYPAUSE:
|
||||
case DIK_NEXTTRACK:
|
||||
case DIK_MUTE:
|
||||
case DIK_CALCULATOR:
|
||||
case DIK_MEDIASTOP:
|
||||
case DIK_VOLUMEDOWN:
|
||||
case DIK_VOLUMEUP:
|
||||
case DIK_WEBHOME:
|
||||
case DIK_WAKE:
|
||||
case DIK_WEBSEARCH:
|
||||
case DIK_WEBFAVORITES:
|
||||
case DIK_WEBREFRESH:
|
||||
case DIK_WEBSTOP:
|
||||
case DIK_WEBFORWARD:
|
||||
case DIK_WEBBACK:
|
||||
case DIK_MYCOMPUTER:
|
||||
case DIK_MAIL:
|
||||
case DIK_MEDIASELECT:
|
||||
case DIK_OEM_102:
|
||||
default:
|
||||
return Component.Identifier.Key.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
public final static Component.Identifier.Button getButtonIdentifier(int id) {
|
||||
switch (id) {
|
||||
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._23;
|
||||
case 23:
|
||||
return Component.Identifier.Button._24;
|
||||
case 24:
|
||||
return Component.Identifier.Button._25;
|
||||
case 25:
|
||||
return Component.Identifier.Button._26;
|
||||
case 26:
|
||||
return Component.Identifier.Button._27;
|
||||
case 27:
|
||||
return Component.Identifier.Button._28;
|
||||
case 28:
|
||||
return Component.Identifier.Button._29;
|
||||
case 29:
|
||||
return Component.Identifier.Button._30;
|
||||
case 30:
|
||||
return Component.Identifier.Button._31;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public final static Component.Identifier.Button mapMouseButtonIdentifier(Component.Identifier.Button button_id) {
|
||||
if (button_id == Component.Identifier.Button._0) {
|
||||
return Component.Identifier.Button.LEFT;
|
||||
} else if (button_id == Component.Identifier.Button._1) {
|
||||
return Component.Identifier.Button.RIGHT;
|
||||
} else if (button_id == Component.Identifier.Button._2) {
|
||||
return Component.Identifier.Button.MIDDLE;
|
||||
} else
|
||||
return button_id;
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue