package com.badlogic.gdx.controllers.lwjgl3;
import org.lwjgl.glfw.GLFW;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.controllers.Controller;
import com.badlogic.gdx.controllers.ControllerListener;
import com.badlogic.gdx.controllers.ControllerManager;
import com.badlogic.gdx.utils.Array;
public class Lwjgl3ControllerManager implements ControllerManager {
final Array<Controller> controllers = new Array<Controller>();
final Array<Controller> polledControllers = new Array<Controller>();
final Array<ControllerListener> listeners = new Array<ControllerListener>();
public Lwjgl3ControllerManager() {
for(int i = GLFW.GLFW_JOYSTICK_1; i < GLFW.GLFW_JOYSTICK_LAST; i++) {
if(GLFW.glfwJoystickPresent(i)) {
controllers.add(new Lwjgl3Controller(this, i));
}
}
Gdx.app.postRunnable(new Runnable() {
@Override
public void run () {
pollState();
Gdx.app.postRunnable(this);
}
});
}
void pollState() {
for(int i = GLFW.GLFW_JOYSTICK_1; i < GLFW.GLFW_JOYSTICK_LAST; i++) {
if(GLFW.glfwJoystickPresent(i)) {
boolean alreadyUsed = false;
for(int j = 0; j < controllers.size; j++) {
if(((Lwjgl3Controller)controllers.get(j)).index == i) {
alreadyUsed = true;
break;
}
}
if(!alreadyUsed) {
Lwjgl3Controller controller = new Lwjgl3Controller(this, i);
connected(controller);
}
}
}
polledControllers.addAll(controllers);
for(Controller controller: polledControllers) {
((Lwjgl3Controller)controller).pollState();
}
polledControllers.clear();
}
@Override
public Array<Controller> getControllers () {
return controllers;
}
@Override
public void addListener (ControllerListener listener) {
listeners.add(listener);
}
@Override
public void removeListener (ControllerListener listener) {
listeners.removeValue(listener, true);
}
@Override
public void clearListeners () {
listeners.clear();
}
void connected (Lwjgl3Controller controller) {
controllers.add(controller);
for(ControllerListener listener: listeners) {
listener.connected(controller);
}
}
void disconnected (Lwjgl3Controller controller) {
controllers.removeValue(controller, true);
for(ControllerListener listener: listeners) {
listener.disconnected(controller);
}
}
void axisChanged (Lwjgl3Controller controller, int axisCode, float value) {
for(ControllerListener listener: listeners) {
listener.axisMoved(controller, axisCode, value);
}
}
void buttonChanged (Lwjgl3Controller controller, int buttonCode, boolean value) {
for(ControllerListener listener: listeners) {
if(value) {
listener.buttonDown(controller, buttonCode);
} else {
listener.buttonUp(controller, buttonCode);
}
}
}
@Override
public Array<ControllerListener> getListeners () {
return listeners;
}
}