Skip to content
Draft
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
574afdf
Experimenting Button Label
AL2009man Mar 4, 2025
07d193e
Create c-cpp.yml
AL2009man Mar 5, 2025
176bb62
Create cmake-multi-platform.yml
AL2009man Mar 5, 2025
9a181e0
Create apply-patch.yml
AL2009man Mar 5, 2025
90b35bc
removing the workflows
AL2009man Mar 5, 2025
4309183
Merge branch 'hedge-dev:main' into main
AL2009man Mar 6, 2025
bec2cf6
added experimental Steam Virtual Gamepad support
AL2009man Mar 6, 2025
ef4e37c
restoring notes for Button Labels.
AL2009man Mar 6, 2025
a8cac87
Merge branch 'hedge-dev:main' into SDL2-Steam
AL2009man Mar 6, 2025
c9b3a5e
Initial Gamepad Hotplug Logic improvements
AL2009man Mar 6, 2025
a96fc60
Lightbar detection when using multiple PlayStation controllers at the…
AL2009man Mar 7, 2025
458938c
Attempt to reduce Input leaking
AL2009man Mar 7, 2025
75dacf5
Lightbar active fix when gamepad plugged first prior to game launch
AL2009man Mar 7, 2025
5fc38a1
Merge branch 'hedge-dev:main' into ControllerHotplugImprovements
AL2009man Mar 7, 2025
bbad87a
Merge branch 'hedge-dev:main' into ControllerHotplugImprovements
AL2009man Mar 12, 2025
aedc26b
Rebase PR branch
AL2009man Mar 22, 2025
8758808
Improved Virtual Gamepad and Lightbar/Player LED detection
AL2009man Mar 22, 2025
cebf5e6
remove code leftover
AL2009man Mar 22, 2025
de94e90
proper Daytime Lightbar and Player LED priority
AL2009man Mar 24, 2025
b1d446c
Merge branch 'hedge-dev:main' into ControllerHotplugImprovements
AL2009man Mar 30, 2025
6e7a2f6
Merge branch 'hedge-dev:main' into ControllerHotplugImprovements
AL2009man Apr 6, 2025
2385bd4
Merge branch 'hedge-dev:main' into ControllerHotplugImprovements
AL2009man Apr 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
170 changes: 103 additions & 67 deletions UnleashedRecomp/hid/driver/sdl_hid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,112 +209,148 @@ static void SetControllerInputDevice(Controller* controller)
}
}

static void SetControllerTimeOfDayLED(Controller& controller, bool isNight)
static void SetControllerTimeOfDayLED(Controller& ctrl, bool isNight)
{
auto r = isNight ? 22 : 0;
auto g = isNight ? 0 : 37;
auto b = isNight ? 101 : 184;
// Fetch the lightbar color based on the time of day
uint8_t r = 0, g = 0, b = 0;

controller.SetLED(r, g, b);
if (isNight)
{
r = 22; // Night: Red tone
g = 0; // Night: No green
b = 101; // Night: Cool blue
}
else
{
r = 0; // Day: No red
g = 0; // Day: No green
b = 60; // Day: Dimmer blue
}

// Apply the lightbar color to the specified controller
if (ctrl.CanPoll())
{
ctrl.SetLED(r, g, b);
}
}

int HID_OnSDLEvent(void*, SDL_Event* event)
{
switch (event->type)
{
case SDL_CONTROLLERDEVICEADDED:
case SDL_CONTROLLERDEVICEADDED:
{
const auto freeIndex = FindFreeController();

if (freeIndex != -1)
{
const auto freeIndex = FindFreeController();
// Initialize the new controller
auto controller = Controller(event->cdevice.which);
g_controllers[freeIndex] = controller;

if (freeIndex != -1)
// Assign "Player 1 LED" for Player 0 and Player 1
if (freeIndex == 0 || freeIndex == 1) // Player 0 and Player 1 both use "Player 1 LED"
{
SDL_GameControllerSetPlayerIndex(controller.controller, 1); // Force Player LED to "Player 1"
}
else // Additional external controllers (Player 2+)
{
auto controller = Controller(event->cdevice.which);
SDL_GameControllerSetPlayerIndex(controller.controller, freeIndex); // Assign correct LED for Player 2+
}

g_controllers[freeIndex] = controller;
// Apply lightbar settings immediately for the new controller
SetControllerTimeOfDayLED(controller, App::s_isWerehog);

SetControllerTimeOfDayLED(controller, App::s_isWerehog);
// Refresh LEDs for all connected controllers
for (auto& ctrl : g_controllers)
{
if (ctrl.CanPoll())
{
SDL_GameControllerSetPlayerIndex(ctrl.controller, ctrl.index); // Ensure correct LED updates
}
}

break;
}
break;
}

case SDL_CONTROLLERDEVICEREMOVED:
{
auto* controller = FindController(event->cdevice.which);

if (controller)
controller->Close();

break;
}
case SDL_CONTROLLERDEVICEREMOVED:
{
auto* controller = FindController(event->cdevice.which);

case SDL_CONTROLLERBUTTONDOWN:
case SDL_CONTROLLERBUTTONUP:
case SDL_CONTROLLERAXISMOTION:
case SDL_CONTROLLERTOUCHPADDOWN:
if (controller)
{
auto* controller = FindController(event->cdevice.which);
controller->Close();

if (!controller)
break;

if (event->type == SDL_CONTROLLERAXISMOTION)
// If Player 1 disconnects, promote the next available controller to Player 1
if (controller == &g_controllers[1]) // Player 1 removed
{
if (abs(event->caxis.value) > 8000)
for (auto& ctrl : g_controllers)
{
SDL_ShowCursor(SDL_DISABLE);
SetControllerInputDevice(controller);
if (ctrl.CanPoll() && &ctrl != &g_controllers[0]) // Skip Player 0
{
g_controllers[1] = ctrl; // Promote next available controller to Player 1
SDL_GameControllerSetPlayerIndex(ctrl.controller, 1); // Reflect Player 1 LED
SetControllerTimeOfDayLED(ctrl, App::s_isWerehog); // Update lightbar
break;
}
}

controller->PollAxis();
}
else
{
SDL_ShowCursor(SDL_DISABLE);
SetControllerInputDevice(controller);

controller->Poll();
// Update Player LED indices for all controllers immediately
for (std::size_t i = 2; i < g_controllers.size(); ++i) // Start from Player 2 onward
{
if (g_controllers[i].CanPoll())
{
SDL_GameControllerSetPlayerIndex(g_controllers[i].controller, static_cast<int>(i)); // Assign correct LED index
SetControllerTimeOfDayLED(g_controllers[i], App::s_isWerehog); // Update lightbars
}
}

break;
// Refresh lightbar settings for all connected controllers
for (auto& ctrl : g_controllers)
{
if (ctrl.CanPoll())
{
SetControllerTimeOfDayLED(ctrl, App::s_isWerehog);
}
}
}
break;
}

case SDL_KEYDOWN:
case SDL_KEYUP:
hid::g_inputDevice = hid::EInputDevice::Keyboard;
break;

case SDL_MOUSEMOTION:
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
{
if (!GameWindow::IsFullscreen() || GameWindow::s_isFullscreenCursorVisible)
SDL_ShowCursor(SDL_ENABLE);

hid::g_inputDevice = hid::EInputDevice::Mouse;
case SDL_CONTROLLERBUTTONDOWN:
case SDL_CONTROLLERBUTTONUP:
case SDL_CONTROLLERAXISMOTION:
case SDL_CONTROLLERTOUCHPADDOWN:
{
auto* controller = FindController(event->cdevice.which);

if (!controller)
break;
}

case SDL_WINDOWEVENT:
// Process input
if (event->type == SDL_CONTROLLERAXISMOTION)
{
if (event->window.event == SDL_WINDOWEVENT_FOCUS_LOST)
if (abs(event->caxis.value) > 8000)
{
// Stop vibrating controllers on focus lost.
for (auto& controller : g_controllers)
controller.SetVibration({ 0, 0 });
SDL_ShowCursor(SDL_DISABLE);
SetControllerInputDevice(controller);
}

break;
controller->PollAxis();
}

case SDL_USER_EVILSONIC:
else
{
for (auto& controller : g_controllers)
SetControllerTimeOfDayLED(controller, event->user.code);
SDL_ShowCursor(SDL_DISABLE);
SetControllerInputDevice(controller);

break;
controller->Poll();
}

// Instantly apply updated lightbar settings during input
SetControllerTimeOfDayLED(*controller, App::s_isWerehog);
break;
}
}

return 0;
Expand Down
Loading