diff options
Diffstat (limited to 'plugins/DX8/src')
7 files changed, 0 insertions, 2407 deletions
diff --git a/plugins/DX8/src/java/net/java/games/input/DirectInputAxis.java b/plugins/DX8/src/java/net/java/games/input/DirectInputAxis.java deleted file mode 100644 index e9cfc6e..0000000 --- a/plugins/DX8/src/java/net/java/games/input/DirectInputAxis.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * %W% %E% - * - * Copyright 2002 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ -/***************************************************************************** - * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materails provided with the distribution. - * - * Neither the name Sun Microsystems, Inc. or the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. - * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING - * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR - * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND - * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS - * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS - * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST - * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, - * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY - * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, - * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed or intended for us in - * the design, construction, operation or maintenance of any nuclear facility - * - *****************************************************************************/ -package net.java.games.input; - -import net.java.games.input.AbstractAxis; -import net.java.games.input.Axis; - -/** - * - * @author martak - * @version - */ -class DirectInputAxis extends AbstractAxis { - - /** - * DIDFT_ constants and macros defined in dinput.h - */ - private static final int DIDFT_ALL = 0x00000000; - private static final int DIDFT_RELAXIS = 0x00000001; - private static final int DIDFT_ABSAXIS = 0x00000002; - private static final int DIDFT_AXIS = 0x00000003; - private static final int DIDFT_PSHBUTTON = 0x00000004; - private static final int DIDFT_TGLBUTTON = 0x00000008; - private static final int DIDFT_BUTTON = 0x0000000C; - private static final int DIDFT_POV = 0x00000010; - private static final int DIDFT_COLLECTION = 0x00000040; - private static final int DIDFT_NODATA = 0x00000080; - private static final int DIDFT_ANYINSTANCE = 0x00FFFF00; - private static final int DIDFT_INSTANCEMASK = DIDFT_ANYINSTANCE; - private static final int DIDFT_FFACTUATOR = 0x01000000; - private static final int DIDFT_FFEFFECTTRIGGER = 0x02000000; - private static final int DIDFT_OUTPUT = 0x10000000; - private static final int DIDFT_NOCOLLECTION = 0x00FFFF00; - private static int DIDFT_MAKEINSTANCE(int n) { - return ((n&0xffff) << 8); - } - private static int DIDFT_GETTYPE(int n) { - return (n&0xFF); - } - private static int DIDFT_GETINSTANCE(int n) { - return ((n >> 8)&0xffff); - } - private static int DIDFT_ENUMCOLLECTION(int n) { - return ((n&0xFFFF) << 8); - } - - private DirectInputDevice device; - /** - * DIJOYSTATE structure defined in dinput.h: - * - * <pre> - * typedef struct DIJOYSTATE { - * LONG lX; - * LONG lY; - * LONG lZ; - * LONG lRx; - * LONG lRy; - * LONG lRz; - * LONG rglSlider[2]; - * DWORD rgdwPOV[4]; - * BYTE rgbButtons[32]; - * } DIJOYSTATE, *LPDIJOYSTATE; - * - * 80 bytes total - * </pre> - */ - private int offset; - private int type; - private int instance; - private int bitmask = 0xffffffff; - private int bitshift = 0; - - private DirectInputAxis(DirectInputDevice device, Axis.Identifier id, - int didft, String name) { - super(name, id); - this.device = device; - this.type = DIDFT_GETTYPE(didft); - this.instance = DIDFT_GETINSTANCE(didft); - if (id == Axis.Identifier.X) { - offset = 0; - } else if (id == Axis.Identifier.Y) { - offset = 1; - } else if (id == Axis.Identifier.Z) { - offset = 2; - } else if (id == Axis.Identifier.RX) { - offset = 3; - } else if (id == Axis.Identifier.RY) { - offset = 4; - } else if (id == Axis.Identifier.RZ) { - offset = 5; - } else if (id == Axis.Identifier.SLIDER) { - //System.out.println("Slider on "+name+" instance = "+instance); - offset = 6 + (instance>>2); - } else if (id == Axis.Identifier.POV) { - //System.out.println("POV on "+name+" instance = "+instance); - offset = 8 + instance; - } else if (id == Axis.Identifier.BUTTON) { - //System.out.println("Button on "+name+" instance = "+instance); - offset = 12 + (instance/4); - bitshift = (instance%4)*8; - bitmask=0xff; - } - } - - /** 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 A float between -1.0 and 1.0 - */ - public float getPollData() { - int data = ((device.data[offset] >> bitshift)&bitmask); - if ((type&DIDFT_BUTTON) != 0 ) { - return (float)((data&0x80)>>7); - } else if ((type&DIDFT_AXIS)!=0){ // all axes are set for -32768 to 32738 - return ((float)data)/32768; - } else if ((type&DIDFT_POV)!=0) { - if (data == -1) { - return Axis.POV.OFF; - } else if (data == 0.0) { - return Axis.POV.UP; - } else if (data == 4500) { - return Axis.POV.UP_RIGHT; - } else if (data == 9000) { - return Axis.POV.RIGHT; - } else if (data == 13500) { - return Axis.POV.DOWN_RIGHT; - } else if (data == 18000) { - return Axis.POV.DOWN; - } else if (data == 22500) { - return Axis.POV.DOWN_LEFT; - } else if (data == 27000) { - return Axis.POV.LEFT; - } else if (data == 31500) { - return Axis.POV.UP_LEFT; - } else { - System.err.print("Unexpected value for DX8 HAT: "+data); - return Axis.POV.OFF; - } - } else { // return raw value - return (float)data; - } - - } - - /** 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 has chnaged since last poll, else false - */ - public boolean isRelative() { - return (type & DIDFT_RELAXIS) != 0; - } - - /** 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 (type & DIDFT_AXIS) != 0; - } - - /** Returns whether or not data polled from this axis is normalized - * between the values of -1.0f and 1.0f. - * @return true if data is normalized, false if not. - */ - public boolean isNormalized() { - return (type & (DIDFT_BUTTON|DIDFT_AXIS|DIDFT_POV)) != 0; - } - - /** Creates a new DirectInputAxis (factory method). - * This is a function used internally during set up - * @return The new DirectInputAxis object. - * @param device The device to attach this axis to. - * - * @param didft The identifier for the axis as provided by DX8. - * @param name A name to give the new axis. - * @param id The identifier for the device - */ - public static DirectInputAxis createAxis(DirectInputDevice device, - Axis.Identifier id, int didft, String name) { - return new DirectInputAxis(device, id, didft, name); - } -} diff --git a/plugins/DX8/src/java/net/java/games/input/DirectInputDevice.java b/plugins/DX8/src/java/net/java/games/input/DirectInputDevice.java deleted file mode 100644 index d269961..0000000 --- a/plugins/DX8/src/java/net/java/games/input/DirectInputDevice.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * %W% %E% - * - * Copyright 2002 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ -/***************************************************************************** - * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materails provided with the distribution. - * - * Neither the name Sun Microsystems, Inc. or the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. - * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING - * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR - * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND - * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS - * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS - * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST - * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, - * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY - * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, - * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed or intended for us in - * the design, construction, operation or maintenance of any nuclear facility - * - *****************************************************************************/ -package net.java.games.input; - -import net.java.games.input.AbstractController; -import net.java.games.input.Axis; -import net.java.games.input.Controller; -import java.util.ArrayList; -import java.util.Iterator; - -/** - * - * @author martak - * @version - */ -class DirectInputDevice extends AbstractController { - - /** - * DIDEVTYPE_ constants from dinput.h header file - ** JPK NOTE: This changed in DI8. In general this - * is fragile anda way shoudl be found to tie these mroe directly - * to the header files. - */ - /* Mike's <=DX7 types - private static final int DIDEVTYPEJOYSTICK_UNKNOWN = 1; - private static final int DIDEVTYPEJOYSTICK_TRADITIONAL = 2; - private static final int DIDEVTYPEJOYSTICK_FLIGHTSTICK = 3; - private static final int DIDEVTYPEJOYSTICK_GAMEPAD = 4; - private static final int DIDEVTYPEJOYSTICK_RUDDER = 5; - private static final int DIDEVTYPEJOYSTICK_WHEEL = 6; - private static final int DIDEVTYPEJOYSTICK_HEADTRACKER = 7; - */ - - /** - * Pointer to the IDirectInputDevice for this device - */ - private long lpDevice; - - /** - * Type of device - */ - private Type type; - - /** - * Do we need to poll data? - */ - private boolean polled = true; - /** - * Data when polling, as per the DIJOYSTATE structure in dinput.h; - * @see DirectInputAxis for a breakdown of this structure - */ - int[] data = new int[32]; - - /** Array list of rumblers */ - private ArrayList rumblerList = new ArrayList(); - - /** - * Private constructor - * @param lpDevice A pointer to the IDirectInputDevice for the device. - * @param subtype The subtype of device, as defined in the DIDEVTYPE - * constants above - * @param productName The product name for the device - * @param instanceName The name of the device - */ - private DirectInputDevice(long lpDevice, int subtype, String productName, - String instanceName,boolean polled) { - super(productName + " " + instanceName); - this.lpDevice = lpDevice; - this.polled = polled; - System.out.println("Creating "+productName+" polling = "+polled); - switch(subtype) { - /* - case DIDEVTYPEJOYSTICK_GAMEPAD: - type = Type.GAMEPAD; break; - case DIDEVTYPEJOYSTICK_RUDDER: - type = Type.RUDDER; break; - case DIDEVTYPEJOYSTICK_WHEEL: - type = Type.WHEEL; break; - case DIDEVTYPEJOYSTICK_HEADTRACKER: - type = Type.HEADTRACKER; break; - case DIDEVTYPEJOYSTICK_TRADITIONAL: // fall through - case DIDEVTYPEJOYSTICK_FLIGHTSTICK: // fall through - */ - default: - type = Type.STICK; break; - } - axes = initDirectInputAxes(); - } - - /** - * Used instead of overriding initAxes because it needs the - * pointer to the IDirectInputDevice - */ - private Axis[] initDirectInputAxes() { - ArrayList list = new ArrayList(); - enumObjects(lpDevice, list); - Axis[] ret = new Axis[list.size()]; - Iterator it = list.iterator(); - int i = 0; - while (it.hasNext()) { - ret[i] = (Axis)it.next(); - i++; - } - return ret; - } - - /** - * Callback called by enumObjects to add a new axis into the list - * @param list This in which to add the new axis - * @param id The identifier for the axis, based on GUID - * @param didft The combination of DIDFT_ flags that make up the type and - * instance number of the axis. - * @param name The name to call the axis. - */ - private void addAxis(ArrayList list, Axis.Identifier id, int didft, - String name) { - list.add(DirectInputAxis.createAxis(this, id, didft, name)); - } - - /** - * Callback called by enumDevice to add a rumbler - * - * @param effect the natie effect id - * @param axisID The axis ID - */ - private void addRumbler(long effect, Axis.Identifier axisID, String axisName) { - rumblerList.add(new DirectInputRumbler(this, effect, axisID, axisName)); - } - - /** Polls axes for data. Returns false if the controller is no longer valid. - * Polling reflects the current state of the device when polled, and is - * unbuffered. - * @return False if the co troller is no longer valid, else true. - */ - public boolean poll() { - return pollNative(lpDevice, data, polled); - } - - /** Returns the type of Controller. - * @return The type of the controller. - */ - public Type getType() { - return type; - } - - /** Returns the zero-based port number for this Controller. - * @return The port number. - */ - public int getPortNumber() { - // REMIND : We may be able to parse this from the name string - return 0; - } - - /** - * Returns the rumbler array - */ - public Rumbler[] getRumblers() { - return (Rumbler[]) rumblerList.toArray(new Rumbler[0]); - } - - /** - * Polls the device; native method. The data from the poll is stored in - * the data array. - */ - private native boolean pollNative(long lpDevice, int[] data, - boolean polled); - - /** - * Enumerates the axes on the device - */ - private native boolean enumObjects(long lpDevice, ArrayList list); - - /** Creates a new DirectInputDevice (factory method) - * This is a function used internally during set up - * @param polled Whether this device's driver should actually be - * polled during a call to Poll or whether it is an - * interrupt driven device that should ignore poll - * requests. - * @param lpDevice A pointer to the IDirectInputDevice for the device. - * @param subtype The subtype of device, as defined in the DIDEVTYPE - * constants above - * @param productName The product name for the device - * @param instanceName The name of the device - * @return The new DirectInputDevice object - */ - public static DirectInputDevice createDevice(long lpDevice, int subtype, - String productName, String instanceName, boolean polled) { - return new DirectInputDevice(lpDevice, subtype, productName, - instanceName,polled); - } -} // class DirectInputDevice diff --git a/plugins/DX8/src/java/net/java/games/input/DirectInputEnvironmentPlugin.java b/plugins/DX8/src/java/net/java/games/input/DirectInputEnvironmentPlugin.java deleted file mode 100644 index fcaa278..0000000 --- a/plugins/DX8/src/java/net/java/games/input/DirectInputEnvironmentPlugin.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * %W% %E% - * - * Copyright 2002 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ -/***************************************************************************** - * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materails provided with the distribution. - * - * Neither the name Sun Microsystems, Inc. or the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. - * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING - * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR - * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND - * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS - * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS - * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST - * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, - * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY - * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, - * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed or intended for us in - * the design, construction, operation or maintenance of any nuclear facility - * - *****************************************************************************/ -package net.java.games.input; - -import java.security.AccessController; -import java.util.ArrayList; -import java.util.Iterator; -import net.java.games.input.Controller; -import net.java.games.input.ControllerEnvironment; -//import sun.security.action.LoadLibraryAction; -import net.java.games.util.plugins.Plugin; - -/** DirectInput implementation of controller environment - * @author martak - * @version 1.0 - */ -public class DirectInputEnvironmentPlugin extends ControllerEnvironment - implements Plugin -{ - - static { - /** Mikes old code, causes it to be laoded by wrong loader - java.security.AccessController.doPrivileged( - new LoadLibraryAction("jinput")); - */ - System.loadLibrary("dxinput"); - } - - /** - * DIDEVTYPE_ constants from dinput.h header file - * JPK NOTE: changed in DX8 so had to be changed. This is - * fragile, we should find a way to set them from - * the C side sowe can stay up to date with header - */ - /** DX7 and earlier - private static final int DIDEVTYPE_DEVICE = 1; - private static final int DIDEVTYPE_MOUSE = 2; - private static final int DIDEVTYPE_KEYBOARD = 3; - private static final int DIDEVTYPE_JOYSTICK = 4; - private static final int DIDEVTYPE_HID = 0x00010000; - private static int GET_DIDEVICE_TYPE(int dwDevType) { - return (int)((byte)dwDevType); - } - private static int GET_DIDEVICE_SUBTYPE(int dwDevType) { - return (int)((byte)((((short)dwDevType) >> 8) & 0xFF)); - } - **/ - /* DX8 and 9 */ - private static final int DI8DEVTYPE_DEVICE = 0x11; - private static final int DI8DEVTYPE_MOUSE = 0x12; - private static final int DI8DEVTYPE_KEYBOARD = 0x13; - private static final int DI8DEVTYPE_JOYSTICK = 0x14; - private static final int DI8DEVTYPE_GAMEPAD = 0x15; - private static final int DI8DEVTYPE_DRIVING = 0x16; - private static final int DI8DEVTYPE_FLIGHT = 0x17; - private static final int DI8DEVTYPE_1STPERSON = 0x18; - private static final int DI8DEVTYPE_DEVICECTRL = 0x19; - private static final int DI8DEVTYPE_SCREENPOINTER = 0x1A; - private static final int DI8DEVTYPE_REMOTE = 0x1B; - private static final int DI8DEVTYPE_SUPPLEMENTAL = 0x1C; - - private static int GET_DIDEVICE_TYPE(int dwDevType) { - return (dwDevType&0xFF); - } - private static int GET_DIDEVICE_SUBTYPE(int dwDevType) { - return (int)((byte)((((short)dwDevType) >> 8) & 0xFF)); - } - - // Pointer to DirectInput instance - private long lpDirectInput; - // Permanent array of controllers - private Controller[] controllers; - - /** Creates new DirectInputEnvironment */ - public DirectInputEnvironmentPlugin() { - lpDirectInput = directInputCreate(); - enumControllers(); - } - - /** Returns a list of all controllers available to this environment, - * or an empty array if there are no controllers in this environment. - * @return An array of controllers that may be empty. - */ - public Controller[] getControllers() { - return controllers; - } - - private void enumControllers() { - // If direct input fails, create an empty array - if (lpDirectInput == 0) { - controllers = new Controller[] {}; - return; - } - // Create temporary controller array - ArrayList tempDevices = new ArrayList(); - // Eumerate devices - enumDevices(lpDirectInput, tempDevices); - // Set up permanent controller array - controllers = new Controller[tempDevices.size()]; - Iterator it = tempDevices.iterator(); - int i = 0; - while (it.hasNext()) { - controllers[i] = (Controller)it.next(); - i++; - } - } - - /** - * Creates a new device, adding it to the list supplied. - * @param lpDevice A pointer to the IDirectInputDevice for the device. - * @param type The type of device to create, as defined by the constants - * in dinput.h (see DI8DEVTYPE constants above). - * @param productName The product name for the device - * @param instanceName The name of the device - */ - private void addDevice(ArrayList list, long lpDevice, - int type, String productName, String instanceName, boolean polled) { - Controller c; - int category = GET_DIDEVICE_TYPE(type); - int subtype = GET_DIDEVICE_SUBTYPE(type); - //System.out.println("Category = "+category); - if (category == DI8DEVTYPE_MOUSE) { - c = DirectInputMouse.createMouse(lpDevice, subtype, productName, - instanceName); - } else if (category == DI8DEVTYPE_KEYBOARD) { - c = DirectInputKeyboard.createKeyboard(lpDevice, subtype, - productName, instanceName); - } else { - // commented out the assert as we have already got devices that are - // gamepad type, but wr are still going to create them as - // DirectInputDevices - //assert category == DI8DEVTYPE_JOYSTICK; - c = DirectInputDevice.createDevice(lpDevice, subtype, productName, - instanceName,polled); - } - if (c != null) { - list.add(c); - } - } - - /** - * Returns the direct input instance, or 0 if failed to initialize - */ - private native long directInputCreate(); - - /** - * Enumerates all devices, calling createDevice for each one - */ - private native boolean enumDevices(long lpDirectInput, ArrayList list); -} // class DirectInputEnvironment diff --git a/plugins/DX8/src/java/net/java/games/input/DirectInputKeyboard.java b/plugins/DX8/src/java/net/java/games/input/DirectInputKeyboard.java deleted file mode 100644 index 6faf163..0000000 --- a/plugins/DX8/src/java/net/java/games/input/DirectInputKeyboard.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * %W% %E% - * - * Copyright 2002 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ -/***************************************************************************** - * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materails provided with the distribution. - * - * Neither the name Sun Microsystems, Inc. or the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. - * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING - * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR - * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND - * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS - * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS - * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST - * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, - * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY - * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, - * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed or intended for us in - * the design, construction, operation or maintenance of any nuclear facility - * - *****************************************************************************/ -package net.java.games.input; - -import net.java.games.input.AbstractAxis; -import net.java.games.input.Axis; -import net.java.games.input.StandardKeyboard; - -/** - * DirectInput keyboard implementation. - * @author martak - * @version - */ -class DirectInputKeyboard extends StandardKeyboard { - - /** - * DIDEVTYPE_ constants from dinput.h header file - */ - private static final int DIDEVTYPEKEYBOARD_UNKNOWN = 0; - private static final int DIDEVTYPEKEYBOARD_PCXT = 1; - private static final int DIDEVTYPEKEYBOARD_OLIVETTI = 2; - private static final int DIDEVTYPEKEYBOARD_PCAT = 3; - private static final int DIDEVTYPEKEYBOARD_PCENH = 4; - private static final int DIDEVTYPEKEYBOARD_NOKIA1050 = 5; - private static final int DIDEVTYPEKEYBOARD_NOKIA9140 = 6; - private static final int DIDEVTYPEKEYBOARD_NEC98 = 7; - private static final int DIDEVTYPEKEYBOARD_NEC98LAPTOP = 8; - private static final int DIDEVTYPEKEYBOARD_NEC98106 = 9; - private static final int DIDEVTYPEKEYBOARD_JAPAN106 = 10; - private static final int DIDEVTYPEKEYBOARD_JAPANAX = 11; - private static final int DIDEVTYPEKEYBOARD_J3100 = 12; - - /** - * Key index crosstable; maps indices into the data array to virtual keys - * in the key array in StandardKeyboard. - * For example, the key F11 is at index 84 in the array of keys in - * StandardKeyboard, yet it is data element 87 (0x57) in our data array. - * <p> - * To access the data element of a particular key (F11), we use the - * crosstable as follows: - * <p><code> - * KeyID f11 = StandardKey.KeyID.F11; - * int keyIndex = f11.getKeyIndex(); // returns 84 - * int crossIndex = CROSSTABLE[keyIndex]; // returns 0x57 (87) - * </code> - * To find a key given the data element index (87), we do a simple search - * through the crosstable starting at that index (index 87/0x57 = 0x65) and - * looking backwards until we find our key itself, or a lower number - * (meaning the key was not found). We can only take advantage of this - * algorithm only because on Windows, our crosstable is in increasing order. - */ - private final static int[] CROSSTABLE = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, // _9 - 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, // Y - 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // D - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, // BACKSLASH - 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, // RSHIFT - 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, // F7 - 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, // NUMPAD5 - 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x57, 0x58, 0x64, 0x65, // F14 - 0x66, 0x70, 0x79, 0x7B, 0x7D, 0x8D, 0x90, 0x91, 0x92, 0x93, 0x94, // KANJI - 0x95, 0x96, 0x97, 0x9C, 0x9D, 0xB3, 0xB5, 0xB7, 0xB8, 0xC5, 0xC7, // HOME - 0xC8, 0xC9, 0xCB, 0xCD, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xDB, 0xDC, // RWIN - 0xDD, 0xDE, 0xDF // SLEEP - }; - - /** - * Pointer to the IDirectInputDevice for this device - */ - private long lpDevice; - - /** - * Subtype of keyboard, defined by DIDEVTYPE constants - */ - private int subtype; - - /** - * Polling key data - */ - private byte[] keyData = new byte[256]; - - /** - * Private constructor - * @param lpDevice A pointer to the IDirectInputDevice for the device. - * @param subtype The subtype of keyboard, as defined in the DIDEVTYPE - * constants above - * @param productName The product name for the device - * @param instanceName The name of the device - */ - private DirectInputKeyboard(long lpDevice, int subtype, String productName, - String instanceName) { - super(productName + " (" + instanceName + ")"); - this.lpDevice = lpDevice; - this.subtype = subtype; - } - - /** - * Callback to rename a given key by index, name - * @param index the index in the data array - * @param name the name of the key - */ - private void renameKey(int index, String name) { - int keyIndex = index; - if (keyIndex > CROSSTABLE.length) { - keyIndex = CROSSTABLE.length - 1; - } - for (; CROSSTABLE[keyIndex] > index; keyIndex--) - ; - if (CROSSTABLE[keyIndex] == index) { - Axis[] axes = getAxes(); - AbstractAxis key = (AbstractAxis)axes[index]; - if (name != null && name.length() > 0) { - //System.out.println("Renaming key " + key.getName() + - // " to " + name + " index=" + - // index + " keyIndex=" + keyIndex + " CROSSTAB=" + - // CROSSTABLE[keyIndex]); - key.setName(name); - } - } else { - //System.out.println("Key not found " + name + " index=" + index + - // " keyIndex=" + keyIndex + " CROSSTAB=" + - // CROSSTABLE[keyIndex]); - } - } - - /** Polls axes for data. Returns false if the controller is no longer valid. - * Polling reflects the current state of the device when polled. - * @return False if the KB is no longer valid, true otherwise. - */ - public boolean poll() { - return pollNative(lpDevice, keyData); - } - - /** 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(Key key) { - KeyID id = (KeyID)key.getIdentifier(); - int keyIndex = id.getKeyIndex(); - int crossIndex = CROSSTABLE[keyIndex]; - return ((keyData[crossIndex] & 0x80) != 0); - } - - /** - * Polls the device; native method - */ - private native boolean pollNative(long lpDevice, byte[] keyData); - - /** - * Renames the keys with the name provided by DirectInput - */ - private native boolean renameKeys(long lpDevice); - - /** Creates a new DirectInputKeyboard (factory method) - * This is a function used internally during set up. - * @param lpDevice A pointer to the IDirectInputDevice for the device. - * @param subtype The subtype of keyboard, as defined in the DIDEVTYPE - * constants above - * @param productName The product name for the keyboard - * @param instanceName The name of the keyboard - * @return The new DirectInputKeyboard object. - */ - public static DirectInputKeyboard createKeyboard(long lpDevice, - int subtype, String productName, String instanceName) { - DirectInputKeyboard ret = new DirectInputKeyboard(lpDevice, subtype, - productName, instanceName); - ret.renameKeys(lpDevice); - return ret; - } -} // class DirectInputKeyboard diff --git a/plugins/DX8/src/java/net/java/games/input/DirectInputMouse.java b/plugins/DX8/src/java/net/java/games/input/DirectInputMouse.java deleted file mode 100644 index 7241414..0000000 --- a/plugins/DX8/src/java/net/java/games/input/DirectInputMouse.java +++ /dev/null @@ -1,352 +0,0 @@ -/* - * %W% %E% - * - * Copyright 2002 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ -/***************************************************************************** - * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materails provided with the distribution. - * - * Neither the name Sun Microsystems, Inc. or the names of the contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. - * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING - * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR - * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND - * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS - * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS - * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST - * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, - * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY - * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, - * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed or intended for us in - * the design, construction, operation or maintenance of any nuclear facility - * - *****************************************************************************/ -package net.java.games.input; - -import net.java.games.input.AbstractAxis; -import net.java.games.input.Axis; -import net.java.games.input.Mouse; - -/** - * DirectInput mouse implementation. - * @author martak - * @version - */ -class DirectInputMouse extends Mouse { - - /** - * DIDEVTYPE_ constants from dinput.h header file - */ - private static final int DIDEVTYPEMOUSE_UNKNOWN = 1; - private static final int DIDEVTYPEMOUSE_TRADITIONAL = 2; - private static final int DIDEVTYPEMOUSE_FINGERSTICK = 3; - private static final int DIDEVTYPEMOUSE_TOUCHPAD = 4; - private static final int DIDEVTYPEMOUSE_TRACKBALL = 5; - - /** - * Pointer to the IDirectInputDevice for this device - */ - private long lpDevice; - - /** - * Type of mouse - */ - private Type type; - - /** - * Mouse data - */ - private byte[] mouseData = new byte[20]; - - /** - * Private constructor - * @param lpDevice A pointer to the IDirectInputDevice for the device. - * @param subtype The subtype of mouse, as defined in the DIDEVTYPE - * constants above - * @param productName The product name for the device - * @param instanceName The name of the device - */ - private DirectInputMouse(long lpDevice, int subtype, String productName, - String instanceName) { - super(productName + " " + instanceName); - this.lpDevice = lpDevice; - buttons = new ButtonsImpl(); - ball = new BallImpl(); - switch(subtype) { - case DIDEVTYPEMOUSE_FINGERSTICK: - type = Type.FINGERSTICK; break; - case DIDEVTYPEMOUSE_TOUCHPAD: - type = Type.TRACKPAD; break; - case DIDEVTYPEMOUSE_TRACKBALL: - type = Type.TRACKBALL; break; - case DIDEVTYPEMOUSE_TRADITIONAL: // fall through - case DIDEVTYPEMOUSE_UNKNOWN: // fall through - default: - type = Type.MOUSE; break; - } - renameAxes(lpDevice); - } - - /** - * Callback to rename a given axis by type, name - */ - private void renameAxis(Axis.Identifier id, String name) { - AbstractAxis axis; - if (id instanceof ButtonID) { - axis = (AbstractAxis)getButtons().getAxis(id); - } else { - axis = (AbstractAxis)getBall().getAxis(id); - } - axis.setName(name); - //System.out.println("Renaming " + name); - } - - /** Polls axes for data. Returns false if the controller is no longer valid. - * Polling reflects the current state of the device when polled. - * @return false if the mosue is no lonegr valid, true otherwise. - */ - public boolean poll() { - return pollNative(lpDevice, mouseData); - } - - /** Returns the type of the Controller. - * @return The device type of the controller (logically this - * shoudl be some form of "mouse" .) - */ - public Type getType() { - return type; - } - - /** Creates a new DirectInputMouse (factory method) - * This is a function used internally during set up. - * @param lpDevice A pointer to the IDirectInputDevice for the device. - * @param subtype The subtype of mouse, as defined in the DIDEVTYPE - * constants above - * @param productName The product name for the keyboard - * @param instanceName The name of the keyboard - * @return The new DirectInputMouse object. - */ - public static DirectInputMouse createMouse(long lpDevice, int subtype, - String productName, String instanceName) { - return new DirectInputMouse(lpDevice, subtype, productName, - instanceName); - } - - /** - * Implementation class representing the mouse ball - */ - class BallImpl extends Ball { - - private int numAxes; - - /** - * Public constructor - */ - public BallImpl() { - super(DirectInputMouse.this.getName() + " ball"); - numAxes = getNumAxes(lpDevice); - x = new BallAxis(Axis.Identifier.X); - y = new BallAxis(Axis.Identifier.Y); - if(numAxes > 2) { - wheel = new BallAxis(Axis.Identifier.SLIDER); - } - } - } // class DirectInputMouse.BallImpl - - /** - * Implementation class representing the mouse buttons - */ - class ButtonsImpl extends Buttons { - - private int numButtons; - - /** - * Public constructor - */ - public ButtonsImpl() { - super(DirectInputMouse.this.getName() + " buttons"); - numButtons = getNumButtons(lpDevice); - left = new ButtonImpl(ButtonID.LEFT); - right = new ButtonImpl(ButtonID.RIGHT); - if(numButtons>2) { - middle = new ButtonImpl(ButtonID.MIDDLE); - } - if(numButtons>3) { - side = new ButtonImpl(ButtonID.SIDE); - } - if(numButtons>4) { - extra = new ButtonImpl(ButtonID.EXTRA); - } - if(numButtons>5) { - forward = new ButtonImpl(ButtonID.FORWARD); - } - if(numButtons>6) { - back = new ButtonImpl(ButtonID.BACK); - } - } - } // class DirectInputMouse.ButtonsImpl - - /** - * Polls the device; native method - */ - private native boolean pollNative(long lpDevice, byte[] mouseData); - - /** - * Renames the axes with the name provided by DirectInput - */ - private native boolean renameAxes(long lpDevice); - - // another Endolf special - /** - * Gets the number of buttons the mouse supports - */ - private native int getNumButtons(long lpDevice); - /** - * Gets the number of axes the mouse supports - */ - private native int getNumAxes(long lpDevice); - - /** - * Mouse button axis implementation - */ - class ButtonImpl extends Button { - - /** - * Index into the mouseData array - */ - private final int index; - - /** Public constructor - * @param id An ID of a button to create an obejct to represent. - * - */ - public ButtonImpl(ButtonID id) { - super(id.getName(), id); - if (id == ButtonID.LEFT) { - index = 12; - } else if (id == ButtonID.RIGHT) { - index = 13; - } else if (id == ButtonID.MIDDLE) { - index = 14; - } else if (id == ButtonID.SIDE) { - index = 15; - } else if (id == ButtonID.EXTRA) { - index = 16; - } else if (id == ButtonID.FORWARD) { - index = 17; - } else if (id == ButtonID.BACK) { - index = 18; - } else { - throw new RuntimeException("Unknown button"); - } - } - - /** 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() { - // Mouse button - byte data = mouseData[index]; - if ((data & 0x80) != 0) { - return 1.0f; - } else { - return 0.0f; - } - } - - /** 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 false; - } - } // class DirectInputMouse.ButtonImpl - - /** - * Mouse ball axis implementation - */ - class BallAxis extends AbstractAxis { - - /** - * Starting index into the mouseData array - */ - private final int index; - - /** Public constructor - * @param id An ID for a mouse axis to create an object to represent. - */ - public BallAxis(Identifier id) { - super(id.getName(), id); - if (id == Identifier.X) { - index = 0; - } else if (id == Identifier.Y) { - index = 4; - } else if (id == Identifier.SLIDER) { - index = 8; - } else { - throw new RuntimeException("Unknown mouse axis"); - } - } - - // Endolf changed this comment, we *are* a mouse axis if we are in here, - // and mouse axes no longer are normalised at all - /** Returns the data from the last time the control has been polled. - * - * @return data The total mouse axis change since the last poll - */ - public float getPollData() { - int data = ((int)mouseData[index+3] << 24) | - ((int)mouseData[index + 2] << 16) | - ((int)mouseData[index + 1] << 8) | - ((int)mouseData[index]); - return (float)data; - } - - /** 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 true; - } - - /** 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; - } - - /** Returns whether or not data polled from this axis is normalized between the values of -1.0f and 1.0f. - * - * @return true if normalized, otherwise false. - */ - public boolean isNormalized() { - return false; - } - - } // class DirectInputMouse.MouseBallAxis -} // class DirectInputMouse diff --git a/plugins/DX8/src/java/net/java/games/input/DirectInputRumbler.java b/plugins/DX8/src/java/net/java/games/input/DirectInputRumbler.java deleted file mode 100644 index 444bf02..0000000 --- a/plugins/DX8/src/java/net/java/games/input/DirectInputRumbler.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Copyright (C) 2003 Jeremy Booth ([email protected]) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. Redistributions in binary - * form must reproduce the above copyright notice, this list of conditions and - * the following disclaimer in the documentation and/or other materials provided - * with the distribution. - * The name of the author may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE - */ -package net.java.games.input; - -/** - * Implementation of the Rumbler interface for direct x - * - * @author Endolf - */ -public class DirectInputRumbler implements Rumbler { - - /** The parent device */ - private DirectInputDevice device; - /** The native effect */ - private long effect; - /** The identifier of the axis we are attached too */ - private Axis.Identifier axisID; - /** The name of the axis this rumbler is attached too */ - private String axisName; - - /** - * Creates a new instance of DirectInputRumbler - * - * @param device The parent device - * @param effect The native effect - * @param axisID The id of the axis this rumbler is attached too - * @param axisName The name of the axis this rumbler is attached too - */ - public DirectInputRumbler(DirectInputDevice device, long effect, Axis.Identifier axisID, String axisName) { - this.device = device; - this.effect = effect; - this.axisID = axisID; - this.axisName = axisName; - } - - /** - * Gets the identifier of the axis this rumbler is attached too - * - * @return The axis id - */ - public Axis.Identifier getAxisIdentifier() { - return axisID; - } - - /** - * Gets the name of the axis this rumbler is attached too - * - * @return The axis name - */ - public String getAxisName() { - return axisName; - } - - /** - * Rumbles this rumbler at the given intensity. - * This will start or stop the effect if necesary. - * The intensity is in the range of -1 to 1 and will be clipped if values - * outside that range are provided. - * - * @param intensity The intensity - */ - public void rumble(float intensity) { - if(intensity>1f) { - intensity = 1.0f; - } else if(intensity<-1f) { - intensity = -1.0f; - } - setRumble(effect, intensity); - } - - /** - * Performs the native call(s) to run the effect - * - * @param effect The native effect - * @param intensity The intensity of the rumble - */ - private native void setRumble(long effect, float intensity); -} diff --git a/plugins/DX8/src/native/input.cpp b/plugins/DX8/src/native/input.cpp deleted file mode 100644 index c4eb7af..0000000 --- a/plugins/DX8/src/native/input.cpp +++ /dev/null @@ -1,1114 +0,0 @@ -/* - * %W% %E% - * - * Copyright 2002 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -#ifndef WIN32 - #error This is a Windows-only file -#endif - -// hard define as DX7 -//#define DIRECTINPUT_VERSION 0x0800 -#include <windows.h> -#include <jni.h> -#include <dinput.h> - - -/* - ****************************************************************************** - * Global variables - ****************************************************************************** - */ -jclass CLASS_AxisIdentifier = NULL; -jclass CLASS_ButtonIdentifier = NULL; -jclass CLASS_DirectInputEnvironmentPlugin = NULL; -jclass CLASS_DirectInputDevice = NULL; -jclass CLASS_DirectInputKeyboard = NULL; -jclass CLASS_DirectInputMouse = NULL; -jmethodID MID_AddDevice = NULL; -jmethodID MID_AddAxis = NULL; -jmethodID MID_AddRumbler = NULL; -jmethodID MID_RenameKey = NULL; -jmethodID MID_RenameAxis = NULL; -jfieldID FID_X = NULL; -jfieldID FID_Y = NULL; -jfieldID FID_Z = NULL; -jfieldID FID_RX = NULL; -jfieldID FID_RY = NULL; -jfieldID FID_RZ = NULL; -jfieldID FID_Slider = NULL; -jfieldID FID_Button = NULL; -jfieldID FID_POV = NULL; -jfieldID FID_Left = NULL; -jfieldID FID_Right = NULL; -jfieldID FID_Middle = NULL; -jfieldID FID_Extra = NULL; -jfieldID FID_Side = NULL; -jfieldID FID_Forward = NULL; -jfieldID FID_Back = NULL; - -const char* FD_AxisIdentifier = "Lnet/java/games/input/Axis$Identifier;"; -const char* FD_ButtonIdentifier = "Lnet/java/games/input/Mouse$ButtonID;"; -// Dummy input window. This is needed because DirectX evidently needs a window -// to do anything, such as setting the cooperative level for a device. -const TCHAR* DUMMY_WINDOW_NAME = "InputControllerWindow"; -HWND hwndDummy = NULL; -// Buffer size -// Endolf changed the name as it is specific to the mouse -// Endolf increased the size as he kept making it go pop -const DWORD MOUSE_BUFFER_SIZE = 32; - -// Class for handing device data to the callback for EnumDevices -class DeviceParamData { -public: - DeviceParamData(LPDIRECTINPUT8 lpdi, JNIEnv* e, jobject o, jobject l) : - lpDirectInput(lpdi), env(e), obj(o), list(l) - { - } - LPDIRECTINPUT8 lpDirectInput; - JNIEnv* env; - jobject obj; - jobject list; -}; - -// Class for handing device data to the callback for EnumObjects -class ObjectParamData { -public: - ObjectParamData(LPDIRECTINPUTDEVICE8 lpDev, JNIEnv* e, jobject o, - jobject l) : - lpDevice(lpDev), env(e), obj(o), list(l) - { - } - LPDIRECTINPUTDEVICE8 lpDevice; - JNIEnv* env; - jobject obj; - jobject list; -}; - -void PrintOutput(TCHAR* tszMessage) { - printf("%s\n", tszMessage); -} - -void PrintDIError(TCHAR* tszOutput, HRESULT res) { - TCHAR tszMessage[256]; -#define CHECK_RESULT(r) case r: \ -sprintf(tszMessage, "%s : %s", tszOutput, #r); \ -break; - switch (res) { - CHECK_RESULT(DI_OK) - CHECK_RESULT(DI_NOTATTACHED) - CHECK_RESULT(DI_POLLEDDEVICE) - CHECK_RESULT(DI_DOWNLOADSKIPPED) - CHECK_RESULT(DI_EFFECTRESTARTED) - CHECK_RESULT(DI_TRUNCATED) - CHECK_RESULT(DI_TRUNCATEDANDRESTARTED) - CHECK_RESULT(DIERR_OLDDIRECTINPUTVERSION) - CHECK_RESULT(DIERR_BETADIRECTINPUTVERSION) - CHECK_RESULT(DIERR_BADDRIVERVER) - CHECK_RESULT(DIERR_DEVICENOTREG) - CHECK_RESULT(DIERR_NOTFOUND) - //CHECK_RESULT(DIERR_OBJECTNOTFOUND) - CHECK_RESULT(DIERR_INVALIDPARAM) - CHECK_RESULT(DIERR_NOINTERFACE) - CHECK_RESULT(DIERR_GENERIC) - CHECK_RESULT(DIERR_OUTOFMEMORY) - CHECK_RESULT(DIERR_UNSUPPORTED) - CHECK_RESULT(DIERR_NOTINITIALIZED) - CHECK_RESULT(DIERR_ALREADYINITIALIZED) - CHECK_RESULT(DIERR_NOAGGREGATION) - CHECK_RESULT(DIERR_OTHERAPPHASPRIO) - CHECK_RESULT(DIERR_INPUTLOST) - CHECK_RESULT(DIERR_ACQUIRED) - CHECK_RESULT(DIERR_NOTACQUIRED) - //CHECK_RESULT(DIERR_READONLY) - //CHECK_RESULT(DIERR_HANDLEEXISTS) - CHECK_RESULT(DIERR_INSUFFICIENTPRIVS) - CHECK_RESULT(DIERR_DEVICEFULL) - CHECK_RESULT(DIERR_MOREDATA) - CHECK_RESULT(DIERR_NOTDOWNLOADED) - CHECK_RESULT(DIERR_HASEFFECTS) - CHECK_RESULT(DIERR_NOTEXCLUSIVEACQUIRED) - CHECK_RESULT(DIERR_INCOMPLETEEFFECT) - CHECK_RESULT(DIERR_NOTBUFFERED) - CHECK_RESULT(DIERR_EFFECTPLAYING) - CHECK_RESULT(DIERR_UNPLUGGED) - CHECK_RESULT(DIERR_REPORTFULL) - default: sprintf(tszMessage, "Unknown"); break; - } - PrintOutput(tszMessage); -} - -/* - ****************************************************************************** - * DirectInputEnvironmentPlugin - ****************************************************************************** - */ - -/* - * Initialize all class, method, and field IDs - */ -BOOL InitIDs(JNIEnv* env) { - CLASS_AxisIdentifier = - env->FindClass("net/java/games/input/Axis$Identifier"); - if (CLASS_AxisIdentifier == NULL) { - return FALSE; - } - FID_X = env->GetStaticFieldID(CLASS_AxisIdentifier, "X", - FD_AxisIdentifier); - if (FID_X == NULL) { - return FALSE; - } - FID_Y = env->GetStaticFieldID(CLASS_AxisIdentifier, "Y", - FD_AxisIdentifier); - if (FID_Y == NULL) { - return FALSE; - } - FID_Z = env->GetStaticFieldID(CLASS_AxisIdentifier, "Z", - FD_AxisIdentifier); - if (FID_Z == NULL) { - return FALSE; - } - FID_RX = env->GetStaticFieldID(CLASS_AxisIdentifier, "RX", - FD_AxisIdentifier); - if (FID_RX == NULL) { - return FALSE; - } - FID_RY = env->GetStaticFieldID(CLASS_AxisIdentifier, "RY", - FD_AxisIdentifier); - if (FID_RY == NULL) { - return FALSE; - } - FID_RZ = env->GetStaticFieldID(CLASS_AxisIdentifier, "RZ", - FD_AxisIdentifier); - if (FID_RZ == NULL) { - return FALSE; - } - FID_Slider = env->GetStaticFieldID(CLASS_AxisIdentifier, "SLIDER", - FD_AxisIdentifier); - if (FID_Slider == NULL) { - return FALSE; - } - FID_Button = env->GetStaticFieldID(CLASS_AxisIdentifier, "BUTTON", - FD_AxisIdentifier); - if (FID_Button == NULL) { - return FALSE; - } - FID_POV = env->GetStaticFieldID(CLASS_AxisIdentifier, "POV", - FD_AxisIdentifier); - if (FID_POV == NULL) { - return FALSE; - } - CLASS_ButtonIdentifier = - env->FindClass("net/java/games/input/Mouse$ButtonID"); - if (CLASS_ButtonIdentifier == NULL) { - return FALSE; - } - FID_Left = env->GetStaticFieldID(CLASS_ButtonIdentifier, "LEFT", - FD_ButtonIdentifier); - if (FID_Left == NULL) { - return FALSE; - } - FID_Right = env->GetStaticFieldID(CLASS_ButtonIdentifier, "RIGHT", - FD_ButtonIdentifier); - if (FID_Right == NULL) { - return FALSE; - } - FID_Middle = env->GetStaticFieldID(CLASS_ButtonIdentifier, "MIDDLE", - FD_ButtonIdentifier); - if (FID_Middle == NULL) { - return FALSE; - } -// Endolf - FID_Side = env->GetStaticFieldID(CLASS_ButtonIdentifier, "SIDE", - FD_ButtonIdentifier); - if (FID_Side == NULL) { - return FALSE; - } - FID_Extra = env->GetStaticFieldID(CLASS_ButtonIdentifier, "EXTRA", - FD_ButtonIdentifier); - if (FID_Extra == NULL) { - return FALSE; - } - FID_Forward = env->GetStaticFieldID(CLASS_ButtonIdentifier, "FORWARD", - FD_ButtonIdentifier); - if (FID_Forward == NULL) { - return FALSE; - } - FID_Back = env->GetStaticFieldID(CLASS_ButtonIdentifier, "BACK", - FD_ButtonIdentifier); - if (FID_Back == NULL) { - return FALSE; - } - - CLASS_DirectInputEnvironmentPlugin = - env->FindClass("net/java/games/input/DirectInputEnvironmentPlugin"); - if (CLASS_DirectInputEnvironmentPlugin == NULL) { - return FALSE; - } - MID_AddDevice = env->GetMethodID(CLASS_DirectInputEnvironmentPlugin, "addDevice", - "(Ljava/util/ArrayList;JILjava/lang/String;Ljava/lang/String;Z)V"); - if (MID_AddDevice == NULL) { - return FALSE; - } - CLASS_DirectInputDevice = - env->FindClass("net/java/games/input/DirectInputDevice"); - if (CLASS_DirectInputDevice == NULL) { - return FALSE; - } - MID_AddAxis = env->GetMethodID(CLASS_DirectInputDevice, "addAxis", - "(Ljava/util/ArrayList;Lnet/java/games/input/Axis$Identifier;ILjava/lang/String;)V"); - if (MID_AddAxis == NULL) { - return FALSE; - } - MID_AddRumbler = env->GetMethodID(CLASS_DirectInputDevice, "addRumbler", - "(JLnet/java/games/input/Axis$Identifier;Ljava/lang/String;)V"); - if (MID_AddRumbler == NULL) { - return FALSE; - } - CLASS_DirectInputKeyboard = - env->FindClass("net/java/games/input/DirectInputKeyboard"); - if (CLASS_DirectInputKeyboard == NULL) { - return FALSE; - } - MID_RenameKey = env->GetMethodID(CLASS_DirectInputKeyboard, "renameKey", - "(ILjava/lang/String;)V"); - if (MID_RenameKey == NULL) { - return FALSE; - } - CLASS_DirectInputMouse = - env->FindClass("net/java/games/input/DirectInputMouse"); - if (CLASS_DirectInputMouse == NULL) { - return FALSE; - } - MID_RenameAxis = env->GetMethodID(CLASS_DirectInputMouse, "renameAxis", - "(Lnet/java/games/input/Axis$Identifier;Ljava/lang/String;)V"); - if (MID_RenameAxis == NULL) { - return FALSE; - } - return TRUE; -} - -/* - * WndProc for our dummy input window - */ -LRESULT CALLBACK DummyWndProc( - HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - return DefWindowProc(hWnd, message, wParam, lParam); -} - -/* - * Register the dummy input window class - */ -BOOL RegisterDummyWindow(HINSTANCE hInstance) -{ - WNDCLASSEX wcex; - wcex.cbSize = sizeof(WNDCLASSEX); - wcex.style = CS_HREDRAW | CS_VREDRAW; - wcex.lpfnWndProc = (WNDPROC)DummyWndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = hInstance; - wcex.hIcon = NULL; - wcex.hCursor = NULL; - wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); - wcex.lpszMenuName = (LPCSTR)NULL; - wcex.lpszClassName = DUMMY_WINDOW_NAME; - wcex.hIconSm = NULL; - return RegisterClassEx(&wcex); -} - -/* - * Class: org_java_games_input_DirectInputEnvironmentPlugin - * Method: directInputCreate - * Signature: ()J - */ -extern "C" JNIEXPORT jlong JNICALL -Java_net_java_games_input_DirectInputEnvironmentPlugin_directInputCreate - (JNIEnv* env, jobject obj) -{ - // Get our module handle - HINSTANCE hInst = GetModuleHandle(NULL); - - // Register the dummy input window - if (!RegisterDummyWindow(hInst)) { - return (jlong)0; - } - - // Create the dummy input window - hwndDummy = CreateWindow(DUMMY_WINDOW_NAME, NULL, - WS_POPUP | WS_ICONIC, - 0, 0, 0, 0, NULL, NULL, hInst, NULL); - if (hwndDummy == NULL) - { - return (jlong)0; - } - - // Create the IDirectInput object - DWORD dwVersion = DIRECTINPUT_VERSION; - LPDIRECTINPUT8 lpDirectInput = NULL; - HRESULT res; - if (FAILED(res = DirectInput8Create(hInst, DIRECTINPUT_VERSION, - IID_IDirectInput8,(VOID **)&lpDirectInput, NULL))){ - PrintDIError("DirectInputCreate", res); - return (jlong)0; - } - - // Initialize method, class, and field IDs - if (!InitIDs(env)) { - lpDirectInput->Release(); - return (jlong)0; - } - - return (jlong)(long)lpDirectInput; -} - -BOOL CALLBACK CountFFAxesCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, - VOID* pContext ) -{ - DWORD* pdwNumForceFeedbackAxis = (DWORD*) pContext; - - if( (pdidoi->dwFlags & DIDOI_FFACTUATOR) != 0 ) { - //printf("%s is ff enabled\n", pdidoi->tszName); - (*pdwNumForceFeedbackAxis)++; - } - - return DIENUM_CONTINUE; -} - -/* - * Enumeration callback for devices - * - * returns DIENUM_CONTINUE or DIENUM_STOP - */ - -/** jeff's new enum callback */ -BOOL CALLBACK EnumDeviceCallback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) -{ - DeviceParamData* pData = (DeviceParamData*)pvRef; - LPDIRECTINPUT8 lpDirectInput = pData->lpDirectInput; - JNIEnv* env = pData->env; - jobject obj = pData->obj; - jobject list = pData->list; - LPDIRECTINPUTDEVICE8 lpDevice = NULL; - LPUNKNOWN pUnknown = NULL; - HRESULT res; - - // Create the device object - if (FAILED(res = lpDirectInput->CreateDevice(lpddi->guidInstance, &lpDevice, - pUnknown))){ - PrintDIError("CreateDevice", res); - return DIENUM_STOP; - } - - /* - LPDIRECTINPUTDEVICE8 lpDevice2 = NULL; - // Get the IDirectDrawDevice8 interface from the object - res = lpDevice->QueryInterface(IID_IDirectInputDevice8, - (void**)&lpDevice2); - if (res != DI_OK) { - PrintDIError("QueryInterface DID2", res); - lpDevice->Release(); - return DIENUM_STOP; - } - */ - - //find out if this device is ff enabled - DWORD numForceFeedbackAxis = 0; - res = lpDevice->EnumObjects( CountFFAxesCallback, - (VOID*)&numForceFeedbackAxis, DIDFT_AXIS ); - if(FAILED(res)) { - PrintDIError("getting ff devices", res); - } - - // Set the data format - LPCDIDATAFORMAT lpDataFormat; - DWORD category = GET_DIDEVICE_TYPE(lpddi->dwDevType)&0xFF; - switch (category){ - case DI8DEVTYPE_KEYBOARD: - //printf("found Keyboard\n"); - lpDataFormat = &c_dfDIKeyboard; - break; - case DI8DEVTYPE_MOUSE: - //printf("found mouse\n"); - lpDataFormat = &c_dfDIMouse2; - // set up buffering - DIPROPDWORD dipropdw; - dipropdw.diph.dwSize = sizeof(DIPROPDWORD); - dipropdw.diph.dwHeaderSize = sizeof(DIPROPHEADER); - dipropdw.diph.dwObj = 0; - dipropdw.diph.dwHow = DIPH_DEVICE; - dipropdw.dwData = MOUSE_BUFFER_SIZE; - if (FAILED( - res = lpDevice->SetProperty(DIPROP_BUFFERSIZE, - &dipropdw.diph))) { - PrintDIError("SetProperty", res); - lpDevice->Release(); - return DIENUM_STOP; - } - break; - case DI8DEVTYPE_JOYSTICK: - default: - //printf("found stick\n"); - lpDataFormat = &c_dfDIJoystick; - break; - } - - if (FAILED(res = lpDevice->SetDataFormat(lpDataFormat))){ - PrintDIError("SetDataFormat", res); - lpDevice->Release(); - return DIENUM_STOP; - } - - if(numForceFeedbackAxis>0) { - // Set the cooperative level - if(FAILED(res = lpDevice->SetCooperativeLevel(hwndDummy, - DISCL_EXCLUSIVE | DISCL_BACKGROUND))){ - PrintDIError("SetCooperativeLevel", res); - lpDevice->Release(); - return DIENUM_STOP; - } - } else { - // Set the cooperative level - if(FAILED(res = lpDevice->SetCooperativeLevel(hwndDummy, - DISCL_NONEXCLUSIVE | DISCL_BACKGROUND))){ - PrintDIError("SetCooperativeLevel", res); - lpDevice->Release(); - return DIENUM_STOP; - } - } - - // get polling - DIDEVCAPS didc; - // Allocate space for all the device's objects (axes, buttons, POVS) - ZeroMemory( &didc, sizeof(DIDEVCAPS) ); - didc.dwSize = sizeof(DIDEVCAPS); - if (FAILED(res=lpDevice->GetCapabilities(&didc))){ - PrintDIError("Get Device Capabilities", res); - lpDevice->Release(); - return DIENUM_STOP; - } - jboolean polled = JNI_FALSE; - if ((didc.dwFlags)&DIDC_POLLEDDATAFORMAT) { - polled = JNI_TRUE; - } - - // Acquire the device - if(FAILED(res = lpDevice->Acquire())){ - PrintDIError("Acquire", res); - lpDevice->Release(); - return DIENUM_STOP; - } - - // Set the variables for the Java callback - jint type = (jint)lpddi->dwDevType&0xffff; - //printf("type == %x\n",type); - jstring productName = env->NewStringUTF(lpddi->tszProductName); - if (productName == NULL) { - lpDevice->Release(); - return DIENUM_STOP; - } - jstring instanceName = env->NewStringUTF(lpddi->tszInstanceName); - if (instanceName == NULL) { - lpDevice->Release(); - return DIENUM_STOP; - } - - // Add the device into the list - env->CallVoidMethod(obj, MID_AddDevice, list, (jlong)(long)lpDevice, type, - productName, instanceName,(jboolean)polled); - return DIENUM_CONTINUE; -} - -/* - * Class: org_java_games_input_DirectInputEnvironmentPlugin - * Method: enumDevices - * Signature: (JLjava/util/ArrayList;)Z - */ -extern "C" JNIEXPORT jboolean JNICALL -Java_net_java_games_input_DirectInputEnvironmentPlugin_enumDevices - (JNIEnv* env, jobject obj, jlong lDirectInput, jobject list) -{ - LPDIRECTINPUT8 lpDirectInput = (LPDIRECTINPUT8)(long)lDirectInput; - DWORD dwDevType = DI8DEVCLASS_ALL; - DeviceParamData data(lpDirectInput, env, obj, list); - LPVOID pvRef = (LPVOID)&data; - DWORD dwFlags = DIEDFL_ATTACHEDONLY; - HRESULT res; - if(FAILED(res=lpDirectInput->EnumDevices(dwDevType, - EnumDeviceCallback, pvRef, dwFlags))){ - PrintDIError("EnumDevices", res); - return JNI_FALSE; - } - return JNI_TRUE; -} - -/* - ****************************************************************************** - * DirectInputDevice - ****************************************************************************** - */ - -/* - * Class: org_java_games_input_DirectInputDevice - * Method: pollNative - * Signature: (J[B)Z - */ -extern "C" JNIEXPORT jboolean JNICALL -Java_net_java_games_input_DirectInputDevice_pollNative - (JNIEnv* env, jobject obj, jlong lDevice, jintArray baData, - jboolean pollme) -{ - LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(long)lDevice; - // Reacquire the device - HRESULT res = lpDevice->Acquire(); - if (res != DI_OK && res != S_FALSE) { - PrintDIError("Acquire", res); - return JNI_FALSE; - } - // Poll the device - if (pollme == JNI_TRUE) { - res = lpDevice->Poll(); - // Changed this to FAILED(res) instead of res != DI_OK as it was - // causeing problems and the dx samples check for FAILED too. - if ( FAILED(res) ) { - PrintDIError("Poll", res); - return JNI_FALSE; - } - } - // Get the device state (data) - DIJOYSTATE data; - res = lpDevice->GetDeviceState(sizeof(data), &data); - if (res != DI_OK) { - PrintDIError("GetDeviceState", res); - return JNI_FALSE; - } - // Copy the data into the byte array - env->SetIntArrayRegion(baData, 0, (jsize)(sizeof(data)/4), (jint*)&data); - return JNI_TRUE; -} - -/* - * Enumeration callback for device objects - * - * returns DIENUM_CONTINUE or DIENUM_STOP - */ -BOOL CALLBACK EnumObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, - LPVOID pvRef) -{ - ObjectParamData* pData = (ObjectParamData*)pvRef; - LPDIRECTINPUTDEVICE8 lpDevice = pData->lpDevice; - JNIEnv* env = pData->env; - jobject obj = pData->obj; - jobject list = pData->list; - jobject identifier = NULL; - char ffEnabled = 0; - - HRESULT res; - if (lpddoi->guidType == GUID_XAxis) { - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, FID_X); - } else if (lpddoi->guidType == GUID_YAxis) { - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, FID_Y); - } else if (lpddoi->guidType == GUID_ZAxis) { - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, FID_Z); - } else if (lpddoi->guidType == GUID_RxAxis) { - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, FID_RX); - } else if (lpddoi->guidType == GUID_RyAxis) { - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, FID_RY); - } else if (lpddoi->guidType == GUID_RzAxis) { - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, FID_RZ); - } else if (lpddoi->guidType == GUID_Slider) { - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, FID_Slider); - } else if (lpddoi->guidType == GUID_Button) { - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, FID_Button); - } else if (lpddoi->guidType == GUID_POV) { - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, FID_POV); - } else { - // Do not add this axis into the list, since we don't know what it is - return DIENUM_CONTINUE; - } - if (identifier == NULL) { - return DIENUM_STOP; - } - if (DIDFT_GETTYPE(lpddoi->dwType)&DIDFT_AXIS){ - // set axis range - DIPROPRANGE joy_axis_range; - joy_axis_range.lMin = -32768; - joy_axis_range.lMax = 32768; - joy_axis_range.diph.dwSize=sizeof(DIPROPRANGE); - joy_axis_range.diph.dwHeaderSize=sizeof(DIPROPHEADER); - joy_axis_range.diph.dwHow = DIPH_BYID; - joy_axis_range.diph.dwObj=lpddoi->dwType; - if (FAILED( - res=lpDevice->SetProperty(DIPROP_RANGE,&joy_axis_range.diph))){ - PrintDIError("SetProperty", res); - } - - //check if this axis is ff enabled - if( (lpddoi->dwFlags & DIDOI_FFACTUATOR) != 0 ) { - //printf("%s is ff enabled\n", lpddoi->tszName); - ffEnabled = 1; - } - } - - jint didft = (jint)lpddoi->dwType; - jstring name = env->NewStringUTF(lpddoi->tszName); - // Add the axis into our list - env->CallVoidMethod(obj, MID_AddAxis, list, identifier, didft, - name); - - if(ffEnabled) { - // This application needs only one effect: Applying raw forces. - DWORD rgdwAxes; - LONG rglDirection = 0; - if(lpddoi->guidType == GUID_XAxis) { - //printf("effect is in the x axis\n"); - rgdwAxes = DIJOFS_X; - } else if(lpddoi->guidType == GUID_YAxis) { - //printf("effect is in the y axis\n"); - rgdwAxes = DIJOFS_Y; - } else if(lpddoi->guidType == GUID_ZAxis) { - //printf("effect is in the z axis\n"); - rgdwAxes = DIJOFS_Z; - } - - DICONSTANTFORCE cf = { DI_FFNOMINALMAX }; - - DIEFFECT eff; - ZeroMemory( &eff, sizeof(eff) ); - eff.dwSize = sizeof(DIEFFECT); - eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS; - eff.dwDuration = INFINITE; - eff.dwSamplePeriod = 0; - eff.dwGain = DI_FFNOMINALMAX; - eff.dwTriggerButton = DIEB_NOTRIGGER; - eff.dwTriggerRepeatInterval = 0; - eff.cAxes = 1; - eff.rgdwAxes = &rgdwAxes; - eff.rglDirection = &rglDirection; - eff.lpEnvelope = 0; - eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE); - eff.lpvTypeSpecificParams = &cf; - eff.dwStartDelay = 0; - cf.lMagnitude = (long) (0); - - LPDIRECTINPUTEFFECT g_pEffect; - // Create the prepared effect - if( FAILED( res = lpDevice->CreateEffect( GUID_ConstantForce, - &eff, &g_pEffect, NULL ) ) ) - { - PrintDIError("Create effect", res); - return res; - } - - env->CallVoidMethod(obj, MID_AddRumbler, (jlong)(long)g_pEffect, identifier, name); - } - return DIENUM_CONTINUE; -} - -/* - * Class: org_java_games_input_DirectInputRumbler - * Method setRumble - * Signature (JF)Z - */ -extern "C" JNIEXPORT jboolean JNICALL -Java_net_java_games_input_DirectInputRumbler_setRumble - (JNIEnv *env, jobject obj, jlong effect, jfloat value) -{ - LPDIRECTINPUTEFFECT g_pEffect = (LPDIRECTINPUTEFFECT)(long)effect; - float force = (float)value; - HRESULT hr; - - DICONSTANTFORCE cf = { DI_FFNOMINALMAX }; - - DIEFFECT eff; - ZeroMemory( &eff, sizeof(eff) ); - eff.dwSize = sizeof(DIEFFECT); - eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE); - eff.lpvTypeSpecificParams = &cf; - cf.lMagnitude = (long) (((float)DI_FFNOMINALMAX)*force); - - //printf("force: %f, mag: %d\n", force, cf.lMagnitude); - - hr = g_pEffect->SetParameters( &eff, DIEP_TYPESPECIFICPARAMS ); - if (FAILED(hr)) { - PrintDIError("set parameters", hr); - return hr; - } - - if(force!=0) { - hr = g_pEffect->Start(1,0); - if (FAILED(hr)) { - PrintDIError("start", hr); - return hr; - } - } else { - hr = g_pEffect->Stop(); - if (FAILED(hr)) { - PrintDIError("stop", hr); - return hr; - } - } -} - -/* - * Class: org_java_games_input_DirectInputDevice - * Method: enumObjects - * Signature: (JLjava/util/ArrayList;)Z - */ -extern "C" JNIEXPORT jboolean JNICALL -Java_net_java_games_input_DirectInputDevice_enumObjects - (JNIEnv* env, jobject obj, jlong lDevice, jobject list) -{ - LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(long)lDevice; - ObjectParamData data(lpDevice, env, obj, list); - LPVOID pvRef = (LPVOID)&data; - DWORD dwFlags = DIDFT_ALL; - // Enum objects - HRESULT res = lpDevice->EnumObjects(EnumObjectsCallback, pvRef, dwFlags); - if (res != DI_OK) { - PrintDIError("EnumObjects", res); - return JNI_FALSE; - } - return JNI_TRUE; -} - -/* - ****************************************************************************** - * DirectInputKeyboard - ****************************************************************************** - */ - -/* - * Class: org_java_games_input_DirectInputKeyboard - * Method: pollNative - * Signature: (J[B)Z - */ -extern "C" JNIEXPORT jboolean JNICALL -Java_net_java_games_input_DirectInputKeyboard_pollNative - (JNIEnv* env, jobject obj, jlong lDevice, jbyteArray baData) -{ - LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(long)lDevice; - // Reacquire the device - HRESULT res = lpDevice->Acquire(); - if (res != DI_OK && res != S_FALSE) { - PrintDIError("Acquire", res); - return JNI_FALSE; - } - // Get the device state (data) - char data[256]; - res = lpDevice->GetDeviceState(sizeof(data), data); - if (res != DI_OK) { - PrintDIError("GetDeviceState", res); - return JNI_FALSE; - } - env->SetByteArrayRegion(baData, 0, (jsize)sizeof(data), (jbyte*)&data); - return JNI_TRUE; -} - -/* - * Enumeration callback to rename keyboard keys - * - * returns DIENUM_CONTINUE or DIENUM_STOP - */ -BOOL CALLBACK RenameKeysCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, - LPVOID pvRef) -{ - ObjectParamData* pData = (ObjectParamData*)pvRef; - //LPDIRECTINPUTDEVICE8 lpDevice = pData->lpDevice; - JNIEnv* env = pData->env; - jobject obj = pData->obj; - jint index = (jint)lpddoi->dwOfs; - jstring name = env->NewStringUTF(lpddoi->tszName); - env->CallVoidMethod(obj, MID_RenameKey, index, name); - return DIENUM_CONTINUE; -} - -/* - * Class: org_java_games_input_DirectInputKeyboard - * Method: renameKeys - * Signature: (J)Z - */ -extern "C" JNIEXPORT jboolean JNICALL -Java_net_java_games_input_DirectInputKeyboard_renameKeys - (JNIEnv* env, jobject obj, jlong lDevice) -{ - LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(long)lDevice; - ObjectParamData data(lpDevice, env, obj, NULL); - LPVOID pvRef = (LPVOID)&data; - DWORD dwFlags = DIDFT_ALL; - // Enum objects - HRESULT res = lpDevice->EnumObjects(RenameKeysCallback, pvRef, dwFlags); - if (res != DI_OK) { - PrintDIError("EnumObjects", res); - return JNI_FALSE; - } - return JNI_TRUE; -} - -/* - ****************************************************************************** - * DirectInputMouse - ****************************************************************************** - */ - -/* - * Class: org_java_games_input_DirectInputMouse - * Method: getNumAxes - * Signature: (J)I - */ -extern "C" JNIEXPORT jint JNICALL -Java_net_java_games_input_DirectInputMouse_getNumAxes - (JNIEnv* env, jobject obj, jlong lDevice) -{ - LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(long)lDevice; - // Reacquire the device - HRESULT res = lpDevice->Acquire(); - if (res != DI_OK && res != S_FALSE) { - PrintDIError("Acquire", res); - return 0; - } - DIDEVCAPS deviceCaps; - // Allocate space for all the device's objects (axes, buttons, POVS) - ZeroMemory( &deviceCaps, sizeof(DIDEVCAPS) ); - deviceCaps.dwSize = sizeof(DIDEVCAPS); - res = lpDevice->GetCapabilities(&deviceCaps); - if(res != DI_OK) { - PrintDIError("GetCapabilities", res); - return JNI_FALSE; - } - return deviceCaps.dwAxes; -} - -/* - * Class: org_java_games_input_DirectInputMouse - * Method: getNumButtons - * Signature: (J)I - */ -extern "C" JNIEXPORT jint JNICALL -Java_net_java_games_input_DirectInputMouse_getNumButtons - (JNIEnv* env, jobject obj, jlong lDevice) -{ - LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(long)lDevice; - // Reacquire the device - HRESULT res = lpDevice->Acquire(); - if (res != DI_OK && res != S_FALSE) { - PrintDIError("Acquire", res); - return 0; - } - DIDEVCAPS deviceCaps; - // Allocate space for all the device's objects (axes, buttons, POVS) - ZeroMemory( &deviceCaps, sizeof(DIDEVCAPS) ); - deviceCaps.dwSize = sizeof(DIDEVCAPS); - res = lpDevice->GetCapabilities(&deviceCaps); - if(res != DI_OK) { - PrintDIError("GetCapabilities", res); - return JNI_FALSE; - } - return deviceCaps.dwButtons; -} - -/* - * Class: org_java_games_input_DirectInputMouse - * Method: pollNative - * Signature: (J[B)Z - */ -extern "C" JNIEXPORT jboolean JNICALL -Java_net_java_games_input_DirectInputMouse_pollNative - (JNIEnv* env, jobject obj, jlong lDevice, jbyteArray baData) -{ - LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(long)lDevice; - // Reacquire the device - HRESULT res = lpDevice->Acquire(); - if (res != DI_OK && res != S_FALSE) { - PrintDIError("Acquire", res); - return JNI_FALSE; - } - // Get the data - DIMOUSESTATE2 data; - res = lpDevice->GetDeviceState(sizeof(data), &data); - if (res != DI_OK) { - PrintDIError("GetDeviceState", res); - return JNI_FALSE; - } - - // Endolf woz here - // Set the axis data to 0, we only want the buttons for this second - data.lX = 0; - data.lY = 0; - data.lZ = 0; - - DIDEVICEOBJECTDATA dataBuffer[MOUSE_BUFFER_SIZE]; - DWORD numEvents = MOUSE_BUFFER_SIZE; - HRESULT res2 = lpDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), dataBuffer, &numEvents, 0); - switch(res2) { - case DIERR_INPUTLOST: - printf("DIERR_INPUTLOST\n"); - break; - case DIERR_INVALIDPARAM: - printf("DIERR_INVALIDPARAM\n"); - break; - case DIERR_NOTACQUIRED: - printf("DIERR_NOTACQUIRED\n"); - break; - case DIERR_NOTBUFFERED: - printf("DIERR_NOTBUFFERED\n"); - break; - case DIERR_NOTINITIALIZED: - printf("DIERR_NOTINITIALIZED\n"); - break; - case DI_BUFFEROVERFLOW: - printf("DI_BUFFEROVERFLOW\n"); - break; - } - int i=0; - for(i=0;i<numEvents;i++) { - switch(dataBuffer[i].dwOfs) { - case DIMOFS_BUTTON0: - if(dataBuffer[i].dwData == 0x80) { - data.rgbButtons[0] = 0x80; - } - break; - case DIMOFS_BUTTON1: - if(dataBuffer[i].dwData == 0x80) { - data.rgbButtons[1] = 0x80; - } - break; - case DIMOFS_BUTTON2: - if(dataBuffer[i].dwData == 0x80) { - data.rgbButtons[2] = 0x80; - } - break; - case DIMOFS_BUTTON3: - if(dataBuffer[i].dwData == 0x80) { - data.rgbButtons[3] = 0x80; - } - break; - case DIMOFS_BUTTON4: - if(dataBuffer[i].dwData == 0x80) { - data.rgbButtons[4] = 0x80; - } - break; - case DIMOFS_BUTTON5: - if(dataBuffer[i].dwData == 0x80) { - data.rgbButtons[5] = 0x80; - } - break; - case DIMOFS_BUTTON6: - if(dataBuffer[i].dwData == 0x80) { - data.rgbButtons[6] = 0x80; - } - break; - case DIMOFS_BUTTON7: - if(dataBuffer[i].dwData == 0x80) { - data.rgbButtons[7] = 0x80; - } - break; - case DIMOFS_X: - data.lX += dataBuffer[i].dwData; - break; - case DIMOFS_Y: - data.lY += dataBuffer[i].dwData; - break; - case DIMOFS_Z: - data.lZ += dataBuffer[i].dwData; - break; - default: - printf("Uknown data offset (%d)\n", dataBuffer[i].dwOfs); - } - } - - //printf("axis data in native at poll end is x: %d, y: %d, z: %d\n", data.lX, data.lY, data.lZ); - - // Set the data in our array - env->SetByteArrayRegion(baData, 0, (jsize)sizeof(data), (jbyte*)&data); - return JNI_TRUE; -} - -/* - * Enumeration callback to rename mouse axes - * - * returns DIENUM_CONTINUE or DIENUM_STOP - */ -BOOL CALLBACK RenameAxesCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, - LPVOID pvRef) -{ - ObjectParamData* pData = (ObjectParamData*)pvRef; - //LPDIRECTINPUTDEVICE8 lpDevice = pData->lpDevice; - JNIEnv* env = pData->env; - jobject obj = pData->obj; - jobject identifier; - switch (lpddoi->dwOfs) { - case DIMOFS_X: - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, - FID_X); - break; - case DIMOFS_Y: - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, - FID_Y); - break; - case DIMOFS_Z: - identifier = env->GetStaticObjectField(CLASS_AxisIdentifier, - FID_Slider); - break; - case DIMOFS_BUTTON0: - identifier = env->GetStaticObjectField(CLASS_ButtonIdentifier, - FID_Left); - break; - case DIMOFS_BUTTON1: - identifier = env->GetStaticObjectField(CLASS_ButtonIdentifier, - FID_Right); - break; - case DIMOFS_BUTTON2: - identifier = env->GetStaticObjectField(CLASS_ButtonIdentifier, - FID_Middle); - break; - case DIMOFS_BUTTON3: - identifier = env->GetStaticObjectField(CLASS_ButtonIdentifier, - FID_Side); - break; - case DIMOFS_BUTTON4: - identifier = env->GetStaticObjectField(CLASS_ButtonIdentifier, - FID_Extra); - break; - case DIMOFS_BUTTON5: - identifier = env->GetStaticObjectField(CLASS_ButtonIdentifier, - FID_Forward); - break; - case DIMOFS_BUTTON6: - identifier = env->GetStaticObjectField(CLASS_ButtonIdentifier, - FID_Back); - break; - default: - return DIENUM_CONTINUE; // Not an axis we know - } - jstring name = env->NewStringUTF(lpddoi->tszName); - env->CallVoidMethod(obj, MID_RenameAxis, identifier, name); - return DIENUM_CONTINUE; -} - -/* - * Class: org_java_games_input_DirectInputMouse - * Method: renameAxes - * Signature: (J)Z - */ -extern "C" JNIEXPORT jboolean JNICALL -Java_net_java_games_input_DirectInputMouse_renameAxes - (JNIEnv* env, jobject obj, jlong lDevice) -{ - LPDIRECTINPUTDEVICE8 lpDevice = (LPDIRECTINPUTDEVICE8)(long)lDevice; - ObjectParamData data(lpDevice, env, obj, NULL); - LPVOID pvRef = (LPVOID)&data; - DWORD dwFlags = DIDFT_ALL; - // Enum objects - HRESULT res = lpDevice->EnumObjects(RenameAxesCallback, pvRef, dwFlags); - if (res != DI_OK) { - PrintDIError("EnumObjects", res); - return JNI_FALSE; - } - return JNI_TRUE; -} - - |