diff --git a/build.xml b/build.xml index 317cbf7..9cb1087 100644 --- a/build.xml +++ b/build.xml @@ -83,6 +83,23 @@ + + + + + + + + + + + + + + + + + diff --git a/coreAPI/src/java/net/java/games/input/ControllerEnvironment.java b/coreAPI/src/java/net/java/games/input/ControllerEnvironment.java index c7a4a42..db6f1dc 100644 --- a/coreAPI/src/java/net/java/games/input/ControllerEnvironment.java +++ b/coreAPI/src/java/net/java/games/input/ControllerEnvironment.java @@ -38,6 +38,9 @@ *****************************************************************************/ package net.java.games.input; +import java.io.File; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Iterator; @@ -105,6 +108,13 @@ public abstract class ControllerEnvironment { controllerListeners.add(l); } + /** + * Returns the isSupported status of this environment. + * What makes an environment supported or not is up to the + * particular plugin, but may include OS or available hardware. + */ + public abstract boolean isSupported(); + /** * Removes a listener for controller state change events. */ diff --git a/coreAPI/src/java/net/java/games/input/DefaultControllerEnvironment.java b/coreAPI/src/java/net/java/games/input/DefaultControllerEnvironment.java index 544562a..098a1cf 100644 --- a/coreAPI/src/java/net/java/games/input/DefaultControllerEnvironment.java +++ b/coreAPI/src/java/net/java/games/input/DefaultControllerEnvironment.java @@ -41,6 +41,7 @@ package net.java.games.input; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.lang.reflect.Method; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; @@ -57,18 +58,8 @@ import net.java.games.util.plugins.*; * @author Michael Martak */ class DefaultControllerEnvironment extends ControllerEnvironment { - /** - * Location of the LIB directory. - */ - static String libPath; - - /** - * List of all controllers in this environment - */ - private ArrayList controllers; - - private Collection loadedPlugins = new ArrayList(); - + static String libPath; + /** * Static utility method for loading native libraries. * It will try to load from either the path given by @@ -90,28 +81,36 @@ class DefaultControllerEnvironment extends ControllerEnvironment { }); } - /** - * Public no-arg constructor. - */ - public DefaultControllerEnvironment() { - } - - private static String getPrivilegedProperty(final String property) { - return (String)AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return System.getProperty(property); - } - }); - } - - private static String getPrivilegedProperty(final String property, final String default_value) { + static String getPrivilegedProperty(final String property) { + return (String)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return System.getProperty(property); + } + }); + } + + + static String getPrivilegedProperty(final String property, final String default_value) { return (String)AccessController.doPrivileged(new PrivilegedAction() { public Object run() { return System.getProperty(property, default_value); } }); } - + + /** + * List of all controllers in this environment + */ + private ArrayList controllers; + + private Collection loadedPlugins = new ArrayList(); + + /** + * Public no-arg constructor. + */ + public DefaultControllerEnvironment() { + } + /** * Returns a list of all controllers available to this environment, * or an empty array if there are no controllers in this environment. @@ -147,15 +146,20 @@ class DefaultControllerEnvironment extends ControllerEnvironment { System.out.println("Trying to use default plugin, OS name " + osName +" not recognised"); } } - ArrayList pluginClassList = new ArrayList(); + StringTokenizer pluginClassTok = new StringTokenizer(pluginClasses, " \t\n\r\f,;:"); while(pluginClassTok.hasMoreTokens()) { String className = pluginClassTok.nextToken(); try { if(!loadedPlugins.contains(className)) { - Class ceClass = Class.forName(className); + Class ceClass = Class.forName(className); ControllerEnvironment ce = (ControllerEnvironment) ceClass.newInstance(); - addControllers(ce.getControllers()); + if(ce.isSupported()) { + addControllers(ce.getControllers()); + loadedPlugins.add(ce.getClass().getName()); + } else { + logln(ceClass.getName() + " is not supported"); + } } } catch (Throwable e) { e.printStackTrace(); @@ -199,9 +203,13 @@ class DefaultControllerEnvironment extends ControllerEnvironment { envClasses[i].getName() +" loaded by "+envClasses[i].getClassLoader()); ControllerEnvironment ce = (ControllerEnvironment) - envClasses[i].newInstance(); - addControllers(ce.getControllers()); - loadedPlugins.add(ce.getClass().getName()); + envClasses[i].newInstance(); + if(ce.isSupported()) { + addControllers(ce.getControllers()); + loadedPlugins.add(ce.getClass().getName()); + } else { + logln(envClasses[i].getName() + " is not supported"); + } } catch (Throwable e) { e.printStackTrace(); } @@ -219,4 +227,8 @@ class DefaultControllerEnvironment extends ControllerEnvironment { controllers.add(c[i]); } } + + public boolean isSupported() { + return true; + } } diff --git a/plugins/OSX/src/java/net/java/games/input/OSXEnvironmentPlugin.java b/plugins/OSX/src/java/net/java/games/input/OSXEnvironmentPlugin.java index 66813b7..9ba03a1 100755 --- a/plugins/OSX/src/java/net/java/games/input/OSXEnvironmentPlugin.java +++ b/plugins/OSX/src/java/net/java/games/input/OSXEnvironmentPlugin.java @@ -38,6 +38,7 @@ *****************************************************************************/ package net.java.games.input; +import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; @@ -55,8 +56,54 @@ import java.security.PrivilegedAction; * @version 1.0 */ public final class OSXEnvironmentPlugin extends ControllerEnvironment implements Plugin { + + private static boolean supported = false; + + /** + * Static utility method for loading native libraries. + * It will try to load from either the path given by + * the net.java.games.input.librarypath property + * or through System.loadLibrary(). + * + */ + static void loadLibrary(final String lib_name) { + AccessController.doPrivileged( + new PrivilegedAction() { + public final Object run() { + String lib_path = System.getProperty("net.java.games.input.librarypath"); + if (lib_path != null) + System.load(lib_path + File.separator + System.mapLibraryName(lib_name)); + else + System.loadLibrary(lib_name); + return null; + } + }); + } + + static String getPrivilegedProperty(final String property) { + return (String)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return System.getProperty(property); + } + }); + } + + + static String getPrivilegedProperty(final String property, final String default_value) { + return (String)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return System.getProperty(property, default_value); + } + }); + } + static { - DefaultControllerEnvironment.loadLibrary("jinput-osx"); + String osName = getPrivilegedProperty("os.name", "").trim(); + if(osName.equals("Mac OS X")) { + // Could check isMacOSXEqualsOrBetterThan in here too. + supported = true; + loadLibrary("jinput-osx"); + } } private final static boolean isMacOSXEqualsOrBetterThan(int major_required, int minor_required) { @@ -70,7 +117,7 @@ public final class OSXEnvironmentPlugin extends ControllerEnvironment implements major = Integer.parseInt(major_str); minor = Integer.parseInt(minor_str); } catch (Exception e) { - ControllerEnvironment.logln("Exception occurred while trying to determine OS version: " + e); + logln("Exception occurred while trying to determine OS version: " + e); // Best guess, no return false; } @@ -80,13 +127,21 @@ public final class OSXEnvironmentPlugin extends ControllerEnvironment implements private final Controller[] controllers; public OSXEnvironmentPlugin() { - this.controllers = enumerateControllers(); + if(isSupported()) { + this.controllers = enumerateControllers(); + } else { + this.controllers = new Controller[0]; + } } public final Controller[] getControllers() { return controllers; } + public boolean isSupported() { + return supported; + } + private final static void addElements(OSXHIDQueue queue, List elements, List components, boolean map_mouse_buttons) throws IOException { Iterator it = elements.iterator(); while (it.hasNext()) { @@ -202,19 +257,19 @@ public final class OSXEnvironmentPlugin extends ControllerEnvironment implements createControllersFromDevice(device, controllers); device_used = old_size != controllers.size(); } catch (IOException e) { - ControllerEnvironment.logln("Failed to create controllers from device: " + device.getProductName()); + logln("Failed to create controllers from device: " + device.getProductName()); } if (!device_used) device.release(); } catch (IOException e) { - ControllerEnvironment.logln("Failed to enumerate device: " + e.getMessage()); + logln("Failed to enumerate device: " + e.getMessage()); } } } finally { it.close(); } } catch (IOException e) { - ControllerEnvironment.log("Failed to enumerate devices: " + e.getMessage()); + log("Failed to enumerate devices: " + e.getMessage()); return new Controller[]{}; } Controller[] controllers_array = new Controller[controllers.size()]; diff --git a/plugins/awt/src/net/java/games/input/AWTEnvironmentPlugin.java b/plugins/awt/src/net/java/games/input/AWTEnvironmentPlugin.java index 96e5986..b6b062a 100644 --- a/plugins/awt/src/net/java/games/input/AWTEnvironmentPlugin.java +++ b/plugins/awt/src/net/java/games/input/AWTEnvironmentPlugin.java @@ -34,7 +34,8 @@ import net.java.games.util.plugins.Plugin; * @author elias */ public class AWTEnvironmentPlugin extends ControllerEnvironment implements Plugin { - private final Controller[] controllers; + + private final Controller[] controllers; public AWTEnvironmentPlugin() { this.controllers = new Controller[]{new AWTKeyboard(), new AWTMouse()}; @@ -43,4 +44,8 @@ public class AWTEnvironmentPlugin extends ControllerEnvironment implements Plugi public Controller[] getControllers() { return controllers; } + + public boolean isSupported() { + return true; + } } diff --git a/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java b/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java index 513c85d..1ad937a 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java @@ -41,21 +41,64 @@ import java.security.PrivilegedAction; public final class LinuxEnvironmentPlugin extends ControllerEnvironment implements Plugin { private final static String LIBNAME = "jinput-linux"; private final static String POSTFIX64BIT = "64"; + private static boolean supported = false; private final Controller[] controllers; private final List devices = new ArrayList(); private final static LinuxDeviceThread device_thread = new LinuxDeviceThread(); + /** + * Static utility method for loading native libraries. + * It will try to load from either the path given by + * the net.java.games.input.librarypath property + * or through System.loadLibrary(). + * + */ + static void loadLibrary(final String lib_name) { + AccessController.doPrivileged( + new PrivilegedAction() { + public final Object run() { + String lib_path = System.getProperty("net.java.games.input.librarypath"); + if (lib_path != null) + System.load(lib_path + File.separator + System.mapLibraryName(lib_name)); + else + System.loadLibrary(lib_name); + return null; + } + }); + } + + static String getPrivilegedProperty(final String property) { + return (String)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return System.getProperty(property); + } + }); + } + + + static String getPrivilegedProperty(final String property, final String default_value) { + return (String)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return System.getProperty(property, default_value); + } + }); + } + static { - try { - DefaultControllerEnvironment.loadLibrary(LIBNAME); - } catch (UnsatisfiedLinkError e) { + String osName = getPrivilegedProperty("os.name", "").trim(); + if(osName.equals("Linux")) { + supported = true; try { - DefaultControllerEnvironment.loadLibrary(LIBNAME + POSTFIX64BIT); - } catch (UnsatisfiedLinkError e2) { - ControllerEnvironment.logln("Failed to load 64 bit library: " + e2.getMessage()); - // throw original error - throw e; + loadLibrary(LIBNAME); + } catch (UnsatisfiedLinkError e) { + try { + loadLibrary(LIBNAME + POSTFIX64BIT); + } catch (UnsatisfiedLinkError e2) { + logln("Failed to load 64 bit library: " + e2.getMessage()); + // throw original error + throw e; + } } } } @@ -65,15 +108,19 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen } public LinuxEnvironmentPlugin() { - this.controllers = enumerateControllers(); - ControllerEnvironment.logln("Linux plugin claims to have found " + controllers.length + " controllers"); - AccessController.doPrivileged( - new PrivilegedAction() { - public final Object run() { - Runtime.getRuntime().addShutdownHook(new ShutdownHook()); - return null; - } - }); + if(isSupported()) { + this.controllers = enumerateControllers(); + logln("Linux plugin claims to have found " + controllers.length + " controllers"); + AccessController.doPrivileged( + new PrivilegedAction() { + public final Object run() { + Runtime.getRuntime().addShutdownHook(new ShutdownHook()); + return null; + } + }); + } else { + controllers = new Controller[0]; + } } /** Returns a list of all controllers available to this environment, @@ -120,7 +167,7 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen povs[3][1] = event_component; break; default: - ControllerEnvironment.logln("Unknown POV instance: " + native_code); + logln("Unknown POV instance: " + native_code); break; } } else if (identifier != null) { @@ -305,7 +352,7 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen } else device.close(); } catch (IOException e) { - ControllerEnvironment.logln("Failed to open device (" + event_file + "): " + e.getMessage()); + logln("Failed to open device (" + event_file + "): " + e.getMessage()); } } } @@ -357,11 +404,11 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen } else device.close(); } catch (IOException e) { - ControllerEnvironment.logln("Failed to create Controller: " + e.getMessage()); + logln("Failed to create Controller: " + e.getMessage()); device.close(); } } catch (IOException e) { - ControllerEnvironment.logln("Failed to open device (" + event_file + "): " + e.getMessage()); + logln("Failed to open device (" + event_file + "): " + e.getMessage()); } } } @@ -373,9 +420,13 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen LinuxDevice device = (LinuxDevice)devices.get(i); device.close(); } catch (IOException e) { - ControllerEnvironment.logln("Failed to close device: " + e.getMessage()); + logln("Failed to close device: " + e.getMessage()); } } } } + + public boolean isSupported() { + return supported; + } } diff --git a/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java b/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java index 08cb8f2..a28c4c7 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java @@ -190,7 +190,7 @@ final class LinuxEventDevice implements LinuxDevice { rumblers.add(new LinuxRumbleFF(this)); } } catch (IOException e) { - ControllerEnvironment.logln("Failed to enumerate rumblers: " + e.getMessage()); + LinuxEnvironmentPlugin.logln("Failed to enumerate rumblers: " + e.getMessage()); } return (Rumbler[])rumblers.toArray(new Rumbler[]{}); } diff --git a/plugins/linux/src/java/net/java/games/input/LinuxForceFeedbackEffect.java b/plugins/linux/src/java/net/java/games/input/LinuxForceFeedbackEffect.java index 528cbff..299e029 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxForceFeedbackEffect.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxForceFeedbackEffect.java @@ -56,7 +56,7 @@ abstract class LinuxForceFeedbackEffect implements Rumbler { write_task.write(0); } } catch (IOException e) { - ControllerEnvironment.logln("Failed to rumble: " + e); + LinuxEnvironmentPlugin.logln("Failed to rumble: " + e); } } diff --git a/plugins/linux/src/java/net/java/games/input/LinuxPOV.java b/plugins/linux/src/java/net/java/games/input/LinuxPOV.java index 7e62501..8cc4e74 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxPOV.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxPOV.java @@ -88,7 +88,7 @@ final class LinuxPOV extends LinuxComponent { else if (last_x == 1 && last_y == 1) return Component.POV.DOWN_RIGHT; else { - ControllerEnvironment.logln("Unknown values x = " + last_x + " | y = " + last_y); + LinuxEnvironmentPlugin.logln("Unknown values x = " + last_x + " | y = " + last_y); return Component.POV.OFF; } } diff --git a/plugins/windows/src/java/net/java/games/input/DirectInputEnvironmentPlugin.java b/plugins/windows/src/java/net/java/games/input/DirectInputEnvironmentPlugin.java index 3e1636b..be452bc 100644 --- a/plugins/windows/src/java/net/java/games/input/DirectInputEnvironmentPlugin.java +++ b/plugins/windows/src/java/net/java/games/input/DirectInputEnvironmentPlugin.java @@ -42,6 +42,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.List; import java.util.ArrayList; +import java.io.File; import java.io.IOException; import net.java.games.util.plugins.Plugin; @@ -52,8 +53,53 @@ import net.java.games.util.plugins.Plugin; * @version 1.0 */ public final class DirectInputEnvironmentPlugin extends ControllerEnvironment implements Plugin { + + private static boolean supported = false; + + /** + * Static utility method for loading native libraries. + * It will try to load from either the path given by + * the net.java.games.input.librarypath property + * or through System.loadLibrary(). + * + */ + static void loadLibrary(final String lib_name) { + AccessController.doPrivileged( + new PrivilegedAction() { + public final Object run() { + String lib_path = System.getProperty("net.java.games.input.librarypath"); + if (lib_path != null) + System.load(lib_path + File.separator + System.mapLibraryName(lib_name)); + else + System.loadLibrary(lib_name); + return null; + } + }); + } + + static String getPrivilegedProperty(final String property) { + return (String)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return System.getProperty(property); + } + }); + } + + + static String getPrivilegedProperty(final String property, final String default_value) { + return (String)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return System.getProperty(property, default_value); + } + }); + } + static { - DefaultControllerEnvironment.loadLibrary("jinput-dx8"); + String osName = getPrivilegedProperty("os.name", "").trim(); + if(osName.startsWith("Windows")) { + supported = true; + loadLibrary("jinput-dx8"); + } } private final Controller[] controllers; @@ -61,29 +107,36 @@ public final class DirectInputEnvironmentPlugin extends ControllerEnvironment im private final DummyWindow window; /** Creates new DirectInputEnvironment */ - public DirectInputEnvironmentPlugin() { + public DirectInputEnvironmentPlugin() { DummyWindow window = null; Controller[] controllers = new Controller[]{}; - try { - window = new DummyWindow(); + if(isSupported()) { try { - controllers = enumControllers(window); + window = new DummyWindow(); + try { + controllers = enumControllers(window); + } catch (IOException e) { + window.destroy(); + throw e; + } } catch (IOException e) { - window.destroy(); - throw e; + logln("Failed to enumerate devices: " + e.getMessage()); } - } catch (IOException e) { - ControllerEnvironment.logln("Failed to enumerate devices: " + e.getMessage()); + this.window = window; + this.controllers = controllers; + AccessController.doPrivileged( + new PrivilegedAction() { + public final Object run() { + Runtime.getRuntime().addShutdownHook(new ShutdownHook()); + return null; + } + }); + } else { + // These are final fields, so can't set them, then over ride + // them if we are supported. + this.window = null; + this.controllers = controllers; } - this.window = window; - this.controllers = controllers; - AccessController.doPrivileged( - new PrivilegedAction() { - public final Object run() { - Runtime.getRuntime().addShutdownHook(new ShutdownHook()); - return null; - } - }); } public final Controller[] getControllers() { @@ -185,4 +238,8 @@ public final class DirectInputEnvironmentPlugin extends ControllerEnvironment im */ } } + + public boolean isSupported() { + return supported; + } } // class DirectInputEnvironment diff --git a/plugins/windows/src/java/net/java/games/input/IDirectInput.java b/plugins/windows/src/java/net/java/games/input/IDirectInput.java index dea99d5..a7393d5 100644 --- a/plugins/windows/src/java/net/java/games/input/IDirectInput.java +++ b/plugins/windows/src/java/net/java/games/input/IDirectInput.java @@ -82,7 +82,7 @@ final class IDirectInput { IDirectInputDevice device = new IDirectInputDevice(window, address, instance_guid, product_guid, dev_type, dev_subtype, instance_name, product_name); devices.add(device); } catch (IOException e) { - DefaultControllerEnvironment.logln("Failed to initialize device " + product_name + " because of: " + e); + DirectInputEnvironmentPlugin.logln("Failed to initialize device " + product_name + " because of: " + e); } } diff --git a/plugins/windows/src/java/net/java/games/input/IDirectInputDevice.java b/plugins/windows/src/java/net/java/games/input/IDirectInputDevice.java index 86eea1c..40d8b8d 100644 --- a/plugins/windows/src/java/net/java/games/input/IDirectInputDevice.java +++ b/plugins/windows/src/java/net/java/games/input/IDirectInputDevice.java @@ -228,7 +228,7 @@ final class IDirectInputDevice { enumEffects(); createRumblers(); } catch (IOException e) { - ControllerEnvironment.logln("Failed to create rumblers: " + e.getMessage()); + DirectInputEnvironmentPlugin.logln("Failed to create rumblers: " + e.getMessage()); } /* Some DirectInput lamer-designer made the device state * axis mode be per-device not per-axis, so I'll just diff --git a/plugins/windows/src/java/net/java/games/input/IDirectInputEffect.java b/plugins/windows/src/java/net/java/games/input/IDirectInputEffect.java index 5cb372f..2d4f55c 100644 --- a/plugins/windows/src/java/net/java/games/input/IDirectInputEffect.java +++ b/plugins/windows/src/java/net/java/games/input/IDirectInputEffect.java @@ -64,7 +64,7 @@ final class IDirectInputEffect implements Rumbler { } else stop(); } catch (IOException e) { - ControllerEnvironment.logln("Failed to set rumbler gain: " + e.getMessage()); + DirectInputEnvironmentPlugin.logln("Failed to set rumbler gain: " + e.getMessage()); } } diff --git a/plugins/windows/src/java/net/java/games/input/RawInputEnvironmentPlugin.java b/plugins/windows/src/java/net/java/games/input/RawInputEnvironmentPlugin.java index d8185e2..767d461 100644 --- a/plugins/windows/src/java/net/java/games/input/RawInputEnvironmentPlugin.java +++ b/plugins/windows/src/java/net/java/games/input/RawInputEnvironmentPlugin.java @@ -42,6 +42,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.List; import java.util.ArrayList; +import java.io.File; import java.io.IOException; import net.java.games.util.plugins.Plugin; @@ -52,21 +53,68 @@ import net.java.games.util.plugins.Plugin; * @version 1.0 */ public final class RawInputEnvironmentPlugin extends ControllerEnvironment implements Plugin { + + private static boolean supported = false; + + /** + * Static utility method for loading native libraries. + * It will try to load from either the path given by + * the net.java.games.input.librarypath property + * or through System.loadLibrary(). + * + */ + static void loadLibrary(final String lib_name) { + AccessController.doPrivileged( + new PrivilegedAction() { + public final Object run() { + String lib_path = System.getProperty("net.java.games.input.librarypath"); + if (lib_path != null) + System.load(lib_path + File.separator + System.mapLibraryName(lib_name)); + else + System.loadLibrary(lib_name); + return null; + } + }); + } + + static String getPrivilegedProperty(final String property) { + return (String)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return System.getProperty(property); + } + }); + } + + + static String getPrivilegedProperty(final String property, final String default_value) { + return (String)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return System.getProperty(property, default_value); + } + }); + } + static { - DefaultControllerEnvironment.loadLibrary("jinput-raw"); + String osName = getPrivilegedProperty("os.name", "").trim(); + if(osName.startsWith("Windows")) { + supported = true; + loadLibrary("jinput-raw"); + } } - private final Controller[] controllers; + private final Controller[] controllers; /** Creates new DirectInputEnvironment */ public RawInputEnvironmentPlugin() { RawInputEventQueue queue; Controller[] controllers = new Controller[]{}; - try { - queue = new RawInputEventQueue(); - controllers = enumControllers(queue); - } catch (IOException e) { - ControllerEnvironment.logln("Failed to enumerate devices: " + e.getMessage()); + if(isSupported()) { + try { + queue = new RawInputEventQueue(); + controllers = enumControllers(queue); + } catch (IOException e) { + logln("Failed to enumerate devices: " + e.getMessage()); + } } this.controllers = controllers; } @@ -122,6 +170,10 @@ public final class RawInputEnvironmentPlugin extends ControllerEnvironment imple return controllers_array; } + public boolean isSupported() { + return supported; + } + /* * The raw input API, while being able to access * multiple mice and keyboards, is a bit raw (hah) @@ -151,4 +203,5 @@ public final class RawInputEnvironmentPlugin extends ControllerEnvironment imple private final static native byte[] getKeyboardClassGUID(); private final static native byte[] getMouseClassGUID(); + } // class DirectInputEnvironment diff --git a/plugins/windows/src/native/build.xml b/plugins/windows/src/native/build.xml index 42a6ed1..f250b24 100644 --- a/plugins/windows/src/native/build.xml +++ b/plugins/windows/src/native/build.xml @@ -3,10 +3,12 @@ - + + + @@ -28,7 +30,7 @@ - + diff --git a/plugins/wintab/src/java/net/java/games/input/WinTabContext.java b/plugins/wintab/src/java/net/java/games/input/WinTabContext.java index 185f4c2..6bbb95a 100644 --- a/plugins/wintab/src/java/net/java/games/input/WinTabContext.java +++ b/plugins/wintab/src/java/net/java/games/input/WinTabContext.java @@ -21,12 +21,10 @@ public class WinTabContext { } public synchronized void open() { - ControllerEnvironment.logln("Opening context"); this.hCTX = nOpen(window.getHwnd()); List devices = new ArrayList(); int numSupportedDevices = nGetNumberOfSupportedDevices(); - ControllerEnvironment.logln(numSupportedDevices + " devices maximum supported"); for(int i=0;i