Make version 2 the main jinput version

This commit is contained in:
endolf 2006-04-29 22:29:27 +00:00
parent 4c91a4eb44
commit 559c008a02
149 changed files with 13218 additions and 10800 deletions

View file

@ -1,104 +1,32 @@
<?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="Game Input API" 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" -->
<!-- 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="utils" value="lib/jutils.jar"/>
<property name="utils" location="../lib/jutils.jar"/>
<mkdir dir="apidocs"/>
<mkdir dir="classes"/>
<mkdir dir="bin"/>
</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">
<include name="net/**"/>
<!-- To add something to the classpath: -->
<classpath>
<pathelement location="${utils}"/>
</classpath>
<!-- To exclude some files: -->
<!--
<exclude name="com/foo/SomeFile.java"/>
<exclude name="com/foo/somepackage/"/>
-->
</javac>
</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/jinput.jar" compress="true" basedir="classes">
<include name="net/**"/>
<exclude name="**/*.java"/>
<exclude name="**/*.form"/>
<exclude name="myapp.mf"/>
<exclude name="myapp.jar"/>
<jar jarfile="bin/jinput-core.jar" compress="true" basedir="classes">
<include name="net/java/games/input/*class"/>
</jar>
<jar jarfile="bin/jinput-test.jar" compress="true" basedir="classes">
<include name="net/java/games/input/test/*class"/>
</jar>
<copy file="bin/jinput.jar" todir="../plugins/DX8/lib" />
</target>
<target name="texttest" depends="init,all" description="Try running it.">
<java classname="net.java.games.input.test.ControllerTextTest"
fork="true" failonerror="true" dir="src/tests">
<classpath>
<pathelement location="bin/jinput.jar"/>
<pathelement location="${utils}"/>
</classpath>
<!-- Pass some args, perhaps: -->
<!-- <arg value="-myfile"/> -->
<!-- Will be given as an absolute path: -->
<!-- <arg file="myfile.txt"/> -->
</java>
</target>
<target name="readtest" depends="init,all" description="Try running it.">
<java classname="net.java.games.input.test.ControllerReadTest"
fork="true" failonerror="true" dir="src/tests">
<classpath>
<pathelement location="bin/jinput.jar"/>
<pathelement location="${utils}"/>
</classpath>
<!-- Pass some args, perhaps: -->
<!-- <arg value="-myfile"/> -->
<!-- Will be given as an absolute path: -->
<!-- <arg file="myfile.txt"/> -->
</java>
</target>
<target name="rumbletest" depends="init,all" description="Try running it.">
<java classname="net.java.games.input.test.RumbleTest"
fork="true" failonerror="true" dir="src/tests">
<classpath>
<pathelement location="bin/jinput.jar"/>
<pathelement location="${utils}"/>
</classpath>
<!-- Pass some args, perhaps: -->
<!-- <arg value="-myfile"/> -->
<!-- Will be given as an absolute path: -->
<!-- <arg file="myfile.txt"/> -->
</java>
</target>
<target name="javadoc" depends="init" description="Javadoc for my API.">
<javadoc packagenames="net.java.games.input.*"
destdir="apidocs"
@ -113,18 +41,12 @@
</target>
<target name="clean" depends="init" description="Clean all build products.">
<delete>
<fileset dir="classes">
<include name="**/*.class"/>
</fileset>
</delete>
<delete file="bin/jinput.jar"/>
<delete dir="apidocs"/>
<delete file="../plugins/DX8/lib/jinput.jar" />
<delete dir="classes"/>
<delete dir="bin"/>
<delete dir="apidocs"/>
</target>
<target name="all" depends="init,jar" description="Build everything.">
<echo message="JInput has been built and jinput.jar is located in the bin directory."/>
</target>
</target>
</project>

View file

@ -38,6 +38,8 @@
*****************************************************************************/
package net.java.games.input;
import java.io.IOException;
/**
* Skeleton implementation of a named axis.
*/
@ -46,17 +48,12 @@ public abstract class AbstractComponent implements Component {
/**
* Human-readable name for this Axis
*/
protected String name;
private final String name;
/**
* Identifier for the axis
*/
protected Identifier id;
/**
* Whether this axis is ready to receive polling data
*/
private boolean polling;
private final Identifier id;
private float value;
private float event_value;
/**
* Protected constructor
@ -65,7 +62,6 @@ public abstract class AbstractComponent implements Component {
protected AbstractComponent(String name, Identifier id) {
this.name = name;
this.id = id;
this.polling = true;
}
/**
@ -83,30 +79,6 @@ public abstract class AbstractComponent implements Component {
return false;
}
/**
* 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 true;
}
/**
* Returns whether or not this axis is ready to receive polling data.
* By default, an abstract axis is set to receive polling data.
*/
public boolean isPolling() {
return polling;
}
/**
* Sets whether or not the axis should receive polling data.
*/
public void setPolling(boolean polling) {
this.polling = polling;
}
/**
* Returns the suggested dead zone for this axis. Dead zone is the
* amount polled data can vary before considered a significant change
@ -125,10 +97,22 @@ public abstract class AbstractComponent implements Component {
* 1.0f.
* @return 0.0f by default, can be overridden
*/
public float getPollData() {
return 0.0f;
public final float getPollData() {
return value;
}
final void setPollData(float value) {
this.value = value;
}
final float getEventValue() {
return event_value;
}
final void setEventValue(float event_value) {
this.event_value = event_value;
}
/**
* Returns a human-readable name for this axis.
*/
@ -142,12 +126,7 @@ public abstract class AbstractComponent implements Component {
public String toString() {
return name;
}
protected abstract float poll() throws IOException;
/**
* Changes the name of this Axis. This should be done only during
* initialization of the axis so that its name remains immutable.
*/
public void setName(String name) {
this.name = name;
}
} // AbstractAxis

View file

@ -38,27 +38,22 @@
*****************************************************************************/
package net.java.games.input;
import java.util.Map;
import java.util.List;
import java.util.HashMap;
import java.util.ArrayList;
import java.io.IOException;
/**
* An AbstractController is a skeleton implementation of a controller that
* contains a fixed number of axes, controllers, and rumblers.
*/
public abstract class AbstractController implements Controller {
/**
* Null array representing no axes
*/
protected static final Component[] NO_COMPONENTS = {};
/**
* Null array representing no child controllers
*/
protected static final Controller[] NO_CONTROLLERS = {};
/**
* Null array representing no rumblers
*/
protected static final Rumbler[] NO_RUMBLERS = {};
final static int EVENT_QUEUE_DEPTH = 32;
private final static Event event = new Event();
/**
* Human-readable name for this Controller
*/
@ -67,26 +62,24 @@ public abstract class AbstractController implements Controller {
/**
* Array of components
*/
protected Component[] components;
private final Component[] components;
/**
* Array of child controllers
*/
protected Controller[] children;
private final Controller[] children;
/**
* Array of rumblers
*/
protected Rumbler[] rumblers;
/**
* Protected constructor for a controller; initially contains no axes,
* child controllers, or rumblers.
* @param name The name for the controller
*/
protected AbstractController(String name) {
this(name, NO_COMPONENTS, NO_CONTROLLERS, NO_RUMBLERS);
}
private final Rumbler[] rumblers;
/**
* Map from Component.Identifiers to Components
*/
private final Map id_to_components = new HashMap();
private EventQueue event_queue = new EventQueue(EVENT_QUEUE_DEPTH);
/**
* Protected constructor for a controller containing the specified
@ -96,21 +89,24 @@ public abstract class AbstractController implements Controller {
* @param children child controllers for the controller
* @param rumblers rumblers for the controller
*/
protected AbstractController(String name, Component[] components,
Controller[] children, Rumbler[] rumblers) {
protected AbstractController(String name, Component[] components, Controller[] children, Rumbler[] rumblers) {
this.name = name;
this.components = components;
this.children = children;
this.rumblers = rumblers;
}
// process from last to first to let earlier listed Components get higher priority
for (int i = components.length - 1; i >= 0; i--) {
id_to_components.put(components[i].getIdentifier(), components[i]);
}
}
/**
* Returns the controllers connected to make up this controller, or
* an empty array if this controller contains no child controllers.
* The objects in the array are returned in order of assignment priority
* (primary stick, secondary buttons, etc.).
*/
public Controller[] getControllers() {
public final Controller[] getControllers() {
return children;
}
@ -123,35 +119,23 @@ public abstract class AbstractController implements Controller {
* The array returned is an empty array if this controller contains no components
* (such as a logical grouping of child controllers).
*/
public Component[] getComponents() {
public final Component[] getComponents() {
return components;
}
/**
* Returns a single component based on its identifier, or null
* if no component with the specified type could be found.
* By default, AbstractController calls getComponents in this method so that
* subclasses may lazily initialize the array of components, if necessary.
*/
public Component getComponent(Component.Identifier id) {
// Calls getAxes() so that subclasses may lazily set the array of axes.
Component[] components = getComponents();
if (components.length == 0) {
return null;
}
for (int i = 0; i < components.length; i++) {
if (components[i].getIdentifier() == id) {
return components[i];
}
}
return null;
public final Component getComponent(Component.Identifier id) {
return (Component)id_to_components.get(id);
}
/**
* Returns the rumblers for sending feedback to this controller, or an
* empty array if there are no rumblers on this controller.
*/
public Rumbler[] getRumblers() {
public final Rumbler[] getRumblers() {
return rumblers;
}
@ -174,7 +158,7 @@ public abstract class AbstractController implements Controller {
/**
* Returns a human-readable name for this Controller.
*/
public String getName() {
public final String getName() {
return name;
}
@ -190,5 +174,68 @@ public abstract class AbstractController implements Controller {
public Type getType() {
return Type.UNKNOWN;
}
/**
* Creates a new EventQueue. Events in old queue are lost.
*/
public final void setEventQueueSize(int size) {
try {
setDeviceEventQueueSize(size);
event_queue = new EventQueue(size);
} catch (IOException e) {
ControllerEnvironment.logln("Failed to create new event queue of size " + size + ": " + e);
}
}
/**
* Plugins override this method to adjust their internal event queue size
*/
protected void setDeviceEventQueueSize(int size) throws IOException {
}
public final EventQueue getEventQueue() {
return event_queue;
}
protected abstract boolean getNextDeviceEvent(Event event) throws IOException;
protected void pollDevice() throws IOException {
}
/* poll() is synchronized to protect the static event */
public synchronized boolean poll() {
Component[] components = getComponents();
try {
pollDevice();
for (int i = 0; i < components.length; i++) {
AbstractComponent component = (AbstractComponent)components[i];
if (component.isRelative()) {
component.setPollData(0);
} else {
float value = component.poll();
component.setPollData(value);
}
}
while (getNextDeviceEvent(event)) {
AbstractComponent component = (AbstractComponent)event.getComponent();
float value = event.getValue();
if (component.isRelative()) {
if (value == 0)
continue;
component.setPollData(component.getPollData() + value);
} else {
if (value == component.getEventValue())
continue;
component.setEventValue(value);
}
if (!event_queue.isFull())
event_queue.add(event);
}
return true;
} catch (IOException e) {
ControllerEnvironment.logln("Failed to poll device: " + e.getMessage());
return false;
}
}
} // class AbstractController

View file

@ -62,29 +62,6 @@ public interface Component {
*/
public abstract boolean isAnalog();
/**
* Returns whether or not data polled from this axis is normalized
* between the values of -1.0f and 1.0f.
* @see #getPollData
*/
public abstract boolean isNormalized();
/**
* Returns whether or not this axis is ready to receive polling data.
* @see #getPollData
* @see Controller#poll
* @see #setPolling
*/
public abstract boolean isPolling();
/**
* Sets whether or not the axis should receive polling data.
* @see #getPollData
* @see Controller#poll
* @see #isPolling
*/
public abstract void setPolling(boolean polling);
/**
* Returns the suggested dead zone for this axis. Dead zone is the
* amount polled data can vary before considered a significant change
@ -558,163 +535,148 @@ public interface Component {
* Returns the side mouse button.
*/
public static final Button SIDE = new Button("Side");
}
/**
* KeyIDs for standard PC (LATIN-1) keyboards
*/
public static class Key extends Identifier {
private int keyID;
/**
* Protected constructor
*/
protected Key(String name, int keyID) {
protected Key(String name) {
super(name);
this.keyID = keyID;
}
protected Key(int keyID) {
this("Key " + keyID, keyID);
}
public int getKeyIndex() {
return keyID;
}
/**
* Standard keyboard (LATIN-1) keys
* UNIX X11 keysym values are listed to the right
*/
public static final Key VOID = new Key("Void", 0); // MS 0x00 UNIX 0xFFFFFF
public static final Key ESCAPE = new Key("Escape", 1); // MS 0x01 UNIX 0xFF1B
public static final Key _1 = new Key("1", 2); // MS 0x02 UNIX 0x031 EXCLAM 0x021
public static final Key _2 = new Key("2", 3); // MS 0x03 UNIX 0x032 AT 0x040
public static final Key _3 = new Key("3", 4); // MS 0x04 UNIX 0x033 NUMBERSIGN 0x023
public static final Key _4 = new Key("4", 5); // MS 0x05 UNIX 0x034 DOLLAR 0x024
public static final Key _5 = new Key("5", 6); // MS 0x06 UNIX 0x035 PERCENT 0x025
public static final Key _6 = new Key("6", 7); // MS 0x07 UNIX 0x036 CIRCUMFLEX 0x05e
public static final Key _7 = new Key("7", 8); // MS 0x08 UNIX 0x037 AMPERSAND 0x026
public static final Key _8 = new Key("8", 9); // MS 0x09 UNIX 0x038 ASTERISK 0x02a
public static final Key _9 = new Key("9", 10); // MS 0x0A UNIX 0x039 PARENLEFT 0x028
public static final Key _0 = new Key("0", 11); // MS 0x0B UNIX 0x030 PARENRIGHT 0x029
public static final Key MINUS = new Key("-", 12); // MS 0x0C UNIX 0x02d UNDERSCORE 0x05f
public static final Key EQUALS = new Key("=", 13); // MS 0x0D UNIX 0x03d PLUS 0x02b
public static final Key BACK = new Key("Back", 14); // MS 0x0E UNIX 0xFF08
public static final Key TAB = new Key("Tab", 15); // MS 0x0F UNIX 0xFF09
public static final Key Q = new Key("Q", 16); // MS 0x10 UNIX 0x071 UPPER 0x051
public static final Key W = new Key("W", 17); // MS 0x11 UNIX 0x077 UPPER 0x057
public static final Key E = new Key("E", 18); // MS 0x12 UNIX 0x065 UPPER 0x045
public static final Key R = new Key("R", 19); // MS 0x13 UNIX 0x072 UPPER 0x052
public static final Key T = new Key("T", 20); // MS 0x14 UNIX 0x074 UPPER 0x054
public static final Key Y = new Key("Y", 21); // MS 0x15 UNIX 0x079 UPPER 0x059
public static final Key U = new Key("U", 22); // MS 0x16 UNIX 0x075 UPPER 0x055
public static final Key I = new Key("I", 23); // MS 0x17 UNIX 0x069 UPPER 0x049
public static final Key O = new Key("O", 24); // MS 0x18 UNIX 0x06F UPPER 0x04F
public static final Key P = new Key("P", 25); // MS 0x19 UNIX 0x070 UPPER 0x050
public static final Key LBRACKET = new Key("[", 26); // MS 0x1A UNIX 0x05b BRACE 0x07b
public static final Key RBRACKET = new Key("]", 27); // MS 0x1B UNIX 0x05d BRACE 0x07d
public static final Key RETURN = new Key("Return", 28); // MS 0x1C UNIX 0xFF0D
public static final Key LCONTROL = new Key("Left Control", 29); // MS 0x1D UNIX 0xFFE3
public static final Key A = new Key("A", 30); // MS 0x1E UNIX 0x061 UPPER 0x041
public static final Key S = new Key("S", 31); // MS 0x1F UNIX 0x073 UPPER 0x053
public static final Key D = new Key("D", 32); // MS 0x20 UNIX 0x064 UPPER 0x044
public static final Key F = new Key("F", 33); // MS 0x21 UNIX 0x066 UPPER 0x046
public static final Key G = new Key("G", 34); // MS 0x22 UNIX 0x067 UPPER 0x047
public static final Key H = new Key("H", 35); // MS 0x23 UNIX 0x068 UPPER 0x048
public static final Key J = new Key("J", 36); // MS 0x24 UNIX 0x06A UPPER 0x04A
public static final Key K = new Key("K", 37); // MS 0x25 UNIX 0x06B UPPER 0x04B
public static final Key L = new Key("L", 38); // MS 0x26 UNIX 0x06C UPPER 0x04C
public static final Key SEMICOLON = new Key(";", 39); // MS 0x27 UNIX 0x03b COLON 0x03a
public static final Key APOSTROPHE = new Key("'", 40); // MS 0x28 UNIX 0x027 QUOTEDBL 0x022
public static final Key GRAVE = new Key("~", 41); // MS 0x29 UNIX 0x060 TILDE 0x07e
public static final Key LSHIFT = new Key("Left Shift", 42); // MS 0x2A UNIX 0xFFE1
public static final Key BACKSLASH = new Key("\\", 43); // MS 0x2B UNIX 0x05c BAR 0x07c
public static final Key Z = new Key("Z", 44); // MS 0x2C UNIX 0x07A UPPER 0x05A
public static final Key X = new Key("X", 45); // MS 0x2D UNIX 0x078 UPPER 0x058
public static final Key C = new Key("C", 46); // MS 0x2E UNIX 0x063 UPPER 0x043
public static final Key V = new Key("V", 47); // MS 0x2F UNIX 0x076 UPPER 0x056
public static final Key B = new Key("B", 48); // MS 0x30 UNIX 0x062 UPPER 0x042
public static final Key N = new Key("N", 49); // MS 0x31 UNIX 0x06E UPPER 0x04E
public static final Key M = new Key("M", 50); // MS 0x32 UNIX 0x06D UPPER 0x04D
public static final Key COMMA = new Key(",", 51); // MS 0x33 UNIX 0x02c LESS 0x03c
public static final Key PERIOD = new Key(".", 52); // MS 0x34 UNIX 0x02e GREATER 0x03e
public static final Key SLASH = new Key("/", 53); // MS 0x35 UNIX 0x02f QUESTION 0x03f
public static final Key RSHIFT = new Key("Right Shift", 54); // MS 0x36 UNIX 0xFFE2
public static final Key MULTIPLY = new Key("Multiply", 55); // MS 0x37 UNIX 0xFFAA
public static final Key LALT = new Key("Left Alt", 56); // MS 0x38 UNIX 0xFFE9
public static final Key SPACE = new Key(" ", 57); // MS 0x39 UNIX 0x020
public static final Key CAPITAL = new Key("Caps Lock", 58); // MS 0x3A UNIX 0xFFE5 SHIFTLOCK 0xFFE6
public static final Key F1 = new Key("F1", 59); // MS 0x3B UNIX 0xFFBE
public static final Key F2 = new Key("F2", 60); // MS 0x3C UNIX 0xFFBF
public static final Key F3 = new Key("F3", 61); // MS 0x3D UNIX 0xFFC0
public static final Key F4 = new Key("F4", 62); // MS 0x3E UNIX 0xFFC1
public static final Key F5 = new Key("F5", 63); // MS 0x3F UNIX 0xFFC2
public static final Key F6 = new Key("F6", 64); // MS 0x40 UNIX 0xFFC3
public static final Key F7 = new Key("F7", 65); // MS 0x41 UNIX 0xFFC4
public static final Key F8 = new Key("F8", 66); // MS 0x42 UNIX 0xFFC5
public static final Key F9 = new Key("F9", 67); // MS 0x43 UNIX 0xFFC6
public static final Key F10 = new Key("F10", 68); // MS 0x44 UNIX 0xFFC7
public static final Key NUMLOCK = new Key("Num Lock", 69); // MS 0x45 UNIX 0xFF7F
public static final Key SCROLL = new Key("Scroll Lock", 70); // MS 0x46 UNIX 0xFF14
public static final Key NUMPAD7 = new Key("Num 7", 71); // MS 0x47 UNIX 0xFFB7 HOME 0xFF95
public static final Key NUMPAD8 = new Key("Num 8", 72); // MS 0x48 UNIX 0xFFB8 UP 0xFF97
public static final Key NUMPAD9 = new Key("Num 9", 73); // MS 0x49 UNIX 0xFFB9 PRIOR 0xFF9A
public static final Key SUBTRACT = new Key("Num -", 74); // MS 0x4A UNIX 0xFFAD
public static final Key NUMPAD4 = new Key("Num 4", 75); // MS 0x4B UNIX 0xFFB4 LEFT 0xFF96
public static final Key NUMPAD5 = new Key("Num 5", 76); // MS 0x4C UNIX 0xFFB5
public static final Key NUMPAD6 = new Key("Num 6", 77); // MS 0x4D UNIX 0xFFB6 RIGHT 0xFF98
public static final Key ADD = new Key("Num +", 78); // MS 0x4E UNIX 0xFFAB
public static final Key NUMPAD1 = new Key("Num 1", 79); // MS 0x4F UNIX 0xFFB1 END 0xFF9C
public static final Key NUMPAD2 = new Key("Num 2", 80); // MS 0x50 UNIX 0xFFB2 DOWN 0xFF99
public static final Key NUMPAD3 = new Key("Num 3", 81); // MS 0x51 UNIX 0xFFB3 NEXT 0xFF9B
public static final Key NUMPAD0 = new Key("Num 0", 82); // MS 0x52 UNIX 0xFFB0 INSERT 0xFF9E
public static final Key DECIMAL = new Key("Num .", 83); // MS 0x53 UNIX 0xFFAE DELETE 0xFF9F
public static final Key F11 = new Key("F11", 84); // MS 0x57 UNIX 0xFFC8
public static final Key F12 = new Key("F12", 85); // MS 0x58 UNIX 0xFFC9
public static final Key F13 = new Key("F13", 86); // MS 0x64 UNIX 0xFFCA
public static final Key F14 = new Key("F14", 87); // MS 0x65 UNIX 0xFFCB
public static final Key F15 = new Key("F15", 88); // MS 0x66 UNIX 0xFFCC
public static final Key KANA = new Key(89); // MS 0x70 UNIX 0xFF2D
public static final Key CONVERT = new Key(90); // MS 0x79 Japanese keyboard
public static final Key NOCONVERT = new Key(91); // MS 0x7B Japanese keyboard
public static final Key YEN = new Key(92); // MS 0x7D UNIX 0x0a5
public static final Key NUMPADEQUAL = new Key("Num =", 93); // MS 0x8D UNIX 0xFFBD
public static final Key CIRCUMFLEX = new Key(94); // MS 0x90 Japanese keyboard
public static final Key AT = new Key(95); // MS 0x91 UNIX 0x040
public static final Key COLON = new Key(96); // MS 0x92 UNIX 0x03a
public static final Key UNDERLINE = new Key(97); // MS 0x93 NEC PC98
public static final Key KANJI = new Key(98); // MS 0x94 UNIX 0xFF21
public static final Key STOP = new Key(99); // MS 0x95 UNIX 0xFF69
public static final Key AX = new Key(100); // MS 0x96 Japan AX
public static final Key UNLABELED = new Key(101); // MS 0x97 J3100
public static final Key NUMPADENTER = new Key("Num Enter", 102); // MS 0x9C UNIX 0xFF8D
public static final Key RCONTROL = new Key("Right Control", 103); // MS 0x9D UNIX 0xFFE4
public static final Key NUMPADCOMMA = new Key("Num ,", 104); // MS 0xB3 UNIX 0xFFAC
public static final Key DIVIDE = new Key("Num /", 105); // MS 0xB5 UNIX 0xFFAF
public static final Key SYSRQ = new Key(106); // MS 0xB7 UNIX 0xFF15 PRINT 0xFF61
public static final Key RALT = new Key("Right Alt", 107); // MS 0xB8 UNIX 0xFFEA
public static final Key PAUSE = new Key("Pause", 108); // MS 0xC5 UNIX 0xFF13 BREAK 0xFF6B
public static final Key HOME = new Key("Home", 109); // MS 0xC7 UNIX 0xFF50
public static final Key UP = new Key("Up", 110); // MS 0xC8 UNIX 0xFF52
public static final Key PAGEUP = new Key("Pg Up", 111); // MS 0xC9 UNIX 0xFF55
public static final Key LEFT = new Key("Left", 112); // MS 0xCB UNIX 0xFF51
public static final Key RIGHT = new Key("Right", 113); // MS 0xCD UNIX 0xFF53
public static final Key END = new Key("End", 114); // MS 0xCF UNIX 0xFF57
public static final Key DOWN = new Key("Down", 115); // MS 0xD0 UNIX 0xFF54
public static final Key PAGEDOWN = new Key("Pg Down", 116); // MS 0xD1 UNIX 0xFF56
public static final Key INSERT = new Key("Insert", 117); // MS 0xD2 UNIX 0xFF63
public static final Key DELETE = new Key("Delete", 118); // MS 0xD3 UNIX 0xFFFF
public static final Key LWIN = new Key("Left Windows", 119); // MS 0xDB UNIX META 0xFFE7 SUPER 0xFFEB HYPER 0xFFED
public static final Key RWIN = new Key("Right Windows", 120); // MS 0xDC UNIX META 0xFFE8 SUPER 0xFFEC HYPER 0xFFEE
public static final Key APPS = new Key(121); // MS 0xDD UNIX 0xFF67
public static final Key POWER = new Key("Power", 122); // MS 0xDE Sun 0x1005FF76 SHIFT 0x1005FF7D
public static final Key SLEEP = new Key("Sleep", 123); // MS 0xDF No UNIX keysym
public static final Key UNKNOWN = new Key("Unknown", 0);
protected static final Key FIRST = VOID;
protected static final Key LAST = SLEEP;
public static final Key VOID = new Key("Void"); // MS 0x00 UNIX 0xFFFFFF
public static final Key ESCAPE = new Key("Escape"); // MS 0x01 UNIX 0xFF1B
public static final Key _1 = new Key("1"); // MS 0x02 UNIX 0x031 EXCLAM 0x021
public static final Key _2 = new Key("2"); // MS 0x03 UNIX 0x032 AT 0x040
public static final Key _3 = new Key("3"); // MS 0x04 UNIX 0x033 NUMBERSIGN 0x023
public static final Key _4 = new Key("4"); // MS 0x05 UNIX 0x034 DOLLAR 0x024
public static final Key _5 = new Key("5"); // MS 0x06 UNIX 0x035 PERCENT 0x025
public static final Key _6 = new Key("6"); // MS 0x07 UNIX 0x036 CIRCUMFLEX 0x05e
public static final Key _7 = new Key("7"); // MS 0x08 UNIX 0x037 AMPERSAND 0x026
public static final Key _8 = new Key("8"); // MS 0x09 UNIX 0x038 ASTERISK 0x02a
public static final Key _9 = new Key("9"); // MS 0x0A UNIX 0x039 PARENLEFT 0x028
public static final Key _0 = new Key("0"); // MS 0x0B UNIX 0x030 PARENRIGHT 0x029
public static final Key MINUS = new Key("-"); // MS 0x0C UNIX 0x02d UNDERSCORE 0x05f
public static final Key EQUALS = new Key("="); // MS 0x0D UNIX 0x03d PLUS 0x02b
public static final Key BACK = new Key("Back"); // MS 0x0E UNIX 0xFF08
public static final Key TAB = new Key("Tab"); // MS 0x0F UNIX 0xFF09
public static final Key Q = new Key("Q"); // MS 0x10 UNIX 0x071 UPPER 0x051
public static final Key W = new Key("W"); // MS 0x11 UNIX 0x077 UPPER 0x057
public static final Key E = new Key("E"); // MS 0x12 UNIX 0x065 UPPER 0x045
public static final Key R = new Key("R"); // MS 0x13 UNIX 0x072 UPPER 0x052
public static final Key T = new Key("T"); // MS 0x14 UNIX 0x074 UPPER 0x054
public static final Key Y = new Key("Y"); // MS 0x15 UNIX 0x079 UPPER 0x059
public static final Key U = new Key("U"); // MS 0x16 UNIX 0x075 UPPER 0x055
public static final Key I = new Key("I"); // MS 0x17 UNIX 0x069 UPPER 0x049
public static final Key O = new Key("O"); // MS 0x18 UNIX 0x06F UPPER 0x04F
public static final Key P = new Key("P"); // MS 0x19 UNIX 0x070 UPPER 0x050
public static final Key LBRACKET = new Key("["); // MS 0x1A UNIX 0x05b BRACE 0x07b
public static final Key RBRACKET = new Key("]"); // MS 0x1B UNIX 0x05d BRACE 0x07d
public static final Key RETURN = new Key("Return"); // MS 0x1C UNIX 0xFF0D
public static final Key LCONTROL = new Key("Left Control"); // MS 0x1D UNIX 0xFFE3
public static final Key A = new Key("A"); // MS 0x1E UNIX 0x061 UPPER 0x041
public static final Key S = new Key("S"); // MS 0x1F UNIX 0x073 UPPER 0x053
public static final Key D = new Key("D"); // MS 0x20 UNIX 0x064 UPPER 0x044
public static final Key F = new Key("F"); // MS 0x21 UNIX 0x066 UPPER 0x046
public static final Key G = new Key("G"); // MS 0x22 UNIX 0x067 UPPER 0x047
public static final Key H = new Key("H"); // MS 0x23 UNIX 0x068 UPPER 0x048
public static final Key J = new Key("J"); // MS 0x24 UNIX 0x06A UPPER 0x04A
public static final Key K = new Key("K"); // MS 0x25 UNIX 0x06B UPPER 0x04B
public static final Key L = new Key("L"); // MS 0x26 UNIX 0x06C UPPER 0x04C
public static final Key SEMICOLON = new Key(";"); // MS 0x27 UNIX 0x03b COLON 0x03a
public static final Key APOSTROPHE = new Key("'"); // MS 0x28 UNIX 0x027 QUOTEDBL 0x022
public static final Key GRAVE = new Key("~"); // MS 0x29 UNIX 0x060 TILDE 0x07e
public static final Key LSHIFT = new Key("Left Shift"); // MS 0x2A UNIX 0xFFE1
public static final Key BACKSLASH = new Key("\\"); // MS 0x2B UNIX 0x05c BAR 0x07c
public static final Key Z = new Key("Z"); // MS 0x2C UNIX 0x07A UPPER 0x05A
public static final Key X = new Key("X"); // MS 0x2D UNIX 0x078 UPPER 0x058
public static final Key C = new Key("C"); // MS 0x2E UNIX 0x063 UPPER 0x043
public static final Key V = new Key("V"); // MS 0x2F UNIX 0x076 UPPER 0x056
public static final Key B = new Key("B"); // MS 0x30 UNIX 0x062 UPPER 0x042
public static final Key N = new Key("N"); // MS 0x31 UNIX 0x06E UPPER 0x04E
public static final Key M = new Key("M"); // MS 0x32 UNIX 0x06D UPPER 0x04D
public static final Key COMMA = new Key(","); // MS 0x33 UNIX 0x02c LESS 0x03c
public static final Key PERIOD = new Key("."); // MS 0x34 UNIX 0x02e GREATER 0x03e
public static final Key SLASH = new Key("/"); // MS 0x35 UNIX 0x02f QUESTION 0x03f
public static final Key RSHIFT = new Key("Right Shift"); // MS 0x36 UNIX 0xFFE2
public static final Key MULTIPLY = new Key("Multiply"); // MS 0x37 UNIX 0xFFAA
public static final Key LALT = new Key("Left Alt"); // MS 0x38 UNIX 0xFFE9
public static final Key SPACE = new Key(" "); // MS 0x39 UNIX 0x020
public static final Key CAPITAL = new Key("Caps Lock"); // MS 0x3A UNIX 0xFFE5 SHIFTLOCK 0xFFE6
public static final Key F1 = new Key("F1"); // MS 0x3B UNIX 0xFFBE
public static final Key F2 = new Key("F2"); // MS 0x3C UNIX 0xFFBF
public static final Key F3 = new Key("F3"); // MS 0x3D UNIX 0xFFC0
public static final Key F4 = new Key("F4"); // MS 0x3E UNIX 0xFFC1
public static final Key F5 = new Key("F5"); // MS 0x3F UNIX 0xFFC2
public static final Key F6 = new Key("F6"); // MS 0x40 UNIX 0xFFC3
public static final Key F7 = new Key("F7"); // MS 0x41 UNIX 0xFFC4
public static final Key F8 = new Key("F8"); // MS 0x42 UNIX 0xFFC5
public static final Key F9 = new Key("F9"); // MS 0x43 UNIX 0xFFC6
public static final Key F10 = new Key("F10"); // MS 0x44 UNIX 0xFFC7
public static final Key NUMLOCK = new Key("Num Lock"); // MS 0x45 UNIX 0xFF7F
public static final Key SCROLL = new Key("Scroll Lock"); // MS 0x46 UNIX 0xFF14
public static final Key NUMPAD7 = new Key("Num 7"); // MS 0x47 UNIX 0xFFB7 HOME 0xFF95
public static final Key NUMPAD8 = new Key("Num 8"); // MS 0x48 UNIX 0xFFB8 UP 0xFF97
public static final Key NUMPAD9 = new Key("Num 9"); // MS 0x49 UNIX 0xFFB9 PRIOR 0xFF9A
public static final Key SUBTRACT = new Key("Num -"); // MS 0x4A UNIX 0xFFAD
public static final Key NUMPAD4 = new Key("Num 4"); // MS 0x4B UNIX 0xFFB4 LEFT 0xFF96
public static final Key NUMPAD5 = new Key("Num 5"); // MS 0x4C UNIX 0xFFB5
public static final Key NUMPAD6 = new Key("Num 6"); // MS 0x4D UNIX 0xFFB6 RIGHT 0xFF98
public static final Key ADD = new Key("Num +"); // MS 0x4E UNIX 0xFFAB
public static final Key NUMPAD1 = new Key("Num 1"); // MS 0x4F UNIX 0xFFB1 END 0xFF9C
public static final Key NUMPAD2 = new Key("Num 2"); // MS 0x50 UNIX 0xFFB2 DOWN 0xFF99
public static final Key NUMPAD3 = new Key("Num 3"); // MS 0x51 UNIX 0xFFB3 NEXT 0xFF9B
public static final Key NUMPAD0 = new Key("Num 0"); // MS 0x52 UNIX 0xFFB0 INSERT 0xFF9E
public static final Key DECIMAL = new Key("Num ."); // MS 0x53 UNIX 0xFFAE DELETE 0xFF9F
public static final Key F11 = new Key("F11"); // MS 0x57 UNIX 0xFFC8
public static final Key F12 = new Key("F12"); // MS 0x58 UNIX 0xFFC9
public static final Key F13 = new Key("F13"); // MS 0x64 UNIX 0xFFCA
public static final Key F14 = new Key("F14"); // MS 0x65 UNIX 0xFFCB
public static final Key F15 = new Key("F15"); // MS 0x66 UNIX 0xFFCC
public static final Key KANA = new Key("Kana"); // MS 0x70 UNIX 0xFF2D
public static final Key CONVERT = new Key("Convert"); // MS 0x79 Japanese keyboard
public static final Key NOCONVERT = new Key("Noconvert"); // MS 0x7B Japanese keyboard
public static final Key YEN = new Key("Yen"); // MS 0x7D UNIX 0x0a5
public static final Key NUMPADEQUAL = new Key("Num ="); // MS 0x8D UNIX 0xFFBD
public static final Key CIRCUMFLEX = new Key("Circumflex"); // MS 0x90 Japanese keyboard
public static final Key AT = new Key("At"); // MS 0x91 UNIX 0x040
public static final Key COLON = new Key("Colon"); // MS 0x92 UNIX 0x03a
public static final Key UNDERLINE = new Key("Underline"); // MS 0x93 NEC PC98
public static final Key KANJI = new Key("Kanji"); // MS 0x94 UNIX 0xFF21
public static final Key STOP = new Key("Stop"); // MS 0x95 UNIX 0xFF69
public static final Key AX = new Key("Ax"); // MS 0x96 Japan AX
public static final Key UNLABELED = new Key("Unlabeled"); // MS 0x97 J3100
public static final Key NUMPADENTER = new Key("Num Enter"); // MS 0x9C UNIX 0xFF8D
public static final Key RCONTROL = new Key("Right Control"); // MS 0x9D UNIX 0xFFE4
public static final Key NUMPADCOMMA = new Key("Num ,"); // MS 0xB3 UNIX 0xFFAC
public static final Key DIVIDE = new Key("Num /"); // MS 0xB5 UNIX 0xFFAF
public static final Key SYSRQ = new Key("SysRq"); // MS 0xB7 UNIX 0xFF15 PRINT 0xFF61
public static final Key RALT = new Key("Right Alt"); // MS 0xB8 UNIX 0xFFEA
public static final Key PAUSE = new Key("Pause"); // MS 0xC5 UNIX 0xFF13 BREAK 0xFF6B
public static final Key HOME = new Key("Home"); // MS 0xC7 UNIX 0xFF50
public static final Key UP = new Key("Up"); // MS 0xC8 UNIX 0xFF52
public static final Key PAGEUP = new Key("Pg Up"); // MS 0xC9 UNIX 0xFF55
public static final Key LEFT = new Key("Left"); // MS 0xCB UNIX 0xFF51
public static final Key RIGHT = new Key("Right"); // MS 0xCD UNIX 0xFF53
public static final Key END = new Key("End"); // MS 0xCF UNIX 0xFF57
public static final Key DOWN = new Key("Down"); // MS 0xD0 UNIX 0xFF54
public static final Key PAGEDOWN = new Key("Pg Down"); // MS 0xD1 UNIX 0xFF56
public static final Key INSERT = new Key("Insert"); // MS 0xD2 UNIX 0xFF63
public static final Key DELETE = new Key("Delete"); // MS 0xD3 UNIX 0xFFFF
public static final Key LWIN = new Key("Left Windows"); // MS 0xDB UNIX META 0xFFE7 SUPER 0xFFEB HYPER 0xFFED
public static final Key RWIN = new Key("Right Windows"); // MS 0xDC UNIX META 0xFFE8 SUPER 0xFFEC HYPER 0xFFEE
public static final Key APPS = new Key("Apps"); // MS 0xDD UNIX 0xFF67
public static final Key POWER = new Key("Power"); // MS 0xDE Sun 0x1005FF76 SHIFT 0x1005FF7D
public static final Key SLEEP = new Key("Sleep"); // MS 0xDF No UNIX keysym
public static final Key UNKNOWN = new Key("Unknown");
} // class StandardKeyboard.KeyID
} // class Axis.Identifier

View file

@ -89,6 +89,17 @@ public interface Controller {
*/
public abstract boolean poll();
/**
* Initialized the controller event queue to a new size. Existing events
* in the queue are lost.
*/
public abstract void setEventQueueSize(int size);
/**
* Get the device event queue
*/
public abstract EventQueue getEventQueue();
/**
* Returns the port type for this Controller.
*/
@ -129,76 +140,65 @@ public interface Controller {
}
/**
* Mouse controller.
* Unkown controller type.
*/
public static final Type UNKNOWN = new Type("unknown");
public static final Type UNKNOWN = new Type("Unknown");
/**
* Mouse controller.
*/
public static final Type MOUSE = new Type("mouse");
public static final Type MOUSE = new Type("Mouse");
/**
* A mouse ball or the ball part of a trackball controller.
* Note that a mouse wheel is considered part of a ball controller.
*/
public static final Type BALL = new Type("ball");
/**
* A group of buttons on a pad (mouse buttons, for
* example) or a keyboard.
*/
public static final Type BUTTONS = new Type("buttons");
/**
* A keyboard controller (same as BUTTONS)
* @see #BUTTONS
*/
public static final Type KEYBOARD = BUTTONS;
public static final Type KEYBOARD = new Type("Keyboard");
/**
* Fingerstick controller; note that this may be sometimes treated as a
* type of mouse or stick.
*/
public static final Type FINGERSTICK = new Type("fingerstick");
public static final Type FINGERSTICK = new Type("Fingerstick");
/**
* Gamepad controller.
*/
public static final Type GAMEPAD = new Type("gamepad");
public static final Type GAMEPAD = new Type("Gamepad");
/**
* Headtracker controller.
*/
public static final Type HEADTRACKER = new Type("headtracker");
public static final Type HEADTRACKER = new Type("Headtracker");
/**
* Rudder controller.
*/
public static final Type RUDDER = new Type("rudder");
public static final Type RUDDER = new Type("Rudder");
/**
* Stick controller, such as a joystick or flightstick.
*/
public static final Type STICK = new Type("stick");
public static final Type STICK = new Type("Stick");
/**
* A trackball controller; note that this may sometimes be treated as a
* type of mouse.
*/
public static final Type TRACKBALL = new Type("trackball");
public static final Type TRACKBALL = new Type("Trackball");
/**
* A trackpad, such as a tablet, touchpad, or glidepad;
* note that this may sometimes be treated as a type of mouse.
*/
public static final Type TRACKPAD = new Type("trackpad");
public static final Type TRACKPAD = new Type("Trackpad");
/**
* A wheel controller, such as a steering wheel (note
* that a mouse wheel is considered part of a ball control, not a
* that a mouse wheel is considered part of a mouse, not a
* wheel controller).
*/
public static final Type WHEEL = new Type("wheel");
public static final Type WHEEL = new Type("Wheel");
} // class Controller.Type
/**

View file

@ -66,7 +66,14 @@ import java.util.Iterator;
*
*/
public abstract class ControllerEnvironment {
static void logln(String msg) {
log(msg + "\n");
}
static void log(String msg) {
System.out.print(msg);
}
/**
* The default controller environment
*/

View file

@ -123,35 +123,35 @@ class DefaultControllerEnvironment extends ControllerEnvironment {
pluginClasses = pluginClasses + " net.java.games.input.OSXEnvironmentPlugin";
} else if(osName.equals("Windows 98") || osName.equals("Windows 2000") || osName.equals("Windows XP")) {
pluginClasses = pluginClasses + " net.java.games.input.DirectInputEnvironmentPlugin";
} else if(osName.startsWith("Windows")) {
// pluginClasses = pluginClasses + " net.java.games.input.RawInputEnvironmentPlugin";
} else if (osName.startsWith("Windows")) {
System.out.println("WARNING: Found unknown Windows version: " + osName);
System.out.println("Attempting to use default windows plug-in.");
System.out.flush();
pluginClasses = pluginClasses + " net.java.games.input.DirectInputEnvironmentPlugin";
// pluginClasses = pluginClasses + " net.java.games.input.RawInputEnvironmentPlugin";
} else {
System.out.println("Trying to use default plugin, OS name " + osName +" not recognised");
}
}
if(!pluginClasses.equals("")) {
ArrayList pluginClassList = new ArrayList();
StringTokenizer pluginClassTok = new StringTokenizer(pluginClasses, " \t\n\r\f,;:");
while(pluginClassTok.hasMoreTokens()) {
String className = pluginClassTok.nextToken();
try {
if(!loadedPlugins.contains(className)) {
Class ceClass = Class.forName(className);
ControllerEnvironment ce = (ControllerEnvironment) ceClass.newInstance();
addControllers(ce.getControllers());
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ArrayList pluginClassList = new ArrayList();
StringTokenizer pluginClassTok = new StringTokenizer(pluginClasses, " \t\n\r\f,;:");
while(pluginClassTok.hasMoreTokens()) {
String className = pluginClassTok.nextToken();
try {
if(!loadedPlugins.contains(className)) {
Class ceClass = Class.forName(className);
ControllerEnvironment ce = (ControllerEnvironment) ceClass.newInstance();
addControllers(ce.getControllers());
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Controller[] ret = new Controller[controllers.size()];
Iterator it = controllers.iterator();
@ -232,7 +232,7 @@ class DefaultControllerEnvironment extends ControllerEnvironment {
envClasses[i].newInstance();
addControllers(ce.getControllers());
loadedPlugins.add(ce.getClass().getName());
} catch (Exception e) {
} catch (Throwable e) {
e.printStackTrace();
}
}

View 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;
public final class Event {
private Component component;
private float value;
private long nanos;
public final void set(Event other) {
this.set(other.getComponent(), other.getValue(), other.getNanos());
}
public final void set(Component component, float value, long nanos) {
this.component = component;
this.value = value;
this.nanos = nanos;
}
public final Component getComponent() {
return component;
}
public final float getValue() {
return value;
}
/**
* Return the time the event happened, in nanoseconds.
* The time is relative and therefore can only be used
* to compare with other event times.
*/
public final long getNanos() {
return nanos;
}
public final String toString() {
return "Event: component = " + component + " | value = " + value;
}
}

View 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;
public final class EventQueue {
private final Event[] queue;
private int head;
private int tail;
public EventQueue(int size) {
queue = new Event[size + 1];
for (int i = 0; i < queue.length; i++)
queue[i] = new Event();
}
final synchronized void add(Event event) {
queue[tail].set(event);
tail = increase(tail);
}
final synchronized boolean isFull() {
return increase(tail) == head;
}
private final int increase(int x) {
return (x + 1)%queue.length;
}
public final synchronized boolean getNextEvent(Event event) {
if (head == tail)
return false;
event.set(queue[head]);
head = increase(head);
return true;
}
}

View file

@ -44,14 +44,13 @@ package net.java.games.input;
* are set to receive polling data.
*/
public abstract class Keyboard extends AbstractController {
/**
* Protected constructor.
* Subclasses should initialize the array of axes to an array of keys.
* @param name The name of the keyboard
*/
protected Keyboard(String name) {
super(name);
protected Keyboard(String name, Component[] keys, Controller[] children, Rumbler[] rumblers) {
super(name, keys, children, rumblers);
}
/**
@ -61,67 +60,10 @@ public abstract class Keyboard extends AbstractController {
return Type.KEYBOARD;
}
/**
* Returns the component corresponding to a particular key on the keypad,
* or null if a key with the specified ID could not be found.
*/
public Component getComponent(Component.Identifier id) {
assert components != null;
// Default implementation uses indices to lookup keys
// in the array of axes
if(id instanceof Component.Identifier.Key) {
int index = ((Component.Identifier.Key)id).getKeyIndex();
assert components.length > index;
return components[index];
}
return null;
}
/**
* 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.
*/
protected abstract boolean isKeyPressed(Key key);
/**
* Axis representing a single key. By default, all keys are set to receive
* polling data.
*/
public class Key extends AbstractComponent {
/**
* Key identifier
*/
private final Component.Identifier.Key keyID;
/**
* Construct a new key object
*/
public Key(Component.Identifier.Key keyID) {
super(keyID.toString(), keyID);
this.keyID = keyID;
}
/**
* 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 false by default, can be overridden
*/
public final boolean isRelative() {
return false;
}
/**
* Returns the data from the last time the control has been polled.
* The value returned will be either 0.0f or 1.0f. The result is always
* 0.0f if polling is turned off.
*/
public float getPollData() {
if (!isPolling()) {
return 0.0f;
}
return (isKeyPressed(this) ? 1.0f : 0.0f);
}
} // class Keyboard.Key
public final boolean isKeyDown(Component.Identifier.Key key_id) {
Component key = getComponent(key_id);
if (key == null)
return false;
return key.getPollData() != 0;
}
} // class Keyboard

View file

@ -38,56 +38,17 @@
*****************************************************************************/
package net.java.games.input;
import java.util.List;
import java.util.ArrayList;
/**
* A Mouse is a type of controller consisting of two child controllers,
* a ball and a button pad. This includes devices such as touch pads,
* trackballs, and fingersticks.
*/
public abstract class Mouse extends AbstractController {
/**
* Mouse ball; should be initialized by subclasses
*/
protected Ball ball;
/**
* Mouse buttons; should be initialized by subclasses
*/
protected Buttons buttons;
/**
* Protected constructor;
* Subclasses should initialize the ball and buttons
*/
protected Mouse(String name) {
super(name);
}
/**
* Returns the controllers connected to make up this controller, or
* an empty array if this controller contains no child controllers.
* The objects in the array are returned in order of assignment priority
* (primary stick, secondary buttons, etc.).
*/
public Controller[] getControllers() {
if (children.length == 0 && ball != null && buttons != null) {
children = new Controller[] { ball, buttons };
}
return children;
}
/**
* Returns the control for the ball of the mouse, never null.
*/
public Ball getBall() {
return ball;
}
/**
* Returns the control for the buttons of the mouse, never null.
*/
public Buttons getButtons() {
return buttons;
protected Mouse(String name, Component[] components, Controller[] children, Rumbler[] rumblers) {
super(name, components, children, rumblers);
}
/**
@ -97,249 +58,79 @@ public abstract class Mouse extends AbstractController {
return Type.MOUSE;
}
/**
* Mouse ball controller
*/
public abstract class Ball extends AbstractController {
/**
* X-axis; should be initialized by subclasses
*/
protected Component x;
/**
* Y-axis; should be initialized by subclasses
*/
protected Component y;
/**
* Mouse wheel; should be initialized by subclasses
*/
protected Component wheel;
/**
* Protected constructor
*/
protected Ball(String name) {
super(name);
}
/**
* Returns the type of Controller.
*/
public Type getType() {
return Type.BALL;
}
/**
* Returns the x-axis for the mouse ball, never null.
*/
public Component getX() {
return x;
}
/**
* Returns the y-axis for the mouse ball, never null.
*/
public Component getY() {
return y;
}
/**
* Returns the mouse wheel, or null if no mouse wheel is present.
*/
public Component getWheel() {
return wheel;
}
/**
* Returns the components on this controller, in order of assignment priority.
* Overridden to return the x-axis, followed by the y-axes, followed by
* the wheel (if present).
* The array returned is an empty array if this controller contains no
* axes (such as a logical grouping of child controllers).
*/
public Component[] getComponents() {
if (components.length == 0 && x != null && y != null) {
if (wheel == null) {
components = new Component[] { x, y };
} else {
components = new Component[] { x, y, wheel };
}
}
return components;
}
/**
* Returns the x-axis for the mouse ball, never null.
*/
public Component getX() {
return getComponent(Component.Identifier.Axis.X);
}
/**
* Polls axes for data. Returns false if the controller is no longer
* valid. Polling reflects the current state of the device when polled.
* By default, polling a mouse ball or button polls the entire mouse
* control.
*/
public boolean poll() {
return Mouse.this.poll();
}
} // class Mouse.Ball
/**
* Mouse buttons controller
*/
public abstract class Buttons extends AbstractController {
/**
* Left button; should be initialized by subclasses
*/
protected Button left;
/**
* Right button; should be initialized by subclasses
*/
protected Button right;
/**
* Middle button; should be initialized by subclasses
*/
protected Button middle;
/**
* Side button; should be initialized by subclasses
*/
protected Button side;
/**
* Extra button; should be initialized by subclasses
*/
protected Button extra;
/**
* Forward button; should be initialized by subclasses
*/
protected Button forward;
/**
* Back button; should be initialized by subclasses
*/
protected Button back;
/**
* Protected constructor
*/
protected Buttons(String name) {
super(name);
}
/**
* Returns the type or identifier of the Controller.
*/
public Type getType() {
return Type.BUTTONS;
}
/**
* Returns the left or primary mouse button, never null.
*/
public Button getLeft() {
return left;
}
/**
* Returns the right or secondary mouse button, null if the mouse is
* a single-button mouse.
*/
public Button getRight() {
return right;
}
/**
* Returns the middle or tertiary mouse button, null if the mouse has
* fewer than three buttons.
*/
public Button getMiddle() {
return middle;
}
/**
* Returns the side or 4th mouse button, null if the mouse has
* fewer than 4 buttons.
*/
public Button getSide() {
return side;
}
/**
* Returns the extra or 5th mouse button, null if the mouse has
* fewer than 5 buttons.
*/
public Button getExtra() {
return extra;
}
/**
* Returns the forward mouse button, null if the mouse hasn't
* got one.
*/
public Button getForward() {
return forward;
}
/**
* Returns the back mouse button, null if the mouse hasn't
* got one.
*/
public Button getBack() {
return back;
}
/**
* Returns the components on this controller, in order of assignment priority.
* Overridden to return the the primary or leftmost mouse button,
* followed by the secondary or rightmost mouse button (if present),
* followed by the middle mouse button (if present).
* The array returned is an empty array if this controller contains no
* axes (such as a logical grouping of child controllers).
*/
public Component[] getComponents() {
if (components.length == 0 && left != null) {
if (right == null) {
components = new Component[] { left };
} else if (middle == null) {
components = new Component[] { left, right };
} else if (side == null) {
components = new Component[] { left, right, middle };
} else if (extra == null) {
components = new Component[] { left, right, middle, side };
} else if (forward == null) {
components = new Component[] { left, right, middle, side, extra };
} else if (back == null) {
components = new Component[] { left, right, middle, side, extra, forward };
} else {
components = new Component[] { left, right, middle, side, extra, forward, back };
}
}
return components;
}
/**
* Returns the y-axis for the mouse ball, never null.
*/
public Component getY() {
return getComponent(Component.Identifier.Axis.Y);
}
/**
* Polls axes for data. Returns false if the controller is no longer
* valid. Polling reflects the current state of the device when polled.
* By default, polling a mouse ball or button polls the entire mouse
* control.
*/
public boolean poll() {
return Mouse.this.poll();
}
} // class Mouse.Buttons
/**
* Mouse button axis
*/
public abstract class Button extends AbstractComponent {
/**
* Protected constructor
*/
protected Button(String name, Component.Identifier.Button id) {
super(name, id);
}
} // class Mouse.Button
/**
* Returns the mouse wheel, or null if no mouse wheel is present.
*/
public Component getWheel() {
return getComponent(Component.Identifier.Axis.Z);
}
/**
* Returns the left or primary mouse button, never null.
*/
public Component getLeft() {
return getComponent(Component.Identifier.Button.LEFT);
}
/**
* Returns the right or secondary mouse button, null if the mouse is
* a single-button mouse.
*/
public Component getRight() {
return getComponent(Component.Identifier.Button.RIGHT);
}
/**
* Returns the middle or tertiary mouse button, null if the mouse has
* fewer than three buttons.
*/
public Component getMiddle() {
return getComponent(Component.Identifier.Button.MIDDLE);
}
/**
* Returns the side or 4th mouse button, null if the mouse has
* fewer than 4 buttons.
*/
public Component getSide() {
return getComponent(Component.Identifier.Button.SIDE);
}
/**
* Returns the extra or 5th mouse button, null if the mouse has
* fewer than 5 buttons.
*/
public Component getExtra() {
return getComponent(Component.Identifier.Button.EXTRA);
}
/**
* Returns the forward mouse button, null if the mouse hasn't
* got one.
*/
public Component getForward() {
return getComponent(Component.Identifier.Button.FORWARD);
}
/**
* Returns the back mouse button, null if the mouse hasn't
* got one.
*/
public Component getBack() {
return getComponent(Component.Identifier.Button.BACK);
}
} // class Mouse

View file

@ -1,119 +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;
/**
* Identifiers for physical keys for standard PC (LATIN-1) keyboards.
*/
public abstract class StandardKeyboard extends Keyboard {
private Key[] standardKeys = {
new Key(Component.Identifier.Key.VOID ), new Key(Component.Identifier.Key.ESCAPE ),
new Key(Component.Identifier.Key._1 ), new Key(Component.Identifier.Key._2 ),
new Key(Component.Identifier.Key._3 ), new Key(Component.Identifier.Key._4 ),
new Key(Component.Identifier.Key._5 ), new Key(Component.Identifier.Key._6 ),
new Key(Component.Identifier.Key._7 ), new Key(Component.Identifier.Key._8 ),
new Key(Component.Identifier.Key._9 ), new Key(Component.Identifier.Key._0 ),
new Key(Component.Identifier.Key.MINUS ), new Key(Component.Identifier.Key.EQUALS ),
new Key(Component.Identifier.Key.BACK ), new Key(Component.Identifier.Key.TAB ),
new Key(Component.Identifier.Key.Q ), new Key(Component.Identifier.Key.W ),
new Key(Component.Identifier.Key.E ), new Key(Component.Identifier.Key.R ),
new Key(Component.Identifier.Key.T ), new Key(Component.Identifier.Key.Y ),
new Key(Component.Identifier.Key.U ), new Key(Component.Identifier.Key.I ),
new Key(Component.Identifier.Key.O ), new Key(Component.Identifier.Key.P ),
new Key(Component.Identifier.Key.LBRACKET ), new Key(Component.Identifier.Key.RBRACKET ),
new Key(Component.Identifier.Key.RETURN ), new Key(Component.Identifier.Key.LCONTROL ),
new Key(Component.Identifier.Key.A ), new Key(Component.Identifier.Key.S ),
new Key(Component.Identifier.Key.D ), new Key(Component.Identifier.Key.F ),
new Key(Component.Identifier.Key.G ), new Key(Component.Identifier.Key.H ),
new Key(Component.Identifier.Key.J ), new Key(Component.Identifier.Key.K ),
new Key(Component.Identifier.Key.L ), new Key(Component.Identifier.Key.SEMICOLON ),
new Key(Component.Identifier.Key.APOSTROPHE ), new Key(Component.Identifier.Key.GRAVE ),
new Key(Component.Identifier.Key.LSHIFT ), new Key(Component.Identifier.Key.BACKSLASH ),
new Key(Component.Identifier.Key.Z ), new Key(Component.Identifier.Key.X ),
new Key(Component.Identifier.Key.C ), new Key(Component.Identifier.Key.V ),
new Key(Component.Identifier.Key.B ), new Key(Component.Identifier.Key.N ),
new Key(Component.Identifier.Key.M ), new Key(Component.Identifier.Key.COMMA ),
new Key(Component.Identifier.Key.PERIOD ), new Key(Component.Identifier.Key.SLASH ),
new Key(Component.Identifier.Key.RSHIFT ), new Key(Component.Identifier.Key.MULTIPLY ),
new Key(Component.Identifier.Key.LALT ), new Key(Component.Identifier.Key.SPACE ),
new Key(Component.Identifier.Key.CAPITAL ), new Key(Component.Identifier.Key.F1 ),
new Key(Component.Identifier.Key.F2 ), new Key(Component.Identifier.Key.F3 ),
new Key(Component.Identifier.Key.F4 ), new Key(Component.Identifier.Key.F5 ),
new Key(Component.Identifier.Key.F6 ), new Key(Component.Identifier.Key.F7 ),
new Key(Component.Identifier.Key.F8 ), new Key(Component.Identifier.Key.F9 ),
new Key(Component.Identifier.Key.F10 ), new Key(Component.Identifier.Key.NUMLOCK ),
new Key(Component.Identifier.Key.SCROLL ), new Key(Component.Identifier.Key.NUMPAD7 ),
new Key(Component.Identifier.Key.NUMPAD8 ), new Key(Component.Identifier.Key.NUMPAD9 ),
new Key(Component.Identifier.Key.SUBTRACT ), new Key(Component.Identifier.Key.NUMPAD4 ),
new Key(Component.Identifier.Key.NUMPAD5 ), new Key(Component.Identifier.Key.NUMPAD6 ),
new Key(Component.Identifier.Key.ADD ), new Key(Component.Identifier.Key.NUMPAD1 ),
new Key(Component.Identifier.Key.NUMPAD2 ), new Key(Component.Identifier.Key.NUMPAD3 ),
new Key(Component.Identifier.Key.NUMPAD0 ), new Key(Component.Identifier.Key.DECIMAL ),
new Key(Component.Identifier.Key.F11 ), new Key(Component.Identifier.Key.F12 ),
new Key(Component.Identifier.Key.F13 ), new Key(Component.Identifier.Key.F14 ),
new Key(Component.Identifier.Key.F15 ), new Key(Component.Identifier.Key.KANA ),
new Key(Component.Identifier.Key.CONVERT ), new Key(Component.Identifier.Key.NOCONVERT ),
new Key(Component.Identifier.Key.YEN ), new Key(Component.Identifier.Key.NUMPADEQUAL),
new Key(Component.Identifier.Key.CIRCUMFLEX ), new Key(Component.Identifier.Key.AT ),
new Key(Component.Identifier.Key.COLON ), new Key(Component.Identifier.Key.UNDERLINE ),
new Key(Component.Identifier.Key.KANJI ), new Key(Component.Identifier.Key.STOP ),
new Key(Component.Identifier.Key.AX ), new Key(Component.Identifier.Key.UNLABELED ),
new Key(Component.Identifier.Key.NUMPADENTER), new Key(Component.Identifier.Key.RCONTROL ),
new Key(Component.Identifier.Key.NUMPADCOMMA), new Key(Component.Identifier.Key.DIVIDE ),
new Key(Component.Identifier.Key.SYSRQ ), new Key(Component.Identifier.Key.RALT ),
new Key(Component.Identifier.Key.PAUSE ), new Key(Component.Identifier.Key.HOME ),
new Key(Component.Identifier.Key.UP ), new Key(Component.Identifier.Key.PAGEUP ),
new Key(Component.Identifier.Key.LEFT ), new Key(Component.Identifier.Key.RIGHT ),
new Key(Component.Identifier.Key.END ), new Key(Component.Identifier.Key.DOWN ),
new Key(Component.Identifier.Key.PAGEDOWN ), new Key(Component.Identifier.Key.INSERT ),
new Key(Component.Identifier.Key.DELETE ), new Key(Component.Identifier.Key.LWIN ),
new Key(Component.Identifier.Key.RWIN ), new Key(Component.Identifier.Key.APPS ),
new Key(Component.Identifier.Key.POWER ), new Key(Component.Identifier.Key.SLEEP ),
};
/**
* Creates a new standard keyboard object with the default keys
* for a standard keyboard.
*/
protected StandardKeyboard(String name) {
super(name);
components = standardKeys;
}
} // class StandardKeyboard

View file

@ -89,7 +89,7 @@ public final class Version {
/**
* Version string of this build.
*/
private static final String version = "1.0.0-b01";
private static final String version = "2.0.0-b01";
/**
* Returns the verison string and build number of

View file

@ -74,6 +74,10 @@ abstract class AxisPanel extends JPanel{
data = axis.getPollData();
renderData();
}
public Component getAxis() {
return axis;
}
protected abstract void renderData();
}
@ -153,7 +157,10 @@ class AnalogAxisPanel extends AxisPanel {
}
protected void renderData(){
analogState.setText(""+data);
String extra = "";
if (getAxis().getDeadZone() >= Math.abs(data))
extra = " (DEADZONE)";
analogState.setText(""+data+extra);
analogState.repaint();
}
}
@ -216,7 +223,7 @@ class ControllerWindow extends JFrame {
}
p.add(p2);
axisList.add(p2);
ax.setPolling(true);
//ax.setPolling(true);
}
public void poll(){