ref:d3c5e2c85e059a041a6e760fea33e0b84b3c0316

fix(input): preserve aux gamepad data and bump libvirtualhid (#5531)

SHA: d3c5e2c85e059a041a6e760fea33e0b84b3c0316
Author: Dave Lane <42013603+ReenigneArcher@users.noreply.github.com>
Date: 2026-08-20 21:00
Parents: f0a46d7
3 files changed +39 -1
Type
src/platform/virtualhid_input.cpp +7 −1
@@ -613,7 +613,13 @@
}
auto &gamepad = context.gamepads[nr];
log_failure("submit libvirtualhid gamepad state"sv, gamepad->adapter->set_state(make_gamepad_state(state, gamepad->adapter->support())));
auto updated_state = make_gamepad_state(state, gamepad->adapter->support());
const auto &cached_state = gamepad->adapter->state();
updated_state.acceleration = cached_state.acceleration;
updated_state.gyroscope = cached_state.gyroscope;
updated_state.battery = cached_state.battery;
updated_state.touchpad_contacts = cached_state.touchpad_contacts;
log_failure("submit libvirtualhid gamepad state"sv, gamepad->adapter->set_state(updated_state));
}
void gamepad_touch(input_context_t &context, const gamepad_touch_t &touch) {
tests/unit/platform/test_virtualhid_input.cpp +32 −0
@@ -540,6 +540,38 @@
EXPECT_EQ(unsupported->gamepad()->submit_count(), unsupported_count);
}
TEST_F(VirtualHidDeviceTest, PreservesAuxiliaryGamepadStateAcrossControlUpdates) {
const auto capabilities = static_cast<std::uint16_t>(LI_CCAP_ACCEL | LI_CCAP_GYRO | LI_CCAP_TOUCHPAD | LI_CCAP_BATTERY_STATE);
auto *adapter = allocate_gamepad("ds5"sv, LI_CTYPE_PS, capabilities);
ASSERT_NE(adapter, nullptr);
EXPECT_TRUE(feedback_queue()->pop(10ms));
EXPECT_TRUE(feedback_queue()->pop(10ms));
platf::virtualhid::gamepad_motion(*context(), {{0, 3}, LI_MOTION_TYPE_ACCEL, 0.0F, 9.80665F, 0.0F});
platf::virtualhid::gamepad_motion(*context(), {{0, 3}, LI_MOTION_TYPE_GYRO, -0.2F, -0.5F, 0.0F});
platf::virtualhid::gamepad_touch(*context(), {{0, 3}, LI_TOUCH_EVENT_DOWN, 10, 0.25F, 0.75F, 1.0F});
platf::virtualhid::gamepad_battery(*context(), {{0, 3}, LI_BATTERY_STATE_DISCHARGING, 75});
platf::virtualhid::gamepad_update(*context(), 0, {platf::A, 255, 0, 0, 0, 0, 0});
const auto &state = adapter->state();
EXPECT_TRUE(state.buttons.test(lvh::GamepadButton::a));
ASSERT_TRUE(state.acceleration);
EXPECT_FLOAT_EQ(state.acceleration->x, 0.0F);
EXPECT_FLOAT_EQ(state.acceleration->y, 9.80665F);
EXPECT_FLOAT_EQ(state.acceleration->z, 0.0F);
ASSERT_TRUE(state.gyroscope);
EXPECT_FLOAT_EQ(state.gyroscope->x, -0.2F);
EXPECT_FLOAT_EQ(state.gyroscope->y, -0.5F);
EXPECT_FLOAT_EQ(state.gyroscope->z, 0.0F);
EXPECT_TRUE(state.touchpad_contacts[0].active);
EXPECT_FLOAT_EQ(state.touchpad_contacts[0].x, 0.25F);
EXPECT_FLOAT_EQ(state.touchpad_contacts[0].y, 0.75F);
ASSERT_TRUE(state.battery);
EXPECT_EQ(state.battery->state, lvh::GamepadBatteryState::discharging);
EXPECT_EQ(state.battery->percentage, 75);
}
TEST_F(VirtualHidDeviceTest, TranslatesMouseAndKeyboardInput) {
platf::virtualhid::move_mouse(*context(), -4, 7);
auto mouse_event = context()->mouse->last_submitted_event();
third-party/libvirtualhid +0 −0