Make version 2 the main jinput version

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

View file

@ -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 + ")";
}
}

View file

@ -0,0 +1,74 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
import java.lang.reflect.Method;
/** HID Element types
* @author elias
* @version 1.0
*/
final class ElementType {
private final static ElementType[] map = new ElementType[514];
public final static ElementType INPUT_MISC = new ElementType(1);
public final static ElementType INPUT_BUTTON = new ElementType(2);
public final static ElementType INPUT_AXIS = new ElementType(3);
public final static ElementType INPUT_SCANCODES = new ElementType(4);
public final static ElementType OUTPUT = new ElementType(129);
public final static ElementType FEATURE = new ElementType(257);
public final static ElementType COLLECTION = new ElementType(513);
private final int type_id;
public final static ElementType map(int type_id) {
if (type_id < 0 || type_id >= map.length)
return null;
return map[type_id];
}
private ElementType(int type_id) {
map[type_id] = this;
this.type_id = type_id;
}
public final String toString() {
return "ElementType (0x" + Integer.toHexString(type_id) + ")";
}
}

View file

@ -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;
}
}

View file

@ -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 );
}

View file

@ -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;
}
}

View file

@ -0,0 +1,251 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
import java.util.Map;
import java.util.HashMap;
/** Mapping from Keyboard HID usages to Component.Identifier.Key
* @author elias
* @version 1.0
*/
final class KeyboardUsage implements Usage {
private final static KeyboardUsage[] map = new KeyboardUsage[0xFF];
public static final KeyboardUsage ERRORROLLOVER = new KeyboardUsage(0x01); /* ErrorRollOver */
public static final KeyboardUsage POSTFAIL = new KeyboardUsage(0x02); /* POSTFail */
public static final KeyboardUsage ERRORUNDEFINED = new KeyboardUsage(0x03); /* ErrorUndefined */
public static final KeyboardUsage A = new KeyboardUsage(Component.Identifier.Key.A, 0x04); /* a or A */
public static final KeyboardUsage B = new KeyboardUsage(Component.Identifier.Key.B, 0x05); /* b or B */
public static final KeyboardUsage C = new KeyboardUsage(Component.Identifier.Key.C, 0x06); /* c or C */
public static final KeyboardUsage D = new KeyboardUsage(Component.Identifier.Key.D, 0x07); /* d or D */
public static final KeyboardUsage E = new KeyboardUsage(Component.Identifier.Key.E, 0x08); /* e or E */
public static final KeyboardUsage F = new KeyboardUsage(Component.Identifier.Key.F, 0x09); /* f or F */
public static final KeyboardUsage G = new KeyboardUsage(Component.Identifier.Key.G, 0x0A); /* g or G */
public static final KeyboardUsage H = new KeyboardUsage(Component.Identifier.Key.H, 0x0B); /* h or H */
public static final KeyboardUsage I = new KeyboardUsage(Component.Identifier.Key.I, 0x0C); /* i or I */
public static final KeyboardUsage J = new KeyboardUsage(Component.Identifier.Key.J, 0x0D); /* j or J */
public static final KeyboardUsage K = new KeyboardUsage(Component.Identifier.Key.K, 0x0E); /* k or K */
public static final KeyboardUsage L = new KeyboardUsage(Component.Identifier.Key.L, 0x0F); /* l or L */
public static final KeyboardUsage M = new KeyboardUsage(Component.Identifier.Key.M, 0x10); /* m or M */
public static final KeyboardUsage N = new KeyboardUsage(Component.Identifier.Key.N, 0x11); /* n or N */
public static final KeyboardUsage O = new KeyboardUsage(Component.Identifier.Key.O, 0x12); /* o or O */
public static final KeyboardUsage P = new KeyboardUsage(Component.Identifier.Key.P, 0x13); /* p or P */
public static final KeyboardUsage Q = new KeyboardUsage(Component.Identifier.Key.Q, 0x14); /* q or Q */
public static final KeyboardUsage R = new KeyboardUsage(Component.Identifier.Key.R, 0x15); /* r or R */
public static final KeyboardUsage S = new KeyboardUsage(Component.Identifier.Key.S, 0x16); /* s or S */
public static final KeyboardUsage T = new KeyboardUsage(Component.Identifier.Key.T, 0x17); /* t or T */
public static final KeyboardUsage U = new KeyboardUsage(Component.Identifier.Key.U, 0x18); /* u or U */
public static final KeyboardUsage V = new KeyboardUsage(Component.Identifier.Key.V, 0x19); /* v or V */
public static final KeyboardUsage W = new KeyboardUsage(Component.Identifier.Key.W, 0x1A); /* w or W */
public static final KeyboardUsage X = new KeyboardUsage(Component.Identifier.Key.X, 0x1B); /* x or X */
public static final KeyboardUsage Y = new KeyboardUsage(Component.Identifier.Key.Y, 0x1C); /* y or Y */
public static final KeyboardUsage Z = new KeyboardUsage(Component.Identifier.Key.Z, 0x1D); /* z or Z */
public static final KeyboardUsage _1 = new KeyboardUsage(Component.Identifier.Key._1, 0x1E); /* 1 or ! */
public static final KeyboardUsage _2 = new KeyboardUsage(Component.Identifier.Key._2, 0x1F); /* 2 or @ */
public static final KeyboardUsage _3 = new KeyboardUsage(Component.Identifier.Key._3, 0x20); /* 3 or # */
public static final KeyboardUsage _4 = new KeyboardUsage(Component.Identifier.Key._4, 0x21); /* 4 or $ */
public static final KeyboardUsage _5 = new KeyboardUsage(Component.Identifier.Key._5, 0x22); /* 5 or % */
public static final KeyboardUsage _6 = new KeyboardUsage(Component.Identifier.Key._6, 0x23); /* 6 or ^ */
public static final KeyboardUsage _7 = new KeyboardUsage(Component.Identifier.Key._7, 0x24); /* 7 or & */
public static final KeyboardUsage _8 = new KeyboardUsage(Component.Identifier.Key._8, 0x25); /* 8 or * */
public static final KeyboardUsage _9 = new KeyboardUsage(Component.Identifier.Key._9, 0x26); /* 9 or ( */
public static final KeyboardUsage _0 = new KeyboardUsage(Component.Identifier.Key._0, 0x27); /* 0 or ) */
public static final KeyboardUsage ENTER = new KeyboardUsage(Component.Identifier.Key.RETURN, 0x28); /* Return (Enter) */
public static final KeyboardUsage ESCAPE = new KeyboardUsage(Component.Identifier.Key.ESCAPE, 0x29); /* Escape */
public static final KeyboardUsage BACKSPACE = new KeyboardUsage(Component.Identifier.Key.BACK, 0x2A); /* Delete (Backspace) */
public static final KeyboardUsage TAB = new KeyboardUsage(Component.Identifier.Key.TAB, 0x2B); /* Tab */
public static final KeyboardUsage SPACEBAR = new KeyboardUsage(Component.Identifier.Key.SPACE, 0x2C); /* Spacebar */
public static final KeyboardUsage HYPHEN = new KeyboardUsage(Component.Identifier.Key.MINUS, 0x2D); /* - or _ */
public static final KeyboardUsage EQUALSIGN = new KeyboardUsage(Component.Identifier.Key.EQUALS, 0x2E); /* = or + */
public static final KeyboardUsage OPENBRACKET = new KeyboardUsage(Component.Identifier.Key.LBRACKET, 0x2F); /* [ or { */
public static final KeyboardUsage CLOSEBRACKET = new KeyboardUsage(Component.Identifier.Key.RBRACKET, 0x30); /* ] or } */
public static final KeyboardUsage BACKSLASH = new KeyboardUsage(Component.Identifier.Key.BACKSLASH, 0x31); /* \ or | */
public static final KeyboardUsage NONUSPOUNT = new KeyboardUsage(Component.Identifier.Key.PERIOD, 0x32); /* Non-US # or _ */
public static final KeyboardUsage SEMICOLON = new KeyboardUsage(Component.Identifier.Key.SEMICOLON, 0x33); /* ; or : */
public static final KeyboardUsage QUOTE = new KeyboardUsage(Component.Identifier.Key.APOSTROPHE, 0x34); /* ' or " */
public static final KeyboardUsage TILDE = new KeyboardUsage(Component.Identifier.Key.GRAVE, 0x35); /* Grave Accent and Tilde */
public static final KeyboardUsage COMMA = new KeyboardUsage(Component.Identifier.Key.COMMA, 0x36); /* , or < */
public static final KeyboardUsage PERIOD = new KeyboardUsage(Component.Identifier.Key.PERIOD, 0x37); /* . or > */
public static final KeyboardUsage SLASH = new KeyboardUsage(Component.Identifier.Key.SLASH, 0x38); /* / or ? */
public static final KeyboardUsage CAPSLOCK = new KeyboardUsage(Component.Identifier.Key.CAPITAL, 0x39); /* Caps Lock */
public static final KeyboardUsage F1 = new KeyboardUsage(Component.Identifier.Key.F1, 0x3A); /* F1 */
public static final KeyboardUsage F2 = new KeyboardUsage(Component.Identifier.Key.F2, 0x3B); /* F2 */
public static final KeyboardUsage F3 = new KeyboardUsage(Component.Identifier.Key.F3, 0x3C); /* F3 */
public static final KeyboardUsage F4 = new KeyboardUsage(Component.Identifier.Key.F4, 0x3D); /* F4 */
public static final KeyboardUsage F5 = new KeyboardUsage(Component.Identifier.Key.F5, 0x3E); /* F5 */
public static final KeyboardUsage F6 = new KeyboardUsage(Component.Identifier.Key.F6, 0x3F); /* F6 */
public static final KeyboardUsage F7 = new KeyboardUsage(Component.Identifier.Key.F7, 0x40); /* F7 */
public static final KeyboardUsage F8 = new KeyboardUsage(Component.Identifier.Key.F8, 0x41); /* F8 */
public static final KeyboardUsage F9 = new KeyboardUsage(Component.Identifier.Key.F9, 0x42); /* F9 */
public static final KeyboardUsage F10 = new KeyboardUsage(Component.Identifier.Key.F10, 0x43); /* F10 */
public static final KeyboardUsage F11 = new KeyboardUsage(Component.Identifier.Key.F11, 0x44); /* F11 */
public static final KeyboardUsage F12 = new KeyboardUsage(Component.Identifier.Key.F12, 0x45); /* F12 */
public static final KeyboardUsage PRINTSCREEN = new KeyboardUsage(Component.Identifier.Key.SYSRQ, 0x46); /* PrintScreen */
public static final KeyboardUsage SCROLLLOCK = new KeyboardUsage(Component.Identifier.Key.SCROLL, 0x47); /* Scroll Lock */
public static final KeyboardUsage PAUSE = new KeyboardUsage(Component.Identifier.Key.PAUSE, 0x48); /* Pause */
public static final KeyboardUsage INSERT = new KeyboardUsage(Component.Identifier.Key.INSERT, 0x49); /* Insert */
public static final KeyboardUsage HOME = new KeyboardUsage(Component.Identifier.Key.HOME, 0x4A); /* Home */
public static final KeyboardUsage PAGEUP = new KeyboardUsage(Component.Identifier.Key.PAGEUP, 0x4B); /* Page Up */
public static final KeyboardUsage DELETE = new KeyboardUsage(Component.Identifier.Key.DELETE, 0x4C); /* Delete Forward */
public static final KeyboardUsage END = new KeyboardUsage(Component.Identifier.Key.END, 0x4D); /* End */
public static final KeyboardUsage PAGEDOWN = new KeyboardUsage(Component.Identifier.Key.PAGEDOWN, 0x4E); /* Page Down */
public static final KeyboardUsage RIGHTARROW = new KeyboardUsage(Component.Identifier.Key.RIGHT, 0x4F); /* Right Arrow */
public static final KeyboardUsage LEFTARROW = new KeyboardUsage(Component.Identifier.Key.LEFT, 0x50); /* Left Arrow */
public static final KeyboardUsage DOWNARROW = new KeyboardUsage(Component.Identifier.Key.DOWN, 0x51); /* Down Arrow */
public static final KeyboardUsage UPARROW = new KeyboardUsage(Component.Identifier.Key.UP, 0x52); /* Up Arrow */
public static final KeyboardUsage KEYPAD_NUMLOCK = new KeyboardUsage(Component.Identifier.Key.NUMLOCK, 0x53); /* Keypad NumLock or Clear */
public static final KeyboardUsage KEYPAD_SLASH = new KeyboardUsage(Component.Identifier.Key.DIVIDE, 0x54); /* Keypad / */
public static final KeyboardUsage KEYPAD_ASTERICK = new KeyboardUsage(0x55); /* Keypad * */
public static final KeyboardUsage KEYPAD_HYPHEN = new KeyboardUsage(Component.Identifier.Key.SUBTRACT, 0x56); /* Keypad - */
public static final KeyboardUsage KEYPAD_PLUS = new KeyboardUsage(Component.Identifier.Key.ADD, 0x57); /* Keypad + */
public static final KeyboardUsage KEYPAD_ENTER = new KeyboardUsage(Component.Identifier.Key.NUMPADENTER, 0x58); /* Keypad Enter */
public static final KeyboardUsage KEYPAD_1 = new KeyboardUsage(Component.Identifier.Key.NUMPAD1, 0x59); /* Keypad 1 or End */
public static final KeyboardUsage KEYPAD_2 = new KeyboardUsage(Component.Identifier.Key.NUMPAD2, 0x5A); /* Keypad 2 or Down Arrow */
public static final KeyboardUsage KEYPAD_3 = new KeyboardUsage(Component.Identifier.Key.NUMPAD3, 0x5B); /* Keypad 3 or Page Down */
public static final KeyboardUsage KEYPAD_4 = new KeyboardUsage(Component.Identifier.Key.NUMPAD4, 0x5C); /* Keypad 4 or Left Arrow */
public static final KeyboardUsage KEYPAD_5 = new KeyboardUsage(Component.Identifier.Key.NUMPAD5, 0x5D); /* Keypad 5 */
public static final KeyboardUsage KEYPAD_6 = new KeyboardUsage(Component.Identifier.Key.NUMPAD6, 0x5E); /* Keypad 6 or Right Arrow */
public static final KeyboardUsage KEYPAD_7 = new KeyboardUsage(Component.Identifier.Key.NUMPAD7, 0x5F); /* Keypad 7 or Home */
public static final KeyboardUsage KEYPAD_8 = new KeyboardUsage(Component.Identifier.Key.NUMPAD8, 0x60); /* Keypad 8 or Up Arrow */
public static final KeyboardUsage KEYPAD_9 = new KeyboardUsage(Component.Identifier.Key.NUMPAD9, 0x61); /* Keypad 9 or Page Up */
public static final KeyboardUsage KEYPAD_0 = new KeyboardUsage(Component.Identifier.Key.NUMPAD0, 0x62); /* Keypad 0 or Insert */
public static final KeyboardUsage KEYPAD_PERIOD = new KeyboardUsage(Component.Identifier.Key.DECIMAL, 0x63); /* Keypad . or Delete */
public static final KeyboardUsage NONUSBACKSLASH = new KeyboardUsage(Component.Identifier.Key.BACKSLASH, 0x64); /* Non-US \ or | */
public static final KeyboardUsage APPLICATION = new KeyboardUsage(Component.Identifier.Key.APPS, 0x65); /* Application */
public static final KeyboardUsage POWER = new KeyboardUsage(Component.Identifier.Key.POWER, 0x66); /* Power */
public static final KeyboardUsage KEYPAD_EQUALSIGN = new KeyboardUsage(Component.Identifier.Key.NUMPADEQUAL, 0x67); /* Keypad = */
public static final KeyboardUsage F13 = new KeyboardUsage(Component.Identifier.Key.F13, 0x68); /* F13 */
public static final KeyboardUsage F14 = new KeyboardUsage(Component.Identifier.Key.F14, 0x69); /* F14 */
public static final KeyboardUsage F15 = new KeyboardUsage(Component.Identifier.Key.F15, 0x6A); /* F15 */
public static final KeyboardUsage F16 = new KeyboardUsage(0x6B); /* F16 */
public static final KeyboardUsage F17 = new KeyboardUsage(0x6C); /* F17 */
public static final KeyboardUsage F18 = new KeyboardUsage(0x6D); /* F18 */
public static final KeyboardUsage F19 = new KeyboardUsage(0x6E); /* F19 */
public static final KeyboardUsage F20 = new KeyboardUsage(0x6F); /* F20 */
public static final KeyboardUsage F21 = new KeyboardUsage(0x70); /* F21 */
public static final KeyboardUsage F22 = new KeyboardUsage(0x71); /* F22 */
public static final KeyboardUsage F23 = new KeyboardUsage(0x72); /* F23 */
public static final KeyboardUsage F24 = new KeyboardUsage(0x73); /* F24 */
public static final KeyboardUsage EXECUTE = new KeyboardUsage(0x74); /* Execute */
public static final KeyboardUsage HELP = new KeyboardUsage(0x75); /* Help */
public static final KeyboardUsage MENU = new KeyboardUsage(0x76); /* Menu */
public static final KeyboardUsage SELECT = new KeyboardUsage(0x77); /* Select */
public static final KeyboardUsage STOP = new KeyboardUsage(Component.Identifier.Key.STOP, 0x78); /* Stop */
public static final KeyboardUsage AGAIN = new KeyboardUsage(0x79); /* Again */
public static final KeyboardUsage UNDO = new KeyboardUsage(0x7A); /* Undo */
public static final KeyboardUsage CUT = new KeyboardUsage(0x7B); /* Cut */
public static final KeyboardUsage COPY = new KeyboardUsage(0x7C); /* Copy */
public static final KeyboardUsage PASTE = new KeyboardUsage(0x7D); /* Paste */
public static final KeyboardUsage FIND = new KeyboardUsage(0x7E); /* Find */
public static final KeyboardUsage MUTE = new KeyboardUsage(0x7F); /* Mute */
public static final KeyboardUsage VOLUMEUP = new KeyboardUsage(0x80); /* Volume Up */
public static final KeyboardUsage VOLUMEDOWN = new KeyboardUsage(0x81); /* Volume Down */
public static final KeyboardUsage LOCKINGCAPSLOCK = new KeyboardUsage(Component.Identifier.Key.CAPITAL, 0x82); /* Locking Caps Lock */
public static final KeyboardUsage LOCKINGNUMLOCK = new KeyboardUsage(Component.Identifier.Key.NUMLOCK, 0x83); /* Locking Num Lock */
public static final KeyboardUsage LOCKINGSCROLLLOCK = new KeyboardUsage(Component.Identifier.Key.SCROLL, 0x84); /* Locking Scroll Lock */
public static final KeyboardUsage KEYPAD_COMMA = new KeyboardUsage(Component.Identifier.Key.COMMA, 0x85); /* Keypad Comma */
public static final KeyboardUsage KEYPAD_EQUALSSIGNAS400 = new KeyboardUsage(0x86); /* Keypad Equal Sign for AS/400 */
public static final KeyboardUsage INTERNATIONAL1 = new KeyboardUsage(0x87); /* International1 */
public static final KeyboardUsage INTERNATIONAL2 = new KeyboardUsage(0x88); /* International2 */
public static final KeyboardUsage INTERNATIONAL3 = new KeyboardUsage(0x89); /* International3 */
public static final KeyboardUsage INTERNATIONAL4 = new KeyboardUsage(0x8A); /* International4 */
public static final KeyboardUsage INTERNATIONAL5 = new KeyboardUsage(0x8B); /* International5 */
public static final KeyboardUsage INTERNATIONAL6 = new KeyboardUsage(0x8C); /* International6 */
public static final KeyboardUsage INTERNATIONAL7 = new KeyboardUsage(0x8D); /* International7 */
public static final KeyboardUsage INTERNATIONAL8 = new KeyboardUsage(0x8E); /* International8 */
public static final KeyboardUsage INTERNATIONAL9 = new KeyboardUsage(0x8F); /* International9 */
public static final KeyboardUsage LANG1 = new KeyboardUsage(0x90); /* LANG1 */
public static final KeyboardUsage LANG2 = new KeyboardUsage(0x91); /* LANG2 */
public static final KeyboardUsage LANG3 = new KeyboardUsage(0x92); /* LANG3 */
public static final KeyboardUsage LANG4 = new KeyboardUsage(0x93); /* LANG4 */
public static final KeyboardUsage LANG5 = new KeyboardUsage(0x94); /* LANG5 */
public static final KeyboardUsage LANG6 = new KeyboardUsage(0x95); /* LANG6 */
public static final KeyboardUsage LANG7 = new KeyboardUsage(0x96); /* LANG7 */
public static final KeyboardUsage LANG8 = new KeyboardUsage(0x97); /* LANG8 */
public static final KeyboardUsage LANG9 = new KeyboardUsage(0x98); /* LANG9 */
public static final KeyboardUsage ALTERNATEERASE = new KeyboardUsage(0x99); /* AlternateErase */
public static final KeyboardUsage SYSREQORATTENTION = new KeyboardUsage(Component.Identifier.Key.SYSRQ, 0x9A); /* SysReq/Attention */
public static final KeyboardUsage CANCEL = new KeyboardUsage(0x9B); /* Cancel */
public static final KeyboardUsage CLEAR = new KeyboardUsage(0x9C); /* Clear */
public static final KeyboardUsage PRIOR = new KeyboardUsage(Component.Identifier.Key.PAGEUP, 0x9D); /* Prior */
public static final KeyboardUsage RETURN = new KeyboardUsage(Component.Identifier.Key.RETURN, 0x9E); /* Return */
public static final KeyboardUsage SEPARATOR = new KeyboardUsage(0x9F); /* Separator */
public static final KeyboardUsage OUT = new KeyboardUsage(0xA0); /* Out */
public static final KeyboardUsage OPER = new KeyboardUsage(0xA1); /* Oper */
public static final KeyboardUsage CLEARORAGAIN = new KeyboardUsage(0xA2); /* Clear/Again */
public static final KeyboardUsage CRSELORPROPS = new KeyboardUsage(0xA3); /* CrSel/Props */
public static final KeyboardUsage EXSEL = new KeyboardUsage(0xA4); /* ExSel */
/* 0xA5-0xDF Reserved */
public static final KeyboardUsage LEFTCONTROL = new KeyboardUsage(Component.Identifier.Key.LCONTROL, 0xE0); /* Left Control */
public static final KeyboardUsage LEFTSHIFT = new KeyboardUsage(Component.Identifier.Key.LSHIFT, 0xE1); /* Left Shift */
public static final KeyboardUsage LEFTALT = new KeyboardUsage(Component.Identifier.Key.LALT, 0xE2); /* Left Alt */
public static final KeyboardUsage LEFTGUI = new KeyboardUsage(Component.Identifier.Key.LWIN, 0xE3); /* Left GUI */
public static final KeyboardUsage RIGHTCONTROL = new KeyboardUsage(Component.Identifier.Key.RCONTROL, 0xE4); /* Right Control */
public static final KeyboardUsage RIGHTSHIFT = new KeyboardUsage(Component.Identifier.Key.RSHIFT, 0xE5); /* Right Shift */
public static final KeyboardUsage RIGHTALT = new KeyboardUsage(Component.Identifier.Key.RALT, 0xE6); /* Right Alt */
public static final KeyboardUsage RIGHTGUI = new KeyboardUsage(Component.Identifier.Key.RWIN, 0xE7); /* Right GUI */
private final int usage;
private final Component.Identifier.Key identifier;
public final Component.Identifier.Key getIdentifier() {
return identifier;
}
public final static KeyboardUsage map(int usage) {
if (usage < 0 || usage >= map.length)
return null;
return map[usage];
}
private KeyboardUsage(int usage) {
this(Component.Identifier.Key.UNKNOWN, usage);
}
private KeyboardUsage(Component.Identifier.Key id, int usage) {
this.identifier = id;
this.usage = usage;
map[usage] = this;
}
public final String toString() {
return "KeyboardUsage (0x" + Integer.toHexString(usage) + ")";
}
}

View file

@ -0,0 +1,74 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
import java.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;
}
}

View file

@ -0,0 +1,70 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
import java.io.IOException;
/** Represents an OSX Component
* @author elias
* @version 1.0
*/
class OSXComponent extends AbstractComponent {
private final OSXHIDElement element;
public OSXComponent(Component.Identifier id, OSXHIDElement element) {
super(id.getName(), id);
this.element = element;
}
public final boolean isRelative() {
return element.isRelative();
}
public boolean isAnalog() {
return element.isAnalog();
}
public final OSXHIDElement getElement() {
return element;
}
protected float poll() throws IOException {
return OSXControllers.poll(element);
}
}

View file

@ -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;
}
}

View file

@ -38,447 +38,194 @@
*****************************************************************************/
package net.java.games.input;
import java.security.AccessController;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.HashMap;
import java.util.StringTokenizer;
import net.java.games.input.Controller;
import net.java.games.input.ControllerEnvironment;
import net.java.games.util.plugins.Plugin;
import java.security.AccessController;
import java.security.PrivilegedAction;
/** OSX HIDManager implementation of controller environment
/** OSX HIDManager implementation
* @author elias
* @author gregorypierce
* @version 1.0
*/
public class OSXEnvironmentPlugin extends ControllerEnvironment implements Plugin
{
public static final int HID_DEVICE_MOUSE = 0x02;
public static final int HID_DEVICE_JOYSTICK = 0x04;
public static final int HID_DEVICE_GAMEPAD = 0x05;
public static final int HID_DEVICE_KEYBOARD = 0x06;
public static final int HID_USAGE_POINTER = 0x01;
public static final int HID_USAGE_XAXIS = 0x30;
public static final int HID_USAGE_YAXIS = 0x31;
public static final int HID_USAGE_ZAXIS = 0x32;
public static final int HID_USAGE_XAXIS_ROTATION = 0x33;
public static final int HID_USAGE_YAXIS_ROTATION = 0x34;
public static final int HID_USAGE_ZAXIS_ROTATION = 0x35;
public static final int HID_USAGE_SLIDER = 0x36;
public static final int HID_USAGE_DIAL = 0x37;
public static final int HID_USAGE_WHEEL = 0x38;
public static final int HID_USAGE_HAT = 0x39;
public static final int HID_USAGE_DPAD_UP = 0x90;
public static final int HID_USAGE_DPAD_DOWN = 0x91;
public static final int HID_USAGE_DPAD_LEFT = 0x92;
public static final int HID_USAGE_DPAD_RIGHT = 0x93;
public static final int HID_USAGE_KEYBOARD_ERRORROLLOVER = 0x01; /* ErrorRollOver */
public static final int HID_USAGE_KEYBOARD_POSTFAIL = 0x02; /* POSTFail */
public static final int HID_USAGE_KEYBOARD_ERRORUNDEFINED = 0x03; /* ErrorUndefined */
public static final int HID_USAGE_KEYBOARD_A = 0x04; /* a or A */
public static final int HID_USAGE_KEYBOARD_B = 0x05; /* b or B */
public static final int HID_USAGE_KEYBOARD_C = 0x06; /* c or C */
public static final int HID_USAGE_KEYBOARD_D = 0x07; /* d or D */
public static final int HID_USAGE_KEYBOARD_E = 0x08; /* e or E */
public static final int HID_USAGE_KEYBOARD_F = 0x09; /* f or F */
public static final int HID_USAGE_KEYBOARD_G = 0x0A; /* g or G */
public static final int HID_USAGE_KEYBOARD_H = 0x0B; /* h or H */
public static final int HID_USAGE_KEYBOARD_I = 0x0C; /* i or I */
public static final int HID_USAGE_KEYBOARD_J = 0x0D; /* j or J */
public static final int HID_USAGE_KEYBOARD_K = 0x0E; /* k or K */
public static final int HID_USAGE_KEYBOARD_L = 0x0F; /* l or L */
public static final int HID_USAGE_KEYBOARD_M = 0x10; /* m or M */
public static final int HID_USAGE_KEYBOARD_N = 0x11; /* n or N */
public static final int HID_USAGE_KEYBOARD_O = 0x12; /* o or O */
public static final int HID_USAGE_KEYBOARD_P = 0x13; /* p or P */
public static final int HID_USAGE_KEYBOARD_Q = 0x14; /* q or Q */
public static final int HID_USAGE_KEYBOARD_R = 0x15; /* r or R */
public static final int HID_USAGE_KEYBOARD_S = 0x16; /* s or S */
public static final int HID_USAGE_KEYBOARD_T = 0x17; /* t or T */
public static final int HID_USAGE_KEYBOARD_U = 0x18; /* u or U */
public static final int HID_USAGE_KEYBOARD_V = 0x19; /* v or V */
public static final int HID_USAGE_KEYBOARD_W = 0x1A; /* w or W */
public static final int HID_USAGE_KEYBOARD_X = 0x1B; /* x or X */
public static final int HID_USAGE_KEYBOARD_Y = 0x1C; /* y or Y */
public static final int HID_USAGE_KEYBOARD_Z = 0x1D; /* z or Z */
public static final int HID_USAGE_KEYBOARD_1 = 0x1E; /* 1 or ! */
public static final int HID_USAGE_KEYBOARD_2 = 0x1F; /* 2 or @ */
public static final int HID_USAGE_KEYBOARD_3 = 0x20; /* 3 or # */
public static final int HID_USAGE_KEYBOARD_4 = 0x21; /* 4 or $ */
public static final int HID_USAGE_KEYBOARD_5 = 0x22; /* 5 or % */
public static final int HID_USAGE_KEYBOARD_6 = 0x23; /* 6 or ^ */
public static final int HID_USAGE_KEYBOARD_7 = 0x24; /* 7 or & */
public static final int HID_USAGE_KEYBOARD_8 = 0x25; /* 8 or * */
public static final int HID_USAGE_KEYBOARD_9 = 0x26; /* 9 or ( */
public static final int HID_USAGE_KEYBOARD_0 = 0x27; /* 0 or ) */
public static final int HID_USAGE_KEYBOARD_ENTER = 0x28; /* Return (Enter) */
public static final int HID_USAGE_KEYBOARD_ESCAPE = 0x29; /* Escape */
public static final int HID_USAGE_KEYBOARD_BACKSPACE = 0x2A; /* Delete (Backspace) */
public static final int HID_USAGE_KEYBOARD_TAB = 0x2B; /* Tab */
public static final int HID_USAGE_KEYBOARD_SPACEBAR = 0x2C; /* Spacebar */
public static final int HID_USAGE_KEYBOARD_HYPHEN = 0x2D; /* - or _ */
public static final int HID_USAGE_KEYBOARD_EQUALSIGN = 0x2E; /* = or + */
public static final int HID_USAGE_KEYBOARD_OPENBRACKET = 0x2F; /* [ or { */
public static final int HID_USAGE_KEYBOARD_CLOSEBRACKET = 0x30; /* ] or } */
public static final int HID_USAGE_KEYBOARD_BACKSLASH = 0x31; /* \ or | */
public static final int HID_USAGE_KEYBOARD_NONUSPOUNT = 0x32; /* Non-US # or _ */
public static final int HID_USAGE_KEYBOARD_SEMICOLON = 0x33; /* ; or : */
public static final int HID_USAGE_KEYBOARD_QUOTE = 0x34; /* ' or " */
public static final int HID_USAGE_KEYBOARD_TILDE = 0x35; /* Grave Accent and Tilde */
public static final int HID_USAGE_KEYBOARD_COMMA = 0x36; /* , or < */
public static final int HID_USAGE_KEYBOARD_PERIOD = 0x37; /* . or > */
public static final int HID_USAGE_KEYBOARD_SLASH = 0x38; /* / or ? */
public static final int HID_USAGE_KEYBOARD_CAPSLOCK = 0x39; /* Caps Lock */
public static final int HID_USAGE_KEYBOARD_F1 = 0x3A; /* F1 */
public static final int HID_USAGE_KEYBOARD_F2 = 0x3B; /* F2 */
public static final int HID_USAGE_KEYBOARD_F3 = 0x3C; /* F3 */
public static final int HID_USAGE_KEYBOARD_F4 = 0x3D; /* F4 */
public static final int HID_USAGE_KEYBOARD_F5 = 0x3E; /* F5 */
public static final int HID_USAGE_KEYBOARD_F6 = 0x3F; /* F6 */
public static final int HID_USAGE_KEYBOARD_F7 = 0x40; /* F7 */
public static final int HID_USAGE_KEYBOARD_F8 = 0x41; /* F8 */
public static final int HID_USAGE_KEYBOARD_F9 = 0x42; /* F9 */
public static final int HID_USAGE_KEYBOARD_F10 = 0x43; /* F10 */
public static final int HID_USAGE_KEYBOARD_F11 = 0x44; /* F11 */
public static final int HID_USAGE_KEYBOARD_F12 = 0x45; /* F12 */
public static final int HID_USAGE_KEYBOARD_PRINTSCREEN = 0x46; /* Print Screen */
public static final int HID_USAGE_KEYBOARD_SCROLLLOCK = 0x47; /* Scroll Lock */
public static final int HID_USAGE_KEYBOARD_PAUSE = 0x48; /* Pause */
public static final int HID_USAGE_KEYBOARD_INSERT = 0x49; /* Insert */
public static final int HID_USAGE_KEYBOARD_HOME = 0x4A; /* Home */
public static final int HID_USAGE_KEYBOARD_PAGEUP = 0x4B; /* Page Up */
public static final int HID_USAGE_KEYBOARD_DELETE = 0x4C; /* Delete Forward */
public static final int HID_USAGE_KEYBOARD_END = 0x4D; /* End */
public static final int HID_USAGE_KEYBOARD_PAGEDOWN = 0x4E; /* Page Down */
public static final int HID_USAGE_KEYBOARD_RIGHTARROW = 0x4F; /* Right Arrow */
public static final int HID_USAGE_KEYBOARD_LEFTARROW = 0x50; /* Left Arrow */
public static final int HID_USAGE_KEYBOARD_DOWNARROW = 0x51; /* Down Arrow */
public static final int HID_USAGE_KEYBOARD_UPARROW = 0x52; /* Up Arrow */
public static final int HID_USAGE_KEYPAD_NUMLOCK = 0x53; /* Keypad NumLock or Clear */
public static final int HID_USAGE_KEYPAD_SLASH = 0x54; /* Keypad / */
public static final int HID_USAGE_KEYPAD_ASTERICK = 0x55; /* Keypad * */
public static final int HID_USAGE_KEYPAD_HYPHEN = 0x56; /* Keypad - */
public static final int HID_USAGE_KEYPAD_PLUS = 0x57; /* Keypad + */
public static final int HID_USAGE_KEYPAD_ENTER = 0x58; /* Keypad Enter */
public static final int HID_USAGE_KEYPAD_1 = 0x59; /* Keypad 1 or End */
public static final int HID_USAGE_KEYPAD_2 = 0x5A; /* Keypad 2 or Down Arrow */
public static final int HID_USAGE_KEYPAD_3 = 0x5B; /* Keypad 3 or Page Down */
public static final int HID_USAGE_KEYPAD_4 = 0x5C; /* Keypad 4 or Left Arrow */
public static final int HID_USAGE_KEYPAD_5 = 0x5D; /* Keypad 5 */
public static final int HID_USAGE_KEYPAD_6 = 0x5E; /* Keypad 6 or Right Arrow */
public static final int HID_USAGE_KEYPAD_7 = 0x5F; /* Keypad 7 or Home */
public static final int HID_USAGE_KEYPAD_8 = 0x60; /* Keypad 8 or Up Arrow */
public static final int HID_USAGE_KEYPAD_9 = 0x61; /* Keypad 9 or Page Up */
public static final int HID_USAGE_KEYPAD_0 = 0x62; /* Keypad 0 or Insert */
public static final int HID_USAGE_KEYPAD_PERIOD = 0x63; /* Keypad . or Delete */
public static final int HID_USAGE_KEYBOARD_NONUSBACKSLASH = 0x64; /* Non-US \ or | */
public static final int HID_USAGE_KEYBOARD_APPLICATION = 0x65; /* Application */
public static final int HID_USAGE_KEYBOARD_POWER = 0x66; /* Power */
public static final int HID_USAGE_KEYPAD_EQUALSIGN = 0x67; /* Keypad = */
public static final int HID_USAGE_KEYBOARD_F13 = 0x68; /* F13 */
public static final int HID_USAGE_KEYBOARD_F14 = 0x69; /* F14 */
public static final int HID_USAGE_KEYBOARD_F15 = 0x6A; /* F15 */
public static final int HID_USAGE_KEYBOARD_F16 = 0x6B; /* F16 */
public static final int HID_USAGE_KEYBOARD_F17 = 0x6C; /* F17 */
public static final int HID_USAGE_KEYBOARD_F18 = 0x6D; /* F18 */
public static final int HID_USAGE_KEYBOARD_F19 = 0x6E; /* F19 */
public static final int HID_USAGE_KEYBOARD_F20 = 0x6F; /* F20 */
public static final int HID_USAGE_KEYBOARD_F21 = 0x70; /* F21 */
public static final int HID_USAGE_KEYBOARD_F22 = 0x71; /* F22 */
public static final int HID_USAGE_KEYBOARD_F23 = 0x72; /* F23 */
public static final int HID_USAGE_KEYBOARD_F24 = 0x73; /* F24 */
public static final int HID_USAGE_KEYBOARD_EXECUTE = 0x74; /* Execute */
public static final int HID_USAGE_KEYBOARD_HELP = 0x75; /* Help */
public static final int HID_USAGE_KEYBOARD_MENU = 0x76; /* Menu */
public static final int HID_USAGE_KEYBOARD_SELECT = 0x77; /* Select */
public static final int HID_USAGE_KEYBOARD_STOP = 0x78; /* Stop */
public static final int HID_USAGE_KEYBOARD_AGAIN = 0x79; /* Again */
public static final int HID_USAGE_KEYBOARD_UNDO = 0x7A; /* Undo */
public static final int HID_USAGE_KEYBOARD_CUT = 0x7B; /* Cut */
public static final int HID_USAGE_KEYBOARD_COPY = 0x7C; /* Copy */
public static final int HID_USAGE_KEYBOARD_PASTE = 0x7D; /* Paste */
public static final int HID_USAGE_KEYBOARD_FIND = 0x7E; /* Find */
public static final int HID_USAGE_KEYBOARD_MUTE = 0x7F; /* Mute */
public static final int HID_USAGE_KEYBOARD_VOLUMEUP = 0x80; /* Volume Up */
public static final int HID_USAGE_KEYBOARD_VOLUMEDOWN = 0x81; /* Volume Down */
public static final int HID_USAGE_KEYBOARD_LOCKINGCAPSLOCK = 0x82; /* Locking Caps Lock */
public static final int HID_USAGE_KEYBOARD_LOCKINGNUMLOCK = 0x83; /* Locking Num Lock */
public static final int HID_USAGE_KEYBOARD_LOCKINGSCROLLLOCK = 0x84; /* Locking Scroll Lock */
public static final int HID_USAGE_KEYPAD_COMMA = 0x85; /* Keypad Comma */
public static final int HID_USAGE_KEYPAD_EQUALSSIGNAS400 = 0x86; /* Keypad Equal Sign for AS/400 */
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL1 = 0x87; /* International1 */
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL2 = 0x88; /* International2 */
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL3 = 0x89; /* International3 */
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL4 = 0x8A; /* International4 */
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL5 = 0x8B; /* International5 */
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL6 = 0x8C; /* International6 */
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL7 = 0x8D; /* International7 */
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL8 = 0x8E; /* International8 */
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL9 = 0x8F; /* International9 */
public static final int HID_USAGE_KEYBOARD_LANG1 = 0x90; /* LANG1 */
public static final int HID_USAGE_KEYBOARD_LANG2 = 0x91; /* LANG2 */
public static final int HID_USAGE_KEYBOARD_LANG3 = 0x92; /* LANG3 */
public static final int HID_USAGE_KEYBOARD_LANG4 = 0x93; /* LANG4 */
public static final int HID_USAGE_KEYBOARD_LANG5 = 0x94; /* LANG5 */
public static final int HID_USAGE_KEYBOARD_LANG6 = 0x95; /* LANG6 */
public static final int HID_USAGE_KEYBOARD_LANG7 = 0x96; /* LANG7 */
public static final int HID_USAGE_KEYBOARD_LANG8 = 0x97; /* LANG8 */
public static final int HID_USAGE_KEYBOARD_LANG9 = 0x98; /* LANG9 */
public static final int HID_USAGE_KEYBOARD_ALTERNATEERASE = 0x99; /* AlternateErase */
public static final int HID_USAGE_KEYBOARD_SYSREQORATTENTION = 0x9A; /* SysReq/Attention */
public static final int HID_USAGE_KEYBOARD_CANCEL = 0x9B; /* Cancel */
public static final int HID_USAGE_KEYBOARD_CLEAR = 0x9C; /* Clear */
public static final int HID_USAGE_KEYBOARD_PRIOR = 0x9D; /* Prior */
public static final int HID_USAGE_KEYBOARD_RETURN = 0x9E; /* Return */
public static final int HID_USAGE_KEYBOARD_SEPARATOR = 0x9F; /* Separator */
public static final int HID_USAGE_KEYBOARD_OUT = 0xA0; /* Out */
public static final int HID_USAGE_KEYBOARD_OPER = 0xA1; /* Oper */
public static final int HID_USAGE_KEYBOARD_CLEARORAGAIN = 0xA2; /* Clear/Again */
public static final int HID_USAGE_KEYBOARD_CRSELORPROPS = 0xA3; /* CrSel/Props */
public static final int HID_USAGE_KEYBOARD_EXSEL = 0xA4; /* ExSel */
/* 0xA5-0xDF Reserved */
public static final int HID_USAGE_KEYBOARD_LEFTCONTROL = 0xE0; /* Left Control */
public static final int HID_USAGE_KEYBOARD_LEFTSHIFT = 0xE1; /* Left Shift */
public static final int HID_USAGE_KEYBOARD_LEFTALT = 0xE2; /* Left Alt */
public static final int HID_USAGE_KEYBOARD_LEFTGUI = 0xE3; /* Left GUI */
public static final int HID_USAGE_KEYBOARD_RIGHTCONTROL = 0xE4; /* Right Control */
public static final int HID_USAGE_KEYBOARD_RIGHTSHIFT = 0xE5; /* Right Shift */
public static final int HID_USAGE_KEYBOARD_RIGHTALT = 0xE6; /* Right Alt */
public static final int HID_USAGE_KEYBOARD_RIGHTGUI = 0xE7; /* Right GUI */
/* 0xE8-0xFFFF Reserved */
public static final int HID_USAGE_KEYBOARD__RESERVED = 0xFFFF;
public static final int HID_USAGEPAGE_UNDEFINED = 0x00;
public static final int HID_USAGEPAGE_GENERICDESKTOP = 0x01;
public static final int HID_USAGEPAGE_SIMULATION = 0x02;
public static final int HID_USAGEPAGE_VR = 0x03;
public static final int HID_USAGEPAGE_SPORT = 0x04;
public static final int HID_USAGEPAGE_GAME = 0x05;
public static final int HID_USAGEPAGE_KEYBOARD = 0x07; /* USB Device Class Definition for Human Interface Devices (HID). Note: the usage type for all key codes is Selector (Sel). */
public static final int HID_USAGEPAGE_LED = 0x08;
public static final int HID_USAGEPAGE_BUTTON = 0x09;
public static final int HID_USAGEPAGE_ORDINAL = 0x0A;
public static final int HID_USAGEPAGE_TELEPHONY = 0x0B;
public static final int HID_USAGEPAGE_CONSUMER = 0x0C;
public static final int HID_USAGEPAGE_DIGITIZER = 0x0D;
public static final int HID_USAGEPAGE_PID = 0x0F; /* USB Physical Interface Device definitions for force feedback and related devices. */
public static final int HID_USAGEPAGE_UNICODE = 0x10;
public static final int HID_USAGEPAGE_ALPHANUMERIC_DISPLAY = 0x14;
public static final int HID_USAGEPAGE_POWERDEVICE = 0x84; /* Power Device Page */
public static final int HID_USAGEPAGE_BATTERY_SYSTEM = 0x85; /* Battery System Page */
public static final int HID_USAGEPAGE_BARCODE_SCANNER = 0x8C; /* (Point of Sale) USB Device Class Definition for Bar Code Scanner Devices */
public static final int HID_USAGEPAGE_SCALE = 0x8D; /* (Point of Sale) USB Device Class Definition for Scale Devices */
public static final int HID_USAGEPAGE_CAMERA_CONTROL = 0x90; /* USB Device Class Definition for Image Class Devices */
public static final int HID_USAGEPAGE_ARCADE = 0x91; /* OAAF Definitions for arcade and coinop related Devices */
public static final int HID_USAGEPAGE_VENDOR_DEFINED_START = 0xFF00;
public static final int HID_ELEMENTTYPE_INPUT_MISC = 1;
public static final int HID_ELEMENTTYPE_INPUT_BUTTON = 2;
public static final int HID_ELEMENTTYPE_INPUT_AXIS = 3;
public static final int HID_ELEMENTTYPE_INPUT_SCANCODES = 4;
public static final int HID_ELEMENTTYPE_OUTPUT = 129;
public static final int HID_ELEMENTTYPE_FEATURE = 257;
public static final int HID_ELEMENTTYPE_COLLECTION = 513;
static
{
System.loadLibrary("jinput");
public final class OSXEnvironmentPlugin extends ControllerEnvironment implements Plugin {
static {
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
if (isMacOSXEqualsOrBetterThan(10, 4)) {
System.loadLibrary("jinput-osx");
} else {
// If we're not on 10.4 or later, try to load the legacy library first
try {
System.loadLibrary("jinput-osx-legacy");
} catch (UnsatisfiedLinkError e) {
System.loadLibrary("jinput-osx");
}
}
return null;
}
});
}
public native void hidCreate();
public native void hidDispose();
public native void enumDevices();
private final static boolean isMacOSXEqualsOrBetterThan(int major_required, int minor_required) {
String os_version = System.getProperty("os.version");
StringTokenizer version_tokenizer = new StringTokenizer(os_version, ".");
int major;
int minor;
try {
String major_str = version_tokenizer.nextToken();
String minor_str = version_tokenizer.nextToken();
major = Integer.parseInt(major_str);
minor = Integer.parseInt(minor_str);
} catch (Exception e) {
ControllerEnvironment.logln("Exception occurred while trying to determine OS version: " + e);
// Best guess, no
return false;
}
return major > major_required || (major == major_required && minor >= minor_required);
}
/**
* Opens an input device and returns the address of the input queue for that device
*/
public native long openDevice( long lpDevice, int queueDepth );
public native void closeDevice( long lpDevice, long lpQueue );
private final Controller[] controllers;
public OSXEnvironmentPlugin() {
this.controllers = enumerateControllers();
}
/**
* Polls a device and returns the element top most on the input queue. The elements that
* are returned are only those that have had their hidCookies registered with registerDeviceElement.
* @param lpQueue
* @return
*/
public native int pollDevice( long lpQueue );
public native int pollElement( long lpDevice, long hidCookie );
public native void registerDeviceElement( long lpQueue, long hidCookie );
public native void deregisterDeviceElement( long lpQueue, long hidCookie );
public final Controller[] getControllers() {
return controllers;
}
private final static void addElements(OSXHIDQueue queue, List elements, List components, boolean map_mouse_buttons) throws IOException {
Iterator it = elements.iterator();
while (it.hasNext()) {
OSXHIDElement element = (OSXHIDElement)it.next();
Component.Identifier id = element.getIdentifier();
if (id == null)
continue;
if (map_mouse_buttons) {
if (id == Component.Identifier.Button._0) {
id = Component.Identifier.Button.LEFT;
} else if (id == Component.Identifier.Button._1) {
id = Component.Identifier.Button.RIGHT;
} else if (id == Component.Identifier.Button._2) {
id = Component.Identifier.Button.MIDDLE;
}
}
OSXComponent component = new OSXComponent(id, element);
components.add(component);
queue.addElement(element, component);
}
}
private HashMap devices = new HashMap();
private final static Keyboard createKeyboardFromDevice(OSXHIDDevice device, List elements) throws IOException {
List components = new ArrayList();
OSXHIDQueue queue = device.createQueue(AbstractController.EVENT_QUEUE_DEPTH);
try {
addElements(queue, elements, components, false);
} catch (IOException e) {
queue.release();
throw e;
}
Component[] components_array = new Component[components.size()];
components.toArray(components_array);
Keyboard keyboard = new OSXKeyboard(device, queue, components_array, new Controller[]{}, new Rumbler[]{});
return keyboard;
}
private final static Mouse createMouseFromDevice(OSXHIDDevice device, List elements) throws IOException {
List components = new ArrayList();
OSXHIDQueue queue = device.createQueue(AbstractController.EVENT_QUEUE_DEPTH);
try {
addElements(queue, elements, components, true);
} catch (IOException e) {
queue.release();
throw e;
}
Component[] components_array = new Component[components.size()];
components.toArray(components_array);
Mouse mouse = new OSXMouse(device, queue, components_array, new Controller[]{}, new Rumbler[]{});
if (mouse.getLeft() != null && mouse.getX() != null && mouse.getY() != null) {
return mouse;
} else {
queue.release();
return null;
}
}
private final static AbstractController createControllerFromDevice(OSXHIDDevice device, List elements, Controller.Type type) throws IOException {
List components = new ArrayList();
OSXHIDQueue queue = device.createQueue(AbstractController.EVENT_QUEUE_DEPTH);
try {
addElements(queue, elements, components, false);
} catch (IOException e) {
queue.release();
throw e;
}
Component[] components_array = new Component[components.size()];
components.toArray(components_array);
AbstractController controller = new OSXAbstractController(device, queue, components_array, new Controller[]{}, new Rumbler[]{}, type);
return controller;
}
public OSXEnvironmentPlugin()
{
System.out.println("net.java.games.input.OSXEnvironmentPlugin instance created");
private final static void createControllersFromDevice(OSXHIDDevice device, List controllers) throws IOException {
UsagePair usage_pair = device.getUsagePair();
if (usage_pair == null)
return;
List elements = device.getElements();
if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && (usage_pair.getUsage() == GenericDesktopUsage.MOUSE ||
usage_pair.getUsage() == GenericDesktopUsage.POINTER)) {
Controller mouse = createMouseFromDevice(device, elements);
if (mouse != null)
controllers.add(mouse);
} else if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && (usage_pair.getUsage() == GenericDesktopUsage.KEYBOARD ||
usage_pair.getUsage() == GenericDesktopUsage.KEYPAD)) {
Controller keyboard = createKeyboardFromDevice(device, elements);
if (keyboard != null)
controllers.add(keyboard);
} else if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && usage_pair.getUsage() == GenericDesktopUsage.JOYSTICK) {
Controller joystick = createControllerFromDevice(device, elements, Controller.Type.STICK);
if (joystick != null)
controllers.add(joystick);
} else if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && usage_pair.getUsage() == GenericDesktopUsage.GAME_PAD) {
Controller game_pad = createControllerFromDevice(device, elements, Controller.Type.GAMEPAD);
if (game_pad != null)
controllers.add(game_pad);
}
}
System.out.println("Creating HID engine");
hidCreate();
System.out.println("Enumerating devices");
enumDevices();
}
public void finalize()
{
System.out.println("Disposing HID engine");
hidDispose();
}
public Controller[] getControllers()
{
return (Controller[])(devices.values().toArray( new Controller[0]));
}
public Controller createController( long lpDevice, String productName, int usage )
{
switch (usage)
{
case (HID_DEVICE_MOUSE):
System.out.println("Found mouse [" + productName + "] device address [" + lpDevice + "]");
return new OSXMouse( this, lpDevice, productName );
case (HID_DEVICE_JOYSTICK):
System.out.println("Found joystick [" + productName + "] device address [" + lpDevice + "]");
return new OSXJoystick( this, lpDevice, productName );
case (HID_DEVICE_GAMEPAD):
System.out.println("Found gamepad [" + productName + "] device address [" + lpDevice + "]");
return new OSXGamepad( this, lpDevice, productName );
case (HID_DEVICE_KEYBOARD):
System.out.println("Found keyboard [" + productName + "] device address [" + lpDevice + "]");
return new OSXKeyboard( this, lpDevice, productName );
default:
System.out.println("Found device of unknown or unsupported type. Usage[" + usage + "], ProductName[" + productName + "] - ignoring");
return null;
}
}
/**
* Add a controller to the device list
* @param lpDevice
* @param productName
* @param usage
*/
private void addController( long lpDevice, String productName, int usage )
{
Controller controller = null;
controller = createController( lpDevice, productName, usage );
if ( controller != null )
{
devices.put( new Long(lpDevice), controller );
}
}
/**
* Adds an InputControllerElement to a device. This method is invoked from native code.
* @param lpDevice
* @param elementCookie
* @param elementType
* @param usage
* @param usagePage
* @param rawMin
* @param rawMax
* @param scaledMin
* @param scaledMax
* @param dataBitSize
* @param isRelative
* @param isWrapping
* @param isNonLinear
* @param hasPreferredState
* @param hasNullState
*/
private void addControllerElement( long lpDevice,
long elementCookie,
int elementType,
int usage,
int usagePage,
int rawMin,
int rawMax,
int scaledMin,
int scaledMax,
int dataBitSize,
boolean isRelative,
boolean isWrapping,
boolean isNonLinear,
boolean hasPreferredState,
boolean hasNullState)
{
InputControllerElement element = new InputControllerElement( elementCookie, elementType, usage, usagePage,
rawMin, rawMax, scaledMin, scaledMax,
dataBitSize, isRelative, isWrapping, isNonLinear,
hasPreferredState, hasNullState );
InputController inputController = (InputController)devices.get( new Long( lpDevice) );
if ( inputController != null )
{
inputController.addControllerElement( element );
}
}
public void testDevice( long lpDevice )
{
System.out.println("Opening device ");
long lpQueue = openDevice( lpDevice, 32 );
for ( int i = 0; i < 50; i++ )
{
try
{
pollDevice( lpQueue );
Thread.sleep(10);
}
catch( Exception e )
{
System.out.println("Interrupted" + e );
}
}
System.out.println("Closing device");
closeDevice( lpDevice, lpQueue );
}
public static void main (String args[])
{
System.out.println("Started net.java.games.input.OSXEnvironmentPlugin");
OSXEnvironmentPlugin newjni = new OSXEnvironmentPlugin();
//newjni.hidCreate();
//newjni.enumDevices();
Controller[] controllers = newjni.getControllers();
for ( int i = 0; i < controllers.length; i++ )
{
System.out.println("Controller [" + controllers[i].getName() +"] enumerated...");
}
//newjni.hidDispose();
System.out.println("Done");
}
}
private final static Controller[] enumerateControllers() {
List controllers = new ArrayList();
try {
OSXHIDDeviceIterator it = new OSXHIDDeviceIterator();
try {
OSXHIDDevice device;
while ((device = it.next()) != null) {
boolean device_used = false;
try {
int old_size = controllers.size();
createControllersFromDevice(device, controllers);
device_used = old_size != controllers.size();
} catch (IOException e) {
ControllerEnvironment.logln("Failed to create controllers from device: " + device.getProductName());
}
if (!device_used)
device.release();
}
} finally {
it.close();
}
} catch (IOException e) {
ControllerEnvironment.log("Failed to enumerate device: " + e.getMessage());
return new Controller[]{};
}
Controller[] controllers_array = new Controller[controllers.size()];
controllers.toArray(controllers_array);
return controllers_array;
}
}

View file

@ -0,0 +1,73 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
/** 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;
}
}

View file

@ -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;
}
}
}

View file

@ -0,0 +1,318 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.Iterator;
/** OSX HIDManager implementation
* @author elias
* @author gregorypierce
* @version 1.0
*/
final class OSXHIDDevice {
private final static int AXIS_DEFAULT_MIN_VALUE = 0;
private final static int AXIS_DEFAULT_MAX_VALUE = 64*1024;
private final static String kIOHIDTransportKey = "Transport";
private final static String kIOHIDVendorIDKey = "VendorID";
private final static String kIOHIDVendorIDSourceKey = "VendorIDSource";
private final static String kIOHIDProductIDKey = "ProductID";
private final static String kIOHIDVersionNumberKey = "VersionNumber";
private final static String kIOHIDManufacturerKey = "Manufacturer";
private final static String kIOHIDProductKey = "Product";
private final static String kIOHIDSerialNumberKey = "SerialNumber";
private final static String kIOHIDCountryCodeKey = "CountryCode";
private final static String kIOHIDLocationIDKey = "LocationID";
private final static String kIOHIDDeviceUsageKey = "DeviceUsage";
private final static String kIOHIDDeviceUsagePageKey = "DeviceUsagePage";
private final static String kIOHIDDeviceUsagePairsKey = "DeviceUsagePairs";
private final static String kIOHIDPrimaryUsageKey = "PrimaryUsage";
private final static String kIOHIDPrimaryUsagePageKey = "PrimaryUsagePage";
private final static String kIOHIDMaxInputReportSizeKey = "MaxInputReportSize";
private final static String kIOHIDMaxOutputReportSizeKey = "MaxOutputReportSize";
private final static String kIOHIDMaxFeatureReportSizeKey = "MaxFeatureReportSize";
private final static String kIOHIDElementKey = "Elements";
private final static String kIOHIDElementCookieKey = "ElementCookie";
private final static String kIOHIDElementTypeKey = "Type";
private final static String kIOHIDElementCollectionTypeKey = "CollectionType";
private final static String kIOHIDElementUsageKey = "Usage";
private final static String kIOHIDElementUsagePageKey = "UsagePage";
private final static String kIOHIDElementMinKey = "Min";
private final static String kIOHIDElementMaxKey = "Max";
private final static String kIOHIDElementScaledMinKey = "ScaledMin";
private final static String kIOHIDElementScaledMaxKey = "ScaledMax";
private final static String kIOHIDElementSizeKey = "Size";
private final static String kIOHIDElementReportSizeKey = "ReportSize";
private final static String kIOHIDElementReportCountKey = "ReportCount";
private final static String kIOHIDElementReportIDKey = "ReportID";
private final static String kIOHIDElementIsArrayKey = "IsArray";
private final static String kIOHIDElementIsRelativeKey = "IsRelative";
private final static String kIOHIDElementIsWrappingKey = "IsWrapping";
private final static String kIOHIDElementIsNonLinearKey = "IsNonLinear";
private final static String kIOHIDElementHasPreferredStateKey = "HasPreferredState";
private final static String kIOHIDElementHasNullStateKey = "HasNullState";
private final static String kIOHIDElementUnitKey = "Unit";
private final static String kIOHIDElementUnitExponentKey = "UnitExponent";
private final static String kIOHIDElementNameKey = "Name";
private final static String kIOHIDElementValueLocationKey = "ValueLocation";
private final static String kIOHIDElementDuplicateIndexKey = "DuplicateIndex";
private final static String kIOHIDElementParentCollectionKey = "ParentCollection";
private final long device_address;
private final long device_interface_address;
private final Map properties;
private boolean released;
public OSXHIDDevice(long device_address, long device_interface_address) throws IOException {
this.device_address = device_address;
this.device_interface_address = device_interface_address;
this.properties = getDeviceProperties();
open();
}
public final Controller.PortType getPortType() {
String transport = (String)properties.get(kIOHIDTransportKey);
if (transport == null)
return Controller.PortType.UNKNOWN;
if (transport.equals("USB")) {
return Controller.PortType.USB;
} else {
return Controller.PortType.UNKNOWN;
}
}
public final String getProductName() {
return (String)properties.get(kIOHIDProductKey);
}
private final OSXHIDElement createElementFromElementProperties(Map element_properties) {
/* long size = getLongFromProperties(element_properties, kIOHIDElementSizeKey);
// ignore elements that can't fit into the 32 bit value field of a hid event
if (size > 32)
return null;*/
long element_cookie = getLongFromProperties(element_properties, kIOHIDElementCookieKey);
int element_type_id = getIntFromProperties(element_properties, kIOHIDElementTypeKey);
ElementType element_type = ElementType.map(element_type_id);
int min = (int)getLongFromProperties(element_properties, kIOHIDElementMinKey, AXIS_DEFAULT_MIN_VALUE);
int max = (int)getLongFromProperties(element_properties, kIOHIDElementMaxKey, AXIS_DEFAULT_MAX_VALUE);
/* long scaled_min = getLongFromProperties(element_properties, kIOHIDElementScaledMinKey, Long.MIN_VALUE);
long scaled_max = getLongFromProperties(element_properties, kIOHIDElementScaledMaxKey, Long.MAX_VALUE);*/
UsagePair device_usage_pair = getUsagePair();
boolean default_relative = device_usage_pair != null && (device_usage_pair.getUsage() == GenericDesktopUsage.POINTER || device_usage_pair.getUsage() == GenericDesktopUsage.MOUSE);
boolean is_relative = getBooleanFromProperties(element_properties, kIOHIDElementIsRelativeKey, default_relative);
/* boolean is_wrapping = getBooleanFromProperties(element_properties, kIOHIDElementIsWrappingKey);
boolean is_non_linear = getBooleanFromProperties(element_properties, kIOHIDElementIsNonLinearKey);
boolean has_preferred_state = getBooleanFromProperties(element_properties, kIOHIDElementHasPreferredStateKey);
boolean has_null_state = getBooleanFromProperties(element_properties, kIOHIDElementHasNullStateKey);*/
int usage = getIntFromProperties(element_properties, kIOHIDElementUsageKey);
int usage_page = getIntFromProperties(element_properties, kIOHIDElementUsagePageKey);
UsagePair usage_pair = createUsagePair(usage_page, usage);
if (usage_pair == null || (element_type != ElementType.INPUT_MISC && element_type != ElementType.INPUT_BUTTON && element_type != ElementType.INPUT_AXIS)) {
//System.out.println("element_type = 0x" + element_type + " | usage = " + usage + " | usage_page = " + usage_page);
return null;
} else {
return new OSXHIDElement(this, usage_pair, element_cookie, element_type, min, max, is_relative);
}
}
private final void addElements(List elements, Map properties) {
Object[] elements_properties = (Object[])properties.get(kIOHIDElementKey);
if (elements_properties == null)
return;
for (int i = 0; i < elements_properties.length; i++) {
Map element_properties = (Map)elements_properties[i];
OSXHIDElement element = createElementFromElementProperties(element_properties);
if (element != null) {
elements.add(element);
}
addElements(elements, element_properties);
}
}
public final List getElements() {
List elements = new ArrayList();
addElements(elements, properties);
return elements;
}
private final static long getLongFromProperties(Map properties, String key, long default_value) {
Long long_obj = (Long)properties.get(key);
if (long_obj == null)
return default_value;
return long_obj.longValue();
}
private final static boolean getBooleanFromProperties(Map properties, String key, boolean default_value) {
return getLongFromProperties(properties, key, default_value ? 1 : 0) != 0;
}
private final static int getIntFromProperties(Map properties, String key) {
return (int)getLongFromProperties(properties, key);
}
private final static long getLongFromProperties(Map properties, String key) {
Long long_obj = (Long)properties.get(key);
return long_obj.longValue();
}
private final static UsagePair createUsagePair(int usage_page_id, int usage_id) {
UsagePage usage_page = UsagePage.map(usage_page_id);
if (usage_page != null) {
Usage usage = usage_page.mapUsage(usage_id);
if (usage != null)
return new UsagePair(usage_page, usage);
}
return null;
}
public final UsagePair getUsagePair() {
int usage_page_id = getIntFromProperties(properties, kIOHIDPrimaryUsagePageKey);
int usage_id = getIntFromProperties(properties, kIOHIDPrimaryUsageKey);
return createUsagePair(usage_page_id, usage_id);
}
/*
public final List getUsagePairs() {
List usage_pairs_list = new ArrayList();
Object[] usage_pairs = (Object[])properties.get(kIOHIDDeviceUsagePairsKey);
if (usage_pairs == null) {
int usage_page_id = getIntFromProperties(properties, kIOHIDPrimaryUsagePageKey);
int usage_id = getIntFromProperties(properties, kIOHIDPrimaryUsageKey);
UsagePair pair = createUsagePair(usage_page_id, usage_id);
if (pair != null)
usage_pairs_list.add(pair);
}
for (int i = 0; i < usage_pairs.length; i++) {
Map usage_pair = (Map)usage_pairs[i];
int usage_page_id = getIntFromProperties(usage_pair, kIOHIDDeviceUsagePageKey);
int usage_id = getIntFromProperties(usage_pair, kIOHIDDeviceUsageKey);
UsagePair pair = createUsagePair(usage_page_id, usage_id);
if (pair != null)
usage_pairs_list.add(pair);
}
return usage_pairs_list;
}
*/
private final void dumpProperties() {
System.out.println(toString());
dumpMap("", properties);
}
private final static void dumpArray(String prefix, Object[] array) {
System.out.println(prefix + "{");
for (int i = 0; i < array.length; i++) {
dumpObject(prefix + "\t", array[i]);
System.out.println(prefix + ",");
}
System.out.println(prefix + "}");
}
private final static void dumpMap(String prefix, Map map) {
Iterator keys = map.keySet().iterator();
while (keys.hasNext()) {
Object key = keys.next();
Object value = map.get(key);
dumpObject(prefix, key);
dumpObject(prefix + "\t", value);
}
}
private final static void dumpObject(String prefix, Object obj) {
if (obj instanceof Long) {
Long l = (Long)obj;
System.out.println(prefix + "0x" + Long.toHexString(l.longValue()));
} else if (obj instanceof Map)
dumpMap(prefix, (Map)obj);
else if (obj.getClass().isArray())
dumpArray(prefix, (Object[])obj);
else
System.out.println(prefix + obj);
}
private final Map getDeviceProperties() throws IOException {
return nGetDeviceProperties(device_address);
}
private final static native Map nGetDeviceProperties(long device_address) throws IOException;
public final synchronized void release() throws IOException {
try {
close();
} finally {
released = true;
nReleaseDevice(device_address, device_interface_address);
}
}
private final static native void nReleaseDevice(long device_address, long device_interface_address);
public final synchronized void getElementValue(long element_cookie, OSXEvent event) throws IOException {
checkReleased();
nGetElementValue(device_interface_address, element_cookie, event);
}
private final static native void nGetElementValue(long device_interface_address, long element_cookie, OSXEvent event) throws IOException;
public final synchronized OSXHIDQueue createQueue(int queue_depth) throws IOException {
checkReleased();
long queue_address = nCreateQueue(device_interface_address);
return new OSXHIDQueue(queue_address, queue_depth);
}
private final static native long nCreateQueue(long device_interface_address) throws IOException;
private final void open() throws IOException {
nOpen(device_interface_address);
}
private final static native void nOpen(long device_interface_address) throws IOException;
private final void close() throws IOException {
nClose(device_interface_address);
}
private final static native void nClose(long device_interface_address) throws IOException;
private final void checkReleased() throws IOException {
if (released)
throw new IOException();
}
}

View file

@ -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;
}

View file

@ -0,0 +1,143 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
import java.io.IOException;
/** Represents an OSX HID Element
* @author elias
* @author gregorypierce
* @version 1.0
*/
final class OSXHIDElement {
private final OSXHIDDevice device;
private final UsagePair usage_pair;
private final long element_cookie;
private final ElementType element_type;
private final int min;
private final int max;
private final Component.Identifier identifier;
private final boolean is_relative;
public OSXHIDElement(OSXHIDDevice device, UsagePair usage_pair, long element_cookie, ElementType element_type, int min, int max, boolean is_relative) {
this.device = device;
this.usage_pair = usage_pair;
this.element_cookie = element_cookie;
this.element_type = element_type;
this.min = min;
this.max = max;
this.identifier = computeIdentifier();
this.is_relative = is_relative;
}
private final Component.Identifier computeIdentifier() {
if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP) {
return ((GenericDesktopUsage)usage_pair.getUsage()).getIdentifier();
} else if (usage_pair.getUsagePage() == UsagePage.BUTTON) {
return ((ButtonUsage)usage_pair.getUsage()).getIdentifier();
} else if (usage_pair.getUsagePage() == UsagePage.KEYBOARD_OR_KEYPAD) {
return ((KeyboardUsage)usage_pair.getUsage()).getIdentifier();
} else
return null;
}
final Component.Identifier getIdentifier() {
return identifier;
}
final long getCookie() {
return element_cookie;
}
final ElementType getType() {
return element_type;
}
final boolean isRelative() {
return is_relative && identifier instanceof Component.Identifier.Axis;
}
final boolean isAnalog() {
return identifier instanceof Component.Identifier.Axis && identifier != Component.Identifier.Axis.POV;
}
private UsagePair getUsagePair() {
return usage_pair;
}
final void getElementValue(OSXEvent event) throws IOException {
device.getElementValue(element_cookie, event);
}
final float convertValue(float value) {
if (identifier == Component.Identifier.Axis.POV) {
switch ((int)value) {
case 0:
return Component.POV.UP;
case 1:
return Component.POV.UP_RIGHT;
case 2:
return Component.POV.RIGHT;
case 3:
return Component.POV.DOWN_RIGHT;
case 4:
return Component.POV.DOWN;
case 5:
return Component.POV.DOWN_LEFT;
case 6:
return Component.POV.LEFT;
case 7:
return Component.POV.UP_LEFT;
case 8:
return Component.POV.OFF;
default:
return Component.POV.OFF;
}
} else if (identifier instanceof Component.Identifier.Axis && !is_relative) {
if (min == max)
return 0;
else if (value > max)
value = max;
else if (value < min)
value = min;
return 2*(value - min)/(max - min) - 1;
} else
return value;
}
}

View file

@ -0,0 +1,141 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
import java.io.IOException;
import java.util.Map;
import java.util.HashMap;
/**
* @author elias
* @version 1.0
*/
final class OSXHIDQueue {
private final Map map = new HashMap();
private final long queue_address;
private boolean released;
public OSXHIDQueue(long address, int queue_depth) throws IOException {
this.queue_address = address;
try {
createQueue(queue_depth);
} catch (IOException e) {
release();
throw e;
}
}
public final synchronized void setQueueDepth(int queue_depth) throws IOException {
checkReleased();
stop();
close();
createQueue(queue_depth);
}
private final void createQueue(int queue_depth) throws IOException {
open(queue_depth);
try {
start();
} catch (IOException e) {
close();
throw e;
}
}
public final OSXComponent mapEvent(OSXEvent event) {
return (OSXComponent)map.get(new Long(event.getCookie()));
}
private final void open(int queue_depth) throws IOException {
nOpen(queue_address, queue_depth);
}
private final static native void nOpen(long queue_address, int queue_depth) throws IOException;
private final void close() throws IOException {
nClose(queue_address);
}
private final static native void nClose(long queue_address) throws IOException;
private final void start() throws IOException {
nStart(queue_address);
}
private final static native void nStart(long queue_address) throws IOException;
private final void stop() throws IOException {
nStop(queue_address);
}
private final static native void nStop(long queue_address) throws IOException;
public final synchronized void release() throws IOException {
if (!released) {
released = true;
try {
stop();
close();
} finally {
nReleaseQueue(queue_address);
}
}
}
private final static native void nReleaseQueue(long queue_address) throws IOException;
public final void addElement(OSXHIDElement element, OSXComponent component) throws IOException {
nAddElement(queue_address, element.getCookie());
map.put(new Long(element.getCookie()), component);
}
private final static native void nAddElement(long queue_address, long cookie) throws IOException;
public final void removeElement(OSXHIDElement element) throws IOException {
nRemoveElement(queue_address, element.getCookie());
map.remove(new Long(element.getCookie()));
}
private final static native void nRemoveElement(long queue_address, long cookie) throws IOException;
public final synchronized boolean getNextEvent(OSXEvent event) throws IOException {
checkReleased();
return nGetNextEvent(queue_address, event);
}
private final static native boolean nGetNextEvent(long queue_address, OSXEvent event) throws IOException;
private final void checkReleased() throws IOException {
if (released)
throw new IOException("Queue is released");
}
}

View file

@ -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;
}
}
}

View file

@ -1,253 +1,68 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
import java.util.HashMap;
import java.io.IOException;
/**
* Created by IntelliJ IDEA.
* User: gpierce
* Date: Aug 2, 2003
* Time: 3:57:58 PM
* To change this template use Options | File Templates.
*/
public class OSXKeyboard extends StandardKeyboard implements InputController
{
/** Represents an OSX Keyboard
* @author elias
* @version 1.0
*/
final class OSXKeyboard extends Keyboard {
private final PortType port;
private final OSXHIDQueue queue;
protected OSXKeyboard(OSXHIDDevice device, OSXHIDQueue queue, Component[] components, Controller[] children, Rumbler[] rumblers) {
super(device.getProductName(), components, children, rumblers);
this.queue = queue;
this.port = device.getPortType();
}
private final static int[] CROSSTABLE = {
0x00, // VOID
0x29, // ESCAPE
0x1E, // _1
0x1F, // _2
0x20, // _3
0x21, // _4
0x22, // _5
0x23, // _6
0x24, // _7
0x25, // _8
0x26, // _9
0x27, // _0
0x2D, // MINUS
0x2E, // EQUALS
0x2A, // BACK
0x2B, // TAB
0x14, // Q
0x1A, // W
0x08, // E
0x15, // R
0x17, // T
0x1C, // Y
0x18, // U
0x0C, // I
0x12, // O
0x13, // P
0x2F, // [
0x30, // ]
0x28, // RETURN
0xE0, // LEFT CONTROL
0x04, // A
0x16, // S
0x07, // D
0x09, // F
0x0A, // G
0x0B, // H
0x0D, // J
0x0E, // K
0x0F, // L
0x33, // ;
0x34, // '
0x35, // ~
0xE1, // /
0x31, // BACKSLASH (\)
0x1D, // Z
0x1B, // X
0x06, // C
0x19, // V
0x05, // B
0x11, // N
0x10, // M
0x36, // ,
0x37, // .
0x38, // SLASH (/)
0xE5, // RSHIFT
0x55, // MULT (*)
0xE2, // LEFT ALT
0x2C, // SPACE
0x39, // CAPSLOCK
0x3A, // F1
0x3B, // F2
0x3C, // F3
0x3D, // F4
0x3E, // F5
0x3F, // F6
0x40, // F7
0x41, // F8
0x42, // F9
0x43, // F10
0x53, // NUMLOCK
0x47, // SCROLLLOCK
0x5F, // NUMPAD7
0x60, // NUMPAD8
0x61, // NUMPAD9
0x56, // SUBTRACT (KEYPAD -)
0x5C, // NUMPAD4
0x5D, // NUMPAD5
0x5E, // NUMPAD6
0x57, // ADD (KEYPAD +)
0x59, // NUMPAD1
0x5A, // NUMPAD2
0x5B, // NUMPAD3
0x62, // NUMPAD0
0x63, // DECIMAL (KEYPAD .)
0x44, // F11
0x45, // F12
0x68, // F13
0x69, // F14
0x6A, // F15
0x87, // KANA
0x88, // CONVERT
0x89, // NONCONVERT
0x8A, // YEN
0x67, // NUMPAD=
0x8B, // CIRCUMFLEX
0x8C, // AT
0x8D, // COLON
0x9F, // UNDERLINE
0x8E, // KANJI
0x78, // STOP
0x8F, // AX
0x90, // UNLABELED
0x58, // NUMPAD ENTER
0xE4, // RIGHT CONTROL
0x85, // NUMPAD COMMA
0x54, // DIVIDE ( NUMPAD /)
0x9A, // SYSREQ
0xE6, // RIGHT ALT
0x48, // PAUSE
0x4A, // HOME
0x52, // UP
0x9D, // PRIOR
0x50, // LEFT
0x4F, // RIGHT
0x4D, // END
0x51, // DOWN
0xA2, // NEXT
0x49, // INSERT
0x4C, // DELETE
0xE3, // LEFT WIN
0xE7, // RIGHT WIN
0x65, // APPS
0x66, // POWER
0x66 // SLEEP
};
protected final boolean getNextDeviceEvent(Event event) throws IOException {
return OSXControllers.getNextDeviceEvent(event, queue);
}
protected final void setDeviceEventQueueSize(int size) throws IOException {
queue.setQueueDepth(size);
}
private OSXEnvironmentPlugin plugin;
private long lpDevice;
private long lpQueue;
private HashMap keys = new HashMap();
private static int[] COOKIETABLE = new int[CROSSTABLE.length ];
public OSXKeyboard( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
{
super( productName );
this.plugin = plugin;
this.lpDevice = lpDevice;
openDevice();
}
public void openDevice()
{
this.lpQueue = plugin.openDevice( this.lpDevice, 256 );
}
public void closeDevice()
{
plugin.closeDevice( this.lpDevice, this.lpQueue );
}
public void addControllerElement(InputControllerElement element)
{
System.out.println("Adding keyboard elements usage page[" + element.getUsagePage() + "] usage [" + element.getUsage() + "] type [" + element.getElementType() + "]" );
switch( element.getUsagePage() )
{
case OSXEnvironmentPlugin.HID_USAGEPAGE_KEYBOARD:
System.out.println("Found keyboard element");
if ( element.getElementType() == OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_BUTTON )
{
// register this key with the queue system as all buttons are retrieved from the
// input controllers queue
//
System.out.println("Registering button-key (usage page [" + element.getUsagePage() + "], usage[" + element.getUsage() + "], elementType [" + element.getElementType() + "], hidCookie [" + element.getHidCookie() + "])");
if ( keys.get( new Long( element.getUsage() )) == null )
{
plugin.registerDeviceElement( lpQueue, element.getHidCookie() );
keys.put( new Long( element.getUsage() ), element );
System.out.println("Registered key [" + element.getHidCookie() + "]");
}
else
{
System.out.println("Ignoring key [" + element.getHidCookie() + "] already enumerated.");
}
}
else
{
System.out.println("Ignoring non-button-key (usage page [" + element.getUsagePage() + "], usage[" + element.getUsage() + "], elementType [" + element.getElementType() + "], hidCookie [" + element.getHidCookie() + "])");
}
break;
default:
}
}
public boolean poll()
{
plugin.pollDevice( lpQueue );
return true;
}
/** Returns whether or not the given key has been pressed since the last
* call to poll.
* @param key The key whose state to check.
* @return true if this key has changed state since last read of its state, false otherwise.
*/
protected boolean isKeyPressed(Keyboard.Key key)
{
Component.Identifier.Key id = (Component.Identifier.Key) key.getIdentifier();
int keyIndex = id.getKeyIndex();
// get that key code out of the crosstable and find the proper InputControllerElement/button for that key
//
//TODO: Optimize this - put the usages in another array the same size as the crosstable so the hidCookies
// can be retrieved directly without the Long creation
int usage = CROSSTABLE[keyIndex];
InputControllerElement element = (InputControllerElement) keys.get( new Long(usage) );
if ( element != null )
{
int value = plugin.pollElement( lpDevice, element.getHidCookie() );
System.out.println("Key Poll result [" + value + "]");
if ( value == 1 )
{
return true;
}
else
{
return false;
}
}
return false;
}
public final PortType getPortType() {
return port;
}
}

View file

@ -1,251 +1,68 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
/**
* Created by IntelliJ IDEA.
* User: gpierce
* Date: Aug 2, 2003
* Time: 3:57:00 PM
* To change this template use Options | File Templates.
*/
public class OSXMouse extends Mouse implements InputController
{
private OSXEnvironmentPlugin plugin;
private long lpDevice;
private long lpQueue;
private int buttonCount = 0;
import java.io.IOException;
/** Represents an OSX Mouse
* @author elias
* @version 1.0
*/
final class OSXMouse extends Mouse {
private final PortType port;
private final OSXHIDQueue queue;
protected OSXMouse(OSXHIDDevice device, OSXHIDQueue queue, Component[] components, Controller[] children, Rumbler[] rumblers) {
super(device.getProductName(), components, children, rumblers);
this.queue = queue;
this.port = device.getPortType();
}
public OSXMouse( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
{
super( productName );
protected final boolean getNextDeviceEvent(Event event) throws IOException {
return OSXControllers.getNextDeviceEvent(event, queue);
}
this.plugin = plugin;
this.lpDevice = lpDevice;
openDevice();
buttons = new ButtonsImpl();
ball = new BallImpl();
}
public void openDevice()
{
this.lpQueue = plugin.openDevice( this.lpDevice, 32 );
}
public void closeDevice()
{
plugin.closeDevice( this.lpDevice, this.lpQueue );
}
public boolean poll()
{
plugin.pollDevice( this.lpQueue );
return true;
}
public void addControllerElement(InputControllerElement element)
{
switch ( element.getUsagePage() )
{
case OSXEnvironmentPlugin.HID_USAGEPAGE_BUTTON:
buttonCount ++;
System.out.println("Adding button [" + buttonCount + "]");
((ButtonsImpl)buttons).addButton(element);
break;
case OSXEnvironmentPlugin.HID_USAGEPAGE_GENERICDESKTOP:
switch( element.getUsage() )
{
case OSXEnvironmentPlugin.HID_USAGE_POINTER:
System.out.println("Adding pointer - this will contain axis");
break;
case OSXEnvironmentPlugin.HID_USAGE_XAXIS:
((BallImpl)ball).addXAxis(element);
System.out.println("Adding X Axis") ;
break;
case OSXEnvironmentPlugin.HID_USAGE_YAXIS:
((BallImpl)ball).addYAxis(element);
System.out.println("Adding Y Axis");
break;
case OSXEnvironmentPlugin.HID_USAGE_WHEEL:
((BallImpl)ball).addWheelAxis(element);
System.out.println("Adding wheel");
break;
default:
}
break;
default:
}
}
/**
* Implementation class representing the mouse ball
*/
class BallImpl extends Ball
{
/**
* Public constructor
*/
public BallImpl()
{
super(OSXMouse.this.getName() + " ball");
}
public void addXAxis( InputControllerElement element )
{
x = new BallAxis(Component.Identifier.Axis.X, element );
}
public void addYAxis( InputControllerElement element )
{
y = new BallAxis( Component.Identifier.Axis.Y, element );
}
public void addWheelAxis( InputControllerElement element )
{
wheel = new BallAxis( Component.Identifier.Axis.SLIDER, element );
}
}
/**
* Implementation class representing the mouse buttons
*/
class ButtonsImpl extends Buttons
{
/**
* Public constructor
*/
public ButtonsImpl()
{
super(OSXMouse.this.getName() + " buttons");
}
public void addButton( InputControllerElement element )
{
if ( left == null )
{
left = new ButtonImpl( Component.Identifier.Button.LEFT, element );
}
else if ( right == null )
{
right = new ButtonImpl( Component.Identifier.Button.RIGHT, element );
}
else if ( middle == null )
{
middle = new ButtonImpl( Component.Identifier.Button.MIDDLE, element );
}
}
}
/**
* Mouse button axis implementation
*/
class ButtonImpl extends Button
{
private long hidCookie;
private boolean isRelative;
/** Public constructor
* @param id An ID of a button to create an obejct to represent.
*
*/
public ButtonImpl(Component.Identifier.Button id, InputControllerElement element)
{
super(id.getName(), id);
this.hidCookie = element.getHidCookie();
this.isRelative = element.isRelative();
}
/** Returns the data from the last time the control has been polled.
* If this axis is a button, the value returned will be either 0.0f or 1.0f.
* If this axis is normalized, the value returned will be between -1.0f and
* 1.0f.
* @return state of controller. (Note: DX8 mice actually
* queue state so what is returned is the next state,
* not necessarily the most current one.)
*/
public float getPollData()
{
return (float) plugin.pollElement( lpDevice, hidCookie );
}
/** Returns <code>true</code> if data returned from <code>poll</code>
* is relative to the last call, or <code>false</code> if data
* is absolute.
* @return true if data is relative, otherwise false.
*/
public boolean isRelative()
{
return isRelative;
}
}
/**
* Mouse ball axis implementation
*/
class BallAxis extends AbstractComponent
{
private long hidCookie;
private boolean isRelative;
/** Public constructor
* @param id An ID for a mouse axis to create an object to represent.
*/
public BallAxis(Component.Identifier.Axis id, InputControllerElement element)
{
super(id.getName(), id);
this.hidCookie = element.getHidCookie();
this.isRelative = element.isRelative();
}
/** Returns the data from the last time the control has been polled.
* If this axis is a button, the value returned will be either 0.0f or 1.0f.
* If this axis is normalized, the value returned will be between -1.0f and
* 1.0f.
* @return data. (Note that mice queue state in DX8 so what
* is returned is the next stae in the queue, not
* necessarily the most current one.)
*/
public float getPollData()
{
return (float) plugin.pollElement( lpDevice, hidCookie );
}
/** Returns <code>true</code> if data returned from <code>poll</code>
* is relative to the last call, or <code>false</code> if data
* is absolute.
* @return true if relative, otherwise false.
*/
public boolean isRelative()
{
return isRelative;
}
/** Returns whether or not the axis is analog, or false if it is digital.
* @return true if analog, false if digital
*/
public boolean isAnalog()
{
return true;
}
}
protected final void setDeviceEventQueueSize(int size) throws IOException {
queue.setQueueDepth(size);
}
public final PortType getPortType() {
return port;
}
}

View file

@ -0,0 +1,46 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
/** Generic Desktop Usages
* @author elias
* @version 1.0
*/
public interface Usage {
}

View file

@ -0,0 +1,114 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
import java.lang.reflect.Method;
/** HID Usage pages
* @author elias
* @version 1.0
*/
final class UsagePage {
private final static UsagePage[] map = new UsagePage[0xFF];
public final static UsagePage UNDEFINED = new UsagePage(0x00);
public final static UsagePage GENERIC_DESKTOP = new UsagePage(0x01, GenericDesktopUsage.class);
public final static UsagePage SIMULATION = new UsagePage(0x02);
public final static UsagePage VR = new UsagePage(0x03);
public final static UsagePage SPORT = new UsagePage(0x04);
public final static UsagePage GAME = new UsagePage(0x05);
/* Reserved 0x06 */
public final static UsagePage KEYBOARD_OR_KEYPAD = new UsagePage(0x07, KeyboardUsage.class); /* USB Device Class Definition for Human Interface Devices (HID). Note: the usage type for all key codes is Selector (Sel). */
public final static UsagePage LEDS = new UsagePage(0x08);
public final static UsagePage BUTTON = new UsagePage(0x09, ButtonUsage.class);
public final static UsagePage ORDINAL = new UsagePage(0x0A);
public final static UsagePage TELEPHONY = new UsagePage(0x0B);
public final static UsagePage CONSUMER = new UsagePage(0x0C);
public final static UsagePage DIGITIZER = new UsagePage(0x0D);
/* Reserved 0x0E */
public final static UsagePage PID = new UsagePage(0x0F); /* USB Physical Interface Device definitions for force feedback and related devices. */
public final static UsagePage UNICODE = new UsagePage(0x10);
/* Reserved 0x11 - 0x13 */
public final static UsagePage ALPHANUMERIC_DISPLAY = new UsagePage(0x14);
/* Reserved 0x15 - 0x7F */
/* Monitor 0x80 - 0x83 USB Device Class Definition for Monitor Devices */
/* Power 0x84 - 0x87 USB Device Class Definition for Power Devices */
public final static UsagePage POWER_DEVICE = new UsagePage(0x84); /* Power Device Page */
public final static UsagePage BATTERY_SYSTEM = new UsagePage(0x85); /* Battery System Page */
/* Reserved 0x88 - 0x8B */
public final static UsagePage BAR_CODE_SCANNER = new UsagePage(0x8C); /* (Point of Sale) USB Device Class Definition for Bar Code Scanner Devices */
public final static UsagePage SCALE = new UsagePage(0x8D); /* (Point of Sale) USB Device Class Definition for Scale Devices */
/* ReservedPointofSalepages 0x8E - 0X8F */
public final static UsagePage CAMERACONTROL= new UsagePage(0x90); /* USB Device Class Definition for Image Class Devices */
public final static UsagePage ARCADE = new UsagePage(0x91); /* OAAF Definitions for arcade and coinop related Devices */
private final Class usage_class;
private final int usage_page_id;
public final static UsagePage map(int page_id) {
if (page_id < 0 || page_id >= map.length)
return null;
return map[page_id];
}
private UsagePage(int page_id, Class usage_class) {
map[page_id] = this;
this.usage_class = usage_class;
this.usage_page_id = page_id;
}
private UsagePage(int page_id) {
this(page_id, null);
}
public final String toString() {
return "UsagePage (0x" + Integer.toHexString(usage_page_id) + ")";
}
public final Usage mapUsage(int usage_id) {
if (usage_class == null)
return null;
try {
Method map_method = usage_class.getMethod("map", new Class[]{int.class});
Object result = map_method.invoke(null, new Object[]{new Integer(usage_id)});
return (Usage)result;
} catch (Exception e) {
throw new Error(e);
}
}
}

View file

@ -0,0 +1,76 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
package net.java.games.input;
/** 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 + ")";
}
}

View file

@ -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>

View file

@ -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 );
}
}

View file

@ -0,0 +1,197 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
#include <CoreServices/CoreServices.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <jni.h>
#include "util.h"
#include "macosxutil.h"
typedef struct {
JNIEnv *env;
jobject map;
} dict_context_t;
typedef struct {
JNIEnv *env;
jobjectArray array;
jsize index;
} array_context_t;
static jobject createObjectFromCFObject(JNIEnv *env, CFTypeRef cfobject);
static jstring createStringFromCFString(JNIEnv *env, CFStringRef cfstring) {
CFIndex unicode_length = CFStringGetLength(cfstring);
CFIndex utf8_length = CFStringGetMaximumSizeForEncoding(unicode_length, kCFStringEncodingUTF8);
// Allocate buffer large enough, plus \0 terminator
char *buffer = (char *)malloc(utf8_length + 1);
if (buffer == NULL)
return NULL;
Boolean result = CFStringGetCString(cfstring, buffer, utf8_length + 1, kCFStringEncodingUTF8);
if (!result) {
free(buffer);
return NULL;
}
jstring str = (*env)->NewStringUTF(env, buffer);
free(buffer);
return str;
}
static jobject createDoubleObjectFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
double value;
Boolean result = CFNumberGetValue(cfnumber, kCFNumberDoubleType, &value);
if (!result)
return NULL;
return newJObject(env, "java/lang/Double", "(D)V", (jdouble)value);
}
static jobject createLongObjectFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
SInt64 value;
Boolean result = CFNumberGetValue(cfnumber, kCFNumberSInt64Type, &value);
if (!result)
return NULL;
return newJObject(env, "java/lang/Long", "(J)V", (jlong)value);
}
static jobject createNumberFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
CFNumberType number_type = CFNumberGetType(cfnumber);
switch (number_type) {
case kCFNumberSInt8Type:
case kCFNumberSInt16Type:
case kCFNumberSInt32Type:
case kCFNumberSInt64Type:
case kCFNumberCharType:
case kCFNumberShortType:
case kCFNumberIntType:
case kCFNumberLongType:
case kCFNumberLongLongType:
case kCFNumberCFIndexType:
return createLongObjectFromCFNumber(env, cfnumber);
case kCFNumberFloat32Type:
case kCFNumberFloat64Type:
case kCFNumberFloatType:
case kCFNumberDoubleType:
return createDoubleObjectFromCFNumber(env, cfnumber);
default:
return NULL;
}
}
static void createArrayEntries(const void *value, void *context) {
array_context_t *array_context = (array_context_t *)context;
jobject jval = createObjectFromCFObject(array_context->env, value);
(*array_context->env)->SetObjectArrayElement(array_context->env, array_context->array, array_context->index++, jval);
(*array_context->env)->DeleteLocalRef(array_context->env, jval);
}
static jobject createArrayFromCFArray(JNIEnv *env, CFArrayRef cfarray) {
jclass Object_class = (*env)->FindClass(env, "java/lang/Object");
if (Object_class == NULL)
return NULL;
CFIndex size = CFArrayGetCount(cfarray);
CFRange range = {0, size};
jobjectArray array = (*env)->NewObjectArray(env, size, Object_class, NULL);
array_context_t array_context;
array_context.env = env;
array_context.array = array;
array_context.index = 0;
CFArrayApplyFunction(cfarray, range, createArrayEntries, &array_context);
return array;
}
static jobject createObjectFromCFObject(JNIEnv *env, CFTypeRef cfobject) {
CFTypeID type_id = CFGetTypeID(cfobject);
if (type_id == CFDictionaryGetTypeID()) {
return createMapFromCFDictionary(env, cfobject);
} else if (type_id == CFArrayGetTypeID()) {
return createArrayFromCFArray(env, cfobject);
} else if (type_id == CFStringGetTypeID()) {
return createStringFromCFString(env, cfobject);
} else if (type_id == CFNumberGetTypeID()) {
return createNumberFromCFNumber(env, cfobject);
} else {
return NULL;
}
}
static void createMapKeys(const void *key, const void *value, void *context) {
dict_context_t *dict_context = (dict_context_t *)context;
jclass Map_class = (*dict_context->env)->GetObjectClass(dict_context->env, dict_context->map);
if (Map_class == NULL)
return;
jmethodID map_put = (*dict_context->env)->GetMethodID(dict_context->env, Map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
if (map_put == NULL)
return;
jobject jkey = createObjectFromCFObject(dict_context->env, key);
jobject jvalue = createObjectFromCFObject(dict_context->env, value);
if (jkey == NULL || jvalue == NULL)
return;
(*dict_context->env)->CallObjectMethod(dict_context->env, dict_context->map, map_put, jkey, jvalue);
(*dict_context->env)->DeleteLocalRef(dict_context->env, jkey);
(*dict_context->env)->DeleteLocalRef(dict_context->env, jvalue);
}
jobject createMapFromCFDictionary(JNIEnv *env, CFDictionaryRef dict) {
jobject map = newJObject(env, "java/util/HashMap", "()V");
if (map == NULL)
return NULL;
dict_context_t dict_context;
dict_context.env = env;
dict_context.map = map;
CFDictionaryApplyFunction(dict, createMapKeys, &dict_context);
return map;
}
void copyEvent(JNIEnv *env, IOHIDEventStruct *event, jobject event_return) {
jclass OSXEvent_class = (*env)->GetObjectClass(env, event_return);
if (OSXEvent_class == NULL) {
return;
}
jmethodID OSXEvent_set = (*env)->GetMethodID(env, OSXEvent_class, "set", "(JJIJ)V");
if (OSXEvent_set == NULL) {
return;
}
Nanoseconds nanos = AbsoluteToNanoseconds(event->timestamp);
uint64_t nanos64= *((uint64_t *)&nanos);
(*env)->CallVoidMethod(env, event_return, OSXEvent_set, (jlong)event->type, (jlong)(intptr_t)event->elementCookie, (jint)event->value, (jlong)nanos64);
}

View file

@ -0,0 +1,48 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <jni.h>
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/hid/IOHIDLib.h>
extern jobject createMapFromCFDictionary(JNIEnv *env, CFDictionaryRef dict);
extern void copyEvent(JNIEnv *env, IOHIDEventStruct *event, jobject event_return);

View file

@ -0,0 +1,118 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
#include <IOKit/IOTypes.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/hid/IOHIDLib.h>
#include <IOKit/hid/IOHIDKeys.h>
#include <CoreFoundation/CoreFoundation.h>
#include "net_java_games_input_OSXHIDDevice.h"
#include "util.h"
#include "macosxutil.h"
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nReleaseDevice(JNIEnv *env, jclass unused, jlong device_address, jlong interface_address) {
io_object_t hidDevice = (io_object_t)device_address;
IOHIDDeviceInterface **device_interface = (IOHIDDeviceInterface **)(intptr_t)interface_address;;
(*device_interface)->Release(device_interface);
IOObjectRelease(hidDevice);
}
JNIEXPORT jobject JNICALL Java_net_java_games_input_OSXHIDDevice_nGetDeviceProperties(JNIEnv *env, jclass unused, jlong device_address) {
io_object_t hidDevice = (io_object_t)device_address;
CFMutableDictionaryRef properties;
kern_return_t result = IORegistryEntryCreateCFProperties(hidDevice,
&properties,
kCFAllocatorDefault,
kNilOptions);
if (result != KERN_SUCCESS) {
throwIOException(env, "Failed to create properties for device (%ld)", result);
return NULL;
}
jobject map = createMapFromCFDictionary(env, properties);
CFRelease(properties);
return map;
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nOpen
(JNIEnv * env, jclass unused, jlong lpDevice) {
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
IOReturn ioReturnValue = (*hidDeviceInterface)->open(hidDeviceInterface, 0);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Device open failed: %d", ioReturnValue);
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nClose
(JNIEnv * env, jclass unused, jlong lpDevice) {
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
IOReturn ioReturnValue = (*hidDeviceInterface)->close(hidDeviceInterface);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Device close failed: %d", ioReturnValue);
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nGetElementValue
(JNIEnv * env, jclass unused, jlong lpDevice, jlong hidCookie, jobject event_return) {
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)hidCookie;
IOHIDEventStruct event;
IOReturn ioReturnValue = (*hidDeviceInterface)->getElementValue(hidDeviceInterface, cookie, &event);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Device getElementValue failed: %d", ioReturnValue);
return;
}
copyEvent(env, &event, event_return);
if (event.longValue != NULL) {
free(event.longValue);
}
}
JNIEXPORT jlong JNICALL Java_net_java_games_input_OSXHIDDevice_nCreateQueue(JNIEnv *env, jclass unused, jlong device_address) {
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)device_address;
IOHIDQueueInterface **queue = (*hidDeviceInterface)->allocQueue(hidDeviceInterface);
if (queue == NULL) {
throwIOException(env, "Could not allocate queue");
return 0;
}
return (jlong)(intptr_t)queue;
}

View file

@ -0,0 +1,143 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
#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;
}

View file

@ -0,0 +1,135 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
#include <IOKit/IOTypes.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/hid/IOHIDLib.h>
#include <IOKit/hid/IOHIDKeys.h>
#include <CoreFoundation/CoreFoundation.h>
#include "net_java_games_input_OSXHIDQueue.h"
#include "util.h"
#include "macosxutil.h"
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nOpen(JNIEnv *env, jclass unused, jlong address, jint queue_depth) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOReturn ioReturnValue = (*queue)->create(queue, 0, queue_depth);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue open failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nStart(JNIEnv *env, jclass unused, jlong address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOReturn ioReturnValue = (*queue)->start(queue);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue start failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nStop(JNIEnv *env, jclass unused, jlong address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOReturn ioReturnValue = (*queue)->stop(queue);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue stop failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nClose(JNIEnv *env, jclass unused, jlong address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOReturn ioReturnValue = (*queue)->dispose(queue);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue dispose failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nReleaseQueue(JNIEnv *env, jclass unused, jlong address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOReturn ioReturnValue = (*queue)->Release(queue);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue Release failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nAddElement(JNIEnv *env, jclass unused, jlong address, jlong cookie_address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)cookie_address;
IOReturn ioReturnValue = (*queue)->addElement(queue, cookie, 0);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue addElement failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nRemoveElement(JNIEnv *env, jclass unused, jlong address, jlong cookie_address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)cookie_address;
IOReturn ioReturnValue = (*queue)->removeElement(queue, cookie);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue removeElement failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT jboolean JNICALL Java_net_java_games_input_OSXHIDQueue_nGetNextEvent(JNIEnv *env, jclass unused, jlong address, jobject event_return) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOHIDEventStruct event;
AbsoluteTime zeroTime = {0, 0};
IOReturn ioReturnValue = (*queue)->getNextEvent(queue, &event, zeroTime, 0);
if (ioReturnValue == kIOReturnUnderrun) {
return JNI_FALSE;
} else if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue getNextEvent failed: %d\n", ioReturnValue);
return JNI_FALSE;
}
copyEvent(env, &event, event_return);
if (event.longValue != NULL) {
free(event.longValue);
}
return JNI_TRUE;
}