From 5c894f5055dfdbf571afee3057e46b9912aedb9b Mon Sep 17 00:00:00 2001 From: Michael Speth Date: Fri, 26 Oct 2012 00:28:20 +1300 Subject: Applied the patch and seems to work after testing. --- plugins/OSX/build.xml | 4 +- .../net/java/games/input/OSXEnvironmentPlugin.java | 5 + plugins/awt/build.xml | 4 +- .../net/java/games/input/AWTEnvironmentPlugin.java | 5 + plugins/linux/build.xml | 4 +- .../src/java/net/java/games/input/LinuxDevice.java | 3 + .../java/games/input/LinuxEnvironmentPlugin.java | 1013 +++++++++++--------- .../net/java/games/input/LinuxEventDevice.java | 7 + .../net/java/games/input/LinuxJoystickDevice.java | 5 + plugins/windows/build.xml | 4 +- .../input/DirectAndRawInputEnvironmentPlugin.java | 5 + .../games/input/DirectInputEnvironmentPlugin.java | 5 + .../games/input/RawInputEnvironmentPlugin.java | 5 + plugins/wintab/build.xml | 6 +- .../java/games/input/WinTabEnvironmentPlugin.java | 5 + 15 files changed, 618 insertions(+), 462 deletions(-) (limited to 'plugins') diff --git a/plugins/OSX/build.xml b/plugins/OSX/build.xml index 659f766..148e161 100644 --- a/plugins/OSX/build.xml +++ b/plugins/OSX/build.xml @@ -18,7 +18,7 @@ - + @@ -39,7 +39,7 @@ 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 b20c428..4df7b40 100755 --- a/plugins/OSX/src/java/net/java/games/input/OSXEnvironmentPlugin.java +++ b/plugins/OSX/src/java/net/java/games/input/OSXEnvironmentPlugin.java @@ -285,4 +285,9 @@ public final class OSXEnvironmentPlugin extends ControllerEnvironment implements controllers.toArray(controllers_array); return controllers_array; } + + @Override + public Controller[] rescanControllers() { + throw new UnsupportedOperationException("Not supported yet."); + } } diff --git a/plugins/awt/build.xml b/plugins/awt/build.xml index 431ad63..3a87342 100644 --- a/plugins/awt/build.xml +++ b/plugins/awt/build.xml @@ -7,7 +7,7 @@ - + @@ -28,7 +28,7 @@ diff --git a/plugins/awt/src/net/java/games/input/AWTEnvironmentPlugin.java b/plugins/awt/src/net/java/games/input/AWTEnvironmentPlugin.java index b6b062a..d675cd7 100644 --- a/plugins/awt/src/net/java/games/input/AWTEnvironmentPlugin.java +++ b/plugins/awt/src/net/java/games/input/AWTEnvironmentPlugin.java @@ -48,4 +48,9 @@ public class AWTEnvironmentPlugin extends ControllerEnvironment implements Plugi public boolean isSupported() { return true; } + + @Override + public Controller[] rescanControllers() { + throw new UnsupportedOperationException("Not supported yet."); + } } diff --git a/plugins/linux/build.xml b/plugins/linux/build.xml index 0187a01..97ea608 100644 --- a/plugins/linux/build.xml +++ b/plugins/linux/build.xml @@ -12,7 +12,7 @@ - + @@ -33,7 +33,7 @@ diff --git a/plugins/linux/src/java/net/java/games/input/LinuxDevice.java b/plugins/linux/src/java/net/java/games/input/LinuxDevice.java index 2f26a68..a8ea612 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxDevice.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxDevice.java @@ -36,4 +36,7 @@ import java.util.ArrayList; */ interface LinuxDevice { void close() throws IOException; + public String getName(); + public String getFilename(); + } 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 1a1a85c..fe6bfa8 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxEnvironmentPlugin.java @@ -25,8 +25,7 @@ */ package net.java.games.input; -import net.java.games.util.plugins.Plugin; - +// === java imports === // import java.util.Arrays; import java.util.Comparator; import java.util.List; @@ -36,501 +35,613 @@ import java.io.File; import java.io.FilenameFilter; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.HashMap; +// === jinput imports === // +import java.util.logging.Level; +import java.util.logging.Logger; +import net.java.games.util.plugins.Plugin; /** Environment plugin for linux * @author elias * @author Jeremy Booth (jeremy@newdawnsoftware.com) */ 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"); - try { - if (lib_path != null) - System.load(lib_path + File.separator + System.mapLibraryName(lib_name)); - else - System.loadLibrary(lib_name); - } catch (UnsatisfiedLinkError e) { - logln("Failed to load library: " + e.getMessage()); - e.printStackTrace(); - supported = false; - } - 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 { - String osName = getPrivilegedProperty("os.name", "").trim(); - if(osName.equals("Linux")) { - supported = true; - if("i386".equals(getPrivilegedProperty("os.arch"))) { - loadLibrary(LIBNAME); - } else { - loadLibrary(LIBNAME + POSTFIX64BIT); - } - } - } - - public final static Object execute(LinuxDeviceTask task) throws IOException { - return device_thread.execute(task); - } +// ============= Class variables ============== // + private final static String LIBNAME = "jinput-linux"; + private final static String POSTFIX64BIT = "64"; + private static boolean supported = false; + private List controllers = new ArrayList(); + //private Controller[] controllers; + private List devices = new ArrayList(); + private final static LinuxDeviceThread device_thread = new LinuxDeviceThread(); + private HashMap controllerDeviceMap = new HashMap(); +// ============= Constructors ============== // public LinuxEnvironmentPlugin() { - 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]; - } + Controller[] arrayControllers = scanControllers(); + for(int i = 0; i < arrayControllers.length; i++){ + controllers.add(arrayControllers[i]); + } } - +// ============= Public Methods ============== // /** Returns a list of all controllers available to this environment, * or an empty array if there are no controllers in this environment. * @return Returns a list of all controllers available to this environment, * or an empty array if there are no controllers in this environment. */ public final Controller[] getControllers() { - return controllers; + Controller[] ret = new Controller[controllers.size()]; + int i = 0; + for(Controller controller:controllers){ + ret[i] = controllers.get(i); + i++; + } + return ret; } - - private final static Component[] createComponents(List event_components, LinuxEventDevice device) { - LinuxEventComponent[][] povs = new LinuxEventComponent[4][2]; - List components = new ArrayList(); - for (int i = 0; i < event_components.size(); i++) { - LinuxEventComponent event_component = (LinuxEventComponent)event_components.get(i); - Component.Identifier identifier = event_component.getIdentifier(); - - if (identifier == Component.Identifier.Axis.POV) { - int native_code = event_component.getDescriptor().getCode(); - switch (native_code) { - case NativeDefinitions.ABS_HAT0X: - povs[0][0] = event_component; - break; - case NativeDefinitions.ABS_HAT0Y: - povs[0][1] = event_component; - break; - case NativeDefinitions.ABS_HAT1X: - povs[1][0] = event_component; - break; - case NativeDefinitions.ABS_HAT1Y: - povs[1][1] = event_component; - break; - case NativeDefinitions.ABS_HAT2X: - povs[2][0] = event_component; - break; - case NativeDefinitions.ABS_HAT2Y: - povs[2][1] = event_component; - break; - case NativeDefinitions.ABS_HAT3X: - povs[3][0] = event_component; - break; - case NativeDefinitions.ABS_HAT3Y: - povs[3][1] = event_component; - break; - default: - logln("Unknown POV instance: " + native_code); - break; - } - } else if (identifier != null) { - LinuxComponent component = new LinuxComponent(event_component); - components.add(component); - device.registerComponent(event_component.getDescriptor(), component); - } + @Override + public Controller[] rescanControllers(){ + Controller controllerArray[] = null; + if(isSupported()) { + + List eventControllers = new ArrayList(); + List jsControllers = new ArrayList(); + + for(Controller controller:controllers){ + if(controller.getType() == Controller.Type.MOUSE || + controller.getType() == Controller.Type.KEYBOARD){ + eventControllers.add(controller); + }else{ + jsControllers.add(controller); } - for (int i = 0; i < povs.length; i++) { - LinuxEventComponent x = povs[i][0]; - LinuxEventComponent y = povs[i][1]; - if (x != null && y != null) { - LinuxComponent controller_component = new LinuxPOV(x, y); - components.add(controller_component); - device.registerComponent(x.getDescriptor(), controller_component); - device.registerComponent(y.getDescriptor(), controller_component); - } + } + rescanEventControllers(eventControllers); + // TODO implment rescan joystick controllers + //enumerateJoystickControllers(jsControllers); + + controllerArray = enumerateControllers(eventControllers, jsControllers); + + //logln("Linux plugin claims to have found " + controllerArray.length + " controllers"); + } else { + controllerArray = new Controller[0]; + } + return controllerArray; + } + + +// ============= Protected Methods ============== // +// ============= Private Methods ============== // + private Controller[] scanControllers(){ + Controller controllerArray[] = null; + if(isSupported()) { + controllerArray = enumerateControllers(); + AccessController.doPrivileged( new PrivilegedAction() { + public final Object run() { + Runtime.getRuntime().addShutdownHook(new ShutdownHook()); + return null; } - Component[] components_array = new Component[components.size()]; - components.toArray(components_array); - return components_array; - } - - private final static Mouse createMouseFromDevice(LinuxEventDevice device, Component[] components) throws IOException { - Mouse mouse = new LinuxMouse(device, components, new Controller[]{}, device.getRumblers()); - if (mouse.getX() != null && mouse.getY() != null && mouse.getPrimaryButton() != null) - return mouse; - else - return null; - } - - private final static Keyboard createKeyboardFromDevice(LinuxEventDevice device, Component[] components) throws IOException { - Keyboard keyboard = new LinuxKeyboard(device, components, new Controller[]{}, device.getRumblers()); - return keyboard; - } - - private final static Controller createJoystickFromDevice(LinuxEventDevice device, Component[] components, Controller.Type type) throws IOException { - Controller joystick = new LinuxAbstractController(device, components, new Controller[]{}, device.getRumblers(), type); - return joystick; - } - - private final static Controller createControllerFromDevice(LinuxEventDevice device) throws IOException { - List event_components = device.getComponents(); - Component[] components = createComponents(event_components, device); - Controller.Type type = device.getType(); - - if (type == Controller.Type.MOUSE) { - return createMouseFromDevice(device, components); - } else if (type == Controller.Type.KEYBOARD) { - return createKeyboardFromDevice(device, components); - } else if (type == Controller.Type.STICK || type == Controller.Type.GAMEPAD) { - return createJoystickFromDevice(device, components, type); - } else - return null; + }); + } else { + controllerArray = new Controller[0]; + } + return controllerArray; + } + + private final void enumerateEventControllers(List controllers) { + final File dev = new File("/dev/input"); + File[] event_device_files = listFilesPrivileged(dev, new FilenameFilter() { + public final boolean accept(File dir, String name) { + return name.startsWith("event"); + } + }); + if (event_device_files == null) + return; + for (int i = 0; i < event_device_files.length; i++) { + File event_file = event_device_files[i]; + try { + String path = getAbsolutePathPrivileged(event_file); + LinuxEventDevice device = new LinuxEventDevice(path); + try { + Controller controller = createControllerFromDevice(device); + if (controller != null) { + controllers.add(controller); + controllerDeviceMap.put(device, controller); + devices.add(device); + } else + device.close(); + } catch (IOException e) { + logln("Failed to create Controller: " + e.getMessage()); + device.close(); + } + } catch (IOException e) { + logln("Failed to open device (" + event_file + "): " + e.getMessage()); + } } - - private final Controller[] enumerateControllers() { - List controllers = new ArrayList(); - List eventControllers = new ArrayList(); - List jsControllers = new ArrayList(); - enumerateEventControllers(eventControllers); - enumerateJoystickControllers(jsControllers); - - for(int i=0;i controllers){ + final File dev = new File("/dev/input"); + File[] event_device_files = listFilesPrivileged(dev, new FilenameFilter() { + public final boolean accept(File dir, String name) { + return name.startsWith("event"); + } + }); + if (event_device_files == null) + return; + for (int i = 0; i < event_device_files.length; i++) { + File event_file = event_device_files[i]; + + // check for new events + boolean isNewEvent = true; + for(LinuxDevice testDevice:devices){ + if(event_file.getName().equals(testDevice.getFilename())){ + isNewEvent = false; + break; + } + } + + if(isNewEvent){ + try { + String path = getAbsolutePathPrivileged(event_file); + LinuxEventDevice device = new LinuxEventDevice(path); + try { + Controller controller = createControllerFromDevice(device); + if (controller != null) { + controllers.add(controller); + devices.add(device); + controllerDeviceMap.put(device, controller); + } else { + device.close(); } + } catch (IOException e) { + logln("Failed to create Controller: " + e.getMessage()); + device.close(); + } + } catch (IOException e) { + logln("Failed to open device (" + event_file + "): " + e.getMessage()); } - controllers.addAll(eventControllers); - controllers.addAll(jsControllers); - - Controller[] controllers_array = new Controller[controllers.size()]; - controllers.toArray(controllers_array); - return controllers_array; + } } - - private final static Component.Identifier.Button getButtonIdentifier(int index) { - switch (index) { - case 0: - return Component.Identifier.Button._0; - case 1: - return Component.Identifier.Button._1; - case 2: - return Component.Identifier.Button._2; - case 3: - return Component.Identifier.Button._3; - case 4: - return Component.Identifier.Button._4; - case 5: - return Component.Identifier.Button._5; - case 6: - return Component.Identifier.Button._6; - case 7: - return Component.Identifier.Button._7; - case 8: - return Component.Identifier.Button._8; - case 9: - return Component.Identifier.Button._9; - case 10: - return Component.Identifier.Button._10; - case 11: - return Component.Identifier.Button._11; - case 12: - return Component.Identifier.Button._12; - case 13: - return Component.Identifier.Button._13; - case 14: - return Component.Identifier.Button._14; - case 15: - return Component.Identifier.Button._15; - case 16: - return Component.Identifier.Button._16; - case 17: - return Component.Identifier.Button._17; - case 18: - return Component.Identifier.Button._18; - case 19: - return Component.Identifier.Button._19; - case 20: - return Component.Identifier.Button._20; - case 21: - return Component.Identifier.Button._21; - case 22: - return Component.Identifier.Button._22; - case 23: - return Component.Identifier.Button._23; - case 24: - return Component.Identifier.Button._24; - case 25: - return Component.Identifier.Button._25; - case 26: - return Component.Identifier.Button._26; - case 27: - return Component.Identifier.Button._27; - case 28: - return Component.Identifier.Button._28; - case 29: - return Component.Identifier.Button._29; - case 30: - return Component.Identifier.Button._30; - case 31: - return Component.Identifier.Button._31; - default: - return null; + // now check for a device that previous was connected and since has disconnected + ArrayList removeDevices = new ArrayList(); + for(LinuxDevice testDevice:devices){ + boolean fileExists = false; + for(int i = 0; i < event_device_files.length; i++){ + File event_file = event_device_files[i]; + if(testDevice.getFilename().equals(event_file.getName())){ + fileExists = true; + break; } + } + if(!fileExists){ + removeDevices.add(testDevice); + } + } + for(LinuxDevice testDevice:removeDevices){ + devices.remove(testDevice); + try { + testDevice.close(); + } catch (IOException ex) { } + Controller controller = controllerDeviceMap.get(testDevice); + if(controller != null){ + controllers.remove(controller); + this.controllers.remove(controller); + controllerDeviceMap.remove(testDevice); + } } + } - private final static Controller createJoystickFromJoystickDevice(LinuxJoystickDevice device) { - List components = new ArrayList(); - byte[] axisMap = device.getAxisMap(); - char[] buttonMap = device.getButtonMap(); - LinuxJoystickAxis[] hatBits = new LinuxJoystickAxis[6]; - - for (int i = 0; i < device.getNumButtons(); i++) { - Component.Identifier button_id = (Component.Identifier)LinuxNativeTypesMap.getButtonID(buttonMap[i]); - if (button_id != null) { - LinuxJoystickButton button = new LinuxJoystickButton(button_id); - device.registerButton(i, button); - components.add(button); + private final Controller[] enumerateControllers() { + List eventControllers = new ArrayList(); + List jsControllers = new ArrayList(); + enumerateEventControllers(eventControllers); + enumerateJoystickControllers(jsControllers); + return enumerateControllers(eventControllers,jsControllers); + } + + private final Controller[] enumerateControllers(ListeventControllers, ListjsControllers) { + + List localControllers = new ArrayList(); + + for(int i=0;i - + @@ -66,7 +66,7 @@ + additionalparam="-source 1.5"> diff --git a/plugins/windows/src/java/net/java/games/input/DirectAndRawInputEnvironmentPlugin.java b/plugins/windows/src/java/net/java/games/input/DirectAndRawInputEnvironmentPlugin.java index c789986..dfd3b22 100644 --- a/plugins/windows/src/java/net/java/games/input/DirectAndRawInputEnvironmentPlugin.java +++ b/plugins/windows/src/java/net/java/games/input/DirectAndRawInputEnvironmentPlugin.java @@ -91,4 +91,9 @@ public class DirectAndRawInputEnvironmentPlugin extends ControllerEnvironment { return rawPlugin.isSupported() || dinputPlugin.isSupported(); } + @Override + public Controller[] rescanControllers() { + throw new UnsupportedOperationException("Not supported yet."); + } + } 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 deb53c3..35253f4 100644 --- a/plugins/windows/src/java/net/java/games/input/DirectInputEnvironmentPlugin.java +++ b/plugins/windows/src/java/net/java/games/input/DirectInputEnvironmentPlugin.java @@ -235,6 +235,11 @@ public final class DirectInputEnvironmentPlugin extends ControllerEnvironment im return controllers_array; } + @Override + public Controller[] rescanControllers() { + throw new UnsupportedOperationException("Not supported yet."); + } + private final class ShutdownHook extends Thread { public final void run() { /* Release the devices to kill off active force feedback effects */ 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 36f089b..0da3180 100644 --- a/plugins/windows/src/java/net/java/games/input/RawInputEnvironmentPlugin.java +++ b/plugins/windows/src/java/net/java/games/input/RawInputEnvironmentPlugin.java @@ -213,4 +213,9 @@ public final class RawInputEnvironmentPlugin extends ControllerEnvironment imple private final static native byte[] getKeyboardClassGUID(); private final static native byte[] getMouseClassGUID(); + @Override + public Controller[] rescanControllers() { + throw new UnsupportedOperationException("Not supported yet."); + } + } // class DirectInputEnvironment diff --git a/plugins/wintab/build.xml b/plugins/wintab/build.xml index 6e47c64..b444ed3 100644 --- a/plugins/wintab/build.xml +++ b/plugins/wintab/build.xml @@ -9,11 +9,11 @@ - + - + @@ -55,7 +55,7 @@ + additionalparam="-source 1.5"> diff --git a/plugins/wintab/src/java/net/java/games/input/WinTabEnvironmentPlugin.java b/plugins/wintab/src/java/net/java/games/input/WinTabEnvironmentPlugin.java index a770ff9..4034336 100644 --- a/plugins/wintab/src/java/net/java/games/input/WinTabEnvironmentPlugin.java +++ b/plugins/wintab/src/java/net/java/games/input/WinTabEnvironmentPlugin.java @@ -134,6 +134,11 @@ public class WinTabEnvironmentPlugin extends ControllerEnvironment implements Pl return controllers; } + @Override + public Controller[] rescanControllers() { + throw new UnsupportedOperationException("Not supported yet."); + } + private final class ShutdownHook extends Thread { public final void run() { /* Release the devices to kill off active force feedback effects */ -- cgit v1.2.3