mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2026-06-17 14:21:08 +00:00
Propagate the controller number to the standalone DS4 touchpad device
This commit is contained in:
@@ -404,6 +404,31 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isAssociatedJoystick(InputDevice originalDevice, InputDevice possibleAssociatedJoystick) {
|
||||||
|
if (possibleAssociatedJoystick == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This can't be an associated joystick if it's not a joystick
|
||||||
|
if ((possibleAssociatedJoystick.getSources() & InputDevice.SOURCE_JOYSTICK) != InputDevice.SOURCE_JOYSTICK) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure the device names *don't* match in order to prevent us from accidentally matching
|
||||||
|
// on another of the exact same device.
|
||||||
|
if (possibleAssociatedJoystick.getName().equals(originalDevice.getName())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure the descriptor matches. This can match in cases where two of the exact same
|
||||||
|
// input device are connected, so we perform the name check to exclude that case.
|
||||||
|
if (!possibleAssociatedJoystick.getDescriptor().equals(originalDevice.getDescriptor())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Called before sending input but after we've determined that this
|
// Called before sending input but after we've determined that this
|
||||||
// is definitely a controller (not a keyboard, mouse, or something else)
|
// is definitely a controller (not a keyboard, mouse, or something else)
|
||||||
private void assignControllerNumberIfNeeded(GenericControllerContext context) {
|
private void assignControllerNumberIfNeeded(GenericControllerContext context) {
|
||||||
@@ -437,6 +462,44 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (!devContext.hasJoystickAxes) {
|
||||||
|
// If this device doesn't have joystick axes, it may be an input device associated
|
||||||
|
// with another joystick (like a PS4 touchpad). We'll propagate that joystick's
|
||||||
|
// controller number to this associated device.
|
||||||
|
|
||||||
|
context.controllerNumber = 0;
|
||||||
|
|
||||||
|
// For the DS4 case, the associated joystick is the next device after the touchpad.
|
||||||
|
// We'll try the opposite case too, just to be a little future-proof.
|
||||||
|
InputDevice associatedDevice = InputDevice.getDevice(devContext.id + 1);
|
||||||
|
if (!isAssociatedJoystick(devContext.inputDevice, associatedDevice)) {
|
||||||
|
associatedDevice = InputDevice.getDevice(devContext.id - 1);
|
||||||
|
if (!isAssociatedJoystick(devContext.inputDevice, associatedDevice)) {
|
||||||
|
LimeLog.info("No associated joystick device found");
|
||||||
|
associatedDevice = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (associatedDevice != null) {
|
||||||
|
InputDeviceContext associatedDeviceContext = inputDeviceContexts.get(associatedDevice.getId());
|
||||||
|
|
||||||
|
// Create a new context for the associated device if one doesn't exist
|
||||||
|
if (associatedDeviceContext == null) {
|
||||||
|
associatedDeviceContext = createInputDeviceContextForDevice(associatedDevice);
|
||||||
|
inputDeviceContexts.put(associatedDevice.getId(), associatedDeviceContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign a controller number for the associated device if one isn't assigned
|
||||||
|
if (!associatedDeviceContext.assignedControllerNumber) {
|
||||||
|
assignControllerNumberIfNeeded(associatedDeviceContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Propagate the associated controller number
|
||||||
|
context.controllerNumber = associatedDeviceContext.controllerNumber;
|
||||||
|
|
||||||
|
LimeLog.info("Propagated controller number from "+associatedDeviceContext.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
LimeLog.info("Not reserving a controller number");
|
LimeLog.info("Not reserving a controller number");
|
||||||
context.controllerNumber = 0;
|
context.controllerNumber = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user