Add support for controllers with dual touchpads

This commit is contained in:
Cameron Gutman
2026-05-14 22:13:45 -05:00
parent 7b026e77be
commit 2600beaf13
3 changed files with 22 additions and 3 deletions
+2 -1
View File
@@ -168,7 +168,8 @@ typedef struct _SS_CONTROLLER_TOUCH_PACKET {
NV_INPUT_HEADER header; NV_INPUT_HEADER header;
uint8_t controllerNumber; uint8_t controllerNumber;
uint8_t eventType; uint8_t eventType;
uint8_t zero[2]; // Alignment/reserved uint8_t zero; // Alignment/reserved
uint8_t touchpadIndex;
uint32_t pointerId; uint32_t pointerId;
netfloat x; netfloat x;
netfloat y; netfloat y;
+12 -2
View File
@@ -1435,6 +1435,11 @@ int LiSendControllerArrivalEvent(uint8_t controllerNumber, uint16_t activeGamepa
// Sunshine supports up to 16 controllers // Sunshine supports up to 16 controllers
controllerNumber %= MAX_GAMEPADS; controllerNumber %= MAX_GAMEPADS;
// Always set the older touchpad cap if we have dual touchpads
if (capabilities & LI_CCAP_DUAL_TOUCHPAD) {
capabilities |= LI_CCAP_TOUCHPAD;
}
// The arrival event is only supported by Sunshine // The arrival event is only supported by Sunshine
if (IS_SUNSHINE()) { if (IS_SUNSHINE()) {
holder = allocatePacketHolder(0); holder = allocatePacketHolder(0);
@@ -1466,7 +1471,7 @@ int LiSendControllerArrivalEvent(uint8_t controllerNumber, uint16_t activeGamepa
return LiSendMultiControllerEvent(controllerNumber, activeGamepadMask, 0, 0, 0, 0, 0, 0, 0); return LiSendMultiControllerEvent(controllerNumber, activeGamepadMask, 0, 0, 0, 0, 0, 0, 0);
} }
int LiSendControllerTouchEvent(uint8_t controllerNumber, uint8_t eventType, uint32_t pointerId, float x, float y, float pressure) { int LiSendControllerTouchEvent2(uint8_t controllerNumber, uint8_t eventType, uint8_t touchpadIndex, uint32_t pointerId, float x, float y, float pressure) {
PPACKET_HOLDER holder; PPACKET_HOLDER holder;
int err; int err;
@@ -1498,7 +1503,8 @@ int LiSendControllerTouchEvent(uint8_t controllerNumber, uint8_t eventType, uint
holder->packet.controllerTouch.header.magic = LE32(SS_CONTROLLER_TOUCH_MAGIC); holder->packet.controllerTouch.header.magic = LE32(SS_CONTROLLER_TOUCH_MAGIC);
holder->packet.controllerTouch.controllerNumber = controllerNumber; holder->packet.controllerTouch.controllerNumber = controllerNumber;
holder->packet.controllerTouch.eventType = eventType; holder->packet.controllerTouch.eventType = eventType;
memset(holder->packet.controllerTouch.zero, 0, sizeof(holder->packet.controllerTouch.zero)); memset(&holder->packet.controllerTouch.zero, 0, sizeof(holder->packet.controllerTouch.zero));
holder->packet.controllerTouch.touchpadIndex = touchpadIndex;
holder->packet.controllerTouch.pointerId = LE32(pointerId); holder->packet.controllerTouch.pointerId = LE32(pointerId);
floatToNetfloat(x, holder->packet.controllerTouch.x); floatToNetfloat(x, holder->packet.controllerTouch.x);
floatToNetfloat(y, holder->packet.controllerTouch.y); floatToNetfloat(y, holder->packet.controllerTouch.y);
@@ -1514,6 +1520,10 @@ int LiSendControllerTouchEvent(uint8_t controllerNumber, uint8_t eventType, uint
return err; return err;
} }
int LiSendControllerTouchEvent(uint8_t controllerNumber, uint8_t eventType, uint32_t pointerId, float x, float y, float pressure) {
return LiSendControllerTouchEvent2(controllerNumber, eventType, 0, pointerId, x, y, pressure);
}
int LiSendControllerMotionEvent(uint8_t controllerNumber, uint8_t motionType, float x, float y, float z) { int LiSendControllerMotionEvent(uint8_t controllerNumber, uint8_t motionType, float x, float y, float z) {
PPACKET_HOLDER holder; PPACKET_HOLDER holder;
int err; int err;
+8
View File
@@ -781,6 +781,7 @@ int LiSendMultiControllerEvent(short controllerNumber, short activeGamepadMask,
#define LI_CCAP_GYRO 0x20 // Can report gyroscope events via LiSendControllerMotionEvent() #define LI_CCAP_GYRO 0x20 // Can report gyroscope events via LiSendControllerMotionEvent()
#define LI_CCAP_BATTERY_STATE 0x40 // Reports battery state via LiSendControllerBatteryEvent() #define LI_CCAP_BATTERY_STATE 0x40 // Reports battery state via LiSendControllerBatteryEvent()
#define LI_CCAP_RGB_LED 0x80 // Can set RGB LED state via ConnListenerSetControllerLED() #define LI_CCAP_RGB_LED 0x80 // Can set RGB LED state via ConnListenerSetControllerLED()
#define LI_CCAP_DUAL_TOUCHPAD 0x100 // Reports touchpad events from 2 separate touchpads
int LiSendControllerArrivalEvent(uint8_t controllerNumber, uint16_t activeGamepadMask, uint8_t type, int LiSendControllerArrivalEvent(uint8_t controllerNumber, uint16_t activeGamepadMask, uint8_t type,
uint32_t supportedButtonFlags, uint16_t capabilities); uint32_t supportedButtonFlags, uint16_t capabilities);
@@ -794,6 +795,13 @@ int LiSendControllerArrivalEvent(uint8_t controllerNumber, uint16_t activeGamepa
// and check for the LI_FF_CONTROLLER_TOUCH_EVENTS flag. // and check for the LI_FF_CONTROLLER_TOUCH_EVENTS flag.
int LiSendControllerTouchEvent(uint8_t controllerNumber, uint8_t eventType, uint32_t pointerId, float x, float y, float pressure); int LiSendControllerTouchEvent(uint8_t controllerNumber, uint8_t eventType, uint32_t pointerId, float x, float y, float pressure);
// This function is similar to LiSendControllerTouchEvent(), but it allows the touchpad index to be
// provided for use with controllers that have multiple touchpads (like the Steam Controller).
//
// The only valid touchpad indices are currently 0 (support indicated by LI_CCAP_TOUCHPAD) and 1
// (support indicated by LI_CCAP_DUAL_TOUCHPAD).
int LiSendControllerTouchEvent2(uint8_t controllerNumber, uint8_t eventType, uint8_t touchpadIndex, uint32_t pointerId, float x, float y, float pressure);
// This function allows clients to send controller-associated motion events to a supported host. // This function allows clients to send controller-associated motion events to a supported host.
// //
// For power and performance reasons, motion sensors should not be enabled unless the host has // For power and performance reasons, motion sensors should not be enabled unless the host has