aboutsummaryrefslogtreecommitdiffstats
path: root/coreAPI/src
diff options
context:
space:
mode:
Diffstat (limited to 'coreAPI/src')
-rw-r--r--coreAPI/src/java/net/java/games/input/ControllerEnvironment.java5
-rw-r--r--coreAPI/src/java/net/java/games/input/DefaultControllerEnvironment.java65
2 files changed, 68 insertions, 2 deletions
diff --git a/coreAPI/src/java/net/java/games/input/ControllerEnvironment.java b/coreAPI/src/java/net/java/games/input/ControllerEnvironment.java
index 17208f7..3a7c21e 100644
--- a/coreAPI/src/java/net/java/games/input/ControllerEnvironment.java
+++ b/coreAPI/src/java/net/java/games/input/ControllerEnvironment.java
@@ -100,6 +100,11 @@ public abstract class ControllerEnvironment {
* or an empty array if there are no controllers in this environment.
*/
public abstract Controller[] getControllers();
+ /**
+ * Rescans the devices and provides a list of new controllers.
+ * @return a list of all controllers available to this environment.
+ */
+ public abstract Controller[] rescanControllers();
/**
* Adds 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 431a9ff..b193ef0 100644
--- a/coreAPI/src/java/net/java/games/input/DefaultControllerEnvironment.java
+++ b/coreAPI/src/java/net/java/games/input/DefaultControllerEnvironment.java
@@ -105,9 +105,10 @@ class DefaultControllerEnvironment extends ControllerEnvironment {
/**
* List of all controllers in this environment
*/
- private ArrayList controllers;
+ private ArrayList<Controller> controllers;
private Collection loadedPlugins = new ArrayList();
+ private ArrayList<ControllerEnvironment> environments = new ArrayList<ControllerEnvironment>();
/**
* Public no-arg constructor.
@@ -122,7 +123,7 @@ class DefaultControllerEnvironment extends ControllerEnvironment {
public Controller[] getControllers() {
if (controllers == null) {
// Controller list has not been scanned.
- controllers = new ArrayList();
+ controllers = new ArrayList<Controller>();
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
scanControllers();
@@ -159,6 +160,7 @@ class DefaultControllerEnvironment extends ControllerEnvironment {
Class ceClass = Class.forName(className);
ControllerEnvironment ce = (ControllerEnvironment) ceClass.newInstance();
if(ce.isSupported()) {
+ environments.add(ce);
addControllers(ce.getControllers());
loadedPlugins.add(ce.getClass().getName());
} else {
@@ -170,6 +172,65 @@ class DefaultControllerEnvironment extends ControllerEnvironment {
}
}
}
+ if(!environments.isEmpty()){
+ Controller[] newScanControllers = environments.get(0).getControllers();
+ Controller[] ret = new Controller[newScanControllers.length];
+ for(int i = 0; i < newScanControllers.length; i++){
+ ret[i] = newScanControllers[i];
+ }
+ return ret;
+ }
+
+ Controller[] ret = new Controller[controllers.size()];
+ Iterator it = controllers.iterator();
+ int i = 0;
+ while (it.hasNext()) {
+ ret[i] = (Controller)it.next();
+ i++;
+ }
+ return ret;
+ }
+
+ /**
+ * Returns a list of all controllers available to this environment,
+ * or an empty array if there are no controllers in this environment.
+ */
+ public Controller[] rescanControllers() {
+ if(!environments.isEmpty()){
+ Controller[] newScanControllers = environments.get(0).rescanControllers();
+ // need to add controllers that were connected
+ for(int i = 0; i < newScanControllers.length; i++){
+ boolean controllerExist = false;
+ for(Controller controller:controllers){
+ if(newScanControllers[i] == controller){
+ controllerExist = true;
+ break;
+ }
+ }
+ if(!controllerExist){
+ controllers.add(newScanControllers[i]);
+ }
+ }
+ ArrayList<Controller> removeControllers = new ArrayList<Controller>();
+ // need to remove controllers that have disconnected
+ for(Controller controller:controllers){
+ boolean controllerExist = false;
+ for(int i = 0; i < newScanControllers.length; i++){
+ if(controller == newScanControllers[i]){
+ controllerExist = true;
+ break;
+ }
+ }
+ if(!controllerExist){
+ //controllers.remove(controller);
+ removeControllers.add(controller);
+ }
+ }
+ for(Controller controller: removeControllers){
+ controllers.remove(controller);
+ }
+ }
+
Controller[] ret = new Controller[controllers.size()];
Iterator it = controllers.iterator();
int i = 0;