diff options
Diffstat (limited to 'plugins/OSX')
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; +} |