diff options
author | Sven Gothel <[email protected]> | 2012-11-22 06:39:20 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2012-11-22 06:39:20 +0100 |
commit | 49416164a4729b1b7e234841ba9be48b9aa90830 (patch) | |
tree | 3ca433f39dd4886de493ccd7046d83809540c980 /plugins/linux | |
parent | d0737cc4a34a41ad9bdac7de379250cacbf55a1d (diff) | |
parent | 5c894f5055dfdbf571afee3057e46b9912aedb9b (diff) |
Diffstat (limited to 'plugins/linux')
5 files changed, 579 insertions, 453 deletions
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 @@ <target depends="init" name="compile"> <!-- <ant dir="src/native" target="createNativeDefinitions.java"/>--> - <javac debug="true" deprecation="true" destdir="classes" source="1.4" target="1.4" srcdir="src/java"> + <javac debug="true" deprecation="true" destdir="classes" source="1.5" target="1.5" srcdir="src/java"> <classpath> <pathelement location="../../coreAPI/bin/jinput-core.jar"/> <pathelement location="../../lib/jutils.jar"/> @@ -33,7 +33,7 @@ <mkdir dir="apidocs"/> <javadoc packagenames="net.java.games.input.*" destdir="apidocs" - additionalparam="-source 1.4" + additionalparam="-source 1.5" link="../../../coreAPI/apidocs"> <sourcepath> <pathelement location="src/java"/> 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 ([email protected]) */ 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<Controller> controllers = new ArrayList<Controller>(); + //private Controller[] controllers; + private List<LinuxDevice> devices = new ArrayList<LinuxDevice>(); + private final static LinuxDeviceThread device_thread = new LinuxDeviceThread(); + private HashMap<LinuxDevice,Controller> controllerDeviceMap = new HashMap<LinuxDevice,Controller>(); +// ============= 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<Controller> 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<eventControllers.size();i++) { - for(int j=0;j<jsControllers.size();j++) { - Controller evController = (Controller) eventControllers.get(i); - Controller jsController = (Controller) jsControllers.get(j); - - // compare - // Check if the nodes have the same name - if(evController.getName().equals(jsController.getName())) { - // Check they have the same component count - Component[] evComponents = evController.getComponents(); - Component[] jsComponents = jsController.getComponents(); - if(evComponents.length==jsComponents.length) { - boolean foundADifference = false; - // check the component pairs are of the same type - for(int k=0;k<evComponents.length;k++) { - // Check the type of the component is the same - if(!(evComponents[k].getIdentifier() == jsComponents[k].getIdentifier())) { - foundADifference = true; - } - } - - if(!foundADifference) { - controllers.add(new LinuxCombinedController((LinuxAbstractController)eventControllers.remove(i), (LinuxJoystickAbstractController)jsControllers.remove(j))); - i--; - j--; - break; - } - } - } + } + + private void rescanEventControllers(List<Controller> 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<LinuxDevice> removeDevices = new ArrayList<LinuxDevice>(); + 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(List<Controller>eventControllers, List<Controller>jsControllers) { + + List localControllers = new ArrayList(); + + for(int i=0;i<eventControllers.size();i++) { + for(int j=0;j<jsControllers.size();j++) { + Controller evController = eventControllers.get(i); + Controller jsController = jsControllers.get(j); + + // compare + // Check if the nodes have the same name + if(evController.getName().equals(jsController.getName())) { + // Check they have the same component count + Component[] evComponents = evController.getComponents(); + Component[] jsComponents = jsController.getComponents(); + if(evComponents.length==jsComponents.length) { + boolean foundADifference = false; + // check the component pairs are of the same type + for(int k=0;k<evComponents.length;k++) { + // Check the type of the component is the same + if(!(evComponents[k].getIdentifier() == jsComponents[k].getIdentifier())) { + foundADifference = true; + } } - } - for (int i = 0; i < device.getNumAxes(); i++) { - Component.Identifier.Axis axis_id; - axis_id = (Component.Identifier.Axis) LinuxNativeTypesMap.getAbsAxisID(axisMap[i]); - LinuxJoystickAxis axis = new LinuxJoystickAxis(axis_id); - device.registerAxis(i, axis); - - if(axisMap[i]==NativeDefinitions.ABS_HAT0X) { - hatBits[0] = axis; - } else if(axisMap[i]==NativeDefinitions.ABS_HAT0Y) { - hatBits[1] = axis; - axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[0], hatBits[1]); - device.registerPOV((LinuxJoystickPOV)axis); - components.add(axis); - } else if(axisMap[i]==NativeDefinitions.ABS_HAT1X) { - hatBits[2] = axis; - } else if(axisMap[i]==NativeDefinitions.ABS_HAT1Y) { - hatBits[3] = axis; - axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[2], hatBits[3]); - device.registerPOV((LinuxJoystickPOV)axis); - components.add(axis); - } else if(axisMap[i]==NativeDefinitions.ABS_HAT2X) { - hatBits[4] = axis; - } else if(axisMap[i]==NativeDefinitions.ABS_HAT2Y) { - hatBits[5] = axis; - axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[4], hatBits[5]); - device.registerPOV((LinuxJoystickPOV)axis); - components.add(axis); - } else { - components.add(axis); + if(!foundADifference) { + localControllers.add(new LinuxCombinedController((LinuxAbstractController)eventControllers.remove(i), (LinuxJoystickAbstractController)jsControllers.remove(j))); + i--; + j--; + break; } + } } - - return new LinuxJoystickAbstractController(device, (Component[])components.toArray(new Component[]{}), new Controller[]{}, new Rumbler[]{}); + } } + localControllers.addAll(eventControllers); + localControllers.addAll(jsControllers); + + Controller[] controllers_array = new Controller[localControllers.size()]; + localControllers.toArray(controllers_array); + return controllers_array; + } +// ============= Implemented Methods ============== // +// ============= Extended Methods ============== // +// ============= Internal Classes ============== // +// ============= Static Methods ============== // - private final void enumerateJoystickControllers(List controllers) { - File[] joystick_device_files = enumerateJoystickDeviceFiles("/dev/input"); - if (joystick_device_files == null || joystick_device_files.length == 0) { - joystick_device_files = enumerateJoystickDeviceFiles("/dev"); - if (joystick_device_files == null) - return; + /** + * 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; } - for (int i = 0; i < joystick_device_files.length; i++) { - File event_file = joystick_device_files[i]; - try { - String path = getAbsolutePathPrivileged(event_file); - LinuxJoystickDevice device = new LinuxJoystickDevice(path); - Controller controller = createJoystickFromJoystickDevice(device); - if (controller != null) { - controllers.add(controller); - devices.add(device); - } else - device.close(); - } catch (IOException e) { - logln("Failed to open device (" + event_file + "): " + e.getMessage()); - } + } + ); + } + + 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); + } + + + + 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); + } } + 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); + } + } + 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; + } + - private final static File[] enumerateJoystickDeviceFiles(final String dev_path) { - final File dev = new File(dev_path); - return listFilesPrivileged(dev, new FilenameFilter() { - public final boolean accept(File dir, String name) { - return name.startsWith("js"); - } - }); + 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; } + } - private static String getAbsolutePathPrivileged(final File file) { - return (String)AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return file.getAbsolutePath(); - } - }); + 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); + } } + for (int i = 0; i < device.getNumAxes(); i++) { + Component.Identifier.Axis axis_id; + axis_id = (Component.Identifier.Axis) LinuxNativeTypesMap.getAbsAxisID(axisMap[i]); + LinuxJoystickAxis axis = new LinuxJoystickAxis(axis_id); + + device.registerAxis(i, axis); - private static File[] listFilesPrivileged(final File dir, final FilenameFilter filter) { - return (File[])AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - File[] files = dir.listFiles(filter); - Arrays.sort(files, new Comparator(){ - public int compare(Object f1, Object f2) { - return ((File)f1).getName().compareTo(((File)f2).getName()); - } - }); - return files; - } - }); + if(axisMap[i]==NativeDefinitions.ABS_HAT0X) { + hatBits[0] = axis; + } else if(axisMap[i]==NativeDefinitions.ABS_HAT0Y) { + hatBits[1] = axis; + axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[0], hatBits[1]); + device.registerPOV((LinuxJoystickPOV)axis); + components.add(axis); + } else if(axisMap[i]==NativeDefinitions.ABS_HAT1X) { + hatBits[2] = axis; + } else if(axisMap[i]==NativeDefinitions.ABS_HAT1Y) { + hatBits[3] = axis; + axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[2], hatBits[3]); + device.registerPOV((LinuxJoystickPOV)axis); + components.add(axis); + } else if(axisMap[i]==NativeDefinitions.ABS_HAT2X) { + hatBits[4] = axis; + } else if(axisMap[i]==NativeDefinitions.ABS_HAT2Y) { + hatBits[5] = axis; + axis = new LinuxJoystickPOV(Component.Identifier.Axis.POV, hatBits[4], hatBits[5]); + device.registerPOV((LinuxJoystickPOV)axis); + components.add(axis); + } else { + components.add(axis); + } } + + return new LinuxJoystickAbstractController(device, (Component[])components.toArray(new Component[]{}), new Controller[]{}, new Rumbler[]{}); + } - 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); - 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 void enumerateJoystickControllers(List controllers) { + File[] joystick_device_files = enumerateJoystickDeviceFiles("/dev/input"); + if (joystick_device_files == null || joystick_device_files.length == 0) { + joystick_device_files = enumerateJoystickDeviceFiles("/dev"); + if (joystick_device_files == null) + return; + } + for (int i = 0; i < joystick_device_files.length; i++) { + File event_file = joystick_device_files[i]; + try { + String path = getAbsolutePathPrivileged(event_file); + LinuxJoystickDevice device = new LinuxJoystickDevice(path); + Controller controller = createJoystickFromJoystickDevice(device); + if (controller != null) { + controllers.add(controller); + devices.add(device); + controllerDeviceMap.put(device, controller); + } else + device.close(); + } catch (IOException e) { + logln("Failed to open device (" + event_file + "): " + e.getMessage()); + } + } } - /** - * Attempt to find devices using uinput used for forwarding events. - * TODO try to work this out! - */ - /* - private final void enumerateUInputControllers(List controllers) { - final File dev = new File("/dev/uinput"); - File[] event_device_files = listFilesPrivileged(dev, new FilenameFilter() { - public final boolean accept(File dir, String name) { - return name.startsWith("event"); - } + private final static File[] enumerateJoystickDeviceFiles(final String dev_path) { + final File dev = new File(dev_path); + return listFilesPrivileged(dev, new FilenameFilter() { + public final boolean accept(File dir, String name) { + return name.startsWith("js"); + } + }); + } + + private static String getAbsolutePathPrivileged(final File file) { + return (String)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return file.getAbsolutePath(); + } + }); + } + + private static File[] listFilesPrivileged(final File dir, final FilenameFilter filter) { + return (File[])AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + File[] files = dir.listFiles(filter); + Arrays.sort(files, new Comparator(){ + public int compare(Object f1, Object f2) { + return ((File)f1).getName().compareTo(((File)f2).getName()); + } }); - 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); - 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()); - } - } + return files; + } + }); } - */ - - private final class ShutdownHook extends Thread { - public final void run() { - for (int i = 0; i < devices.size(); i++) { - try { - LinuxDevice device = (LinuxDevice)devices.get(i); - device.close(); - } catch (IOException e) { - logln("Failed to close device: " + e.getMessage()); - } - } + + + + private final class ShutdownHook extends Thread { + public final void run() { + for (int i = 0; i < devices.size(); i++) { + try { + LinuxDevice device = (LinuxDevice)devices.get(i); + device.close(); + } catch (IOException e) { + logln("Failed to close device: " + e.getMessage()); } + } } + } - public boolean isSupported() { - return supported; - } + public boolean isSupported() { + return supported; + } } +/* + * Local variables: + * c-indent-level: 4 + * c-basic-offset: 4 + * End: + * + * vim: ts=8 sts=4 sw=4 noexpandtab + */ 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 1517147..79b7707 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxEventDevice.java @@ -25,6 +25,7 @@ */ package net.java.games.input; +import java.io.File; import java.io.IOException; import java.util.Map; import java.util.HashMap; @@ -52,6 +53,7 @@ final class LinuxEventDevice implements LinuxDevice { * it doesn't hurt to have multiple threads read/write from/to it */ private final byte[] key_states = new byte[NativeDefinitions.KEY_MAX/8 + 1]; + private String filename; public LinuxEventDevice(String filename) throws IOException { long fd; @@ -76,6 +78,8 @@ final class LinuxEventDevice implements LinuxDevice { close(); throw e; } + File file = new File(filename); + this.filename = file.getName(); } private final static native long nOpen(String filename, boolean rw) throws IOException; @@ -336,6 +340,9 @@ final class LinuxEventDevice implements LinuxDevice { public final String getName() { return name; } + public String getFilename(){ + return filename; + } private final String getDeviceName() throws IOException { return nGetName(fd); diff --git a/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java b/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java index 0dcd5da..6b45d4a 100644 --- a/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java +++ b/plugins/linux/src/java/net/java/games/input/LinuxJoystickDevice.java @@ -236,4 +236,9 @@ final class LinuxJoystickDevice implements LinuxDevice { protected void finalize() throws IOException { close(); } + + @Override + public String getFilename() { + throw new UnsupportedOperationException("Not supported yet."); + } } |