aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/OSX
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/OSX')
-rw-r--r--plugins/OSX/build.xml55
-rw-r--r--plugins/OSX/src/java/net/java/games/input/ButtonUsage.java141
-rw-r--r--plugins/OSX/src/java/net/java/games/input/ElementType.java74
-rw-r--r--plugins/OSX/src/java/net/java/games/input/GenericDesktopUsage.java142
-rw-r--r--plugins/OSX/src/java/net/java/games/input/InputController.java13
-rw-r--r--plugins/OSX/src/java/net/java/games/input/InputControllerElement.java195
-rw-r--r--plugins/OSX/src/java/net/java/games/input/KeyboardUsage.java251
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXAbstractController.java74
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXComponent.java70
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXControllers.java64
-rwxr-xr-xplugins/OSX/src/java/net/java/games/input/OSXEnvironmentPlugin.java615
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXEvent.java73
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXGamepad.java82
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXHIDDevice.java318
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXHIDDeviceIterator.java65
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXHIDElement.java143
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXHIDQueue.java141
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXJoystick.java280
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXKeyboard.java315
-rw-r--r--plugins/OSX/src/java/net/java/games/input/OSXMouse.java313
-rw-r--r--plugins/OSX/src/java/net/java/games/input/Usage.java46
-rw-r--r--plugins/OSX/src/java/net/java/games/input/UsagePage.java114
-rw-r--r--plugins/OSX/src/java/net/java/games/input/UsagePair.java76
-rw-r--r--plugins/OSX/src/native/build.xml80
-rw-r--r--plugins/OSX/src/native/jinputjnilib.c839
-rw-r--r--plugins/OSX/src/native/macosxutil.c197
-rw-r--r--plugins/OSX/src/native/macosxutil.h48
-rw-r--r--plugins/OSX/src/native/net_java_games_input_OSXHIDDevice.c118
-rw-r--r--plugins/OSX/src/native/net_java_games_input_OSXHIDDeviceIterator.c143
-rw-r--r--plugins/OSX/src/native/net_java_games_input_OSXHIDQueue.c135
30 files changed, 2833 insertions, 2387 deletions
diff --git a/plugins/OSX/build.xml b/plugins/OSX/build.xml
index 066c838..659f766 100644
--- a/plugins/OSX/build.xml
+++ b/plugins/OSX/build.xml
@@ -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>
diff --git a/plugins/OSX/src/java/net/java/games/input/ButtonUsage.java b/plugins/OSX/src/java/net/java/games/input/ButtonUsage.java
new file mode 100644
index 0000000..d83dcb8
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/ButtonUsage.java
@@ -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 + ")";
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/ElementType.java b/plugins/OSX/src/java/net/java/games/input/ElementType.java
new file mode 100644
index 0000000..efc303f
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/ElementType.java
@@ -0,0 +1,74 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+package net.java.games.input;
+
+import java.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) + ")";
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/GenericDesktopUsage.java b/plugins/OSX/src/java/net/java/games/input/GenericDesktopUsage.java
new file mode 100644
index 0000000..9b6d48b
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/GenericDesktopUsage.java
@@ -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;
+ }
+
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/InputController.java b/plugins/OSX/src/java/net/java/games/input/InputController.java
deleted file mode 100644
index 2a5442b..0000000
--- a/plugins/OSX/src/java/net/java/games/input/InputController.java
+++ /dev/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 );
-}
diff --git a/plugins/OSX/src/java/net/java/games/input/InputControllerElement.java b/plugins/OSX/src/java/net/java/games/input/InputControllerElement.java
deleted file mode 100644
index 8ba92c3..0000000
--- a/plugins/OSX/src/java/net/java/games/input/InputControllerElement.java
+++ /dev/null
@@ -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;
- }
-
-}
diff --git a/plugins/OSX/src/java/net/java/games/input/KeyboardUsage.java b/plugins/OSX/src/java/net/java/games/input/KeyboardUsage.java
new file mode 100644
index 0000000..7621032
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/KeyboardUsage.java
@@ -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) + ")";
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXAbstractController.java b/plugins/OSX/src/java/net/java/games/input/OSXAbstractController.java
new file mode 100644
index 0000000..4248c88
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/OSXAbstractController.java
@@ -0,0 +1,74 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+package net.java.games.input;
+
+import java.io.IOException;
+
+/** Represents 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;
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXComponent.java b/plugins/OSX/src/java/net/java/games/input/OSXComponent.java
new file mode 100644
index 0000000..6533a79
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/OSXComponent.java
@@ -0,0 +1,70 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+package net.java.games.input;
+
+import java.io.IOException;
+
+/** Represents 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);
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXControllers.java b/plugins/OSX/src/java/net/java/games/input/OSXControllers.java
new file mode 100644
index 0000000..704ccc5
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/OSXControllers.java
@@ -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;
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXEnvironmentPlugin.java b/plugins/OSX/src/java/net/java/games/input/OSXEnvironmentPlugin.java
index 41a28fc..68e42b0 100755
--- a/plugins/OSX/src/java/net/java/games/input/OSXEnvironmentPlugin.java
+++ b/plugins/OSX/src/java/net/java/games/input/OSXEnvironmentPlugin.java
@@ -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 native void hidCreate();
- public native void hidDispose();
- public native void enumDevices();
-
- /**
- * 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 );
-
-
- /**
- * 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 );
-
-
- private HashMap devices = new HashMap();
-
-
- public OSXEnvironmentPlugin()
- {
- System.out.println("net.java.games.input.OSXEnvironmentPlugin instance created");
-
- 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");
+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;
+ }
+ });
}
-} \ No newline at end of file
+ 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);
+ }
+
+ private final Controller[] controllers;
+
+ public OSXEnvironmentPlugin() {
+ this.controllers = enumerateControllers();
+ }
+
+ 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 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;
+ }
+
+ 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);
+ }
+ }
+
+ 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;
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXEvent.java b/plugins/OSX/src/java/net/java/games/input/OSXEvent.java
new file mode 100644
index 0000000..9db46e6
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/OSXEvent.java
@@ -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;
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXGamepad.java b/plugins/OSX/src/java/net/java/games/input/OSXGamepad.java
deleted file mode 100644
index d739b6c..0000000
--- a/plugins/OSX/src/java/net/java/games/input/OSXGamepad.java
+++ /dev/null
@@ -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;
-
- }
- }
-}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXHIDDevice.java b/plugins/OSX/src/java/net/java/games/input/OSXHIDDevice.java
new file mode 100644
index 0000000..27102ca
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/OSXHIDDevice.java
@@ -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();
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXHIDDeviceIterator.java b/plugins/OSX/src/java/net/java/games/input/OSXHIDDeviceIterator.java
new file mode 100644
index 0000000..1070c58
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/OSXHIDDeviceIterator.java
@@ -0,0 +1,65 @@
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+/*****************************************************************************
+* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistribution of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+*
+* - Redistribution in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materails provided with the distribution.
+*
+* Neither the name Sun Microsystems, Inc. or the names of the contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* This software is provided "AS IS," without a warranty of any kind.
+* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
+* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
+* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
+* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
+* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
+* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
+* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
+* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+*
+* You acknowledge that this software is not designed or intended for us in
+* the design, construction, operation or maintenance of any nuclear facility
+*
+*****************************************************************************/
+package net.java.games.input;
+
+import java.io.IOException;
+
+/** 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;
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXHIDElement.java b/plugins/OSX/src/java/net/java/games/input/OSXHIDElement.java
new file mode 100644
index 0000000..a8c0907
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/OSXHIDElement.java
@@ -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;
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXHIDQueue.java b/plugins/OSX/src/java/net/java/games/input/OSXHIDQueue.java
new file mode 100644
index 0000000..884c76a
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/OSXHIDQueue.java
@@ -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");
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXJoystick.java b/plugins/OSX/src/java/net/java/games/input/OSXJoystick.java
deleted file mode 100644
index f20fb57..0000000
--- a/plugins/OSX/src/java/net/java/games/input/OSXJoystick.java
+++ /dev/null
@@ -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;
- }
- }
-
-
-}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXKeyboard.java b/plugins/OSX/src/java/net/java/games/input/OSXKeyboard.java
index c717f8a..f545264 100644
--- a/plugins/OSX/src/java/net/java/games/input/OSXKeyboard.java
+++ b/plugins/OSX/src/java/net/java/games/input/OSXKeyboard.java
@@ -1,253 +1,68 @@
-package net.java.games.input;
-
-import java.util.HashMap;
-
-/**
- * Created by IntelliJ IDEA.
- * User: gpierce
- * Date: Aug 2, 2003
- * Time: 3:57:58 PM
- * To change this template use Options | File Templates.
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
-public class OSXKeyboard extends StandardKeyboard implements InputController
-{
-
- 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
- };
-
- 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;
- }
- }
+/*****************************************************************************
+* 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;
- return false;
- }
+import java.io.IOException;
+
+/** 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();
+ }
+
+ 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 final PortType getPortType() {
+ return port;
+ }
}
diff --git a/plugins/OSX/src/java/net/java/games/input/OSXMouse.java b/plugins/OSX/src/java/net/java/games/input/OSXMouse.java
index 2abeb67..8f5244b 100644
--- a/plugins/OSX/src/java/net/java/games/input/OSXMouse.java
+++ b/plugins/OSX/src/java/net/java/games/input/OSXMouse.java
@@ -1,251 +1,68 @@
-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.
+/*
+ * %W% %E%
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
-public class OSXMouse extends Mouse implements InputController
-{
- private OSXEnvironmentPlugin plugin;
- private long lpDevice;
- private long lpQueue;
- private int buttonCount = 0;
-
-
- public OSXMouse( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
- {
- super( productName );
-
- 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;
- }
- }
+/*****************************************************************************
+* 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 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();
+ }
+
+ 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 final PortType getPortType() {
+ return port;
+ }
}
diff --git a/plugins/OSX/src/java/net/java/games/input/Usage.java b/plugins/OSX/src/java/net/java/games/input/Usage.java
new file mode 100644
index 0000000..8b79b3a
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/Usage.java
@@ -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 {
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/UsagePage.java b/plugins/OSX/src/java/net/java/games/input/UsagePage.java
new file mode 100644
index 0000000..bd50eab
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/UsagePage.java
@@ -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);
+ }
+ }
+}
diff --git a/plugins/OSX/src/java/net/java/games/input/UsagePair.java b/plugins/OSX/src/java/net/java/games/input/UsagePair.java
new file mode 100644
index 0000000..8d0b883
--- /dev/null
+++ b/plugins/OSX/src/java/net/java/games/input/UsagePair.java
@@ -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 + ")";
+ }
+}
diff --git a/plugins/OSX/src/native/build.xml b/plugins/OSX/src/native/build.xml
index b88c856..9b338da 100644
--- a/plugins/OSX/src/native/build.xml
+++ b/plugins/OSX/src/native/build.xml
@@ -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>
diff --git a/plugins/OSX/src/native/jinputjnilib.c b/plugins/OSX/src/native/jinputjnilib.c
deleted file mode 100644
index 86c7347..0000000
--- a/plugins/OSX/src/native/jinputjnilib.c
+++ /dev/null
@@ -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 );
- }
-}
-
-
-
diff --git a/plugins/OSX/src/native/macosxutil.c b/plugins/OSX/src/native/macosxutil.c
new file mode 100644
index 0000000..81b5cc6
--- /dev/null
+++ b/plugins/OSX/src/native/macosxutil.c
@@ -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);
+}
diff --git a/plugins/OSX/src/native/macosxutil.h b/plugins/OSX/src/native/macosxutil.h
new file mode 100644
index 0000000..ed2722c
--- /dev/null
+++ b/plugins/OSX/src/native/macosxutil.h
@@ -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);
diff --git a/plugins/OSX/src/native/net_java_games_input_OSXHIDDevice.c b/plugins/OSX/src/native/net_java_games_input_OSXHIDDevice.c
new file mode 100644
index 0000000..cef6701
--- /dev/null
+++ b/plugins/OSX/src/native/net_java_games_input_OSXHIDDevice.c
@@ -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;
+}
diff --git a/plugins/OSX/src/native/net_java_games_input_OSXHIDDeviceIterator.c b/plugins/OSX/src/native/net_java_games_input_OSXHIDDeviceIterator.c
new file mode 100644
index 0000000..e76363f
--- /dev/null
+++ b/plugins/OSX/src/native/net_java_games_input_OSXHIDDeviceIterator.c
@@ -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;
+}
diff --git a/plugins/OSX/src/native/net_java_games_input_OSXHIDQueue.c b/plugins/OSX/src/native/net_java_games_input_OSXHIDQueue.c
new file mode 100644
index 0000000..12dbd0a
--- /dev/null
+++ b/plugins/OSX/src/native/net_java_games_input_OSXHIDQueue.c
@@ -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;
+}