mirror of
https://github.com/shadowfacts/jinput-arm64.git
synced 2026-04-05 22:45:50 +00:00
Make version 2 the main jinput version
This commit is contained in:
parent
4c91a4eb44
commit
559c008a02
149 changed files with 13218 additions and 10800 deletions
141
plugins/OSX/src/java/net/java/games/input/ButtonUsage.java
Normal file
141
plugins/OSX/src/java/net/java/games/input/ButtonUsage.java
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
/** Button Usages
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class ButtonUsage implements Usage {
|
||||
private final static Map map = new HashMap();
|
||||
|
||||
private final int button_id;
|
||||
|
||||
public final static ButtonUsage map(int button_id) {
|
||||
Integer button_id_obj = new Integer(button_id);
|
||||
ButtonUsage existing = (ButtonUsage)map.get(button_id_obj);
|
||||
if (existing != null)
|
||||
return existing;
|
||||
ButtonUsage new_button = new ButtonUsage(button_id);
|
||||
map.put(button_id_obj, new_button);
|
||||
return new_button;
|
||||
}
|
||||
|
||||
private ButtonUsage(int button_id) {
|
||||
this.button_id = button_id;
|
||||
}
|
||||
|
||||
public final Component.Identifier.Button getIdentifier() {
|
||||
switch (button_id) {
|
||||
case 1:
|
||||
return Component.Identifier.Button._0;
|
||||
case 2:
|
||||
return Component.Identifier.Button._1;
|
||||
case 3:
|
||||
return Component.Identifier.Button._2;
|
||||
case 4:
|
||||
return Component.Identifier.Button._3;
|
||||
case 5:
|
||||
return Component.Identifier.Button._4;
|
||||
case 6:
|
||||
return Component.Identifier.Button._5;
|
||||
case 7:
|
||||
return Component.Identifier.Button._6;
|
||||
case 8:
|
||||
return Component.Identifier.Button._7;
|
||||
case 9:
|
||||
return Component.Identifier.Button._8;
|
||||
case 10:
|
||||
return Component.Identifier.Button._9;
|
||||
case 11:
|
||||
return Component.Identifier.Button._10;
|
||||
case 12:
|
||||
return Component.Identifier.Button._11;
|
||||
case 13:
|
||||
return Component.Identifier.Button._12;
|
||||
case 14:
|
||||
return Component.Identifier.Button._13;
|
||||
case 15:
|
||||
return Component.Identifier.Button._14;
|
||||
case 16:
|
||||
return Component.Identifier.Button._15;
|
||||
case 17:
|
||||
return Component.Identifier.Button._16;
|
||||
case 18:
|
||||
return Component.Identifier.Button._17;
|
||||
case 19:
|
||||
return Component.Identifier.Button._18;
|
||||
case 20:
|
||||
return Component.Identifier.Button._19;
|
||||
case 21:
|
||||
return Component.Identifier.Button._20;
|
||||
case 22:
|
||||
return Component.Identifier.Button._21;
|
||||
case 23:
|
||||
return Component.Identifier.Button._22;
|
||||
case 24:
|
||||
return Component.Identifier.Button._23;
|
||||
case 25:
|
||||
return Component.Identifier.Button._24;
|
||||
case 26:
|
||||
return Component.Identifier.Button._25;
|
||||
case 27:
|
||||
return Component.Identifier.Button._26;
|
||||
case 28:
|
||||
return Component.Identifier.Button._27;
|
||||
case 29:
|
||||
return Component.Identifier.Button._28;
|
||||
case 30:
|
||||
return Component.Identifier.Button._29;
|
||||
case 31:
|
||||
return Component.Identifier.Button._30;
|
||||
case 32:
|
||||
return Component.Identifier.Button._31;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "ButtonUsage (" + button_id + ")";
|
||||
}
|
||||
}
|
||||
74
plugins/OSX/src/java/net/java/games/input/ElementType.java
Normal file
74
plugins/OSX/src/java/net/java/games/input/ElementType.java
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
/** HID Element types
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class ElementType {
|
||||
private final static ElementType[] map = new ElementType[514];
|
||||
|
||||
public final static ElementType INPUT_MISC = new ElementType(1);
|
||||
public final static ElementType INPUT_BUTTON = new ElementType(2);
|
||||
public final static ElementType INPUT_AXIS = new ElementType(3);
|
||||
public final static ElementType INPUT_SCANCODES = new ElementType(4);
|
||||
public final static ElementType OUTPUT = new ElementType(129);
|
||||
public final static ElementType FEATURE = new ElementType(257);
|
||||
public final static ElementType COLLECTION = new ElementType(513);
|
||||
|
||||
private final int type_id;
|
||||
|
||||
public final static ElementType map(int type_id) {
|
||||
if (type_id < 0 || type_id >= map.length)
|
||||
return null;
|
||||
return map[type_id];
|
||||
}
|
||||
|
||||
private ElementType(int type_id) {
|
||||
map[type_id] = this;
|
||||
this.type_id = type_id;
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "ElementType (0x" + Integer.toHexString(type_id) + ")";
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
/** Generic Desktop Usages
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class GenericDesktopUsage implements Usage {
|
||||
private final static GenericDesktopUsage[] map = new GenericDesktopUsage[0xFF];
|
||||
|
||||
public final static GenericDesktopUsage POINTER = new GenericDesktopUsage(0x01); /* Physical Collection */
|
||||
public final static GenericDesktopUsage MOUSE = new GenericDesktopUsage(0x02); /* Application Collection */
|
||||
/* 0x03 Reserved */
|
||||
public final static GenericDesktopUsage JOYSTICK = new GenericDesktopUsage(0x04); /* Application Collection */
|
||||
public final static GenericDesktopUsage GAME_PAD = new GenericDesktopUsage(0x05); /* Application Collection */
|
||||
public final static GenericDesktopUsage KEYBOARD = new GenericDesktopUsage(0x06); /* Application Collection */
|
||||
public final static GenericDesktopUsage KEYPAD = new GenericDesktopUsage(0x07); /* Application Collection */
|
||||
public final static GenericDesktopUsage MULTI_AXIS_CONTROLLER = new GenericDesktopUsage(0x08); /* Application Collection */
|
||||
/* 0x09 - 0x2F Reserved */
|
||||
public final static GenericDesktopUsage X = new GenericDesktopUsage(0x30); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage Y = new GenericDesktopUsage(0x31); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage Z = new GenericDesktopUsage(0x32); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage RX = new GenericDesktopUsage(0x33); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage RY = new GenericDesktopUsage(0x34); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage RZ = new GenericDesktopUsage(0x35); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage SLIDER = new GenericDesktopUsage(0x36); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage DIAL = new GenericDesktopUsage(0x37); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage WHEEL = new GenericDesktopUsage(0x38); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage HATSWITCH = new GenericDesktopUsage(0x39); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage COUNTED_BUFFER = new GenericDesktopUsage(0x3A); /* Logical Collection */
|
||||
public final static GenericDesktopUsage BYTE_COUNT = new GenericDesktopUsage(0x3B); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage MOTION_WAKEUP = new GenericDesktopUsage(0x3C); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage START = new GenericDesktopUsage(0x3D); /* On/Off Control */
|
||||
public final static GenericDesktopUsage SELECT = new GenericDesktopUsage(0x3E); /* On/Off Control */
|
||||
/* 0x3F Reserved */
|
||||
public final static GenericDesktopUsage VX = new GenericDesktopUsage(0x40); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VY = new GenericDesktopUsage(0x41); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VZ = new GenericDesktopUsage(0x42); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VBRX = new GenericDesktopUsage(0x43); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VBRY = new GenericDesktopUsage(0x44); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VBRZ = new GenericDesktopUsage(0x45); /* Dynamic Value */
|
||||
public final static GenericDesktopUsage VNO = new GenericDesktopUsage(0x46); /* Dynamic Value */
|
||||
/* 0x47 - 0x7F Reserved */
|
||||
public final static GenericDesktopUsage SYSTEM_CONTROL = new GenericDesktopUsage(0x80); /* Application Collection */
|
||||
public final static GenericDesktopUsage SYSTEM_POWER_DOWN = new GenericDesktopUsage(0x81); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_SLEEP = new GenericDesktopUsage(0x82); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_WAKE_UP = new GenericDesktopUsage(0x83); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_CONTEXT_MENU = new GenericDesktopUsage(0x84); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MAIN_MENU = new GenericDesktopUsage(0x85); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_APP_MENU = new GenericDesktopUsage(0x86); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_HELP = new GenericDesktopUsage(0x87); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_EXIT = new GenericDesktopUsage(0x88); /* One-Shot Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU = new GenericDesktopUsage(0x89); /* Selector */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_RIGHT = new GenericDesktopUsage(0x8A); /* Re-Trigger Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_LEFT = new GenericDesktopUsage(0x8B); /* Re-Trigger Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_UP = new GenericDesktopUsage(0x8C); /* Re-Trigger Control */
|
||||
public final static GenericDesktopUsage SYSTEM_MENU_DOWN = new GenericDesktopUsage(0x8D); /* Re-Trigger Control */
|
||||
/* 0x8E - 0x8F Reserved */
|
||||
public final static GenericDesktopUsage DPAD_UP = new GenericDesktopUsage(0x90); /* On/Off Control */
|
||||
public final static GenericDesktopUsage DPAD_DOWN = new GenericDesktopUsage(0x91); /* On/Off Control */
|
||||
public final static GenericDesktopUsage DPAD_RIGHT = new GenericDesktopUsage(0x92); /* On/Off Control */
|
||||
public final static GenericDesktopUsage DPAD_LEFT = new GenericDesktopUsage(0x93); /* On/Off Control */
|
||||
/* 0x94 - 0xFFFF Reserved */
|
||||
|
||||
private final int usage_id;
|
||||
|
||||
public final static GenericDesktopUsage map(int usage_id) {
|
||||
if (usage_id < 0 || usage_id >= map.length)
|
||||
return null;
|
||||
return map[usage_id];
|
||||
}
|
||||
|
||||
private GenericDesktopUsage(int usage_id) {
|
||||
map[usage_id] = this;
|
||||
this.usage_id = usage_id;
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "GenericDesktopUsage (0x" + Integer.toHexString(usage_id) + ")";
|
||||
}
|
||||
|
||||
public final Component.Identifier getIdentifier() {
|
||||
if (this == GenericDesktopUsage.X) {
|
||||
return Component.Identifier.Axis.X;
|
||||
} else if (this == GenericDesktopUsage.Y) {
|
||||
return Component.Identifier.Axis.Y;
|
||||
} else if (this == GenericDesktopUsage.Z) {
|
||||
return Component.Identifier.Axis.Z;
|
||||
} else if (this == GenericDesktopUsage.RX) {
|
||||
return Component.Identifier.Axis.RX;
|
||||
} else if (this == GenericDesktopUsage.RY) {
|
||||
return Component.Identifier.Axis.RY;
|
||||
} else if (this == GenericDesktopUsage.RZ) {
|
||||
return Component.Identifier.Axis.RZ;
|
||||
} else if (this == GenericDesktopUsage.SLIDER) {
|
||||
return Component.Identifier.Axis.SLIDER;
|
||||
} else if (this == GenericDesktopUsage.HATSWITCH) {
|
||||
return Component.Identifier.Axis.POV;
|
||||
} else if (this == GenericDesktopUsage.SELECT) {
|
||||
return Component.Identifier.Button.SELECT;
|
||||
} else
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
package net.java.games.input;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: gpierce
|
||||
* Date: Aug 2, 2003
|
||||
* Time: 2:57:15 PM
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public interface InputController
|
||||
{
|
||||
public void addControllerElement( InputControllerElement element );
|
||||
}
|
||||
|
|
@ -1,195 +0,0 @@
|
|||
package net.java.games.input;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: gpierce
|
||||
* Date: Aug 2, 2003
|
||||
* Time: 2:59:26 PM
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class InputControllerElement
|
||||
{
|
||||
private long hidCookie;
|
||||
private int elementType;
|
||||
private int usagePage;
|
||||
private int usage;
|
||||
|
||||
private int rawMin;
|
||||
private int rawMax;
|
||||
private int scaledMin;
|
||||
private int scaledMax;
|
||||
|
||||
private int dataBitSize;
|
||||
|
||||
private boolean isRelative;
|
||||
private boolean isWrapping;
|
||||
private boolean isNonLinear;
|
||||
private boolean hasPreferredState;
|
||||
private boolean hasNullState;
|
||||
|
||||
public InputControllerElement()
|
||||
{
|
||||
}
|
||||
|
||||
public InputControllerElement(long hidCookie, int elementType, int usage, int usagePage,
|
||||
int rawMin, int rawMax, int scaledMin, int scaledMax,
|
||||
int dataBitSize, boolean isRelative, boolean isWrapping,
|
||||
boolean isNonLinear, boolean hasPreferredState, boolean hasNullState )
|
||||
{
|
||||
this.hidCookie = hidCookie;
|
||||
this.elementType = elementType;
|
||||
this.usage = usage;
|
||||
this.usagePage = usagePage;
|
||||
this.rawMin = rawMin;
|
||||
this.rawMax = rawMax;
|
||||
this.scaledMin = scaledMin;
|
||||
this.scaledMax = scaledMax;
|
||||
this.dataBitSize = dataBitSize;
|
||||
this.isRelative = isRelative;
|
||||
this.isWrapping = isWrapping;
|
||||
this.isNonLinear = isNonLinear;
|
||||
this.hasPreferredState = hasPreferredState;
|
||||
this.hasNullState = hasNullState;
|
||||
}
|
||||
|
||||
public long getHidCookie()
|
||||
{
|
||||
return hidCookie;
|
||||
}
|
||||
|
||||
public void setHidCookie(long hidCookie)
|
||||
{
|
||||
this.hidCookie = hidCookie;
|
||||
}
|
||||
|
||||
public int getElementType()
|
||||
{
|
||||
return elementType;
|
||||
}
|
||||
|
||||
public void setElementType(int elementType)
|
||||
{
|
||||
this.elementType = elementType;
|
||||
}
|
||||
|
||||
public int getUsagePage()
|
||||
{
|
||||
return usagePage;
|
||||
}
|
||||
|
||||
public void setUsagePage(int usagePage)
|
||||
{
|
||||
this.usagePage = usagePage;
|
||||
}
|
||||
|
||||
public int getUsage()
|
||||
{
|
||||
return usage;
|
||||
}
|
||||
|
||||
public void setUsage(int usage)
|
||||
{
|
||||
this.usage = usage;
|
||||
}
|
||||
|
||||
public int getRawMin()
|
||||
{
|
||||
return rawMin;
|
||||
}
|
||||
|
||||
public void setRawMin(int rawMin)
|
||||
{
|
||||
this.rawMin = rawMin;
|
||||
}
|
||||
|
||||
public int getRawMax()
|
||||
{
|
||||
return rawMax;
|
||||
}
|
||||
|
||||
public void setRawMax(int rawMax)
|
||||
{
|
||||
this.rawMax = rawMax;
|
||||
}
|
||||
|
||||
public int getScaledMin()
|
||||
{
|
||||
return scaledMin;
|
||||
}
|
||||
|
||||
public void setScaledMin(int scaledMin)
|
||||
{
|
||||
this.scaledMin = scaledMin;
|
||||
}
|
||||
|
||||
public int getScaledMax()
|
||||
{
|
||||
return scaledMax;
|
||||
}
|
||||
|
||||
public void setScaledMax(int scaledMax)
|
||||
{
|
||||
this.scaledMax = scaledMax;
|
||||
}
|
||||
|
||||
public int getDataBitSize()
|
||||
{
|
||||
return dataBitSize;
|
||||
}
|
||||
|
||||
public void setDataBitSize(int dataBitSize)
|
||||
{
|
||||
this.dataBitSize = dataBitSize;
|
||||
}
|
||||
|
||||
public boolean isRelative()
|
||||
{
|
||||
return isRelative;
|
||||
}
|
||||
|
||||
public void setRelative(boolean relative)
|
||||
{
|
||||
isRelative = relative;
|
||||
}
|
||||
|
||||
public boolean isWrapping()
|
||||
{
|
||||
return isWrapping;
|
||||
}
|
||||
|
||||
public void setWrapping(boolean wrapping)
|
||||
{
|
||||
isWrapping = wrapping;
|
||||
}
|
||||
|
||||
public boolean isNonLinear()
|
||||
{
|
||||
return isNonLinear;
|
||||
}
|
||||
|
||||
public void setNonLinear(boolean nonLinear)
|
||||
{
|
||||
isNonLinear = nonLinear;
|
||||
}
|
||||
|
||||
public boolean isHasPreferredState()
|
||||
{
|
||||
return hasPreferredState;
|
||||
}
|
||||
|
||||
public void setHasPreferredState(boolean hasPreferredState)
|
||||
{
|
||||
this.hasPreferredState = hasPreferredState;
|
||||
}
|
||||
|
||||
public boolean isHasNullState()
|
||||
{
|
||||
return hasNullState;
|
||||
}
|
||||
|
||||
public void setHasNullState(boolean hasNullState)
|
||||
{
|
||||
this.hasNullState = hasNullState;
|
||||
}
|
||||
|
||||
}
|
||||
251
plugins/OSX/src/java/net/java/games/input/KeyboardUsage.java
Normal file
251
plugins/OSX/src/java/net/java/games/input/KeyboardUsage.java
Normal file
|
|
@ -0,0 +1,251 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
/** Mapping from Keyboard HID usages to Component.Identifier.Key
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class KeyboardUsage implements Usage {
|
||||
private final static KeyboardUsage[] map = new KeyboardUsage[0xFF];
|
||||
|
||||
public static final KeyboardUsage ERRORROLLOVER = new KeyboardUsage(0x01); /* ErrorRollOver */
|
||||
public static final KeyboardUsage POSTFAIL = new KeyboardUsage(0x02); /* POSTFail */
|
||||
public static final KeyboardUsage ERRORUNDEFINED = new KeyboardUsage(0x03); /* ErrorUndefined */
|
||||
public static final KeyboardUsage A = new KeyboardUsage(Component.Identifier.Key.A, 0x04); /* a or A */
|
||||
public static final KeyboardUsage B = new KeyboardUsage(Component.Identifier.Key.B, 0x05); /* b or B */
|
||||
public static final KeyboardUsage C = new KeyboardUsage(Component.Identifier.Key.C, 0x06); /* c or C */
|
||||
public static final KeyboardUsage D = new KeyboardUsage(Component.Identifier.Key.D, 0x07); /* d or D */
|
||||
public static final KeyboardUsage E = new KeyboardUsage(Component.Identifier.Key.E, 0x08); /* e or E */
|
||||
public static final KeyboardUsage F = new KeyboardUsage(Component.Identifier.Key.F, 0x09); /* f or F */
|
||||
public static final KeyboardUsage G = new KeyboardUsage(Component.Identifier.Key.G, 0x0A); /* g or G */
|
||||
public static final KeyboardUsage H = new KeyboardUsage(Component.Identifier.Key.H, 0x0B); /* h or H */
|
||||
public static final KeyboardUsage I = new KeyboardUsage(Component.Identifier.Key.I, 0x0C); /* i or I */
|
||||
public static final KeyboardUsage J = new KeyboardUsage(Component.Identifier.Key.J, 0x0D); /* j or J */
|
||||
public static final KeyboardUsage K = new KeyboardUsage(Component.Identifier.Key.K, 0x0E); /* k or K */
|
||||
public static final KeyboardUsage L = new KeyboardUsage(Component.Identifier.Key.L, 0x0F); /* l or L */
|
||||
public static final KeyboardUsage M = new KeyboardUsage(Component.Identifier.Key.M, 0x10); /* m or M */
|
||||
public static final KeyboardUsage N = new KeyboardUsage(Component.Identifier.Key.N, 0x11); /* n or N */
|
||||
public static final KeyboardUsage O = new KeyboardUsage(Component.Identifier.Key.O, 0x12); /* o or O */
|
||||
public static final KeyboardUsage P = new KeyboardUsage(Component.Identifier.Key.P, 0x13); /* p or P */
|
||||
public static final KeyboardUsage Q = new KeyboardUsage(Component.Identifier.Key.Q, 0x14); /* q or Q */
|
||||
public static final KeyboardUsage R = new KeyboardUsage(Component.Identifier.Key.R, 0x15); /* r or R */
|
||||
public static final KeyboardUsage S = new KeyboardUsage(Component.Identifier.Key.S, 0x16); /* s or S */
|
||||
public static final KeyboardUsage T = new KeyboardUsage(Component.Identifier.Key.T, 0x17); /* t or T */
|
||||
public static final KeyboardUsage U = new KeyboardUsage(Component.Identifier.Key.U, 0x18); /* u or U */
|
||||
public static final KeyboardUsage V = new KeyboardUsage(Component.Identifier.Key.V, 0x19); /* v or V */
|
||||
public static final KeyboardUsage W = new KeyboardUsage(Component.Identifier.Key.W, 0x1A); /* w or W */
|
||||
public static final KeyboardUsage X = new KeyboardUsage(Component.Identifier.Key.X, 0x1B); /* x or X */
|
||||
public static final KeyboardUsage Y = new KeyboardUsage(Component.Identifier.Key.Y, 0x1C); /* y or Y */
|
||||
public static final KeyboardUsage Z = new KeyboardUsage(Component.Identifier.Key.Z, 0x1D); /* z or Z */
|
||||
public static final KeyboardUsage _1 = new KeyboardUsage(Component.Identifier.Key._1, 0x1E); /* 1 or ! */
|
||||
public static final KeyboardUsage _2 = new KeyboardUsage(Component.Identifier.Key._2, 0x1F); /* 2 or @ */
|
||||
public static final KeyboardUsage _3 = new KeyboardUsage(Component.Identifier.Key._3, 0x20); /* 3 or # */
|
||||
public static final KeyboardUsage _4 = new KeyboardUsage(Component.Identifier.Key._4, 0x21); /* 4 or $ */
|
||||
public static final KeyboardUsage _5 = new KeyboardUsage(Component.Identifier.Key._5, 0x22); /* 5 or % */
|
||||
public static final KeyboardUsage _6 = new KeyboardUsage(Component.Identifier.Key._6, 0x23); /* 6 or ^ */
|
||||
public static final KeyboardUsage _7 = new KeyboardUsage(Component.Identifier.Key._7, 0x24); /* 7 or & */
|
||||
public static final KeyboardUsage _8 = new KeyboardUsage(Component.Identifier.Key._8, 0x25); /* 8 or * */
|
||||
public static final KeyboardUsage _9 = new KeyboardUsage(Component.Identifier.Key._9, 0x26); /* 9 or ( */
|
||||
public static final KeyboardUsage _0 = new KeyboardUsage(Component.Identifier.Key._0, 0x27); /* 0 or ) */
|
||||
public static final KeyboardUsage ENTER = new KeyboardUsage(Component.Identifier.Key.RETURN, 0x28); /* Return (Enter) */
|
||||
public static final KeyboardUsage ESCAPE = new KeyboardUsage(Component.Identifier.Key.ESCAPE, 0x29); /* Escape */
|
||||
public static final KeyboardUsage BACKSPACE = new KeyboardUsage(Component.Identifier.Key.BACK, 0x2A); /* Delete (Backspace) */
|
||||
public static final KeyboardUsage TAB = new KeyboardUsage(Component.Identifier.Key.TAB, 0x2B); /* Tab */
|
||||
public static final KeyboardUsage SPACEBAR = new KeyboardUsage(Component.Identifier.Key.SPACE, 0x2C); /* Spacebar */
|
||||
public static final KeyboardUsage HYPHEN = new KeyboardUsage(Component.Identifier.Key.MINUS, 0x2D); /* - or _ */
|
||||
public static final KeyboardUsage EQUALSIGN = new KeyboardUsage(Component.Identifier.Key.EQUALS, 0x2E); /* = or + */
|
||||
public static final KeyboardUsage OPENBRACKET = new KeyboardUsage(Component.Identifier.Key.LBRACKET, 0x2F); /* [ or { */
|
||||
public static final KeyboardUsage CLOSEBRACKET = new KeyboardUsage(Component.Identifier.Key.RBRACKET, 0x30); /* ] or } */
|
||||
public static final KeyboardUsage BACKSLASH = new KeyboardUsage(Component.Identifier.Key.BACKSLASH, 0x31); /* \ or | */
|
||||
public static final KeyboardUsage NONUSPOUNT = new KeyboardUsage(Component.Identifier.Key.PERIOD, 0x32); /* Non-US # or _ */
|
||||
public static final KeyboardUsage SEMICOLON = new KeyboardUsage(Component.Identifier.Key.SEMICOLON, 0x33); /* ; or : */
|
||||
public static final KeyboardUsage QUOTE = new KeyboardUsage(Component.Identifier.Key.APOSTROPHE, 0x34); /* ' or " */
|
||||
public static final KeyboardUsage TILDE = new KeyboardUsage(Component.Identifier.Key.GRAVE, 0x35); /* Grave Accent and Tilde */
|
||||
public static final KeyboardUsage COMMA = new KeyboardUsage(Component.Identifier.Key.COMMA, 0x36); /* , or < */
|
||||
public static final KeyboardUsage PERIOD = new KeyboardUsage(Component.Identifier.Key.PERIOD, 0x37); /* . or > */
|
||||
public static final KeyboardUsage SLASH = new KeyboardUsage(Component.Identifier.Key.SLASH, 0x38); /* / or ? */
|
||||
public static final KeyboardUsage CAPSLOCK = new KeyboardUsage(Component.Identifier.Key.CAPITAL, 0x39); /* Caps Lock */
|
||||
public static final KeyboardUsage F1 = new KeyboardUsage(Component.Identifier.Key.F1, 0x3A); /* F1 */
|
||||
public static final KeyboardUsage F2 = new KeyboardUsage(Component.Identifier.Key.F2, 0x3B); /* F2 */
|
||||
public static final KeyboardUsage F3 = new KeyboardUsage(Component.Identifier.Key.F3, 0x3C); /* F3 */
|
||||
public static final KeyboardUsage F4 = new KeyboardUsage(Component.Identifier.Key.F4, 0x3D); /* F4 */
|
||||
public static final KeyboardUsage F5 = new KeyboardUsage(Component.Identifier.Key.F5, 0x3E); /* F5 */
|
||||
public static final KeyboardUsage F6 = new KeyboardUsage(Component.Identifier.Key.F6, 0x3F); /* F6 */
|
||||
public static final KeyboardUsage F7 = new KeyboardUsage(Component.Identifier.Key.F7, 0x40); /* F7 */
|
||||
public static final KeyboardUsage F8 = new KeyboardUsage(Component.Identifier.Key.F8, 0x41); /* F8 */
|
||||
public static final KeyboardUsage F9 = new KeyboardUsage(Component.Identifier.Key.F9, 0x42); /* F9 */
|
||||
public static final KeyboardUsage F10 = new KeyboardUsage(Component.Identifier.Key.F10, 0x43); /* F10 */
|
||||
public static final KeyboardUsage F11 = new KeyboardUsage(Component.Identifier.Key.F11, 0x44); /* F11 */
|
||||
public static final KeyboardUsage F12 = new KeyboardUsage(Component.Identifier.Key.F12, 0x45); /* F12 */
|
||||
public static final KeyboardUsage PRINTSCREEN = new KeyboardUsage(Component.Identifier.Key.SYSRQ, 0x46); /* PrintScreen */
|
||||
public static final KeyboardUsage SCROLLLOCK = new KeyboardUsage(Component.Identifier.Key.SCROLL, 0x47); /* Scroll Lock */
|
||||
public static final KeyboardUsage PAUSE = new KeyboardUsage(Component.Identifier.Key.PAUSE, 0x48); /* Pause */
|
||||
public static final KeyboardUsage INSERT = new KeyboardUsage(Component.Identifier.Key.INSERT, 0x49); /* Insert */
|
||||
public static final KeyboardUsage HOME = new KeyboardUsage(Component.Identifier.Key.HOME, 0x4A); /* Home */
|
||||
public static final KeyboardUsage PAGEUP = new KeyboardUsage(Component.Identifier.Key.PAGEUP, 0x4B); /* Page Up */
|
||||
public static final KeyboardUsage DELETE = new KeyboardUsage(Component.Identifier.Key.DELETE, 0x4C); /* Delete Forward */
|
||||
public static final KeyboardUsage END = new KeyboardUsage(Component.Identifier.Key.END, 0x4D); /* End */
|
||||
public static final KeyboardUsage PAGEDOWN = new KeyboardUsage(Component.Identifier.Key.PAGEDOWN, 0x4E); /* Page Down */
|
||||
public static final KeyboardUsage RIGHTARROW = new KeyboardUsage(Component.Identifier.Key.RIGHT, 0x4F); /* Right Arrow */
|
||||
public static final KeyboardUsage LEFTARROW = new KeyboardUsage(Component.Identifier.Key.LEFT, 0x50); /* Left Arrow */
|
||||
public static final KeyboardUsage DOWNARROW = new KeyboardUsage(Component.Identifier.Key.DOWN, 0x51); /* Down Arrow */
|
||||
public static final KeyboardUsage UPARROW = new KeyboardUsage(Component.Identifier.Key.UP, 0x52); /* Up Arrow */
|
||||
public static final KeyboardUsage KEYPAD_NUMLOCK = new KeyboardUsage(Component.Identifier.Key.NUMLOCK, 0x53); /* Keypad NumLock or Clear */
|
||||
public static final KeyboardUsage KEYPAD_SLASH = new KeyboardUsage(Component.Identifier.Key.DIVIDE, 0x54); /* Keypad / */
|
||||
public static final KeyboardUsage KEYPAD_ASTERICK = new KeyboardUsage(0x55); /* Keypad * */
|
||||
public static final KeyboardUsage KEYPAD_HYPHEN = new KeyboardUsage(Component.Identifier.Key.SUBTRACT, 0x56); /* Keypad - */
|
||||
public static final KeyboardUsage KEYPAD_PLUS = new KeyboardUsage(Component.Identifier.Key.ADD, 0x57); /* Keypad + */
|
||||
public static final KeyboardUsage KEYPAD_ENTER = new KeyboardUsage(Component.Identifier.Key.NUMPADENTER, 0x58); /* Keypad Enter */
|
||||
public static final KeyboardUsage KEYPAD_1 = new KeyboardUsage(Component.Identifier.Key.NUMPAD1, 0x59); /* Keypad 1 or End */
|
||||
public static final KeyboardUsage KEYPAD_2 = new KeyboardUsage(Component.Identifier.Key.NUMPAD2, 0x5A); /* Keypad 2 or Down Arrow */
|
||||
public static final KeyboardUsage KEYPAD_3 = new KeyboardUsage(Component.Identifier.Key.NUMPAD3, 0x5B); /* Keypad 3 or Page Down */
|
||||
public static final KeyboardUsage KEYPAD_4 = new KeyboardUsage(Component.Identifier.Key.NUMPAD4, 0x5C); /* Keypad 4 or Left Arrow */
|
||||
public static final KeyboardUsage KEYPAD_5 = new KeyboardUsage(Component.Identifier.Key.NUMPAD5, 0x5D); /* Keypad 5 */
|
||||
public static final KeyboardUsage KEYPAD_6 = new KeyboardUsage(Component.Identifier.Key.NUMPAD6, 0x5E); /* Keypad 6 or Right Arrow */
|
||||
public static final KeyboardUsage KEYPAD_7 = new KeyboardUsage(Component.Identifier.Key.NUMPAD7, 0x5F); /* Keypad 7 or Home */
|
||||
public static final KeyboardUsage KEYPAD_8 = new KeyboardUsage(Component.Identifier.Key.NUMPAD8, 0x60); /* Keypad 8 or Up Arrow */
|
||||
public static final KeyboardUsage KEYPAD_9 = new KeyboardUsage(Component.Identifier.Key.NUMPAD9, 0x61); /* Keypad 9 or Page Up */
|
||||
public static final KeyboardUsage KEYPAD_0 = new KeyboardUsage(Component.Identifier.Key.NUMPAD0, 0x62); /* Keypad 0 or Insert */
|
||||
public static final KeyboardUsage KEYPAD_PERIOD = new KeyboardUsage(Component.Identifier.Key.DECIMAL, 0x63); /* Keypad . or Delete */
|
||||
public static final KeyboardUsage NONUSBACKSLASH = new KeyboardUsage(Component.Identifier.Key.BACKSLASH, 0x64); /* Non-US \ or | */
|
||||
public static final KeyboardUsage APPLICATION = new KeyboardUsage(Component.Identifier.Key.APPS, 0x65); /* Application */
|
||||
public static final KeyboardUsage POWER = new KeyboardUsage(Component.Identifier.Key.POWER, 0x66); /* Power */
|
||||
public static final KeyboardUsage KEYPAD_EQUALSIGN = new KeyboardUsage(Component.Identifier.Key.NUMPADEQUAL, 0x67); /* Keypad = */
|
||||
public static final KeyboardUsage F13 = new KeyboardUsage(Component.Identifier.Key.F13, 0x68); /* F13 */
|
||||
public static final KeyboardUsage F14 = new KeyboardUsage(Component.Identifier.Key.F14, 0x69); /* F14 */
|
||||
public static final KeyboardUsage F15 = new KeyboardUsage(Component.Identifier.Key.F15, 0x6A); /* F15 */
|
||||
public static final KeyboardUsage F16 = new KeyboardUsage(0x6B); /* F16 */
|
||||
public static final KeyboardUsage F17 = new KeyboardUsage(0x6C); /* F17 */
|
||||
public static final KeyboardUsage F18 = new KeyboardUsage(0x6D); /* F18 */
|
||||
public static final KeyboardUsage F19 = new KeyboardUsage(0x6E); /* F19 */
|
||||
public static final KeyboardUsage F20 = new KeyboardUsage(0x6F); /* F20 */
|
||||
public static final KeyboardUsage F21 = new KeyboardUsage(0x70); /* F21 */
|
||||
public static final KeyboardUsage F22 = new KeyboardUsage(0x71); /* F22 */
|
||||
public static final KeyboardUsage F23 = new KeyboardUsage(0x72); /* F23 */
|
||||
public static final KeyboardUsage F24 = new KeyboardUsage(0x73); /* F24 */
|
||||
public static final KeyboardUsage EXECUTE = new KeyboardUsage(0x74); /* Execute */
|
||||
public static final KeyboardUsage HELP = new KeyboardUsage(0x75); /* Help */
|
||||
public static final KeyboardUsage MENU = new KeyboardUsage(0x76); /* Menu */
|
||||
public static final KeyboardUsage SELECT = new KeyboardUsage(0x77); /* Select */
|
||||
public static final KeyboardUsage STOP = new KeyboardUsage(Component.Identifier.Key.STOP, 0x78); /* Stop */
|
||||
public static final KeyboardUsage AGAIN = new KeyboardUsage(0x79); /* Again */
|
||||
public static final KeyboardUsage UNDO = new KeyboardUsage(0x7A); /* Undo */
|
||||
public static final KeyboardUsage CUT = new KeyboardUsage(0x7B); /* Cut */
|
||||
public static final KeyboardUsage COPY = new KeyboardUsage(0x7C); /* Copy */
|
||||
public static final KeyboardUsage PASTE = new KeyboardUsage(0x7D); /* Paste */
|
||||
public static final KeyboardUsage FIND = new KeyboardUsage(0x7E); /* Find */
|
||||
public static final KeyboardUsage MUTE = new KeyboardUsage(0x7F); /* Mute */
|
||||
public static final KeyboardUsage VOLUMEUP = new KeyboardUsage(0x80); /* Volume Up */
|
||||
public static final KeyboardUsage VOLUMEDOWN = new KeyboardUsage(0x81); /* Volume Down */
|
||||
public static final KeyboardUsage LOCKINGCAPSLOCK = new KeyboardUsage(Component.Identifier.Key.CAPITAL, 0x82); /* Locking Caps Lock */
|
||||
public static final KeyboardUsage LOCKINGNUMLOCK = new KeyboardUsage(Component.Identifier.Key.NUMLOCK, 0x83); /* Locking Num Lock */
|
||||
public static final KeyboardUsage LOCKINGSCROLLLOCK = new KeyboardUsage(Component.Identifier.Key.SCROLL, 0x84); /* Locking Scroll Lock */
|
||||
public static final KeyboardUsage KEYPAD_COMMA = new KeyboardUsage(Component.Identifier.Key.COMMA, 0x85); /* Keypad Comma */
|
||||
public static final KeyboardUsage KEYPAD_EQUALSSIGNAS400 = new KeyboardUsage(0x86); /* Keypad Equal Sign for AS/400 */
|
||||
public static final KeyboardUsage INTERNATIONAL1 = new KeyboardUsage(0x87); /* International1 */
|
||||
public static final KeyboardUsage INTERNATIONAL2 = new KeyboardUsage(0x88); /* International2 */
|
||||
public static final KeyboardUsage INTERNATIONAL3 = new KeyboardUsage(0x89); /* International3 */
|
||||
public static final KeyboardUsage INTERNATIONAL4 = new KeyboardUsage(0x8A); /* International4 */
|
||||
public static final KeyboardUsage INTERNATIONAL5 = new KeyboardUsage(0x8B); /* International5 */
|
||||
public static final KeyboardUsage INTERNATIONAL6 = new KeyboardUsage(0x8C); /* International6 */
|
||||
public static final KeyboardUsage INTERNATIONAL7 = new KeyboardUsage(0x8D); /* International7 */
|
||||
public static final KeyboardUsage INTERNATIONAL8 = new KeyboardUsage(0x8E); /* International8 */
|
||||
public static final KeyboardUsage INTERNATIONAL9 = new KeyboardUsage(0x8F); /* International9 */
|
||||
public static final KeyboardUsage LANG1 = new KeyboardUsage(0x90); /* LANG1 */
|
||||
public static final KeyboardUsage LANG2 = new KeyboardUsage(0x91); /* LANG2 */
|
||||
public static final KeyboardUsage LANG3 = new KeyboardUsage(0x92); /* LANG3 */
|
||||
public static final KeyboardUsage LANG4 = new KeyboardUsage(0x93); /* LANG4 */
|
||||
public static final KeyboardUsage LANG5 = new KeyboardUsage(0x94); /* LANG5 */
|
||||
public static final KeyboardUsage LANG6 = new KeyboardUsage(0x95); /* LANG6 */
|
||||
public static final KeyboardUsage LANG7 = new KeyboardUsage(0x96); /* LANG7 */
|
||||
public static final KeyboardUsage LANG8 = new KeyboardUsage(0x97); /* LANG8 */
|
||||
public static final KeyboardUsage LANG9 = new KeyboardUsage(0x98); /* LANG9 */
|
||||
public static final KeyboardUsage ALTERNATEERASE = new KeyboardUsage(0x99); /* AlternateErase */
|
||||
public static final KeyboardUsage SYSREQORATTENTION = new KeyboardUsage(Component.Identifier.Key.SYSRQ, 0x9A); /* SysReq/Attention */
|
||||
public static final KeyboardUsage CANCEL = new KeyboardUsage(0x9B); /* Cancel */
|
||||
public static final KeyboardUsage CLEAR = new KeyboardUsage(0x9C); /* Clear */
|
||||
public static final KeyboardUsage PRIOR = new KeyboardUsage(Component.Identifier.Key.PAGEUP, 0x9D); /* Prior */
|
||||
public static final KeyboardUsage RETURN = new KeyboardUsage(Component.Identifier.Key.RETURN, 0x9E); /* Return */
|
||||
public static final KeyboardUsage SEPARATOR = new KeyboardUsage(0x9F); /* Separator */
|
||||
public static final KeyboardUsage OUT = new KeyboardUsage(0xA0); /* Out */
|
||||
public static final KeyboardUsage OPER = new KeyboardUsage(0xA1); /* Oper */
|
||||
public static final KeyboardUsage CLEARORAGAIN = new KeyboardUsage(0xA2); /* Clear/Again */
|
||||
public static final KeyboardUsage CRSELORPROPS = new KeyboardUsage(0xA3); /* CrSel/Props */
|
||||
public static final KeyboardUsage EXSEL = new KeyboardUsage(0xA4); /* ExSel */
|
||||
/* 0xA5-0xDF Reserved */
|
||||
public static final KeyboardUsage LEFTCONTROL = new KeyboardUsage(Component.Identifier.Key.LCONTROL, 0xE0); /* Left Control */
|
||||
public static final KeyboardUsage LEFTSHIFT = new KeyboardUsage(Component.Identifier.Key.LSHIFT, 0xE1); /* Left Shift */
|
||||
public static final KeyboardUsage LEFTALT = new KeyboardUsage(Component.Identifier.Key.LALT, 0xE2); /* Left Alt */
|
||||
public static final KeyboardUsage LEFTGUI = new KeyboardUsage(Component.Identifier.Key.LWIN, 0xE3); /* Left GUI */
|
||||
public static final KeyboardUsage RIGHTCONTROL = new KeyboardUsage(Component.Identifier.Key.RCONTROL, 0xE4); /* Right Control */
|
||||
public static final KeyboardUsage RIGHTSHIFT = new KeyboardUsage(Component.Identifier.Key.RSHIFT, 0xE5); /* Right Shift */
|
||||
public static final KeyboardUsage RIGHTALT = new KeyboardUsage(Component.Identifier.Key.RALT, 0xE6); /* Right Alt */
|
||||
public static final KeyboardUsage RIGHTGUI = new KeyboardUsage(Component.Identifier.Key.RWIN, 0xE7); /* Right GUI */
|
||||
|
||||
private final int usage;
|
||||
private final Component.Identifier.Key identifier;
|
||||
|
||||
public final Component.Identifier.Key getIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
|
||||
public final static KeyboardUsage map(int usage) {
|
||||
if (usage < 0 || usage >= map.length)
|
||||
return null;
|
||||
return map[usage];
|
||||
}
|
||||
|
||||
private KeyboardUsage(int usage) {
|
||||
this(Component.Identifier.Key.UNKNOWN, usage);
|
||||
}
|
||||
|
||||
private KeyboardUsage(Component.Identifier.Key id, int usage) {
|
||||
this.identifier = id;
|
||||
this.usage = usage;
|
||||
map[usage] = this;
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "KeyboardUsage (0x" + Integer.toHexString(usage) + ")";
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/** Represents an OSX AbstractController
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXAbstractController extends AbstractController {
|
||||
private final PortType port;
|
||||
private final OSXHIDQueue queue;
|
||||
private final Type type;
|
||||
|
||||
protected OSXAbstractController(OSXHIDDevice device, OSXHIDQueue queue, Component[] components, Controller[] children, Rumbler[] rumblers, Type type) {
|
||||
super(device.getProductName(), components, children, rumblers);
|
||||
this.queue = queue;
|
||||
this.type = type;
|
||||
this.port = device.getPortType();
|
||||
}
|
||||
|
||||
protected final boolean getNextDeviceEvent(Event event) throws IOException {
|
||||
return OSXControllers.getNextDeviceEvent(event, queue);
|
||||
}
|
||||
|
||||
protected final void setDeviceEventQueueSize(int size) throws IOException {
|
||||
queue.setQueueDepth(size);
|
||||
}
|
||||
|
||||
public Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public final PortType getPortType() {
|
||||
return port;
|
||||
}
|
||||
}
|
||||
70
plugins/OSX/src/java/net/java/games/input/OSXComponent.java
Normal file
70
plugins/OSX/src/java/net/java/games/input/OSXComponent.java
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/** Represents an OSX Component
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
class OSXComponent extends AbstractComponent {
|
||||
private final OSXHIDElement element;
|
||||
|
||||
public OSXComponent(Component.Identifier id, OSXHIDElement element) {
|
||||
super(id.getName(), id);
|
||||
this.element = element;
|
||||
}
|
||||
|
||||
public final boolean isRelative() {
|
||||
return element.isRelative();
|
||||
}
|
||||
|
||||
public boolean isAnalog() {
|
||||
return element.isAnalog();
|
||||
}
|
||||
|
||||
public final OSXHIDElement getElement() {
|
||||
return element;
|
||||
}
|
||||
|
||||
protected float poll() throws IOException {
|
||||
return OSXControllers.poll(element);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/** helper methods for OSX specific Controllers
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXControllers {
|
||||
private final static OSXEvent osx_event = new OSXEvent();
|
||||
|
||||
public final static synchronized float poll(OSXHIDElement element) throws IOException {
|
||||
element.getElementValue(osx_event);
|
||||
return element.convertValue(osx_event.getValue());
|
||||
}
|
||||
|
||||
/* synchronized to protect osx_event */
|
||||
public final static synchronized boolean getNextDeviceEvent(Event event, OSXHIDQueue queue) throws IOException {
|
||||
if (queue.getNextEvent(osx_event)) {
|
||||
OSXComponent component = queue.mapEvent(osx_event);
|
||||
event.set(component, component.getElement().convertValue(osx_event.getValue()), osx_event.getNanos());
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -38,447 +38,194 @@
|
|||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.security.AccessController;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.HashMap;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import net.java.games.input.Controller;
|
||||
import net.java.games.input.ControllerEnvironment;
|
||||
import net.java.games.util.plugins.Plugin;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
|
||||
/** OSX HIDManager implementation of controller environment
|
||||
/** OSX HIDManager implementation
|
||||
* @author elias
|
||||
* @author gregorypierce
|
||||
* @version 1.0
|
||||
*/
|
||||
public class OSXEnvironmentPlugin extends ControllerEnvironment implements Plugin
|
||||
{
|
||||
|
||||
|
||||
public static final int HID_DEVICE_MOUSE = 0x02;
|
||||
public static final int HID_DEVICE_JOYSTICK = 0x04;
|
||||
public static final int HID_DEVICE_GAMEPAD = 0x05;
|
||||
public static final int HID_DEVICE_KEYBOARD = 0x06;
|
||||
|
||||
|
||||
public static final int HID_USAGE_POINTER = 0x01;
|
||||
public static final int HID_USAGE_XAXIS = 0x30;
|
||||
public static final int HID_USAGE_YAXIS = 0x31;
|
||||
public static final int HID_USAGE_ZAXIS = 0x32;
|
||||
public static final int HID_USAGE_XAXIS_ROTATION = 0x33;
|
||||
public static final int HID_USAGE_YAXIS_ROTATION = 0x34;
|
||||
public static final int HID_USAGE_ZAXIS_ROTATION = 0x35;
|
||||
public static final int HID_USAGE_SLIDER = 0x36;
|
||||
public static final int HID_USAGE_DIAL = 0x37;
|
||||
public static final int HID_USAGE_WHEEL = 0x38;
|
||||
public static final int HID_USAGE_HAT = 0x39;
|
||||
public static final int HID_USAGE_DPAD_UP = 0x90;
|
||||
public static final int HID_USAGE_DPAD_DOWN = 0x91;
|
||||
public static final int HID_USAGE_DPAD_LEFT = 0x92;
|
||||
public static final int HID_USAGE_DPAD_RIGHT = 0x93;
|
||||
|
||||
|
||||
public static final int HID_USAGE_KEYBOARD_ERRORROLLOVER = 0x01; /* ErrorRollOver */
|
||||
public static final int HID_USAGE_KEYBOARD_POSTFAIL = 0x02; /* POSTFail */
|
||||
public static final int HID_USAGE_KEYBOARD_ERRORUNDEFINED = 0x03; /* ErrorUndefined */
|
||||
public static final int HID_USAGE_KEYBOARD_A = 0x04; /* a or A */
|
||||
public static final int HID_USAGE_KEYBOARD_B = 0x05; /* b or B */
|
||||
public static final int HID_USAGE_KEYBOARD_C = 0x06; /* c or C */
|
||||
public static final int HID_USAGE_KEYBOARD_D = 0x07; /* d or D */
|
||||
public static final int HID_USAGE_KEYBOARD_E = 0x08; /* e or E */
|
||||
public static final int HID_USAGE_KEYBOARD_F = 0x09; /* f or F */
|
||||
public static final int HID_USAGE_KEYBOARD_G = 0x0A; /* g or G */
|
||||
public static final int HID_USAGE_KEYBOARD_H = 0x0B; /* h or H */
|
||||
public static final int HID_USAGE_KEYBOARD_I = 0x0C; /* i or I */
|
||||
public static final int HID_USAGE_KEYBOARD_J = 0x0D; /* j or J */
|
||||
public static final int HID_USAGE_KEYBOARD_K = 0x0E; /* k or K */
|
||||
public static final int HID_USAGE_KEYBOARD_L = 0x0F; /* l or L */
|
||||
public static final int HID_USAGE_KEYBOARD_M = 0x10; /* m or M */
|
||||
public static final int HID_USAGE_KEYBOARD_N = 0x11; /* n or N */
|
||||
public static final int HID_USAGE_KEYBOARD_O = 0x12; /* o or O */
|
||||
public static final int HID_USAGE_KEYBOARD_P = 0x13; /* p or P */
|
||||
public static final int HID_USAGE_KEYBOARD_Q = 0x14; /* q or Q */
|
||||
public static final int HID_USAGE_KEYBOARD_R = 0x15; /* r or R */
|
||||
public static final int HID_USAGE_KEYBOARD_S = 0x16; /* s or S */
|
||||
public static final int HID_USAGE_KEYBOARD_T = 0x17; /* t or T */
|
||||
public static final int HID_USAGE_KEYBOARD_U = 0x18; /* u or U */
|
||||
public static final int HID_USAGE_KEYBOARD_V = 0x19; /* v or V */
|
||||
public static final int HID_USAGE_KEYBOARD_W = 0x1A; /* w or W */
|
||||
public static final int HID_USAGE_KEYBOARD_X = 0x1B; /* x or X */
|
||||
public static final int HID_USAGE_KEYBOARD_Y = 0x1C; /* y or Y */
|
||||
public static final int HID_USAGE_KEYBOARD_Z = 0x1D; /* z or Z */
|
||||
public static final int HID_USAGE_KEYBOARD_1 = 0x1E; /* 1 or ! */
|
||||
public static final int HID_USAGE_KEYBOARD_2 = 0x1F; /* 2 or @ */
|
||||
public static final int HID_USAGE_KEYBOARD_3 = 0x20; /* 3 or # */
|
||||
public static final int HID_USAGE_KEYBOARD_4 = 0x21; /* 4 or $ */
|
||||
public static final int HID_USAGE_KEYBOARD_5 = 0x22; /* 5 or % */
|
||||
public static final int HID_USAGE_KEYBOARD_6 = 0x23; /* 6 or ^ */
|
||||
public static final int HID_USAGE_KEYBOARD_7 = 0x24; /* 7 or & */
|
||||
public static final int HID_USAGE_KEYBOARD_8 = 0x25; /* 8 or * */
|
||||
public static final int HID_USAGE_KEYBOARD_9 = 0x26; /* 9 or ( */
|
||||
public static final int HID_USAGE_KEYBOARD_0 = 0x27; /* 0 or ) */
|
||||
public static final int HID_USAGE_KEYBOARD_ENTER = 0x28; /* Return (Enter) */
|
||||
public static final int HID_USAGE_KEYBOARD_ESCAPE = 0x29; /* Escape */
|
||||
public static final int HID_USAGE_KEYBOARD_BACKSPACE = 0x2A; /* Delete (Backspace) */
|
||||
public static final int HID_USAGE_KEYBOARD_TAB = 0x2B; /* Tab */
|
||||
public static final int HID_USAGE_KEYBOARD_SPACEBAR = 0x2C; /* Spacebar */
|
||||
public static final int HID_USAGE_KEYBOARD_HYPHEN = 0x2D; /* - or _ */
|
||||
public static final int HID_USAGE_KEYBOARD_EQUALSIGN = 0x2E; /* = or + */
|
||||
public static final int HID_USAGE_KEYBOARD_OPENBRACKET = 0x2F; /* [ or { */
|
||||
public static final int HID_USAGE_KEYBOARD_CLOSEBRACKET = 0x30; /* ] or } */
|
||||
public static final int HID_USAGE_KEYBOARD_BACKSLASH = 0x31; /* \ or | */
|
||||
public static final int HID_USAGE_KEYBOARD_NONUSPOUNT = 0x32; /* Non-US # or _ */
|
||||
public static final int HID_USAGE_KEYBOARD_SEMICOLON = 0x33; /* ; or : */
|
||||
public static final int HID_USAGE_KEYBOARD_QUOTE = 0x34; /* ' or " */
|
||||
public static final int HID_USAGE_KEYBOARD_TILDE = 0x35; /* Grave Accent and Tilde */
|
||||
public static final int HID_USAGE_KEYBOARD_COMMA = 0x36; /* , or < */
|
||||
public static final int HID_USAGE_KEYBOARD_PERIOD = 0x37; /* . or > */
|
||||
public static final int HID_USAGE_KEYBOARD_SLASH = 0x38; /* / or ? */
|
||||
public static final int HID_USAGE_KEYBOARD_CAPSLOCK = 0x39; /* Caps Lock */
|
||||
public static final int HID_USAGE_KEYBOARD_F1 = 0x3A; /* F1 */
|
||||
public static final int HID_USAGE_KEYBOARD_F2 = 0x3B; /* F2 */
|
||||
public static final int HID_USAGE_KEYBOARD_F3 = 0x3C; /* F3 */
|
||||
public static final int HID_USAGE_KEYBOARD_F4 = 0x3D; /* F4 */
|
||||
public static final int HID_USAGE_KEYBOARD_F5 = 0x3E; /* F5 */
|
||||
public static final int HID_USAGE_KEYBOARD_F6 = 0x3F; /* F6 */
|
||||
public static final int HID_USAGE_KEYBOARD_F7 = 0x40; /* F7 */
|
||||
public static final int HID_USAGE_KEYBOARD_F8 = 0x41; /* F8 */
|
||||
public static final int HID_USAGE_KEYBOARD_F9 = 0x42; /* F9 */
|
||||
public static final int HID_USAGE_KEYBOARD_F10 = 0x43; /* F10 */
|
||||
public static final int HID_USAGE_KEYBOARD_F11 = 0x44; /* F11 */
|
||||
public static final int HID_USAGE_KEYBOARD_F12 = 0x45; /* F12 */
|
||||
public static final int HID_USAGE_KEYBOARD_PRINTSCREEN = 0x46; /* Print Screen */
|
||||
public static final int HID_USAGE_KEYBOARD_SCROLLLOCK = 0x47; /* Scroll Lock */
|
||||
public static final int HID_USAGE_KEYBOARD_PAUSE = 0x48; /* Pause */
|
||||
public static final int HID_USAGE_KEYBOARD_INSERT = 0x49; /* Insert */
|
||||
public static final int HID_USAGE_KEYBOARD_HOME = 0x4A; /* Home */
|
||||
public static final int HID_USAGE_KEYBOARD_PAGEUP = 0x4B; /* Page Up */
|
||||
public static final int HID_USAGE_KEYBOARD_DELETE = 0x4C; /* Delete Forward */
|
||||
public static final int HID_USAGE_KEYBOARD_END = 0x4D; /* End */
|
||||
public static final int HID_USAGE_KEYBOARD_PAGEDOWN = 0x4E; /* Page Down */
|
||||
public static final int HID_USAGE_KEYBOARD_RIGHTARROW = 0x4F; /* Right Arrow */
|
||||
public static final int HID_USAGE_KEYBOARD_LEFTARROW = 0x50; /* Left Arrow */
|
||||
public static final int HID_USAGE_KEYBOARD_DOWNARROW = 0x51; /* Down Arrow */
|
||||
public static final int HID_USAGE_KEYBOARD_UPARROW = 0x52; /* Up Arrow */
|
||||
public static final int HID_USAGE_KEYPAD_NUMLOCK = 0x53; /* Keypad NumLock or Clear */
|
||||
public static final int HID_USAGE_KEYPAD_SLASH = 0x54; /* Keypad / */
|
||||
public static final int HID_USAGE_KEYPAD_ASTERICK = 0x55; /* Keypad * */
|
||||
public static final int HID_USAGE_KEYPAD_HYPHEN = 0x56; /* Keypad - */
|
||||
public static final int HID_USAGE_KEYPAD_PLUS = 0x57; /* Keypad + */
|
||||
public static final int HID_USAGE_KEYPAD_ENTER = 0x58; /* Keypad Enter */
|
||||
public static final int HID_USAGE_KEYPAD_1 = 0x59; /* Keypad 1 or End */
|
||||
public static final int HID_USAGE_KEYPAD_2 = 0x5A; /* Keypad 2 or Down Arrow */
|
||||
public static final int HID_USAGE_KEYPAD_3 = 0x5B; /* Keypad 3 or Page Down */
|
||||
public static final int HID_USAGE_KEYPAD_4 = 0x5C; /* Keypad 4 or Left Arrow */
|
||||
public static final int HID_USAGE_KEYPAD_5 = 0x5D; /* Keypad 5 */
|
||||
public static final int HID_USAGE_KEYPAD_6 = 0x5E; /* Keypad 6 or Right Arrow */
|
||||
public static final int HID_USAGE_KEYPAD_7 = 0x5F; /* Keypad 7 or Home */
|
||||
public static final int HID_USAGE_KEYPAD_8 = 0x60; /* Keypad 8 or Up Arrow */
|
||||
public static final int HID_USAGE_KEYPAD_9 = 0x61; /* Keypad 9 or Page Up */
|
||||
public static final int HID_USAGE_KEYPAD_0 = 0x62; /* Keypad 0 or Insert */
|
||||
public static final int HID_USAGE_KEYPAD_PERIOD = 0x63; /* Keypad . or Delete */
|
||||
public static final int HID_USAGE_KEYBOARD_NONUSBACKSLASH = 0x64; /* Non-US \ or | */
|
||||
public static final int HID_USAGE_KEYBOARD_APPLICATION = 0x65; /* Application */
|
||||
public static final int HID_USAGE_KEYBOARD_POWER = 0x66; /* Power */
|
||||
public static final int HID_USAGE_KEYPAD_EQUALSIGN = 0x67; /* Keypad = */
|
||||
public static final int HID_USAGE_KEYBOARD_F13 = 0x68; /* F13 */
|
||||
public static final int HID_USAGE_KEYBOARD_F14 = 0x69; /* F14 */
|
||||
public static final int HID_USAGE_KEYBOARD_F15 = 0x6A; /* F15 */
|
||||
public static final int HID_USAGE_KEYBOARD_F16 = 0x6B; /* F16 */
|
||||
public static final int HID_USAGE_KEYBOARD_F17 = 0x6C; /* F17 */
|
||||
public static final int HID_USAGE_KEYBOARD_F18 = 0x6D; /* F18 */
|
||||
public static final int HID_USAGE_KEYBOARD_F19 = 0x6E; /* F19 */
|
||||
public static final int HID_USAGE_KEYBOARD_F20 = 0x6F; /* F20 */
|
||||
public static final int HID_USAGE_KEYBOARD_F21 = 0x70; /* F21 */
|
||||
public static final int HID_USAGE_KEYBOARD_F22 = 0x71; /* F22 */
|
||||
public static final int HID_USAGE_KEYBOARD_F23 = 0x72; /* F23 */
|
||||
public static final int HID_USAGE_KEYBOARD_F24 = 0x73; /* F24 */
|
||||
public static final int HID_USAGE_KEYBOARD_EXECUTE = 0x74; /* Execute */
|
||||
public static final int HID_USAGE_KEYBOARD_HELP = 0x75; /* Help */
|
||||
public static final int HID_USAGE_KEYBOARD_MENU = 0x76; /* Menu */
|
||||
public static final int HID_USAGE_KEYBOARD_SELECT = 0x77; /* Select */
|
||||
public static final int HID_USAGE_KEYBOARD_STOP = 0x78; /* Stop */
|
||||
public static final int HID_USAGE_KEYBOARD_AGAIN = 0x79; /* Again */
|
||||
public static final int HID_USAGE_KEYBOARD_UNDO = 0x7A; /* Undo */
|
||||
public static final int HID_USAGE_KEYBOARD_CUT = 0x7B; /* Cut */
|
||||
public static final int HID_USAGE_KEYBOARD_COPY = 0x7C; /* Copy */
|
||||
public static final int HID_USAGE_KEYBOARD_PASTE = 0x7D; /* Paste */
|
||||
public static final int HID_USAGE_KEYBOARD_FIND = 0x7E; /* Find */
|
||||
public static final int HID_USAGE_KEYBOARD_MUTE = 0x7F; /* Mute */
|
||||
public static final int HID_USAGE_KEYBOARD_VOLUMEUP = 0x80; /* Volume Up */
|
||||
public static final int HID_USAGE_KEYBOARD_VOLUMEDOWN = 0x81; /* Volume Down */
|
||||
public static final int HID_USAGE_KEYBOARD_LOCKINGCAPSLOCK = 0x82; /* Locking Caps Lock */
|
||||
public static final int HID_USAGE_KEYBOARD_LOCKINGNUMLOCK = 0x83; /* Locking Num Lock */
|
||||
public static final int HID_USAGE_KEYBOARD_LOCKINGSCROLLLOCK = 0x84; /* Locking Scroll Lock */
|
||||
public static final int HID_USAGE_KEYPAD_COMMA = 0x85; /* Keypad Comma */
|
||||
public static final int HID_USAGE_KEYPAD_EQUALSSIGNAS400 = 0x86; /* Keypad Equal Sign for AS/400 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL1 = 0x87; /* International1 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL2 = 0x88; /* International2 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL3 = 0x89; /* International3 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL4 = 0x8A; /* International4 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL5 = 0x8B; /* International5 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL6 = 0x8C; /* International6 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL7 = 0x8D; /* International7 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL8 = 0x8E; /* International8 */
|
||||
public static final int HID_USAGE_KEYBOARD_INTERNATIONAL9 = 0x8F; /* International9 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG1 = 0x90; /* LANG1 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG2 = 0x91; /* LANG2 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG3 = 0x92; /* LANG3 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG4 = 0x93; /* LANG4 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG5 = 0x94; /* LANG5 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG6 = 0x95; /* LANG6 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG7 = 0x96; /* LANG7 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG8 = 0x97; /* LANG8 */
|
||||
public static final int HID_USAGE_KEYBOARD_LANG9 = 0x98; /* LANG9 */
|
||||
public static final int HID_USAGE_KEYBOARD_ALTERNATEERASE = 0x99; /* AlternateErase */
|
||||
public static final int HID_USAGE_KEYBOARD_SYSREQORATTENTION = 0x9A; /* SysReq/Attention */
|
||||
public static final int HID_USAGE_KEYBOARD_CANCEL = 0x9B; /* Cancel */
|
||||
public static final int HID_USAGE_KEYBOARD_CLEAR = 0x9C; /* Clear */
|
||||
public static final int HID_USAGE_KEYBOARD_PRIOR = 0x9D; /* Prior */
|
||||
public static final int HID_USAGE_KEYBOARD_RETURN = 0x9E; /* Return */
|
||||
public static final int HID_USAGE_KEYBOARD_SEPARATOR = 0x9F; /* Separator */
|
||||
public static final int HID_USAGE_KEYBOARD_OUT = 0xA0; /* Out */
|
||||
public static final int HID_USAGE_KEYBOARD_OPER = 0xA1; /* Oper */
|
||||
public static final int HID_USAGE_KEYBOARD_CLEARORAGAIN = 0xA2; /* Clear/Again */
|
||||
public static final int HID_USAGE_KEYBOARD_CRSELORPROPS = 0xA3; /* CrSel/Props */
|
||||
public static final int HID_USAGE_KEYBOARD_EXSEL = 0xA4; /* ExSel */
|
||||
/* 0xA5-0xDF Reserved */
|
||||
public static final int HID_USAGE_KEYBOARD_LEFTCONTROL = 0xE0; /* Left Control */
|
||||
public static final int HID_USAGE_KEYBOARD_LEFTSHIFT = 0xE1; /* Left Shift */
|
||||
public static final int HID_USAGE_KEYBOARD_LEFTALT = 0xE2; /* Left Alt */
|
||||
public static final int HID_USAGE_KEYBOARD_LEFTGUI = 0xE3; /* Left GUI */
|
||||
public static final int HID_USAGE_KEYBOARD_RIGHTCONTROL = 0xE4; /* Right Control */
|
||||
public static final int HID_USAGE_KEYBOARD_RIGHTSHIFT = 0xE5; /* Right Shift */
|
||||
public static final int HID_USAGE_KEYBOARD_RIGHTALT = 0xE6; /* Right Alt */
|
||||
public static final int HID_USAGE_KEYBOARD_RIGHTGUI = 0xE7; /* Right GUI */
|
||||
/* 0xE8-0xFFFF Reserved */
|
||||
public static final int HID_USAGE_KEYBOARD__RESERVED = 0xFFFF;
|
||||
|
||||
|
||||
public static final int HID_USAGEPAGE_UNDEFINED = 0x00;
|
||||
public static final int HID_USAGEPAGE_GENERICDESKTOP = 0x01;
|
||||
public static final int HID_USAGEPAGE_SIMULATION = 0x02;
|
||||
public static final int HID_USAGEPAGE_VR = 0x03;
|
||||
public static final int HID_USAGEPAGE_SPORT = 0x04;
|
||||
public static final int HID_USAGEPAGE_GAME = 0x05;
|
||||
public static final int HID_USAGEPAGE_KEYBOARD = 0x07; /* USB Device Class Definition for Human Interface Devices (HID). Note: the usage type for all key codes is Selector (Sel). */
|
||||
public static final int HID_USAGEPAGE_LED = 0x08;
|
||||
public static final int HID_USAGEPAGE_BUTTON = 0x09;
|
||||
public static final int HID_USAGEPAGE_ORDINAL = 0x0A;
|
||||
public static final int HID_USAGEPAGE_TELEPHONY = 0x0B;
|
||||
public static final int HID_USAGEPAGE_CONSUMER = 0x0C;
|
||||
public static final int HID_USAGEPAGE_DIGITIZER = 0x0D;
|
||||
public static final int HID_USAGEPAGE_PID = 0x0F; /* USB Physical Interface Device definitions for force feedback and related devices. */
|
||||
public static final int HID_USAGEPAGE_UNICODE = 0x10;
|
||||
public static final int HID_USAGEPAGE_ALPHANUMERIC_DISPLAY = 0x14;
|
||||
public static final int HID_USAGEPAGE_POWERDEVICE = 0x84; /* Power Device Page */
|
||||
public static final int HID_USAGEPAGE_BATTERY_SYSTEM = 0x85; /* Battery System Page */
|
||||
public static final int HID_USAGEPAGE_BARCODE_SCANNER = 0x8C; /* (Point of Sale) USB Device Class Definition for Bar Code Scanner Devices */
|
||||
public static final int HID_USAGEPAGE_SCALE = 0x8D; /* (Point of Sale) USB Device Class Definition for Scale Devices */
|
||||
public static final int HID_USAGEPAGE_CAMERA_CONTROL = 0x90; /* USB Device Class Definition for Image Class Devices */
|
||||
public static final int HID_USAGEPAGE_ARCADE = 0x91; /* OAAF Definitions for arcade and coinop related Devices */
|
||||
public static final int HID_USAGEPAGE_VENDOR_DEFINED_START = 0xFF00;
|
||||
|
||||
|
||||
public static final int HID_ELEMENTTYPE_INPUT_MISC = 1;
|
||||
public static final int HID_ELEMENTTYPE_INPUT_BUTTON = 2;
|
||||
public static final int HID_ELEMENTTYPE_INPUT_AXIS = 3;
|
||||
public static final int HID_ELEMENTTYPE_INPUT_SCANCODES = 4;
|
||||
public static final int HID_ELEMENTTYPE_OUTPUT = 129;
|
||||
public static final int HID_ELEMENTTYPE_FEATURE = 257;
|
||||
public static final int HID_ELEMENTTYPE_COLLECTION = 513;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static
|
||||
{
|
||||
System.loadLibrary("jinput");
|
||||
public final class OSXEnvironmentPlugin extends ControllerEnvironment implements Plugin {
|
||||
static {
|
||||
AccessController.doPrivileged(new PrivilegedAction() {
|
||||
public Object run() {
|
||||
if (isMacOSXEqualsOrBetterThan(10, 4)) {
|
||||
System.loadLibrary("jinput-osx");
|
||||
} else {
|
||||
// If we're not on 10.4 or later, try to load the legacy library first
|
||||
try {
|
||||
System.loadLibrary("jinput-osx-legacy");
|
||||
} catch (UnsatisfiedLinkError e) {
|
||||
System.loadLibrary("jinput-osx");
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public native void hidCreate();
|
||||
public native void hidDispose();
|
||||
public native void enumDevices();
|
||||
private final static boolean isMacOSXEqualsOrBetterThan(int major_required, int minor_required) {
|
||||
String os_version = System.getProperty("os.version");
|
||||
StringTokenizer version_tokenizer = new StringTokenizer(os_version, ".");
|
||||
int major;
|
||||
int minor;
|
||||
try {
|
||||
String major_str = version_tokenizer.nextToken();
|
||||
String minor_str = version_tokenizer.nextToken();
|
||||
major = Integer.parseInt(major_str);
|
||||
minor = Integer.parseInt(minor_str);
|
||||
} catch (Exception e) {
|
||||
ControllerEnvironment.logln("Exception occurred while trying to determine OS version: " + e);
|
||||
// Best guess, no
|
||||
return false;
|
||||
}
|
||||
return major > major_required || (major == major_required && minor >= minor_required);
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens an input device and returns the address of the input queue for that device
|
||||
*/
|
||||
public native long openDevice( long lpDevice, int queueDepth );
|
||||
public native void closeDevice( long lpDevice, long lpQueue );
|
||||
private final Controller[] controllers;
|
||||
|
||||
public OSXEnvironmentPlugin() {
|
||||
this.controllers = enumerateControllers();
|
||||
}
|
||||
|
||||
/**
|
||||
* Polls a device and returns the element top most on the input queue. The elements that
|
||||
* are returned are only those that have had their hidCookies registered with registerDeviceElement.
|
||||
* @param lpQueue
|
||||
* @return
|
||||
*/
|
||||
public native int pollDevice( long lpQueue );
|
||||
public native int pollElement( long lpDevice, long hidCookie );
|
||||
public native void registerDeviceElement( long lpQueue, long hidCookie );
|
||||
public native void deregisterDeviceElement( long lpQueue, long hidCookie );
|
||||
public final Controller[] getControllers() {
|
||||
return controllers;
|
||||
}
|
||||
|
||||
private final static void addElements(OSXHIDQueue queue, List elements, List components, boolean map_mouse_buttons) throws IOException {
|
||||
Iterator it = elements.iterator();
|
||||
while (it.hasNext()) {
|
||||
OSXHIDElement element = (OSXHIDElement)it.next();
|
||||
Component.Identifier id = element.getIdentifier();
|
||||
if (id == null)
|
||||
continue;
|
||||
if (map_mouse_buttons) {
|
||||
if (id == Component.Identifier.Button._0) {
|
||||
id = Component.Identifier.Button.LEFT;
|
||||
} else if (id == Component.Identifier.Button._1) {
|
||||
id = Component.Identifier.Button.RIGHT;
|
||||
} else if (id == Component.Identifier.Button._2) {
|
||||
id = Component.Identifier.Button.MIDDLE;
|
||||
}
|
||||
}
|
||||
OSXComponent component = new OSXComponent(id, element);
|
||||
components.add(component);
|
||||
queue.addElement(element, component);
|
||||
}
|
||||
}
|
||||
|
||||
private HashMap devices = new HashMap();
|
||||
private final static Keyboard createKeyboardFromDevice(OSXHIDDevice device, List elements) throws IOException {
|
||||
List components = new ArrayList();
|
||||
OSXHIDQueue queue = device.createQueue(AbstractController.EVENT_QUEUE_DEPTH);
|
||||
try {
|
||||
addElements(queue, elements, components, false);
|
||||
} catch (IOException e) {
|
||||
queue.release();
|
||||
throw e;
|
||||
}
|
||||
Component[] components_array = new Component[components.size()];
|
||||
components.toArray(components_array);
|
||||
Keyboard keyboard = new OSXKeyboard(device, queue, components_array, new Controller[]{}, new Rumbler[]{});
|
||||
return keyboard;
|
||||
}
|
||||
|
||||
private final static Mouse createMouseFromDevice(OSXHIDDevice device, List elements) throws IOException {
|
||||
List components = new ArrayList();
|
||||
OSXHIDQueue queue = device.createQueue(AbstractController.EVENT_QUEUE_DEPTH);
|
||||
try {
|
||||
addElements(queue, elements, components, true);
|
||||
} catch (IOException e) {
|
||||
queue.release();
|
||||
throw e;
|
||||
}
|
||||
Component[] components_array = new Component[components.size()];
|
||||
components.toArray(components_array);
|
||||
Mouse mouse = new OSXMouse(device, queue, components_array, new Controller[]{}, new Rumbler[]{});
|
||||
if (mouse.getLeft() != null && mouse.getX() != null && mouse.getY() != null) {
|
||||
return mouse;
|
||||
} else {
|
||||
queue.release();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private final static AbstractController createControllerFromDevice(OSXHIDDevice device, List elements, Controller.Type type) throws IOException {
|
||||
List components = new ArrayList();
|
||||
OSXHIDQueue queue = device.createQueue(AbstractController.EVENT_QUEUE_DEPTH);
|
||||
try {
|
||||
addElements(queue, elements, components, false);
|
||||
} catch (IOException e) {
|
||||
queue.release();
|
||||
throw e;
|
||||
}
|
||||
Component[] components_array = new Component[components.size()];
|
||||
components.toArray(components_array);
|
||||
AbstractController controller = new OSXAbstractController(device, queue, components_array, new Controller[]{}, new Rumbler[]{}, type);
|
||||
return controller;
|
||||
}
|
||||
|
||||
public OSXEnvironmentPlugin()
|
||||
{
|
||||
System.out.println("net.java.games.input.OSXEnvironmentPlugin instance created");
|
||||
private final static void createControllersFromDevice(OSXHIDDevice device, List controllers) throws IOException {
|
||||
UsagePair usage_pair = device.getUsagePair();
|
||||
if (usage_pair == null)
|
||||
return;
|
||||
List elements = device.getElements();
|
||||
if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && (usage_pair.getUsage() == GenericDesktopUsage.MOUSE ||
|
||||
usage_pair.getUsage() == GenericDesktopUsage.POINTER)) {
|
||||
Controller mouse = createMouseFromDevice(device, elements);
|
||||
if (mouse != null)
|
||||
controllers.add(mouse);
|
||||
} else if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && (usage_pair.getUsage() == GenericDesktopUsage.KEYBOARD ||
|
||||
usage_pair.getUsage() == GenericDesktopUsage.KEYPAD)) {
|
||||
Controller keyboard = createKeyboardFromDevice(device, elements);
|
||||
if (keyboard != null)
|
||||
controllers.add(keyboard);
|
||||
} else if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && usage_pair.getUsage() == GenericDesktopUsage.JOYSTICK) {
|
||||
Controller joystick = createControllerFromDevice(device, elements, Controller.Type.STICK);
|
||||
if (joystick != null)
|
||||
controllers.add(joystick);
|
||||
} else if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP && usage_pair.getUsage() == GenericDesktopUsage.GAME_PAD) {
|
||||
Controller game_pad = createControllerFromDevice(device, elements, Controller.Type.GAMEPAD);
|
||||
if (game_pad != null)
|
||||
controllers.add(game_pad);
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("Creating HID engine");
|
||||
hidCreate();
|
||||
|
||||
System.out.println("Enumerating devices");
|
||||
enumDevices();
|
||||
}
|
||||
|
||||
public void finalize()
|
||||
{
|
||||
System.out.println("Disposing HID engine");
|
||||
hidDispose();
|
||||
}
|
||||
|
||||
public Controller[] getControllers()
|
||||
{
|
||||
return (Controller[])(devices.values().toArray( new Controller[0]));
|
||||
}
|
||||
|
||||
public Controller createController( long lpDevice, String productName, int usage )
|
||||
{
|
||||
|
||||
switch (usage)
|
||||
{
|
||||
case (HID_DEVICE_MOUSE):
|
||||
System.out.println("Found mouse [" + productName + "] device address [" + lpDevice + "]");
|
||||
return new OSXMouse( this, lpDevice, productName );
|
||||
case (HID_DEVICE_JOYSTICK):
|
||||
System.out.println("Found joystick [" + productName + "] device address [" + lpDevice + "]");
|
||||
return new OSXJoystick( this, lpDevice, productName );
|
||||
case (HID_DEVICE_GAMEPAD):
|
||||
System.out.println("Found gamepad [" + productName + "] device address [" + lpDevice + "]");
|
||||
return new OSXGamepad( this, lpDevice, productName );
|
||||
case (HID_DEVICE_KEYBOARD):
|
||||
System.out.println("Found keyboard [" + productName + "] device address [" + lpDevice + "]");
|
||||
return new OSXKeyboard( this, lpDevice, productName );
|
||||
|
||||
default:
|
||||
System.out.println("Found device of unknown or unsupported type. Usage[" + usage + "], ProductName[" + productName + "] - ignoring");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a controller to the device list
|
||||
* @param lpDevice
|
||||
* @param productName
|
||||
* @param usage
|
||||
*/
|
||||
private void addController( long lpDevice, String productName, int usage )
|
||||
{
|
||||
Controller controller = null;
|
||||
|
||||
controller = createController( lpDevice, productName, usage );
|
||||
|
||||
if ( controller != null )
|
||||
{
|
||||
devices.put( new Long(lpDevice), controller );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an InputControllerElement to a device. This method is invoked from native code.
|
||||
* @param lpDevice
|
||||
* @param elementCookie
|
||||
* @param elementType
|
||||
* @param usage
|
||||
* @param usagePage
|
||||
* @param rawMin
|
||||
* @param rawMax
|
||||
* @param scaledMin
|
||||
* @param scaledMax
|
||||
* @param dataBitSize
|
||||
* @param isRelative
|
||||
* @param isWrapping
|
||||
* @param isNonLinear
|
||||
* @param hasPreferredState
|
||||
* @param hasNullState
|
||||
*/
|
||||
private void addControllerElement( long lpDevice,
|
||||
long elementCookie,
|
||||
int elementType,
|
||||
int usage,
|
||||
int usagePage,
|
||||
int rawMin,
|
||||
int rawMax,
|
||||
int scaledMin,
|
||||
int scaledMax,
|
||||
int dataBitSize,
|
||||
boolean isRelative,
|
||||
boolean isWrapping,
|
||||
boolean isNonLinear,
|
||||
boolean hasPreferredState,
|
||||
boolean hasNullState)
|
||||
{
|
||||
InputControllerElement element = new InputControllerElement( elementCookie, elementType, usage, usagePage,
|
||||
rawMin, rawMax, scaledMin, scaledMax,
|
||||
dataBitSize, isRelative, isWrapping, isNonLinear,
|
||||
hasPreferredState, hasNullState );
|
||||
|
||||
|
||||
InputController inputController = (InputController)devices.get( new Long( lpDevice) );
|
||||
if ( inputController != null )
|
||||
{
|
||||
inputController.addControllerElement( element );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void testDevice( long lpDevice )
|
||||
{
|
||||
System.out.println("Opening device ");
|
||||
long lpQueue = openDevice( lpDevice, 32 );
|
||||
|
||||
for ( int i = 0; i < 50; i++ )
|
||||
{
|
||||
try
|
||||
{
|
||||
pollDevice( lpQueue );
|
||||
Thread.sleep(10);
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
System.out.println("Interrupted" + e );
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("Closing device");
|
||||
closeDevice( lpDevice, lpQueue );
|
||||
}
|
||||
|
||||
public static void main (String args[])
|
||||
{
|
||||
System.out.println("Started net.java.games.input.OSXEnvironmentPlugin");
|
||||
OSXEnvironmentPlugin newjni = new OSXEnvironmentPlugin();
|
||||
|
||||
//newjni.hidCreate();
|
||||
|
||||
//newjni.enumDevices();
|
||||
|
||||
|
||||
Controller[] controllers = newjni.getControllers();
|
||||
|
||||
for ( int i = 0; i < controllers.length; i++ )
|
||||
{
|
||||
System.out.println("Controller [" + controllers[i].getName() +"] enumerated...");
|
||||
}
|
||||
|
||||
//newjni.hidDispose();
|
||||
|
||||
System.out.println("Done");
|
||||
}
|
||||
|
||||
}
|
||||
private final static Controller[] enumerateControllers() {
|
||||
List controllers = new ArrayList();
|
||||
try {
|
||||
OSXHIDDeviceIterator it = new OSXHIDDeviceIterator();
|
||||
try {
|
||||
OSXHIDDevice device;
|
||||
while ((device = it.next()) != null) {
|
||||
boolean device_used = false;
|
||||
try {
|
||||
int old_size = controllers.size();
|
||||
createControllersFromDevice(device, controllers);
|
||||
device_used = old_size != controllers.size();
|
||||
} catch (IOException e) {
|
||||
ControllerEnvironment.logln("Failed to create controllers from device: " + device.getProductName());
|
||||
}
|
||||
if (!device_used)
|
||||
device.release();
|
||||
}
|
||||
} finally {
|
||||
it.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
ControllerEnvironment.log("Failed to enumerate device: " + e.getMessage());
|
||||
return new Controller[]{};
|
||||
}
|
||||
Controller[] controllers_array = new Controller[controllers.size()];
|
||||
controllers.toArray(controllers_array);
|
||||
return controllers_array;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
73
plugins/OSX/src/java/net/java/games/input/OSXEvent.java
Normal file
73
plugins/OSX/src/java/net/java/games/input/OSXEvent.java
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
/** OSX Event structure corresponding to IOHIDEventStruct
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
class OSXEvent {
|
||||
private long type;
|
||||
private long cookie;
|
||||
private int value;
|
||||
private long nanos;
|
||||
|
||||
public void set(long type, long cookie, int value, long nanos) {
|
||||
this.type = type;
|
||||
this.cookie = cookie;
|
||||
this.value = value;
|
||||
this.nanos = nanos;
|
||||
}
|
||||
|
||||
public long getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public long getCookie() {
|
||||
return cookie;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public long getNanos() {
|
||||
return nanos;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
package net.java.games.input;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: gpierce
|
||||
* Date: Aug 2, 2003
|
||||
* Time: 3:59:09 PM
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class OSXGamepad extends AbstractController implements InputController
|
||||
{
|
||||
private OSXEnvironmentPlugin plugin;
|
||||
private long lpDevice;
|
||||
private long lpQueue;
|
||||
|
||||
public OSXGamepad( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
|
||||
{
|
||||
super( productName );
|
||||
|
||||
this.plugin = plugin;
|
||||
this.lpDevice = lpDevice;
|
||||
|
||||
openDevice();
|
||||
}
|
||||
public boolean poll()
|
||||
{
|
||||
plugin.pollDevice( lpQueue );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void openDevice()
|
||||
{
|
||||
this.lpQueue = plugin.openDevice( this.lpDevice, 32 );
|
||||
}
|
||||
|
||||
public void closeDevice()
|
||||
{
|
||||
plugin.closeDevice( this.lpDevice, this.lpQueue );
|
||||
}
|
||||
|
||||
public void pollDevice()
|
||||
{
|
||||
plugin.pollDevice( this.lpQueue );
|
||||
}
|
||||
|
||||
public void addControllerElement(InputControllerElement element)
|
||||
{
|
||||
switch ( element.getElementType() )
|
||||
{
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_MISC:
|
||||
System.out.println("*Adding misc component");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_BUTTON:
|
||||
System.out.println("*Adding button");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_AXIS:
|
||||
System.out.println("*Adding axis");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_SCANCODES:
|
||||
System.out.println("*Adding scancode");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_OUTPUT:
|
||||
System.out.println("*Adding forcefeedback");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_FEATURE:
|
||||
|
||||
System.out.println("*Adding feature");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_COLLECTION:
|
||||
System.out.println("*Adding collection");
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
318
plugins/OSX/src/java/net/java/games/input/OSXHIDDevice.java
Normal file
318
plugins/OSX/src/java/net/java/games/input/OSXHIDDevice.java
Normal file
|
|
@ -0,0 +1,318 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
import java.util.Iterator;
|
||||
|
||||
/** OSX HIDManager implementation
|
||||
* @author elias
|
||||
* @author gregorypierce
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXHIDDevice {
|
||||
private final static int AXIS_DEFAULT_MIN_VALUE = 0;
|
||||
private final static int AXIS_DEFAULT_MAX_VALUE = 64*1024;
|
||||
|
||||
private final static String kIOHIDTransportKey = "Transport";
|
||||
private final static String kIOHIDVendorIDKey = "VendorID";
|
||||
private final static String kIOHIDVendorIDSourceKey = "VendorIDSource";
|
||||
private final static String kIOHIDProductIDKey = "ProductID";
|
||||
private final static String kIOHIDVersionNumberKey = "VersionNumber";
|
||||
private final static String kIOHIDManufacturerKey = "Manufacturer";
|
||||
private final static String kIOHIDProductKey = "Product";
|
||||
private final static String kIOHIDSerialNumberKey = "SerialNumber";
|
||||
private final static String kIOHIDCountryCodeKey = "CountryCode";
|
||||
private final static String kIOHIDLocationIDKey = "LocationID";
|
||||
private final static String kIOHIDDeviceUsageKey = "DeviceUsage";
|
||||
private final static String kIOHIDDeviceUsagePageKey = "DeviceUsagePage";
|
||||
private final static String kIOHIDDeviceUsagePairsKey = "DeviceUsagePairs";
|
||||
private final static String kIOHIDPrimaryUsageKey = "PrimaryUsage";
|
||||
private final static String kIOHIDPrimaryUsagePageKey = "PrimaryUsagePage";
|
||||
private final static String kIOHIDMaxInputReportSizeKey = "MaxInputReportSize";
|
||||
private final static String kIOHIDMaxOutputReportSizeKey = "MaxOutputReportSize";
|
||||
private final static String kIOHIDMaxFeatureReportSizeKey = "MaxFeatureReportSize";
|
||||
|
||||
private final static String kIOHIDElementKey = "Elements";
|
||||
|
||||
private final static String kIOHIDElementCookieKey = "ElementCookie";
|
||||
private final static String kIOHIDElementTypeKey = "Type";
|
||||
private final static String kIOHIDElementCollectionTypeKey = "CollectionType";
|
||||
private final static String kIOHIDElementUsageKey = "Usage";
|
||||
private final static String kIOHIDElementUsagePageKey = "UsagePage";
|
||||
private final static String kIOHIDElementMinKey = "Min";
|
||||
private final static String kIOHIDElementMaxKey = "Max";
|
||||
private final static String kIOHIDElementScaledMinKey = "ScaledMin";
|
||||
private final static String kIOHIDElementScaledMaxKey = "ScaledMax";
|
||||
private final static String kIOHIDElementSizeKey = "Size";
|
||||
private final static String kIOHIDElementReportSizeKey = "ReportSize";
|
||||
private final static String kIOHIDElementReportCountKey = "ReportCount";
|
||||
private final static String kIOHIDElementReportIDKey = "ReportID";
|
||||
private final static String kIOHIDElementIsArrayKey = "IsArray";
|
||||
private final static String kIOHIDElementIsRelativeKey = "IsRelative";
|
||||
private final static String kIOHIDElementIsWrappingKey = "IsWrapping";
|
||||
private final static String kIOHIDElementIsNonLinearKey = "IsNonLinear";
|
||||
private final static String kIOHIDElementHasPreferredStateKey = "HasPreferredState";
|
||||
private final static String kIOHIDElementHasNullStateKey = "HasNullState";
|
||||
private final static String kIOHIDElementUnitKey = "Unit";
|
||||
private final static String kIOHIDElementUnitExponentKey = "UnitExponent";
|
||||
private final static String kIOHIDElementNameKey = "Name";
|
||||
private final static String kIOHIDElementValueLocationKey = "ValueLocation";
|
||||
private final static String kIOHIDElementDuplicateIndexKey = "DuplicateIndex";
|
||||
private final static String kIOHIDElementParentCollectionKey = "ParentCollection";
|
||||
|
||||
private final long device_address;
|
||||
private final long device_interface_address;
|
||||
private final Map properties;
|
||||
|
||||
private boolean released;
|
||||
|
||||
public OSXHIDDevice(long device_address, long device_interface_address) throws IOException {
|
||||
this.device_address = device_address;
|
||||
this.device_interface_address = device_interface_address;
|
||||
this.properties = getDeviceProperties();
|
||||
open();
|
||||
}
|
||||
|
||||
public final Controller.PortType getPortType() {
|
||||
String transport = (String)properties.get(kIOHIDTransportKey);
|
||||
if (transport == null)
|
||||
return Controller.PortType.UNKNOWN;
|
||||
if (transport.equals("USB")) {
|
||||
return Controller.PortType.USB;
|
||||
} else {
|
||||
return Controller.PortType.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
public final String getProductName() {
|
||||
return (String)properties.get(kIOHIDProductKey);
|
||||
}
|
||||
|
||||
private final OSXHIDElement createElementFromElementProperties(Map element_properties) {
|
||||
/* long size = getLongFromProperties(element_properties, kIOHIDElementSizeKey);
|
||||
// ignore elements that can't fit into the 32 bit value field of a hid event
|
||||
if (size > 32)
|
||||
return null;*/
|
||||
long element_cookie = getLongFromProperties(element_properties, kIOHIDElementCookieKey);
|
||||
int element_type_id = getIntFromProperties(element_properties, kIOHIDElementTypeKey);
|
||||
ElementType element_type = ElementType.map(element_type_id);
|
||||
int min = (int)getLongFromProperties(element_properties, kIOHIDElementMinKey, AXIS_DEFAULT_MIN_VALUE);
|
||||
int max = (int)getLongFromProperties(element_properties, kIOHIDElementMaxKey, AXIS_DEFAULT_MAX_VALUE);
|
||||
/* long scaled_min = getLongFromProperties(element_properties, kIOHIDElementScaledMinKey, Long.MIN_VALUE);
|
||||
long scaled_max = getLongFromProperties(element_properties, kIOHIDElementScaledMaxKey, Long.MAX_VALUE);*/
|
||||
UsagePair device_usage_pair = getUsagePair();
|
||||
boolean default_relative = device_usage_pair != null && (device_usage_pair.getUsage() == GenericDesktopUsage.POINTER || device_usage_pair.getUsage() == GenericDesktopUsage.MOUSE);
|
||||
|
||||
boolean is_relative = getBooleanFromProperties(element_properties, kIOHIDElementIsRelativeKey, default_relative);
|
||||
/* boolean is_wrapping = getBooleanFromProperties(element_properties, kIOHIDElementIsWrappingKey);
|
||||
boolean is_non_linear = getBooleanFromProperties(element_properties, kIOHIDElementIsNonLinearKey);
|
||||
boolean has_preferred_state = getBooleanFromProperties(element_properties, kIOHIDElementHasPreferredStateKey);
|
||||
boolean has_null_state = getBooleanFromProperties(element_properties, kIOHIDElementHasNullStateKey);*/
|
||||
int usage = getIntFromProperties(element_properties, kIOHIDElementUsageKey);
|
||||
int usage_page = getIntFromProperties(element_properties, kIOHIDElementUsagePageKey);
|
||||
UsagePair usage_pair = createUsagePair(usage_page, usage);
|
||||
if (usage_pair == null || (element_type != ElementType.INPUT_MISC && element_type != ElementType.INPUT_BUTTON && element_type != ElementType.INPUT_AXIS)) {
|
||||
//System.out.println("element_type = 0x" + element_type + " | usage = " + usage + " | usage_page = " + usage_page);
|
||||
return null;
|
||||
} else {
|
||||
return new OSXHIDElement(this, usage_pair, element_cookie, element_type, min, max, is_relative);
|
||||
}
|
||||
}
|
||||
|
||||
private final void addElements(List elements, Map properties) {
|
||||
Object[] elements_properties = (Object[])properties.get(kIOHIDElementKey);
|
||||
if (elements_properties == null)
|
||||
return;
|
||||
for (int i = 0; i < elements_properties.length; i++) {
|
||||
Map element_properties = (Map)elements_properties[i];
|
||||
OSXHIDElement element = createElementFromElementProperties(element_properties);
|
||||
if (element != null) {
|
||||
elements.add(element);
|
||||
}
|
||||
addElements(elements, element_properties);
|
||||
}
|
||||
}
|
||||
|
||||
public final List getElements() {
|
||||
List elements = new ArrayList();
|
||||
addElements(elements, properties);
|
||||
return elements;
|
||||
}
|
||||
|
||||
private final static long getLongFromProperties(Map properties, String key, long default_value) {
|
||||
Long long_obj = (Long)properties.get(key);
|
||||
if (long_obj == null)
|
||||
return default_value;
|
||||
return long_obj.longValue();
|
||||
}
|
||||
|
||||
private final static boolean getBooleanFromProperties(Map properties, String key, boolean default_value) {
|
||||
return getLongFromProperties(properties, key, default_value ? 1 : 0) != 0;
|
||||
}
|
||||
|
||||
private final static int getIntFromProperties(Map properties, String key) {
|
||||
return (int)getLongFromProperties(properties, key);
|
||||
}
|
||||
|
||||
private final static long getLongFromProperties(Map properties, String key) {
|
||||
Long long_obj = (Long)properties.get(key);
|
||||
return long_obj.longValue();
|
||||
}
|
||||
|
||||
private final static UsagePair createUsagePair(int usage_page_id, int usage_id) {
|
||||
UsagePage usage_page = UsagePage.map(usage_page_id);
|
||||
if (usage_page != null) {
|
||||
Usage usage = usage_page.mapUsage(usage_id);
|
||||
if (usage != null)
|
||||
return new UsagePair(usage_page, usage);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public final UsagePair getUsagePair() {
|
||||
int usage_page_id = getIntFromProperties(properties, kIOHIDPrimaryUsagePageKey);
|
||||
int usage_id = getIntFromProperties(properties, kIOHIDPrimaryUsageKey);
|
||||
return createUsagePair(usage_page_id, usage_id);
|
||||
}
|
||||
|
||||
/*
|
||||
public final List getUsagePairs() {
|
||||
List usage_pairs_list = new ArrayList();
|
||||
Object[] usage_pairs = (Object[])properties.get(kIOHIDDeviceUsagePairsKey);
|
||||
if (usage_pairs == null) {
|
||||
int usage_page_id = getIntFromProperties(properties, kIOHIDPrimaryUsagePageKey);
|
||||
int usage_id = getIntFromProperties(properties, kIOHIDPrimaryUsageKey);
|
||||
UsagePair pair = createUsagePair(usage_page_id, usage_id);
|
||||
if (pair != null)
|
||||
usage_pairs_list.add(pair);
|
||||
}
|
||||
for (int i = 0; i < usage_pairs.length; i++) {
|
||||
Map usage_pair = (Map)usage_pairs[i];
|
||||
int usage_page_id = getIntFromProperties(usage_pair, kIOHIDDeviceUsagePageKey);
|
||||
int usage_id = getIntFromProperties(usage_pair, kIOHIDDeviceUsageKey);
|
||||
UsagePair pair = createUsagePair(usage_page_id, usage_id);
|
||||
if (pair != null)
|
||||
usage_pairs_list.add(pair);
|
||||
}
|
||||
return usage_pairs_list;
|
||||
}
|
||||
*/
|
||||
private final void dumpProperties() {
|
||||
System.out.println(toString());
|
||||
dumpMap("", properties);
|
||||
}
|
||||
|
||||
private final static void dumpArray(String prefix, Object[] array) {
|
||||
System.out.println(prefix + "{");
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
dumpObject(prefix + "\t", array[i]);
|
||||
System.out.println(prefix + ",");
|
||||
}
|
||||
System.out.println(prefix + "}");
|
||||
}
|
||||
|
||||
private final static void dumpMap(String prefix, Map map) {
|
||||
Iterator keys = map.keySet().iterator();
|
||||
while (keys.hasNext()) {
|
||||
Object key = keys.next();
|
||||
Object value = map.get(key);
|
||||
dumpObject(prefix, key);
|
||||
dumpObject(prefix + "\t", value);
|
||||
}
|
||||
}
|
||||
|
||||
private final static void dumpObject(String prefix, Object obj) {
|
||||
if (obj instanceof Long) {
|
||||
Long l = (Long)obj;
|
||||
System.out.println(prefix + "0x" + Long.toHexString(l.longValue()));
|
||||
} else if (obj instanceof Map)
|
||||
dumpMap(prefix, (Map)obj);
|
||||
else if (obj.getClass().isArray())
|
||||
dumpArray(prefix, (Object[])obj);
|
||||
else
|
||||
System.out.println(prefix + obj);
|
||||
}
|
||||
|
||||
private final Map getDeviceProperties() throws IOException {
|
||||
return nGetDeviceProperties(device_address);
|
||||
}
|
||||
private final static native Map nGetDeviceProperties(long device_address) throws IOException;
|
||||
|
||||
public final synchronized void release() throws IOException {
|
||||
try {
|
||||
close();
|
||||
} finally {
|
||||
released = true;
|
||||
nReleaseDevice(device_address, device_interface_address);
|
||||
}
|
||||
}
|
||||
private final static native void nReleaseDevice(long device_address, long device_interface_address);
|
||||
|
||||
public final synchronized void getElementValue(long element_cookie, OSXEvent event) throws IOException {
|
||||
checkReleased();
|
||||
nGetElementValue(device_interface_address, element_cookie, event);
|
||||
}
|
||||
private final static native void nGetElementValue(long device_interface_address, long element_cookie, OSXEvent event) throws IOException;
|
||||
|
||||
public final synchronized OSXHIDQueue createQueue(int queue_depth) throws IOException {
|
||||
checkReleased();
|
||||
long queue_address = nCreateQueue(device_interface_address);
|
||||
return new OSXHIDQueue(queue_address, queue_depth);
|
||||
}
|
||||
private final static native long nCreateQueue(long device_interface_address) throws IOException;
|
||||
|
||||
private final void open() throws IOException {
|
||||
nOpen(device_interface_address);
|
||||
}
|
||||
private final static native void nOpen(long device_interface_address) throws IOException;
|
||||
|
||||
private final void close() throws IOException {
|
||||
nClose(device_interface_address);
|
||||
}
|
||||
private final static native void nClose(long device_interface_address) throws IOException;
|
||||
|
||||
private final void checkReleased() throws IOException {
|
||||
if (released)
|
||||
throw new IOException();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/** OSX HIDManager implementation
|
||||
* @author elias
|
||||
* @author gregorypierce
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXHIDDeviceIterator {
|
||||
private final long iterator_address;
|
||||
|
||||
public OSXHIDDeviceIterator() throws IOException {
|
||||
this.iterator_address = nCreateIterator();
|
||||
}
|
||||
private final static native long nCreateIterator();
|
||||
|
||||
public final void close(){
|
||||
nReleaseIterator(iterator_address);
|
||||
}
|
||||
private final static native void nReleaseIterator(long iterator_address);
|
||||
|
||||
public final OSXHIDDevice next() throws IOException {
|
||||
return nNext(iterator_address);
|
||||
}
|
||||
private final static native OSXHIDDevice nNext(long iterator_address) throws IOException;
|
||||
}
|
||||
143
plugins/OSX/src/java/net/java/games/input/OSXHIDElement.java
Normal file
143
plugins/OSX/src/java/net/java/games/input/OSXHIDElement.java
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/** Represents an OSX HID Element
|
||||
* @author elias
|
||||
* @author gregorypierce
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXHIDElement {
|
||||
private final OSXHIDDevice device;
|
||||
private final UsagePair usage_pair;
|
||||
private final long element_cookie;
|
||||
private final ElementType element_type;
|
||||
private final int min;
|
||||
private final int max;
|
||||
private final Component.Identifier identifier;
|
||||
private final boolean is_relative;
|
||||
|
||||
public OSXHIDElement(OSXHIDDevice device, UsagePair usage_pair, long element_cookie, ElementType element_type, int min, int max, boolean is_relative) {
|
||||
this.device = device;
|
||||
this.usage_pair = usage_pair;
|
||||
this.element_cookie = element_cookie;
|
||||
this.element_type = element_type;
|
||||
this.min = min;
|
||||
this.max = max;
|
||||
this.identifier = computeIdentifier();
|
||||
this.is_relative = is_relative;
|
||||
}
|
||||
|
||||
private final Component.Identifier computeIdentifier() {
|
||||
if (usage_pair.getUsagePage() == UsagePage.GENERIC_DESKTOP) {
|
||||
return ((GenericDesktopUsage)usage_pair.getUsage()).getIdentifier();
|
||||
} else if (usage_pair.getUsagePage() == UsagePage.BUTTON) {
|
||||
return ((ButtonUsage)usage_pair.getUsage()).getIdentifier();
|
||||
} else if (usage_pair.getUsagePage() == UsagePage.KEYBOARD_OR_KEYPAD) {
|
||||
return ((KeyboardUsage)usage_pair.getUsage()).getIdentifier();
|
||||
} else
|
||||
return null;
|
||||
}
|
||||
|
||||
final Component.Identifier getIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
|
||||
final long getCookie() {
|
||||
return element_cookie;
|
||||
}
|
||||
|
||||
final ElementType getType() {
|
||||
return element_type;
|
||||
}
|
||||
|
||||
final boolean isRelative() {
|
||||
return is_relative && identifier instanceof Component.Identifier.Axis;
|
||||
}
|
||||
|
||||
final boolean isAnalog() {
|
||||
return identifier instanceof Component.Identifier.Axis && identifier != Component.Identifier.Axis.POV;
|
||||
}
|
||||
|
||||
private UsagePair getUsagePair() {
|
||||
return usage_pair;
|
||||
}
|
||||
|
||||
final void getElementValue(OSXEvent event) throws IOException {
|
||||
device.getElementValue(element_cookie, event);
|
||||
}
|
||||
|
||||
final float convertValue(float value) {
|
||||
if (identifier == Component.Identifier.Axis.POV) {
|
||||
switch ((int)value) {
|
||||
case 0:
|
||||
return Component.POV.UP;
|
||||
case 1:
|
||||
return Component.POV.UP_RIGHT;
|
||||
case 2:
|
||||
return Component.POV.RIGHT;
|
||||
case 3:
|
||||
return Component.POV.DOWN_RIGHT;
|
||||
case 4:
|
||||
return Component.POV.DOWN;
|
||||
case 5:
|
||||
return Component.POV.DOWN_LEFT;
|
||||
case 6:
|
||||
return Component.POV.LEFT;
|
||||
case 7:
|
||||
return Component.POV.UP_LEFT;
|
||||
case 8:
|
||||
return Component.POV.OFF;
|
||||
default:
|
||||
return Component.POV.OFF;
|
||||
}
|
||||
} else if (identifier instanceof Component.Identifier.Axis && !is_relative) {
|
||||
if (min == max)
|
||||
return 0;
|
||||
else if (value > max)
|
||||
value = max;
|
||||
else if (value < min)
|
||||
value = min;
|
||||
return 2*(value - min)/(max - min) - 1;
|
||||
} else
|
||||
return value;
|
||||
}
|
||||
}
|
||||
141
plugins/OSX/src/java/net/java/games/input/OSXHIDQueue.java
Normal file
141
plugins/OSX/src/java/net/java/games/input/OSXHIDQueue.java
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXHIDQueue {
|
||||
private final Map map = new HashMap();
|
||||
private final long queue_address;
|
||||
|
||||
private boolean released;
|
||||
|
||||
public OSXHIDQueue(long address, int queue_depth) throws IOException {
|
||||
this.queue_address = address;
|
||||
try {
|
||||
createQueue(queue_depth);
|
||||
} catch (IOException e) {
|
||||
release();
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
public final synchronized void setQueueDepth(int queue_depth) throws IOException {
|
||||
checkReleased();
|
||||
stop();
|
||||
close();
|
||||
createQueue(queue_depth);
|
||||
}
|
||||
|
||||
private final void createQueue(int queue_depth) throws IOException {
|
||||
open(queue_depth);
|
||||
try {
|
||||
start();
|
||||
} catch (IOException e) {
|
||||
close();
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
public final OSXComponent mapEvent(OSXEvent event) {
|
||||
return (OSXComponent)map.get(new Long(event.getCookie()));
|
||||
}
|
||||
|
||||
private final void open(int queue_depth) throws IOException {
|
||||
nOpen(queue_address, queue_depth);
|
||||
}
|
||||
private final static native void nOpen(long queue_address, int queue_depth) throws IOException;
|
||||
|
||||
private final void close() throws IOException {
|
||||
nClose(queue_address);
|
||||
}
|
||||
private final static native void nClose(long queue_address) throws IOException;
|
||||
|
||||
private final void start() throws IOException {
|
||||
nStart(queue_address);
|
||||
}
|
||||
private final static native void nStart(long queue_address) throws IOException;
|
||||
|
||||
private final void stop() throws IOException {
|
||||
nStop(queue_address);
|
||||
}
|
||||
private final static native void nStop(long queue_address) throws IOException;
|
||||
|
||||
public final synchronized void release() throws IOException {
|
||||
if (!released) {
|
||||
released = true;
|
||||
try {
|
||||
stop();
|
||||
close();
|
||||
} finally {
|
||||
nReleaseQueue(queue_address);
|
||||
}
|
||||
}
|
||||
}
|
||||
private final static native void nReleaseQueue(long queue_address) throws IOException;
|
||||
|
||||
public final void addElement(OSXHIDElement element, OSXComponent component) throws IOException {
|
||||
nAddElement(queue_address, element.getCookie());
|
||||
map.put(new Long(element.getCookie()), component);
|
||||
}
|
||||
private final static native void nAddElement(long queue_address, long cookie) throws IOException;
|
||||
|
||||
public final void removeElement(OSXHIDElement element) throws IOException {
|
||||
nRemoveElement(queue_address, element.getCookie());
|
||||
map.remove(new Long(element.getCookie()));
|
||||
}
|
||||
private final static native void nRemoveElement(long queue_address, long cookie) throws IOException;
|
||||
|
||||
public final synchronized boolean getNextEvent(OSXEvent event) throws IOException {
|
||||
checkReleased();
|
||||
return nGetNextEvent(queue_address, event);
|
||||
}
|
||||
private final static native boolean nGetNextEvent(long queue_address, OSXEvent event) throws IOException;
|
||||
|
||||
private final void checkReleased() throws IOException {
|
||||
if (released)
|
||||
throw new IOException("Queue is released");
|
||||
}
|
||||
}
|
||||
|
|
@ -1,280 +0,0 @@
|
|||
package net.java.games.input;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* Joystick class which recognizes most of the enhanced joystick features
|
||||
* including:
|
||||
* x, y, and z axis
|
||||
* x, y axis rotation
|
||||
* slider
|
||||
* hat
|
||||
*
|
||||
*/
|
||||
public class OSXJoystick extends AbstractController implements InputController
|
||||
{
|
||||
private OSXEnvironmentPlugin plugin;
|
||||
private long lpDevice;
|
||||
private long lpQueue;
|
||||
private int buttonCount = 0;
|
||||
private List buttons = new ArrayList();
|
||||
|
||||
private Axis xAxis = null;
|
||||
private Axis yAxis = null;
|
||||
private Axis zAxis = null;
|
||||
private Axis xAxisRotation = null;
|
||||
private Axis yAxisRotation = null;
|
||||
private Axis zAxisRotation = null;
|
||||
private Axis slider = null;
|
||||
private Axis hat = null;
|
||||
|
||||
public OSXJoystick( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
|
||||
{
|
||||
super( productName );
|
||||
|
||||
this.plugin = plugin;
|
||||
this.lpDevice = lpDevice;
|
||||
|
||||
openDevice();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of the Controller.
|
||||
*/
|
||||
public Type getType() {
|
||||
return Type.STICK;
|
||||
}
|
||||
|
||||
public boolean poll()
|
||||
{
|
||||
plugin.pollDevice( lpQueue );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void openDevice()
|
||||
{
|
||||
this.lpQueue = plugin.openDevice( this.lpDevice, 32 );
|
||||
}
|
||||
|
||||
public void closeDevice()
|
||||
{
|
||||
plugin.closeDevice( this.lpDevice, this.lpQueue );
|
||||
}
|
||||
|
||||
public void pollDevice()
|
||||
{
|
||||
plugin.pollDevice( this.lpQueue );
|
||||
}
|
||||
|
||||
public Component[] getComponents() {
|
||||
List cpList = new ArrayList(buttons);
|
||||
if (xAxis != null) cpList.add(xAxis);
|
||||
if (yAxis != null) cpList.add(yAxis);
|
||||
if (zAxis != null) cpList.add(zAxis);
|
||||
if (xAxisRotation != null) cpList.add(xAxisRotation);
|
||||
if (yAxisRotation != null) cpList.add(yAxisRotation);
|
||||
if (zAxisRotation != null) cpList.add(zAxisRotation);
|
||||
if (slider != null) cpList.add(slider);
|
||||
if (hat != null) cpList.add(hat);
|
||||
Component[] ca = new Component[cpList.size()];
|
||||
return (Component[]) cpList.toArray(ca);
|
||||
}
|
||||
|
||||
|
||||
public void addControllerElement(InputControllerElement element)
|
||||
{
|
||||
|
||||
switch ( element.getElementType() )
|
||||
{
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_BUTTON:
|
||||
Button button = null;
|
||||
switch (buttonCount) {
|
||||
case 0:
|
||||
button = new Button(Component.Identifier.Button.TRIGGER, element);
|
||||
break;
|
||||
case 1:
|
||||
button = new Button(Component.Identifier.Button._2, element);
|
||||
break;
|
||||
case 2:
|
||||
button = new Button(Component.Identifier.Button._3, element);
|
||||
break;
|
||||
case 3:
|
||||
button = new Button(Component.Identifier.Button._4, element);
|
||||
break;
|
||||
case 4:
|
||||
button = new Button(Component.Identifier.Button._5, element);
|
||||
break;
|
||||
case 5:
|
||||
button = new Button(Component.Identifier.Button._6, element);
|
||||
break;
|
||||
case 6:
|
||||
button = new Button(Component.Identifier.Button._7, element);
|
||||
break;
|
||||
case 7:
|
||||
button = new Button(Component.Identifier.Button._8, element);
|
||||
break;
|
||||
case 8:
|
||||
button = new Button(Component.Identifier.Button._9, element);
|
||||
break;
|
||||
default:
|
||||
String name = String.valueOf(buttonCount + 1);
|
||||
button = new Button(new Component.Identifier.Button(name), element);
|
||||
break;
|
||||
}
|
||||
buttons.add(button);
|
||||
buttonCount++;
|
||||
System.out.println("Adding button [" + buttonCount + "]");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_MISC:
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_AXIS:
|
||||
switch (element.getUsage()) {
|
||||
case OSXEnvironmentPlugin.HID_USAGE_XAXIS:
|
||||
xAxis = new Axis(Component.Identifier.Axis.X, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_YAXIS:
|
||||
yAxis = new Axis(Component.Identifier.Axis.Y, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_ZAXIS:
|
||||
zAxis = new Axis(Component.Identifier.Axis.Z, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_XAXIS_ROTATION:
|
||||
xAxisRotation = new Axis(Component.Identifier.Axis.RX, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_YAXIS_ROTATION:
|
||||
yAxisRotation = new Axis(Component.Identifier.Axis.RY, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_ZAXIS_ROTATION:
|
||||
zAxisRotation = new Axis(Component.Identifier.Axis.RZ, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_SLIDER:
|
||||
slider = new Axis(Component.Identifier.Axis.SLIDER, element);
|
||||
break;
|
||||
case OSXEnvironmentPlugin.HID_USAGE_HAT:
|
||||
hat = new Axis(Component.Identifier.Axis.POV, element);
|
||||
break;
|
||||
default:
|
||||
System.out.println("*Unknown axis");
|
||||
break;
|
||||
}
|
||||
|
||||
System.out.println("*Adding axis");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_SCANCODES:
|
||||
System.out.println("*Adding scancode");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_OUTPUT:
|
||||
System.out.println("*Adding forcefeedback");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_FEATURE:
|
||||
|
||||
System.out.println("*Adding feature");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_ELEMENTTYPE_COLLECTION:
|
||||
System.out.println("*Adding collection");
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mouse button axis implementation
|
||||
*/
|
||||
class Button extends AbstractComponent
|
||||
{
|
||||
|
||||
private long hidCookie;
|
||||
private boolean isRelative;
|
||||
|
||||
|
||||
|
||||
/** Public constructor
|
||||
* @param id An ID of a button to create an obejct to represent.
|
||||
*
|
||||
*/
|
||||
public Button(Component.Identifier.Button id, InputControllerElement element)
|
||||
{
|
||||
super(id.getName(), id);
|
||||
this.hidCookie = element.getHidCookie();
|
||||
this.isRelative = element.isRelative();
|
||||
}
|
||||
|
||||
/** Returns the data from the last time the control has been polled.
|
||||
* If this axis is a button, the value returned will be either 0.0f or 1.0f.
|
||||
* If this axis is normalized, the value returned will be between -1.0f and
|
||||
* 1.0f.
|
||||
* @return state of controller. (Note: DX8 mice actually
|
||||
* queue state so what is returned is the next state,
|
||||
* not necessarily the most current one.)
|
||||
*/
|
||||
public float getPollData()
|
||||
{
|
||||
return (float) plugin.pollElement( lpDevice, hidCookie );
|
||||
}
|
||||
|
||||
/** Returns <code>true</code> if data returned from <code>poll</code>
|
||||
* is relative to the last call, or <code>false</code> if data
|
||||
* is absolute.
|
||||
* @return true if data is relative, otherwise false.
|
||||
*/
|
||||
public boolean isRelative()
|
||||
{
|
||||
return isRelative;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Mouse button axis implementation
|
||||
*/
|
||||
class Axis extends AbstractComponent
|
||||
{
|
||||
|
||||
private long hidCookie;
|
||||
private boolean isRelative;
|
||||
|
||||
/** Public constructor
|
||||
* @param id An ID of a button to create an obejct to represent.
|
||||
*
|
||||
*/
|
||||
public Axis(Component.Identifier id, InputControllerElement element)
|
||||
{
|
||||
super(id.getName(), id);
|
||||
this.hidCookie = element.getHidCookie();
|
||||
this.isRelative = element.isRelative();
|
||||
}
|
||||
|
||||
/** Returns the data from the last time the control has been polled.
|
||||
* If this axis is a button, the value returned will be either 0.0f or 1.0f.
|
||||
* If this axis is normalized, the value returned will be between -1.0f and
|
||||
* 1.0f.
|
||||
* @return state of controller. (Note: DX8 mice actually
|
||||
* queue state so what is returned is the next state,
|
||||
* not necessarily the most current one.)
|
||||
*/
|
||||
public float getPollData()
|
||||
{
|
||||
return (float) plugin.pollElement( lpDevice, hidCookie );
|
||||
}
|
||||
|
||||
/** Returns <code>true</code> if data returned from <code>poll</code>
|
||||
* is relative to the last call, or <code>false</code> if data
|
||||
* is absolute.
|
||||
* @return true if data is relative, otherwise false.
|
||||
*/
|
||||
public boolean isRelative()
|
||||
{
|
||||
return isRelative;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,253 +1,68 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: gpierce
|
||||
* Date: Aug 2, 2003
|
||||
* Time: 3:57:58 PM
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class OSXKeyboard extends StandardKeyboard implements InputController
|
||||
{
|
||||
/** Represents an OSX Keyboard
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXKeyboard extends Keyboard {
|
||||
private final PortType port;
|
||||
private final OSXHIDQueue queue;
|
||||
|
||||
protected OSXKeyboard(OSXHIDDevice device, OSXHIDQueue queue, Component[] components, Controller[] children, Rumbler[] rumblers) {
|
||||
super(device.getProductName(), components, children, rumblers);
|
||||
this.queue = queue;
|
||||
this.port = device.getPortType();
|
||||
}
|
||||
|
||||
private final static int[] CROSSTABLE = {
|
||||
0x00, // VOID
|
||||
0x29, // ESCAPE
|
||||
0x1E, // _1
|
||||
0x1F, // _2
|
||||
0x20, // _3
|
||||
0x21, // _4
|
||||
0x22, // _5
|
||||
0x23, // _6
|
||||
0x24, // _7
|
||||
0x25, // _8
|
||||
0x26, // _9
|
||||
0x27, // _0
|
||||
0x2D, // MINUS
|
||||
0x2E, // EQUALS
|
||||
0x2A, // BACK
|
||||
0x2B, // TAB
|
||||
0x14, // Q
|
||||
0x1A, // W
|
||||
0x08, // E
|
||||
0x15, // R
|
||||
0x17, // T
|
||||
0x1C, // Y
|
||||
0x18, // U
|
||||
0x0C, // I
|
||||
0x12, // O
|
||||
0x13, // P
|
||||
0x2F, // [
|
||||
0x30, // ]
|
||||
0x28, // RETURN
|
||||
0xE0, // LEFT CONTROL
|
||||
0x04, // A
|
||||
0x16, // S
|
||||
0x07, // D
|
||||
0x09, // F
|
||||
0x0A, // G
|
||||
0x0B, // H
|
||||
0x0D, // J
|
||||
0x0E, // K
|
||||
0x0F, // L
|
||||
0x33, // ;
|
||||
0x34, // '
|
||||
0x35, // ~
|
||||
0xE1, // /
|
||||
0x31, // BACKSLASH (\)
|
||||
0x1D, // Z
|
||||
0x1B, // X
|
||||
0x06, // C
|
||||
0x19, // V
|
||||
0x05, // B
|
||||
0x11, // N
|
||||
0x10, // M
|
||||
0x36, // ,
|
||||
0x37, // .
|
||||
0x38, // SLASH (/)
|
||||
0xE5, // RSHIFT
|
||||
0x55, // MULT (*)
|
||||
0xE2, // LEFT ALT
|
||||
0x2C, // SPACE
|
||||
0x39, // CAPSLOCK
|
||||
0x3A, // F1
|
||||
0x3B, // F2
|
||||
0x3C, // F3
|
||||
0x3D, // F4
|
||||
0x3E, // F5
|
||||
0x3F, // F6
|
||||
0x40, // F7
|
||||
0x41, // F8
|
||||
0x42, // F9
|
||||
0x43, // F10
|
||||
0x53, // NUMLOCK
|
||||
0x47, // SCROLLLOCK
|
||||
0x5F, // NUMPAD7
|
||||
0x60, // NUMPAD8
|
||||
0x61, // NUMPAD9
|
||||
0x56, // SUBTRACT (KEYPAD -)
|
||||
0x5C, // NUMPAD4
|
||||
0x5D, // NUMPAD5
|
||||
0x5E, // NUMPAD6
|
||||
0x57, // ADD (KEYPAD +)
|
||||
0x59, // NUMPAD1
|
||||
0x5A, // NUMPAD2
|
||||
0x5B, // NUMPAD3
|
||||
0x62, // NUMPAD0
|
||||
0x63, // DECIMAL (KEYPAD .)
|
||||
0x44, // F11
|
||||
0x45, // F12
|
||||
0x68, // F13
|
||||
0x69, // F14
|
||||
0x6A, // F15
|
||||
0x87, // KANA
|
||||
0x88, // CONVERT
|
||||
0x89, // NONCONVERT
|
||||
0x8A, // YEN
|
||||
0x67, // NUMPAD=
|
||||
0x8B, // CIRCUMFLEX
|
||||
0x8C, // AT
|
||||
0x8D, // COLON
|
||||
0x9F, // UNDERLINE
|
||||
0x8E, // KANJI
|
||||
0x78, // STOP
|
||||
0x8F, // AX
|
||||
0x90, // UNLABELED
|
||||
0x58, // NUMPAD ENTER
|
||||
0xE4, // RIGHT CONTROL
|
||||
0x85, // NUMPAD COMMA
|
||||
0x54, // DIVIDE ( NUMPAD /)
|
||||
0x9A, // SYSREQ
|
||||
0xE6, // RIGHT ALT
|
||||
0x48, // PAUSE
|
||||
0x4A, // HOME
|
||||
0x52, // UP
|
||||
0x9D, // PRIOR
|
||||
0x50, // LEFT
|
||||
0x4F, // RIGHT
|
||||
0x4D, // END
|
||||
0x51, // DOWN
|
||||
0xA2, // NEXT
|
||||
0x49, // INSERT
|
||||
0x4C, // DELETE
|
||||
0xE3, // LEFT WIN
|
||||
0xE7, // RIGHT WIN
|
||||
0x65, // APPS
|
||||
0x66, // POWER
|
||||
0x66 // SLEEP
|
||||
};
|
||||
protected final boolean getNextDeviceEvent(Event event) throws IOException {
|
||||
return OSXControllers.getNextDeviceEvent(event, queue);
|
||||
}
|
||||
|
||||
protected final void setDeviceEventQueueSize(int size) throws IOException {
|
||||
queue.setQueueDepth(size);
|
||||
}
|
||||
|
||||
private OSXEnvironmentPlugin plugin;
|
||||
private long lpDevice;
|
||||
private long lpQueue;
|
||||
private HashMap keys = new HashMap();
|
||||
|
||||
private static int[] COOKIETABLE = new int[CROSSTABLE.length ];
|
||||
|
||||
public OSXKeyboard( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
|
||||
{
|
||||
super( productName );
|
||||
|
||||
this.plugin = plugin;
|
||||
this.lpDevice = lpDevice;
|
||||
|
||||
openDevice();
|
||||
}
|
||||
|
||||
public void openDevice()
|
||||
{
|
||||
this.lpQueue = plugin.openDevice( this.lpDevice, 256 );
|
||||
}
|
||||
|
||||
public void closeDevice()
|
||||
{
|
||||
plugin.closeDevice( this.lpDevice, this.lpQueue );
|
||||
}
|
||||
|
||||
public void addControllerElement(InputControllerElement element)
|
||||
{
|
||||
System.out.println("Adding keyboard elements usage page[" + element.getUsagePage() + "] usage [" + element.getUsage() + "] type [" + element.getElementType() + "]" );
|
||||
|
||||
switch( element.getUsagePage() )
|
||||
{
|
||||
case OSXEnvironmentPlugin.HID_USAGEPAGE_KEYBOARD:
|
||||
|
||||
System.out.println("Found keyboard element");
|
||||
|
||||
if ( element.getElementType() == OSXEnvironmentPlugin.HID_ELEMENTTYPE_INPUT_BUTTON )
|
||||
{
|
||||
// register this key with the queue system as all buttons are retrieved from the
|
||||
// input controllers queue
|
||||
//
|
||||
System.out.println("Registering button-key (usage page [" + element.getUsagePage() + "], usage[" + element.getUsage() + "], elementType [" + element.getElementType() + "], hidCookie [" + element.getHidCookie() + "])");
|
||||
|
||||
|
||||
if ( keys.get( new Long( element.getUsage() )) == null )
|
||||
{
|
||||
plugin.registerDeviceElement( lpQueue, element.getHidCookie() );
|
||||
|
||||
keys.put( new Long( element.getUsage() ), element );
|
||||
System.out.println("Registered key [" + element.getHidCookie() + "]");
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("Ignoring key [" + element.getHidCookie() + "] already enumerated.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("Ignoring non-button-key (usage page [" + element.getUsagePage() + "], usage[" + element.getUsage() + "], elementType [" + element.getElementType() + "], hidCookie [" + element.getHidCookie() + "])");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
public boolean poll()
|
||||
{
|
||||
plugin.pollDevice( lpQueue );
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/** Returns whether or not the given key has been pressed since the last
|
||||
* call to poll.
|
||||
* @param key The key whose state to check.
|
||||
* @return true if this key has changed state since last read of its state, false otherwise.
|
||||
*/
|
||||
protected boolean isKeyPressed(Keyboard.Key key)
|
||||
{
|
||||
Component.Identifier.Key id = (Component.Identifier.Key) key.getIdentifier();
|
||||
int keyIndex = id.getKeyIndex();
|
||||
|
||||
// get that key code out of the crosstable and find the proper InputControllerElement/button for that key
|
||||
//
|
||||
//TODO: Optimize this - put the usages in another array the same size as the crosstable so the hidCookies
|
||||
// can be retrieved directly without the Long creation
|
||||
int usage = CROSSTABLE[keyIndex];
|
||||
InputControllerElement element = (InputControllerElement) keys.get( new Long(usage) );
|
||||
|
||||
|
||||
if ( element != null )
|
||||
{
|
||||
int value = plugin.pollElement( lpDevice, element.getHidCookie() );
|
||||
|
||||
System.out.println("Key Poll result [" + value + "]");
|
||||
if ( value == 1 )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
public final PortType getPortType() {
|
||||
return port;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,251 +1,68 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: gpierce
|
||||
* Date: Aug 2, 2003
|
||||
* Time: 3:57:00 PM
|
||||
* To change this template use Options | File Templates.
|
||||
*/
|
||||
public class OSXMouse extends Mouse implements InputController
|
||||
{
|
||||
private OSXEnvironmentPlugin plugin;
|
||||
private long lpDevice;
|
||||
private long lpQueue;
|
||||
private int buttonCount = 0;
|
||||
import java.io.IOException;
|
||||
|
||||
/** Represents an OSX Mouse
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class OSXMouse extends Mouse {
|
||||
private final PortType port;
|
||||
private final OSXHIDQueue queue;
|
||||
|
||||
protected OSXMouse(OSXHIDDevice device, OSXHIDQueue queue, Component[] components, Controller[] children, Rumbler[] rumblers) {
|
||||
super(device.getProductName(), components, children, rumblers);
|
||||
this.queue = queue;
|
||||
this.port = device.getPortType();
|
||||
}
|
||||
|
||||
public OSXMouse( OSXEnvironmentPlugin plugin, long lpDevice, String productName )
|
||||
{
|
||||
super( productName );
|
||||
protected final boolean getNextDeviceEvent(Event event) throws IOException {
|
||||
return OSXControllers.getNextDeviceEvent(event, queue);
|
||||
}
|
||||
|
||||
this.plugin = plugin;
|
||||
this.lpDevice = lpDevice;
|
||||
|
||||
openDevice();
|
||||
|
||||
buttons = new ButtonsImpl();
|
||||
ball = new BallImpl();
|
||||
}
|
||||
|
||||
public void openDevice()
|
||||
{
|
||||
this.lpQueue = plugin.openDevice( this.lpDevice, 32 );
|
||||
}
|
||||
|
||||
public void closeDevice()
|
||||
{
|
||||
plugin.closeDevice( this.lpDevice, this.lpQueue );
|
||||
}
|
||||
|
||||
public boolean poll()
|
||||
{
|
||||
plugin.pollDevice( this.lpQueue );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void addControllerElement(InputControllerElement element)
|
||||
{
|
||||
|
||||
switch ( element.getUsagePage() )
|
||||
{
|
||||
case OSXEnvironmentPlugin.HID_USAGEPAGE_BUTTON:
|
||||
buttonCount ++;
|
||||
System.out.println("Adding button [" + buttonCount + "]");
|
||||
((ButtonsImpl)buttons).addButton(element);
|
||||
break;
|
||||
|
||||
|
||||
case OSXEnvironmentPlugin.HID_USAGEPAGE_GENERICDESKTOP:
|
||||
switch( element.getUsage() )
|
||||
{
|
||||
case OSXEnvironmentPlugin.HID_USAGE_POINTER:
|
||||
System.out.println("Adding pointer - this will contain axis");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_USAGE_XAXIS:
|
||||
((BallImpl)ball).addXAxis(element);
|
||||
System.out.println("Adding X Axis") ;
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_USAGE_YAXIS:
|
||||
((BallImpl)ball).addYAxis(element);
|
||||
System.out.println("Adding Y Axis");
|
||||
break;
|
||||
|
||||
case OSXEnvironmentPlugin.HID_USAGE_WHEEL:
|
||||
((BallImpl)ball).addWheelAxis(element);
|
||||
System.out.println("Adding wheel");
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation class representing the mouse ball
|
||||
*/
|
||||
class BallImpl extends Ball
|
||||
{
|
||||
/**
|
||||
* Public constructor
|
||||
*/
|
||||
public BallImpl()
|
||||
{
|
||||
super(OSXMouse.this.getName() + " ball");
|
||||
}
|
||||
|
||||
public void addXAxis( InputControllerElement element )
|
||||
{
|
||||
x = new BallAxis(Component.Identifier.Axis.X, element );
|
||||
}
|
||||
|
||||
public void addYAxis( InputControllerElement element )
|
||||
{
|
||||
y = new BallAxis( Component.Identifier.Axis.Y, element );
|
||||
}
|
||||
|
||||
public void addWheelAxis( InputControllerElement element )
|
||||
{
|
||||
wheel = new BallAxis( Component.Identifier.Axis.SLIDER, element );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Implementation class representing the mouse buttons
|
||||
*/
|
||||
class ButtonsImpl extends Buttons
|
||||
{
|
||||
/**
|
||||
* Public constructor
|
||||
*/
|
||||
public ButtonsImpl()
|
||||
{
|
||||
super(OSXMouse.this.getName() + " buttons");
|
||||
}
|
||||
|
||||
public void addButton( InputControllerElement element )
|
||||
{
|
||||
if ( left == null )
|
||||
{
|
||||
left = new ButtonImpl( Component.Identifier.Button.LEFT, element );
|
||||
}
|
||||
else if ( right == null )
|
||||
{
|
||||
right = new ButtonImpl( Component.Identifier.Button.RIGHT, element );
|
||||
}
|
||||
else if ( middle == null )
|
||||
{
|
||||
middle = new ButtonImpl( Component.Identifier.Button.MIDDLE, element );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mouse button axis implementation
|
||||
*/
|
||||
class ButtonImpl extends Button
|
||||
{
|
||||
|
||||
private long hidCookie;
|
||||
private boolean isRelative;
|
||||
|
||||
|
||||
/** Public constructor
|
||||
* @param id An ID of a button to create an obejct to represent.
|
||||
*
|
||||
*/
|
||||
public ButtonImpl(Component.Identifier.Button id, InputControllerElement element)
|
||||
{
|
||||
super(id.getName(), id);
|
||||
this.hidCookie = element.getHidCookie();
|
||||
this.isRelative = element.isRelative();
|
||||
}
|
||||
|
||||
/** Returns the data from the last time the control has been polled.
|
||||
* If this axis is a button, the value returned will be either 0.0f or 1.0f.
|
||||
* If this axis is normalized, the value returned will be between -1.0f and
|
||||
* 1.0f.
|
||||
* @return state of controller. (Note: DX8 mice actually
|
||||
* queue state so what is returned is the next state,
|
||||
* not necessarily the most current one.)
|
||||
*/
|
||||
public float getPollData()
|
||||
{
|
||||
return (float) plugin.pollElement( lpDevice, hidCookie );
|
||||
}
|
||||
|
||||
/** Returns <code>true</code> if data returned from <code>poll</code>
|
||||
* is relative to the last call, or <code>false</code> if data
|
||||
* is absolute.
|
||||
* @return true if data is relative, otherwise false.
|
||||
*/
|
||||
public boolean isRelative()
|
||||
{
|
||||
return isRelative;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Mouse ball axis implementation
|
||||
*/
|
||||
class BallAxis extends AbstractComponent
|
||||
{
|
||||
|
||||
private long hidCookie;
|
||||
private boolean isRelative;
|
||||
|
||||
/** Public constructor
|
||||
* @param id An ID for a mouse axis to create an object to represent.
|
||||
*/
|
||||
public BallAxis(Component.Identifier.Axis id, InputControllerElement element)
|
||||
{
|
||||
super(id.getName(), id);
|
||||
|
||||
this.hidCookie = element.getHidCookie();
|
||||
this.isRelative = element.isRelative();
|
||||
}
|
||||
|
||||
/** Returns the data from the last time the control has been polled.
|
||||
* If this axis is a button, the value returned will be either 0.0f or 1.0f.
|
||||
* If this axis is normalized, the value returned will be between -1.0f and
|
||||
* 1.0f.
|
||||
* @return data. (Note that mice queue state in DX8 so what
|
||||
* is returned is the next stae in the queue, not
|
||||
* necessarily the most current one.)
|
||||
*/
|
||||
public float getPollData()
|
||||
{
|
||||
return (float) plugin.pollElement( lpDevice, hidCookie );
|
||||
}
|
||||
|
||||
/** Returns <code>true</code> if data returned from <code>poll</code>
|
||||
* is relative to the last call, or <code>false</code> if data
|
||||
* is absolute.
|
||||
* @return true if relative, otherwise false.
|
||||
*/
|
||||
public boolean isRelative()
|
||||
{
|
||||
return isRelative;
|
||||
}
|
||||
|
||||
/** Returns whether or not the axis is analog, or false if it is digital.
|
||||
* @return true if analog, false if digital
|
||||
*/
|
||||
public boolean isAnalog()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
protected final void setDeviceEventQueueSize(int size) throws IOException {
|
||||
queue.setQueueDepth(size);
|
||||
}
|
||||
|
||||
public final PortType getPortType() {
|
||||
return port;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
46
plugins/OSX/src/java/net/java/games/input/Usage.java
Normal file
46
plugins/OSX/src/java/net/java/games/input/Usage.java
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
/** Generic Desktop Usages
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
public interface Usage {
|
||||
}
|
||||
114
plugins/OSX/src/java/net/java/games/input/UsagePage.java
Normal file
114
plugins/OSX/src/java/net/java/games/input/UsagePage.java
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
/** HID Usage pages
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
final class UsagePage {
|
||||
private final static UsagePage[] map = new UsagePage[0xFF];
|
||||
|
||||
public final static UsagePage UNDEFINED = new UsagePage(0x00);
|
||||
public final static UsagePage GENERIC_DESKTOP = new UsagePage(0x01, GenericDesktopUsage.class);
|
||||
public final static UsagePage SIMULATION = new UsagePage(0x02);
|
||||
public final static UsagePage VR = new UsagePage(0x03);
|
||||
public final static UsagePage SPORT = new UsagePage(0x04);
|
||||
public final static UsagePage GAME = new UsagePage(0x05);
|
||||
/* Reserved 0x06 */
|
||||
public final static UsagePage KEYBOARD_OR_KEYPAD = new UsagePage(0x07, KeyboardUsage.class); /* USB Device Class Definition for Human Interface Devices (HID). Note: the usage type for all key codes is Selector (Sel). */
|
||||
public final static UsagePage LEDS = new UsagePage(0x08);
|
||||
public final static UsagePage BUTTON = new UsagePage(0x09, ButtonUsage.class);
|
||||
public final static UsagePage ORDINAL = new UsagePage(0x0A);
|
||||
public final static UsagePage TELEPHONY = new UsagePage(0x0B);
|
||||
public final static UsagePage CONSUMER = new UsagePage(0x0C);
|
||||
public final static UsagePage DIGITIZER = new UsagePage(0x0D);
|
||||
/* Reserved 0x0E */
|
||||
public final static UsagePage PID = new UsagePage(0x0F); /* USB Physical Interface Device definitions for force feedback and related devices. */
|
||||
public final static UsagePage UNICODE = new UsagePage(0x10);
|
||||
/* Reserved 0x11 - 0x13 */
|
||||
public final static UsagePage ALPHANUMERIC_DISPLAY = new UsagePage(0x14);
|
||||
/* Reserved 0x15 - 0x7F */
|
||||
/* Monitor 0x80 - 0x83 USB Device Class Definition for Monitor Devices */
|
||||
/* Power 0x84 - 0x87 USB Device Class Definition for Power Devices */
|
||||
public final static UsagePage POWER_DEVICE = new UsagePage(0x84); /* Power Device Page */
|
||||
public final static UsagePage BATTERY_SYSTEM = new UsagePage(0x85); /* Battery System Page */
|
||||
/* Reserved 0x88 - 0x8B */
|
||||
public final static UsagePage BAR_CODE_SCANNER = new UsagePage(0x8C); /* (Point of Sale) USB Device Class Definition for Bar Code Scanner Devices */
|
||||
public final static UsagePage SCALE = new UsagePage(0x8D); /* (Point of Sale) USB Device Class Definition for Scale Devices */
|
||||
/* ReservedPointofSalepages 0x8E - 0X8F */
|
||||
public final static UsagePage CAMERACONTROL= new UsagePage(0x90); /* USB Device Class Definition for Image Class Devices */
|
||||
public final static UsagePage ARCADE = new UsagePage(0x91); /* OAAF Definitions for arcade and coinop related Devices */
|
||||
private final Class usage_class;
|
||||
private final int usage_page_id;
|
||||
|
||||
public final static UsagePage map(int page_id) {
|
||||
if (page_id < 0 || page_id >= map.length)
|
||||
return null;
|
||||
return map[page_id];
|
||||
}
|
||||
|
||||
private UsagePage(int page_id, Class usage_class) {
|
||||
map[page_id] = this;
|
||||
this.usage_class = usage_class;
|
||||
this.usage_page_id = page_id;
|
||||
}
|
||||
|
||||
private UsagePage(int page_id) {
|
||||
this(page_id, null);
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "UsagePage (0x" + Integer.toHexString(usage_page_id) + ")";
|
||||
}
|
||||
|
||||
public final Usage mapUsage(int usage_id) {
|
||||
if (usage_class == null)
|
||||
return null;
|
||||
try {
|
||||
Method map_method = usage_class.getMethod("map", new Class[]{int.class});
|
||||
Object result = map_method.invoke(null, new Object[]{new Integer(usage_id)});
|
||||
return (Usage)result;
|
||||
} catch (Exception e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
76
plugins/OSX/src/java/net/java/games/input/UsagePair.java
Normal file
76
plugins/OSX/src/java/net/java/games/input/UsagePair.java
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
package net.java.games.input;
|
||||
|
||||
/** Usage/Page pair
|
||||
* @author elias
|
||||
* @version 1.0
|
||||
*/
|
||||
class UsagePair {
|
||||
private final UsagePage usage_page;
|
||||
private final Usage usage;
|
||||
|
||||
public UsagePair(UsagePage usage_page, Usage usage) {
|
||||
this.usage_page = usage_page;
|
||||
this.usage = usage;
|
||||
}
|
||||
|
||||
public final UsagePage getUsagePage() {
|
||||
return usage_page;
|
||||
}
|
||||
|
||||
public final Usage getUsage() {
|
||||
return usage;
|
||||
}
|
||||
|
||||
public final int hashCode() {
|
||||
return usage.hashCode() ^ usage_page.hashCode();
|
||||
}
|
||||
|
||||
public final boolean equals(Object other) {
|
||||
if (!(other instanceof UsagePair))
|
||||
return false;
|
||||
UsagePair other_pair = (UsagePair)other;
|
||||
return other_pair.usage.equals(usage) && other_pair.usage_page.equals(usage_page);
|
||||
}
|
||||
|
||||
public final String toString() {
|
||||
return "UsagePair: (page = " + usage_page + ", usage = " + usage + ")";
|
||||
}
|
||||
}
|
||||
|
|
@ -1,23 +1,67 @@
|
|||
<?xml version="1.0" ?>
|
||||
<project name="OS X Plugin, Native code" basedir="." default="compileNativeJinputLib">
|
||||
<description>OSX JInput Native Plugin</description>
|
||||
<property name="src" location="src" />
|
||||
<property name="build" location="classes" />
|
||||
<property name="dist" location="../../dist" />
|
||||
<property name="plugins" location="plugins" />
|
||||
|
||||
<target name="init">
|
||||
<mkdir dir="build"/>
|
||||
</target>
|
||||
<description>OSX JInput Native Plugin</description>
|
||||
|
||||
<target name="compileNativeJinputLib" depends="init">
|
||||
<exec dir="." executable="cc" os="Mac OS X">
|
||||
|
||||
<arg line="-c -I${java.home}/include jinputjnilib.c"/>
|
||||
</exec>
|
||||
<exec dir="." executable="cc" os="Mac OS X">
|
||||
<arg line="-bundle -o libjinput.jnilib jinputjnilib.o -framework JavaVM -framework CoreFoundation -framework IOKit "/>
|
||||
</exec>
|
||||
</target>
|
||||
<target name="init">
|
||||
<mkdir dir="universal"/>
|
||||
<mkdir dir="legacy"/>
|
||||
</target>
|
||||
|
||||
<target name="clean">
|
||||
<delete failonerror="false">
|
||||
<fileset dir="universal"/>
|
||||
<fileset dir="legacy"/>
|
||||
</delete>
|
||||
</target>
|
||||
|
||||
<target name="compile">
|
||||
<apply dir="${dstdir}" executable="${compiler}" os="Mac OS X" skipemptyfilesets="true" failonerror="true" dest="${dstdir}">
|
||||
<arg line="${cflags} -O2 -Wall -c -fPIC -I${sdkroot}/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers -I../../../../common/src/native -I.."/>
|
||||
<mapper type="glob" from="*.c" to="*.o"/>
|
||||
<fileset dir="." includes="*.c"/>
|
||||
<fileset dir="../../../common/src/native" includes="*.c"/>
|
||||
</apply>
|
||||
</target>
|
||||
|
||||
<target name="link">
|
||||
<apply dir="." parallel="true" executable="${linker}" os="Mac OS X" failonerror="true">
|
||||
<arg line="${linkerflags} -dynamiclib -o ${libname} -framework JavaVM -framework CoreFoundation -framework IOKit -framework CoreServices"/>
|
||||
<fileset dir="${objdir}" includes="*.o"/>
|
||||
</apply>
|
||||
<apply dir="." parallel="true" executable="strip" os="Mac OS X" failonerror="true">
|
||||
<arg line="-S -X"/>
|
||||
<fileset dir="." includes="*.jnilib"/>
|
||||
</apply>
|
||||
</target>
|
||||
|
||||
<target name="compileNativeJinputLib" depends="init">
|
||||
<property name="universal_sdkroot" location="/Developer/SDKs/MacOSX10.4u.sdk"/>
|
||||
<property name="legacy_sdkroot" location="/Developer/SDKs/MacOSX10.3.9.sdk"/>
|
||||
<property name="universal_flags" value="-isysroot ${universal_sdkroot} -arch i386 -arch ppc"/>
|
||||
<antcall target="compile">
|
||||
<param name="dstdir" location="universal"/>
|
||||
<param name="compiler" value="gcc-4.0"/>
|
||||
<param name="sdkroot" location="${universal_sdkroot}"/>
|
||||
<param name="cflags" value="${universal_flags}"/>
|
||||
</antcall>
|
||||
<antcall target="link">
|
||||
<param name="objdir" location="universal"/>
|
||||
<param name="libname" value="libjinput-osx.jnilib"/>
|
||||
<param name="linker" value="gcc-4.0"/>
|
||||
<!-- <param name="linkerflags" value="${universal_flags} -Wl,-syslibroot,${universal_sdkroot}"/>-->
|
||||
<param name="linkerflags" value="${universal_flags}"/>
|
||||
</antcall>
|
||||
<antcall target="compile">
|
||||
<param name="dstdir" location="legacy"/>
|
||||
<param name="compiler" value="gcc-3.3"/>
|
||||
<param name="sdkroot" location="${legacy_sdkroot}"/>
|
||||
<param name="cflags" value=""/>
|
||||
</antcall>
|
||||
<antcall target="link">
|
||||
<param name="objdir" location="legacy"/>
|
||||
<param name="libname" value="libjinput-osx-legacy.jnilib"/>
|
||||
<param name="linker" value="gcc-3.3"/>
|
||||
<param name="linkerflags" value=""/>
|
||||
</antcall>
|
||||
</target>
|
||||
</project>
|
||||
|
|
|
|||
|
|
@ -1,839 +0,0 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <ctype.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sysexits.h>
|
||||
#include <mach/mach.h>
|
||||
#include <mach/mach_error.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
#include <IOKit/hid/IOHIDKeys.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <Carbon/Carbon.h>
|
||||
#include "net_java_games_input_OSXEnvironmentPlugin.h"
|
||||
|
||||
Boolean init( JNIEnv * env );
|
||||
void createMasterPort();
|
||||
void disposeMasterPort();
|
||||
|
||||
|
||||
void createHIDDevice(io_object_t hidDevice, IOHIDDeviceInterface ***hidDeviceInterface);
|
||||
IOReturn openDevice(IOHIDDeviceInterface ***hidDeviceInterface);
|
||||
IOReturn closeDevice(IOHIDDeviceInterface ***hidDeviceInterface);
|
||||
|
||||
|
||||
Boolean showDictionaryElement (CFDictionaryRef dictionary, CFStringRef key);
|
||||
void showProperty(const void * key, const void * value);
|
||||
void displayCFProperty(CFStringRef object, CFTypeRef value);
|
||||
void CFObjectShow( CFTypeRef value );
|
||||
void CFObjectSend( CFTypeRef value );
|
||||
|
||||
jclass CLASS_JNIWrapper = NULL;
|
||||
jmethodID MID_AddController = NULL;
|
||||
jmethodID MID_AddControllerElement = NULL;
|
||||
mach_port_t masterPort = NULL;
|
||||
io_iterator_t hidObjectIterator;
|
||||
|
||||
long elementCookie;
|
||||
long elementType;
|
||||
long usage;
|
||||
long usagePage;
|
||||
long min;
|
||||
long max;
|
||||
long scaledMin;
|
||||
long scaledMax;
|
||||
long size;
|
||||
jboolean isRelative;
|
||||
jboolean isWrapping;
|
||||
jboolean isNonLinear;
|
||||
|
||||
|
||||
JNIEnv * lpEnv;
|
||||
jlong lpDevice;
|
||||
jobject lpObj;
|
||||
jboolean completeElement = JNI_FALSE;
|
||||
|
||||
|
||||
|
||||
|
||||
Boolean showDictionaryElement (CFDictionaryRef dictionary, CFStringRef key)
|
||||
{
|
||||
CFTypeRef value = CFDictionaryGetValue (dictionary, key);
|
||||
if (value)
|
||||
{
|
||||
const char * c = CFStringGetCStringPtr (key, CFStringGetSystemEncoding ());
|
||||
if (c)
|
||||
{
|
||||
printf ("%s", c);
|
||||
}
|
||||
else
|
||||
{
|
||||
CFIndex bufferSize = CFStringGetLength (key) + 1;
|
||||
char * buffer = (char *)malloc (bufferSize);
|
||||
if (buffer)
|
||||
{
|
||||
if (CFStringGetCString (key, buffer, bufferSize, CFStringGetSystemEncoding ()))
|
||||
printf ("%s", buffer);
|
||||
free(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
printf("=");
|
||||
|
||||
CFObjectShow( value );
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
return (value != NULL);
|
||||
}
|
||||
|
||||
static void showCFArray (const void * value, void * parameter)
|
||||
{
|
||||
if (CFGetTypeID (value) != CFDictionaryGetTypeID ())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CFObjectShow(value);
|
||||
}
|
||||
|
||||
void CFObjectShow( CFTypeRef value )
|
||||
{
|
||||
CFTypeID type = CFGetTypeID(value);
|
||||
if (type == CFArrayGetTypeID())
|
||||
{
|
||||
CFRange range = {0, CFArrayGetCount (value)};
|
||||
|
||||
//Show an element array containing one or more element dictionaries
|
||||
CFArrayApplyFunction (value, range, showCFArray, 0);
|
||||
}
|
||||
else if (type == CFBooleanGetTypeID())
|
||||
{
|
||||
printf(CFBooleanGetValue(value) ? "true" : "false");
|
||||
}
|
||||
else if (type == CFDictionaryGetTypeID())
|
||||
{
|
||||
printf("Map\n");
|
||||
|
||||
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementCookieKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementCollectionTypeKey));
|
||||
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementMinKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementMaxKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementScaledMinKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementScaledMaxKey));
|
||||
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementSizeKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementIsRelativeKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementIsWrappingKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementIsNonLinearKey));
|
||||
#ifdef kIOHIDElementHasPreferredStateKey
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementHasPreferredStateKey));
|
||||
#else
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementHasPreferedStateKey));
|
||||
#endif
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementHasNullStateKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementVendorSpecificKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementUnitKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementUnitExponentKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementNameKey));
|
||||
showDictionaryElement (value, CFSTR(kIOHIDElementKey));
|
||||
|
||||
printf("\n\n\n");
|
||||
}
|
||||
else if (type == CFNumberGetTypeID())
|
||||
{
|
||||
long number;
|
||||
if (CFNumberGetValue (value, kCFNumberLongType, &number))
|
||||
{
|
||||
printf("0x%lx (%ld)", number, number);
|
||||
}
|
||||
}
|
||||
else if (type == CFStringGetTypeID())
|
||||
{
|
||||
const char * c = CFStringGetCStringPtr (value, CFStringGetSystemEncoding ());
|
||||
if (c)
|
||||
{
|
||||
printf ("%s", c);
|
||||
}
|
||||
else
|
||||
{
|
||||
CFIndex bufferSize = CFStringGetLength (value) + 1;
|
||||
char * buffer = (char *)malloc (bufferSize);
|
||||
if (buffer)
|
||||
{
|
||||
if (CFStringGetCString (value, buffer, bufferSize, CFStringGetSystemEncoding ()))
|
||||
{
|
||||
printf ("%s", buffer);
|
||||
}
|
||||
|
||||
free(buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
Boolean init(JNIEnv* env)
|
||||
{
|
||||
CLASS_JNIWrapper = (*env)->FindClass(env,"net/java/games/input/OSXEnvironmentPlugin");
|
||||
if ( CLASS_JNIWrapper == NULL )
|
||||
{
|
||||
printf("Class OSXEnvironmentPlugin not found... \n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MID_AddController = (*env)->GetMethodID(env, CLASS_JNIWrapper, "addController", "(JLjava/lang/String;I)V");
|
||||
if (MID_AddController == NULL)
|
||||
{
|
||||
printf("Method addController not found... \n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MID_AddControllerElement = (*env)->GetMethodID(env, CLASS_JNIWrapper, "addControllerElement", "(JJIIIIIIIIZZZZZ)V");
|
||||
if (MID_AddControllerElement == NULL)
|
||||
{
|
||||
printf("Method addControllerElement not found... \n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void createMasterPort()
|
||||
{
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
//Get a Mach port to initiate communication with I/O Kit.
|
||||
//
|
||||
ioReturnValue = IOMasterPort(bootstrap_port, &masterPort);
|
||||
}
|
||||
|
||||
void disposeMasterPort()
|
||||
{
|
||||
//Free master port if we created one.
|
||||
//
|
||||
if (masterPort)
|
||||
{
|
||||
mach_port_deallocate(mach_task_self(), masterPort);
|
||||
}
|
||||
}
|
||||
|
||||
void createHIDDevice( io_object_t hidDevice, IOHIDDeviceInterface ***hidDeviceInterface )
|
||||
{
|
||||
io_name_t className;
|
||||
IOCFPlugInInterface **plugInInterface = NULL;
|
||||
HRESULT plugInResult = S_OK;
|
||||
SInt32 score = 0;
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = IOObjectGetClass(hidDevice, className);
|
||||
if ( ioReturnValue != kIOReturnSuccess )
|
||||
{
|
||||
printf("Failed to get IOObject class name.");
|
||||
}
|
||||
|
||||
printf("Found device type [%s]\n", className);
|
||||
|
||||
ioReturnValue = IOCreatePlugInInterfaceForService(hidDevice,
|
||||
kIOHIDDeviceUserClientTypeID,
|
||||
kIOCFPlugInInterfaceID,
|
||||
&plugInInterface,
|
||||
&score);
|
||||
|
||||
if (ioReturnValue == kIOReturnSuccess)
|
||||
{
|
||||
//Call a method of the intermediate plug-in to create the device
|
||||
//interface
|
||||
//
|
||||
plugInResult = (*plugInInterface)->QueryInterface(plugInInterface,
|
||||
CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID),
|
||||
(LPVOID) hidDeviceInterface);
|
||||
if ( plugInResult != S_OK )
|
||||
{
|
||||
printf("Couldn't create HID class device interface");
|
||||
}
|
||||
|
||||
(*plugInInterface)->Release(plugInInterface);
|
||||
}
|
||||
}
|
||||
|
||||
IOReturn openDevice(IOHIDDeviceInterface ***hidDeviceInterface)
|
||||
{
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
//todo, change this to be controlled from the java layer at each device
|
||||
//
|
||||
ioReturnValue = (**hidDeviceInterface)->open(*hidDeviceInterface, 0 );
|
||||
if ( ioReturnValue != kIOReturnSuccess )
|
||||
{
|
||||
printf("Unable to open device - return [%d]\n", ioReturnValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Successfully opened device \n");
|
||||
}
|
||||
|
||||
return ioReturnValue;
|
||||
}
|
||||
|
||||
IOReturn closeDevice(IOHIDDeviceInterface ***hidDeviceInterface)
|
||||
{
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = (**hidDeviceInterface)->close(*hidDeviceInterface);
|
||||
if ( ioReturnValue != kIOReturnSuccess )
|
||||
{
|
||||
printf("Unable to close device - return [%d]\n", ioReturnValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Successfully closed device \n");
|
||||
}
|
||||
|
||||
// release the device interface
|
||||
//
|
||||
(**hidDeviceInterface)->Release(*hidDeviceInterface);
|
||||
|
||||
return ioReturnValue;
|
||||
}
|
||||
|
||||
static void sendCFArray(const void * value, void * parameter)
|
||||
{
|
||||
if (CFGetTypeID (value) != CFDictionaryGetTypeID ())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CFObjectSend(value);
|
||||
}
|
||||
|
||||
void CFObjectSend( CFTypeRef value )
|
||||
{
|
||||
CFTypeID type = CFGetTypeID(value);
|
||||
if (type == CFArrayGetTypeID())
|
||||
{
|
||||
CFRange range = {0, CFArrayGetCount (value)};
|
||||
|
||||
//Show an element array containing one or more element dictionaries
|
||||
CFArrayApplyFunction (value, range, sendCFArray, 0);
|
||||
}
|
||||
else if (type == CFDictionaryGetTypeID())
|
||||
{
|
||||
// printf("Sending Map\n");
|
||||
|
||||
|
||||
CFTypeRef val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementCookieKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val , kCFNumberLongType, &elementCookie);
|
||||
printf("ElementCookie - 0x%lx (%ld) \n", elementCookie, elementCookie);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementTypeKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &elementType);
|
||||
printf("element Type - 0x%lx (%ld) \n", elementType, elementType);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementUsageKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &usage);
|
||||
printf("usage - 0x%lx (%ld) \n", usage, usage);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementUsagePageKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &usagePage);
|
||||
printf("usage page- 0x%lx (%ld) \n", usagePage, usagePage);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementMinKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &min);
|
||||
//printf("min - 0x%lx (%ld) \n", min, min);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementMaxKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &max);
|
||||
//printf("max - 0x%lx (%ld) \n", max, max);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementScaledMinKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &scaledMin);
|
||||
//printf("scaledMin - 0x%lx (%ld) \n", scaledMin, scaledMin);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementScaledMaxKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &scaledMax);
|
||||
//printf("scaledMax - 0x%lx (%ld) \n", scaledMax, scaledMax);
|
||||
}
|
||||
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementSizeKey) );
|
||||
if ( val )
|
||||
{
|
||||
CFNumberGetValue ( val, kCFNumberLongType, &size);
|
||||
//printf("Size - 0x%lx (%ld) \n", size, size);
|
||||
}
|
||||
|
||||
jboolean isRelative = JNI_FALSE;
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementIsRelativeKey) );
|
||||
if ( val )
|
||||
{
|
||||
isRelative = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
|
||||
|
||||
jboolean isWrapping = JNI_FALSE;
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementIsWrappingKey) );
|
||||
if ( val )
|
||||
{
|
||||
isWrapping = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
|
||||
|
||||
jboolean isNonLinear = JNI_FALSE;
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementIsNonLinearKey) );
|
||||
if ( val )
|
||||
{
|
||||
isNonLinear = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
|
||||
|
||||
jboolean hasPreferredState = JNI_FALSE;
|
||||
#ifdef kIOHIDElementHasPreferredStateKey
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementHasPreferredStateKey) );
|
||||
if ( val )
|
||||
{
|
||||
hasPreferredState = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
#else
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementHasPreferedStateKey) );
|
||||
if ( val )
|
||||
{
|
||||
hasPreferredState = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
#endif
|
||||
|
||||
jboolean hasNullState = JNI_FALSE;
|
||||
val = CFDictionaryGetValue( value, CFSTR(kIOHIDElementHasNullStateKey) );
|
||||
if ( val )
|
||||
{
|
||||
hasNullState = (CFBooleanGetValue(val) ? JNI_TRUE : JNI_FALSE);
|
||||
}
|
||||
|
||||
(*lpEnv)->CallVoidMethod(lpEnv, lpObj, MID_AddControllerElement,
|
||||
(jlong)(long)lpDevice,
|
||||
(jlong)(long)elementCookie,
|
||||
(jint)(long)elementType,
|
||||
(jint)(long)usage,
|
||||
(jint)(long)usagePage,
|
||||
(jint)(long)min,
|
||||
(jint)(long)max,
|
||||
(jint)(long)scaledMin,
|
||||
(jint)(long)scaledMax,
|
||||
(jint)(long)size,
|
||||
(jboolean)isRelative,
|
||||
(jboolean)isWrapping,
|
||||
(jboolean)isNonLinear,
|
||||
(jboolean)hasPreferredState,
|
||||
(jboolean)hasNullState);
|
||||
|
||||
// printf("End of element definition \n");
|
||||
|
||||
|
||||
|
||||
CFTypeRef object = CFDictionaryGetValue (value, CFSTR(kIOHIDElementKey));
|
||||
if (object)
|
||||
{
|
||||
CFObjectSend( object );
|
||||
}
|
||||
|
||||
printf("\n\n\n");
|
||||
}
|
||||
}
|
||||
|
||||
void addControllerElements( CFMutableDictionaryRef dictionary, CFStringRef key )
|
||||
{
|
||||
printf("Adding controller elements\n");
|
||||
|
||||
CFTypeRef value = CFDictionaryGetValue (dictionary, key);
|
||||
if (value)
|
||||
{
|
||||
CFRange range = {0, CFArrayGetCount (value)};
|
||||
CFArrayApplyFunction (value, range, sendCFArray, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: hidCreate
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_hidCreate
|
||||
(JNIEnv * env, jobject obj)
|
||||
{
|
||||
if ( init( env ) )
|
||||
{
|
||||
createMasterPort();
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: hidDispose
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_hidDispose
|
||||
(JNIEnv * env, jobject obj)
|
||||
{
|
||||
disposeMasterPort();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: enumDevices
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_enumDevices
|
||||
(JNIEnv * env, jobject obj)
|
||||
{
|
||||
|
||||
lpEnv = env;
|
||||
lpObj = obj;
|
||||
|
||||
CFMutableDictionaryRef hidMatchDictionary = NULL;
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
Boolean noMatchingDevices = false;
|
||||
|
||||
// Set up a matching dictionary to search the I/O Registry by class
|
||||
// name for all HID class devices
|
||||
//
|
||||
hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
|
||||
|
||||
// Now search I/O Registry for matching devices.
|
||||
//
|
||||
ioReturnValue = IOServiceGetMatchingServices(masterPort, hidMatchDictionary, &hidObjectIterator);
|
||||
|
||||
noMatchingDevices = ((ioReturnValue != kIOReturnSuccess) | (hidObjectIterator == NULL));
|
||||
|
||||
// If search is unsuccessful, print message .
|
||||
//
|
||||
if (noMatchingDevices)
|
||||
{
|
||||
printf("No matching HID class devices found.");
|
||||
return;
|
||||
}
|
||||
|
||||
// IOServiceGetMatchingServices consumes a reference to the
|
||||
// dictionary, so we don't need to release the dictionary ref.
|
||||
//
|
||||
hidMatchDictionary = NULL;
|
||||
|
||||
io_object_t hidDevice = NULL;
|
||||
IOHIDDeviceInterface **hidDeviceInterface = NULL;
|
||||
CFMutableDictionaryRef properties = 0;
|
||||
char path[512];
|
||||
kern_return_t result;
|
||||
|
||||
|
||||
while ((hidDevice = IOIteratorNext(hidObjectIterator)))
|
||||
{
|
||||
result = IORegistryEntryGetPath(hidDevice, kIOServicePlane, path);
|
||||
|
||||
if ( result == KERN_SUCCESS )
|
||||
{
|
||||
result = IORegistryEntryCreateCFProperties(hidDevice,
|
||||
&properties,
|
||||
kCFAllocatorDefault,
|
||||
kNilOptions);
|
||||
}
|
||||
|
||||
if ((result == KERN_SUCCESS) && properties)
|
||||
{
|
||||
//showDictionaryElement(properties, CFSTR(kIOHIDTransportKey));
|
||||
//showDictionaryElement(properties, CFSTR(kIOHIDVendorKey));
|
||||
//printf("ProductID: "); showDictionaryElement(properties, CFSTR(kIOHIDProductIDKey));
|
||||
//printf("VersionNumber: "); showDictionaryElement(properties, CFSTR(kIOHIDVersionNumberKey));
|
||||
//printf("Manufacturer: "); showDictionaryElement(properties, CFSTR(kIOHIDManufacturerKey));
|
||||
//printf("ProductKey: "); showDictionaryElement(properties, CFSTR(kIOHIDProductKey));
|
||||
//printf("SerialNumber: "); showDictionaryElement(properties, CFSTR(kIOHIDSerialNumberKey));
|
||||
//showDictionaryElement(properties, CFSTR(kIOHIDLocationIDKey));
|
||||
//printf("PrimaryUsage: "); showDictionaryElement(properties, CFSTR(kIOHIDPrimaryUsageKey));
|
||||
//showDictionaryElement(properties, CFSTR(kIOHIDPrimaryUsagePageKey));
|
||||
//showDictionaryElement(properties, CFSTR(kIOHIDElementKey));
|
||||
|
||||
|
||||
|
||||
// get the product name
|
||||
//
|
||||
CFTypeRef productName = CFDictionaryGetValue (properties, CFSTR(kIOHIDProductKey));
|
||||
|
||||
// get the usage for this product
|
||||
//
|
||||
long usage;
|
||||
CFNumberGetValue ( CFDictionaryGetValue( properties, CFSTR(kIOHIDPrimaryUsageKey) ), kCFNumberLongType, &usage);
|
||||
|
||||
|
||||
createHIDDevice( hidDevice, &hidDeviceInterface );
|
||||
|
||||
IOObjectRelease( hidDevice );
|
||||
|
||||
if ( hidDeviceInterface != NULL )
|
||||
{
|
||||
(*env)->CallVoidMethod(env, obj, MID_AddController,
|
||||
(jlong)(long)hidDeviceInterface,
|
||||
(*env)->NewStringUTF( env, CFStringGetCStringPtr( productName, CFStringGetSystemEncoding()) ),
|
||||
(jint)usage );
|
||||
lpEnv = env;
|
||||
lpDevice = (jlong)(long)hidDeviceInterface;
|
||||
|
||||
addControllerElements( properties, CFSTR(kIOHIDElementKey) );
|
||||
|
||||
|
||||
}
|
||||
|
||||
//Release the properties dictionary
|
||||
CFRelease(properties);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
IOObjectRelease(hidObjectIterator);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: openDevice
|
||||
* Signature: (JI)J
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_openDevice
|
||||
(JNIEnv * env, jobject obj, jlong lpDevice, jint queueDepth)
|
||||
{
|
||||
IOHIDDeviceInterface **hidDeviceInterface = NULL;
|
||||
hidDeviceInterface = (IOHIDDeviceInterface **) (long)lpDevice;
|
||||
openDevice( &hidDeviceInterface );
|
||||
|
||||
|
||||
IOHIDQueueInterface **queue = NULL;
|
||||
queue = (*hidDeviceInterface)->allocQueue(hidDeviceInterface);
|
||||
|
||||
if (queue)
|
||||
{
|
||||
// create a queue and specify how deep they want the input queue to be
|
||||
//
|
||||
(*queue)->create( queue, 0, (int)queueDepth );
|
||||
printf("InputQueue created %lx with depth %d \n", (long) queue, (int)queueDepth );
|
||||
|
||||
// start the input queue
|
||||
//
|
||||
(*queue)->start( queue );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Unable to create queue for device! \n");
|
||||
}
|
||||
|
||||
return (jlong)(long)queue;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: closeDevice
|
||||
* Signature: (JJ)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_closeDevice
|
||||
(JNIEnv * env, jobject obj, jlong lpDevice, jlong lpQueue)
|
||||
{
|
||||
IOHIDDeviceInterface **hidDeviceInterface = NULL;
|
||||
hidDeviceInterface = (IOHIDDeviceInterface **) (long)lpDevice;
|
||||
|
||||
IOHIDQueueInterface **queue = NULL;
|
||||
queue = (IOHIDQueueInterface **)(long)lpQueue;
|
||||
|
||||
// stop the queue
|
||||
//
|
||||
(*queue)->stop(queue);
|
||||
|
||||
// dispose of the queue
|
||||
//
|
||||
(*queue)->dispose(queue);
|
||||
|
||||
// release the queue
|
||||
//
|
||||
(*queue)->Release(queue);
|
||||
|
||||
// close the input device
|
||||
//
|
||||
closeDevice( &hidDeviceInterface );
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: pollDevice
|
||||
* Signature: (J)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_pollDevice
|
||||
(JNIEnv * env, jobject obj, jlong lpQueue)
|
||||
{
|
||||
IOHIDEventStruct event;
|
||||
|
||||
IOHIDQueueInterface **queue = NULL;
|
||||
queue = (IOHIDQueueInterface **)(long)lpQueue;
|
||||
|
||||
AbsoluteTime zeroTime = {0,0};
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = (*queue)->getNextEvent(queue, &event, zeroTime, 0);
|
||||
if ( ioReturnValue == kIOReturnSuccess )
|
||||
{
|
||||
printf("Queue getNextEvent return value: %ld\n", (long)ioReturnValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Queue event[%lx] %ld\n", (unsigned long) event.elementCookie, event.value );
|
||||
}
|
||||
|
||||
return (jint) event.value;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: pollDevice
|
||||
* Signature: (JJ)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_pollElement
|
||||
(JNIEnv * env, jobject obj, jlong lpDevice, jlong hidCookie)
|
||||
{
|
||||
IOHIDDeviceInterface **hidDeviceInterface = NULL;
|
||||
hidDeviceInterface = (IOHIDDeviceInterface **) (long)lpDevice;
|
||||
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(long)hidCookie;
|
||||
|
||||
IOHIDEventStruct event;
|
||||
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = (*hidDeviceInterface)->getElementValue(hidDeviceInterface, cookie, &event);
|
||||
if ( ioReturnValue == kIOReturnSuccess )
|
||||
{
|
||||
printf("Queue getNextEvent return value: %ld\n", (long)ioReturnValue );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Queue event[%lx] %ld\n", (unsigned long) event.elementCookie, event.value );
|
||||
}
|
||||
|
||||
return (jint) event.value;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: registerDeviceElement
|
||||
* Signature: (JJ)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_registerDeviceElement
|
||||
(JNIEnv * env, jobject obj, jlong lpQueue, jlong hidCookie)
|
||||
{
|
||||
IOHIDQueueInterface **queue = NULL;
|
||||
queue = (IOHIDQueueInterface **)(long)lpQueue;
|
||||
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(long)hidCookie;
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = (*queue)->addElement(queue, cookie, 0);
|
||||
if ( ioReturnValue == kIOReturnSuccess )
|
||||
{
|
||||
printf("Registered pollElement: %ld\n", (long)cookie );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Failed to add poll element: %ld\n", (long)cookie );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: net_java_games_input_OSXEnvironmentPlugin
|
||||
* Method: deregisterDeviceElement
|
||||
* Signature: (JJ)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXEnvironmentPlugin_deregisterDeviceElement
|
||||
(JNIEnv * env, jobject obj, jlong lpQueue, jlong hidCookie)
|
||||
{
|
||||
IOHIDQueueInterface **queue = NULL;
|
||||
queue = (IOHIDQueueInterface **)(long)lpQueue;
|
||||
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(long)hidCookie;
|
||||
|
||||
IOReturn ioReturnValue = kIOReturnSuccess;
|
||||
|
||||
ioReturnValue = (*queue)->removeElement(queue, cookie );
|
||||
if ( ioReturnValue == kIOReturnSuccess )
|
||||
{
|
||||
printf("Removed pollElement: %ld\n", (long)cookie );
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Failed to remove poll element: %ld\n", (long)cookie );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
197
plugins/OSX/src/native/macosxutil.c
Normal file
197
plugins/OSX/src/native/macosxutil.c
Normal file
|
|
@ -0,0 +1,197 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <jni.h>
|
||||
#include "util.h"
|
||||
#include "macosxutil.h"
|
||||
|
||||
typedef struct {
|
||||
JNIEnv *env;
|
||||
jobject map;
|
||||
} dict_context_t;
|
||||
|
||||
typedef struct {
|
||||
JNIEnv *env;
|
||||
jobjectArray array;
|
||||
jsize index;
|
||||
} array_context_t;
|
||||
|
||||
static jobject createObjectFromCFObject(JNIEnv *env, CFTypeRef cfobject);
|
||||
|
||||
static jstring createStringFromCFString(JNIEnv *env, CFStringRef cfstring) {
|
||||
CFIndex unicode_length = CFStringGetLength(cfstring);
|
||||
CFIndex utf8_length = CFStringGetMaximumSizeForEncoding(unicode_length, kCFStringEncodingUTF8);
|
||||
// Allocate buffer large enough, plus \0 terminator
|
||||
char *buffer = (char *)malloc(utf8_length + 1);
|
||||
if (buffer == NULL)
|
||||
return NULL;
|
||||
Boolean result = CFStringGetCString(cfstring, buffer, utf8_length + 1, kCFStringEncodingUTF8);
|
||||
if (!result) {
|
||||
free(buffer);
|
||||
return NULL;
|
||||
}
|
||||
jstring str = (*env)->NewStringUTF(env, buffer);
|
||||
free(buffer);
|
||||
return str;
|
||||
}
|
||||
|
||||
static jobject createDoubleObjectFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
|
||||
double value;
|
||||
Boolean result = CFNumberGetValue(cfnumber, kCFNumberDoubleType, &value);
|
||||
if (!result)
|
||||
return NULL;
|
||||
return newJObject(env, "java/lang/Double", "(D)V", (jdouble)value);
|
||||
}
|
||||
|
||||
static jobject createLongObjectFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
|
||||
SInt64 value;
|
||||
Boolean result = CFNumberGetValue(cfnumber, kCFNumberSInt64Type, &value);
|
||||
if (!result)
|
||||
return NULL;
|
||||
return newJObject(env, "java/lang/Long", "(J)V", (jlong)value);
|
||||
}
|
||||
|
||||
static jobject createNumberFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
|
||||
CFNumberType number_type = CFNumberGetType(cfnumber);
|
||||
switch (number_type) {
|
||||
case kCFNumberSInt8Type:
|
||||
case kCFNumberSInt16Type:
|
||||
case kCFNumberSInt32Type:
|
||||
case kCFNumberSInt64Type:
|
||||
case kCFNumberCharType:
|
||||
case kCFNumberShortType:
|
||||
case kCFNumberIntType:
|
||||
case kCFNumberLongType:
|
||||
case kCFNumberLongLongType:
|
||||
case kCFNumberCFIndexType:
|
||||
return createLongObjectFromCFNumber(env, cfnumber);
|
||||
case kCFNumberFloat32Type:
|
||||
case kCFNumberFloat64Type:
|
||||
case kCFNumberFloatType:
|
||||
case kCFNumberDoubleType:
|
||||
return createDoubleObjectFromCFNumber(env, cfnumber);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void createArrayEntries(const void *value, void *context) {
|
||||
array_context_t *array_context = (array_context_t *)context;
|
||||
jobject jval = createObjectFromCFObject(array_context->env, value);
|
||||
(*array_context->env)->SetObjectArrayElement(array_context->env, array_context->array, array_context->index++, jval);
|
||||
(*array_context->env)->DeleteLocalRef(array_context->env, jval);
|
||||
}
|
||||
|
||||
static jobject createArrayFromCFArray(JNIEnv *env, CFArrayRef cfarray) {
|
||||
jclass Object_class = (*env)->FindClass(env, "java/lang/Object");
|
||||
if (Object_class == NULL)
|
||||
return NULL;
|
||||
CFIndex size = CFArrayGetCount(cfarray);
|
||||
CFRange range = {0, size};
|
||||
jobjectArray array = (*env)->NewObjectArray(env, size, Object_class, NULL);
|
||||
array_context_t array_context;
|
||||
array_context.env = env;
|
||||
array_context.array = array;
|
||||
array_context.index = 0;
|
||||
CFArrayApplyFunction(cfarray, range, createArrayEntries, &array_context);
|
||||
return array;
|
||||
}
|
||||
|
||||
static jobject createObjectFromCFObject(JNIEnv *env, CFTypeRef cfobject) {
|
||||
CFTypeID type_id = CFGetTypeID(cfobject);
|
||||
if (type_id == CFDictionaryGetTypeID()) {
|
||||
return createMapFromCFDictionary(env, cfobject);
|
||||
} else if (type_id == CFArrayGetTypeID()) {
|
||||
return createArrayFromCFArray(env, cfobject);
|
||||
} else if (type_id == CFStringGetTypeID()) {
|
||||
return createStringFromCFString(env, cfobject);
|
||||
} else if (type_id == CFNumberGetTypeID()) {
|
||||
return createNumberFromCFNumber(env, cfobject);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void createMapKeys(const void *key, const void *value, void *context) {
|
||||
dict_context_t *dict_context = (dict_context_t *)context;
|
||||
|
||||
jclass Map_class = (*dict_context->env)->GetObjectClass(dict_context->env, dict_context->map);
|
||||
if (Map_class == NULL)
|
||||
return;
|
||||
jmethodID map_put = (*dict_context->env)->GetMethodID(dict_context->env, Map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
||||
if (map_put == NULL)
|
||||
return;
|
||||
jobject jkey = createObjectFromCFObject(dict_context->env, key);
|
||||
jobject jvalue = createObjectFromCFObject(dict_context->env, value);
|
||||
if (jkey == NULL || jvalue == NULL)
|
||||
return;
|
||||
(*dict_context->env)->CallObjectMethod(dict_context->env, dict_context->map, map_put, jkey, jvalue);
|
||||
(*dict_context->env)->DeleteLocalRef(dict_context->env, jkey);
|
||||
(*dict_context->env)->DeleteLocalRef(dict_context->env, jvalue);
|
||||
}
|
||||
|
||||
jobject createMapFromCFDictionary(JNIEnv *env, CFDictionaryRef dict) {
|
||||
jobject map = newJObject(env, "java/util/HashMap", "()V");
|
||||
if (map == NULL)
|
||||
return NULL;
|
||||
dict_context_t dict_context;
|
||||
dict_context.env = env;
|
||||
dict_context.map = map;
|
||||
CFDictionaryApplyFunction(dict, createMapKeys, &dict_context);
|
||||
return map;
|
||||
}
|
||||
|
||||
void copyEvent(JNIEnv *env, IOHIDEventStruct *event, jobject event_return) {
|
||||
jclass OSXEvent_class = (*env)->GetObjectClass(env, event_return);
|
||||
if (OSXEvent_class == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
jmethodID OSXEvent_set = (*env)->GetMethodID(env, OSXEvent_class, "set", "(JJIJ)V");
|
||||
if (OSXEvent_set == NULL) {
|
||||
return;
|
||||
}
|
||||
Nanoseconds nanos = AbsoluteToNanoseconds(event->timestamp);
|
||||
uint64_t nanos64= *((uint64_t *)&nanos);
|
||||
(*env)->CallVoidMethod(env, event_return, OSXEvent_set, (jlong)event->type, (jlong)(intptr_t)event->elementCookie, (jint)event->value, (jlong)nanos64);
|
||||
}
|
||||
48
plugins/OSX/src/native/macosxutil.h
Normal file
48
plugins/OSX/src/native/macosxutil.h
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <jni.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
|
||||
extern jobject createMapFromCFDictionary(JNIEnv *env, CFDictionaryRef dict);
|
||||
extern void copyEvent(JNIEnv *env, IOHIDEventStruct *event, jobject event_return);
|
||||
118
plugins/OSX/src/native/net_java_games_input_OSXHIDDevice.c
Normal file
118
plugins/OSX/src/native/net_java_games_input_OSXHIDDevice.c
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <IOKit/IOTypes.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
#include <IOKit/hid/IOHIDKeys.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include "net_java_games_input_OSXHIDDevice.h"
|
||||
#include "util.h"
|
||||
#include "macosxutil.h"
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nReleaseDevice(JNIEnv *env, jclass unused, jlong device_address, jlong interface_address) {
|
||||
io_object_t hidDevice = (io_object_t)device_address;
|
||||
IOHIDDeviceInterface **device_interface = (IOHIDDeviceInterface **)(intptr_t)interface_address;;
|
||||
(*device_interface)->Release(device_interface);
|
||||
IOObjectRelease(hidDevice);
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL Java_net_java_games_input_OSXHIDDevice_nGetDeviceProperties(JNIEnv *env, jclass unused, jlong device_address) {
|
||||
io_object_t hidDevice = (io_object_t)device_address;
|
||||
CFMutableDictionaryRef properties;
|
||||
|
||||
kern_return_t result = IORegistryEntryCreateCFProperties(hidDevice,
|
||||
&properties,
|
||||
kCFAllocatorDefault,
|
||||
kNilOptions);
|
||||
if (result != KERN_SUCCESS) {
|
||||
throwIOException(env, "Failed to create properties for device (%ld)", result);
|
||||
return NULL;
|
||||
}
|
||||
jobject map = createMapFromCFDictionary(env, properties);
|
||||
CFRelease(properties);
|
||||
return map;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nOpen
|
||||
(JNIEnv * env, jclass unused, jlong lpDevice) {
|
||||
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
|
||||
IOReturn ioReturnValue = (*hidDeviceInterface)->open(hidDeviceInterface, 0);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Device open failed: %d", ioReturnValue);
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nClose
|
||||
(JNIEnv * env, jclass unused, jlong lpDevice) {
|
||||
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
|
||||
IOReturn ioReturnValue = (*hidDeviceInterface)->close(hidDeviceInterface);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Device close failed: %d", ioReturnValue);
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nGetElementValue
|
||||
(JNIEnv * env, jclass unused, jlong lpDevice, jlong hidCookie, jobject event_return) {
|
||||
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)hidCookie;
|
||||
IOHIDEventStruct event;
|
||||
|
||||
IOReturn ioReturnValue = (*hidDeviceInterface)->getElementValue(hidDeviceInterface, cookie, &event);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Device getElementValue failed: %d", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
copyEvent(env, &event, event_return);
|
||||
if (event.longValue != NULL) {
|
||||
free(event.longValue);
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT jlong JNICALL Java_net_java_games_input_OSXHIDDevice_nCreateQueue(JNIEnv *env, jclass unused, jlong device_address) {
|
||||
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)device_address;
|
||||
IOHIDQueueInterface **queue = (*hidDeviceInterface)->allocQueue(hidDeviceInterface);
|
||||
|
||||
if (queue == NULL) {
|
||||
throwIOException(env, "Could not allocate queue");
|
||||
return 0;
|
||||
}
|
||||
return (jlong)(intptr_t)queue;
|
||||
}
|
||||
|
|
@ -0,0 +1,143 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <IOKit/IOTypes.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
#include <IOKit/hid/IOHIDKeys.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include "net_java_games_input_OSXHIDDeviceIterator.h"
|
||||
#include "util.h"
|
||||
|
||||
JNIEXPORT jlong JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nCreateIterator(JNIEnv *env, jclass unused) {
|
||||
io_iterator_t hidObjectIterator;
|
||||
// Set up a matching dictionary to search the I/O Registry by class
|
||||
// name for all HID class devices
|
||||
//
|
||||
CFMutableDictionaryRef hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
|
||||
|
||||
// Now search I/O Registry for matching devices.
|
||||
// IOServiceGetMatchingServices consumes a reference to the dictionary so we don't have to release it
|
||||
IOReturn ioReturnValue = IOServiceGetMatchingServices(kIOMasterPortDefault, hidMatchDictionary, &hidObjectIterator);
|
||||
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Failed to create iterator (%ld)\n", ioReturnValue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (hidObjectIterator == IO_OBJECT_NULL) {
|
||||
throwIOException(env, "Failed to create iterator\n");
|
||||
return 0;
|
||||
}
|
||||
return (jlong)hidObjectIterator;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nReleaseIterator(JNIEnv *env, jclass unused, jlong address) {
|
||||
io_iterator_t iterator = (io_iterator_t)address;
|
||||
IOObjectRelease(iterator);
|
||||
}
|
||||
|
||||
static IOHIDDeviceInterface **createHIDDevice(JNIEnv *env, io_object_t hidDevice) {
|
||||
// io_name_t className;
|
||||
IOHIDDeviceInterface **hidDeviceInterface;
|
||||
IOCFPlugInInterface **plugInInterface;
|
||||
SInt32 score;
|
||||
|
||||
/* ioReturnValue = IOObjectGetClass(hidDevice, className);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
printfJava(env, "Failed to get IOObject class name.");
|
||||
}
|
||||
|
||||
printfJava(env, "Found device type [%s]\n", className);
|
||||
*/
|
||||
IOReturn ioReturnValue = IOCreatePlugInInterfaceForService(hidDevice,
|
||||
kIOHIDDeviceUserClientTypeID,
|
||||
kIOCFPlugInInterfaceID,
|
||||
&plugInInterface,
|
||||
&score);
|
||||
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Couldn't create plugin for device interface (%ld)\n", ioReturnValue);
|
||||
return NULL;
|
||||
}
|
||||
//Call a method of the intermediate plug-in to create the device
|
||||
//interface
|
||||
//
|
||||
HRESULT plugInResult = (*plugInInterface)->QueryInterface(plugInInterface,
|
||||
CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID),
|
||||
(LPVOID)&hidDeviceInterface);
|
||||
(*plugInInterface)->Release(plugInInterface);
|
||||
if (plugInResult != S_OK) {
|
||||
throwIOException(env, "Couldn't create HID class device interface (%ld)\n", plugInResult);
|
||||
return NULL;
|
||||
}
|
||||
return hidDeviceInterface;
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nNext(JNIEnv *env, jclass unused, jlong address) {
|
||||
io_iterator_t iterator = (io_iterator_t)address;
|
||||
io_object_t hidDevice;
|
||||
// io_string_t path;
|
||||
// kern_return_t result;
|
||||
|
||||
hidDevice = IOIteratorNext(iterator);
|
||||
if (hidDevice == MACH_PORT_NULL)
|
||||
return NULL;
|
||||
/* IOResult result = IORegistryEntryGetPath(hidDevice, kIOServicePlane, path);
|
||||
|
||||
if (result != KERN_SUCCESS) {
|
||||
IOObjectRelease(hidDevice);
|
||||
throwIOException("Failed to get device path (%ld)\n", result);
|
||||
return NULL;
|
||||
}
|
||||
*/
|
||||
IOHIDDeviceInterface **device_interface = createHIDDevice(env, hidDevice);
|
||||
if (device_interface == NULL) {
|
||||
IOObjectRelease(hidDevice);
|
||||
return NULL;
|
||||
}
|
||||
jobject device_object = newJObject(env, "net/java/games/input/OSXHIDDevice", "(JJ)V", (jlong)hidDevice, (jlong)(intptr_t)device_interface);
|
||||
if (device_object == NULL) {
|
||||
(*device_interface)->Release(device_interface);
|
||||
IOObjectRelease(hidDevice);
|
||||
return NULL;
|
||||
}
|
||||
return device_object;
|
||||
}
|
||||
135
plugins/OSX/src/native/net_java_games_input_OSXHIDQueue.c
Normal file
135
plugins/OSX/src/native/net_java_games_input_OSXHIDQueue.c
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* %W% %E%
|
||||
*
|
||||
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
|
||||
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
*/
|
||||
/*****************************************************************************
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistribution of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* - Redistribution in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materails provided with the distribution.
|
||||
*
|
||||
* Neither the name Sun Microsystems, Inc. or the names of the contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
|
||||
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
|
||||
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
|
||||
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
|
||||
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
|
||||
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
|
||||
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
|
||||
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*
|
||||
* You acknowledge that this software is not designed or intended for us in
|
||||
* the design, construction, operation or maintenance of any nuclear facility
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <IOKit/IOTypes.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
#include <IOKit/hid/IOHIDKeys.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include "net_java_games_input_OSXHIDQueue.h"
|
||||
#include "util.h"
|
||||
#include "macosxutil.h"
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nOpen(JNIEnv *env, jclass unused, jlong address, jint queue_depth) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOReturn ioReturnValue = (*queue)->create(queue, 0, queue_depth);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue open failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nStart(JNIEnv *env, jclass unused, jlong address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOReturn ioReturnValue = (*queue)->start(queue);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue start failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nStop(JNIEnv *env, jclass unused, jlong address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOReturn ioReturnValue = (*queue)->stop(queue);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue stop failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nClose(JNIEnv *env, jclass unused, jlong address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOReturn ioReturnValue = (*queue)->dispose(queue);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue dispose failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nReleaseQueue(JNIEnv *env, jclass unused, jlong address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOReturn ioReturnValue = (*queue)->Release(queue);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue Release failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nAddElement(JNIEnv *env, jclass unused, jlong address, jlong cookie_address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)cookie_address;
|
||||
|
||||
IOReturn ioReturnValue = (*queue)->addElement(queue, cookie, 0);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue addElement failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nRemoveElement(JNIEnv *env, jclass unused, jlong address, jlong cookie_address) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)cookie_address;
|
||||
|
||||
IOReturn ioReturnValue = (*queue)->removeElement(queue, cookie);
|
||||
if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue removeElement failed: %d\n", ioReturnValue);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_net_java_games_input_OSXHIDQueue_nGetNextEvent(JNIEnv *env, jclass unused, jlong address, jobject event_return) {
|
||||
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
|
||||
IOHIDEventStruct event;
|
||||
|
||||
AbsoluteTime zeroTime = {0, 0};
|
||||
IOReturn ioReturnValue = (*queue)->getNextEvent(queue, &event, zeroTime, 0);
|
||||
if (ioReturnValue == kIOReturnUnderrun) {
|
||||
return JNI_FALSE;
|
||||
} else if (ioReturnValue != kIOReturnSuccess) {
|
||||
throwIOException(env, "Queue getNextEvent failed: %d\n", ioReturnValue);
|
||||
return JNI_FALSE;
|
||||
}
|
||||
copyEvent(env, &event, event_return);
|
||||
if (event.longValue != NULL) {
|
||||
free(event.longValue);
|
||||
}
|
||||
return JNI_TRUE;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue