Skip to content

Commit 8d017ab

Browse files
committed
Use SDL_EVENT_GAMEPAD_BUTTON events to update gamepad inputs
1 parent 702a678 commit 8d017ab

File tree

2 files changed

+157
-102
lines changed

2 files changed

+157
-102
lines changed

backends/imgui_impl_sdl2.cpp

+79-51
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,42 @@ static void ImGui_ImplSDL2_UpdateKeyModifiers(SDL_Keymod sdl_key_mods)
346346
io.AddKeyEvent(ImGuiMod_Super, (sdl_key_mods & KMOD_GUI) != 0);
347347
}
348348

349+
static ImGuiKey ImGui_ImplSDL3_GameControllerButtonEventToImGuiKey(SDL_GameControllerButton button)
350+
{
351+
switch (button)
352+
{
353+
case SDL_CONTROLLER_BUTTON_START: return ImGuiKey_GamepadStart;
354+
case SDL_CONTROLLER_BUTTON_BACK: return ImGuiKey_GamepadBack;
355+
case SDL_CONTROLLER_BUTTON_X: return ImGuiKey_GamepadFaceLeft; // Xbox X, PS Square
356+
case SDL_CONTROLLER_BUTTON_B: return ImGuiKey_GamepadFaceRight; // Xbox B, PS Circle
357+
case SDL_CONTROLLER_BUTTON_Y: return ImGuiKey_GamepadFaceUp; // Xbox Y, PS Triangle
358+
case SDL_CONTROLLER_BUTTON_A: return ImGuiKey_GamepadFaceDown; // Xbox A, PS Cross
359+
case SDL_CONTROLLER_BUTTON_DPAD_LEFT: return ImGuiKey_GamepadDpadLeft;
360+
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: return ImGuiKey_GamepadDpadRight;
361+
case SDL_CONTROLLER_BUTTON_DPAD_UP: return ImGuiKey_GamepadDpadUp;
362+
case SDL_CONTROLLER_BUTTON_DPAD_DOWN: return ImGuiKey_GamepadDpadDown;
363+
case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: return ImGuiKey_GamepadL1;
364+
case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: return ImGuiKey_GamepadR1;
365+
case SDL_CONTROLLER_BUTTON_LEFTSTICK: return ImGuiKey_GamepadL3;
366+
case SDL_CONTROLLER_BUTTON_RIGHTSTICK: return ImGuiKey_GamepadR3;
367+
default: break;
368+
}
369+
return ImGuiKey_None;
370+
}
371+
372+
static inline float Saturate(float v) { return v < 0.0f ? 0.0f : v > 1.0f ? 1.0f : v; }
373+
static void ImGui_ImplSDL2_UpdateGamepadAnalog(ImGui_ImplSDL2_Data* bd, ImGuiIO& io, ImGuiKey key, SDL_GameControllerAxis axis_no, float v0, float v1)
374+
{
375+
float merged_value = 0.0f;
376+
for (SDL_GameController* gamepad : bd->Gamepads)
377+
{
378+
float vn = Saturate((float)(SDL_GameControllerGetAxis(gamepad, axis_no) - v0) / (float)(v1 - v0));
379+
if (merged_value < vn)
380+
merged_value = vn;
381+
}
382+
io.AddKeyAnalogEvent(key, merged_value > 0.1f, merged_value);
383+
}
384+
349385
static ImGuiViewport* ImGui_ImplSDL2_GetViewportForWindowID(Uint32 window_id)
350386
{
351387
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
@@ -460,6 +496,47 @@ bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
460496
bd->WantUpdateGamepadsList = true;
461497
return true;
462498
}
499+
500+
case SDL_CONTROLLERBUTTONUP:
501+
case SDL_CONTROLLERBUTTONDOWN:
502+
{
503+
SDL_GameControllerButton button = (SDL_GameControllerButton)event->cbutton.button;
504+
bool merged_value = false;
505+
for (SDL_GameController* gamepad : bd->Gamepads)
506+
merged_value |= SDL_GameControllerGetButton(gamepad, button);
507+
io.AddKeyEvent(ImGui_ImplSDL3_GameControllerButtonEventToImGuiKey(button), merged_value);
508+
return true;
509+
}
510+
511+
case SDL_CONTROLLERAXISMOTION:
512+
{
513+
const int thumb_dead_zone = 8000; // SDL_gamepad.h suggests using this value.
514+
switch ((SDL_GameControllerAxis)event->caxis.axis)
515+
{
516+
case SDL_CONTROLLER_AXIS_TRIGGERLEFT:
517+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadL2, SDL_CONTROLLER_AXIS_TRIGGERLEFT, 0.0f, 32767);
518+
break;
519+
case SDL_CONTROLLER_AXIS_TRIGGERRIGHT:
520+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadR2, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, 0.0f, 32767);
521+
break;
522+
case SDL_CONTROLLER_AXIS_LEFTX:
523+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickLeft, SDL_CONTROLLER_AXIS_LEFTX, -thumb_dead_zone, -32768);
524+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickRight, SDL_CONTROLLER_AXIS_LEFTX, +thumb_dead_zone, +32767);
525+
break;
526+
case SDL_CONTROLLER_AXIS_LEFTY:
527+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickUp, SDL_CONTROLLER_AXIS_LEFTY, -thumb_dead_zone, -32768);
528+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickDown, SDL_CONTROLLER_AXIS_LEFTY, +thumb_dead_zone, +32767);
529+
break;
530+
case SDL_CONTROLLER_AXIS_RIGHTX:
531+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickLeft, SDL_CONTROLLER_AXIS_RIGHTX, -thumb_dead_zone, -32768);
532+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickRight, SDL_CONTROLLER_AXIS_RIGHTX, +thumb_dead_zone, +32767);
533+
break;
534+
case SDL_CONTROLLER_AXIS_RIGHTY:
535+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickUp, SDL_CONTROLLER_AXIS_RIGHTY, -thumb_dead_zone, -32768);
536+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickDown, SDL_CONTROLLER_AXIS_RIGHTY, +thumb_dead_zone, +32767);
537+
break;
538+
}
539+
}
463540
}
464541
return false;
465542
}
@@ -714,27 +791,6 @@ void ImGui_ImplSDL2_SetGamepadMode(ImGui_ImplSDL2_GamepadMode mode, struct _SDL_
714791
bd->GamepadMode = mode;
715792
}
716793

717-
static void ImGui_ImplSDL2_UpdateGamepadButton(ImGui_ImplSDL2_Data* bd, ImGuiIO& io, ImGuiKey key, SDL_GameControllerButton button_no)
718-
{
719-
bool merged_value = false;
720-
for (SDL_GameController* gamepad : bd->Gamepads)
721-
merged_value |= SDL_GameControllerGetButton(gamepad, button_no) != 0;
722-
io.AddKeyEvent(key, merged_value);
723-
}
724-
725-
static inline float Saturate(float v) { return v < 0.0f ? 0.0f : v > 1.0f ? 1.0f : v; }
726-
static void ImGui_ImplSDL2_UpdateGamepadAnalog(ImGui_ImplSDL2_Data* bd, ImGuiIO& io, ImGuiKey key, SDL_GameControllerAxis axis_no, float v0, float v1)
727-
{
728-
float merged_value = 0.0f;
729-
for (SDL_GameController* gamepad : bd->Gamepads)
730-
{
731-
float vn = Saturate((float)(SDL_GameControllerGetAxis(gamepad, axis_no) - v0) / (float)(v1 - v0));
732-
if (merged_value < vn)
733-
merged_value = vn;
734-
}
735-
io.AddKeyAnalogEvent(key, merged_value > 0.1f, merged_value);
736-
}
737-
738794
static void ImGui_ImplSDL2_UpdateGamepads()
739795
{
740796
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData();
@@ -757,36 +813,8 @@ static void ImGui_ImplSDL2_UpdateGamepads()
757813
}
758814

759815
io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
760-
if (bd->Gamepads.Size == 0)
761-
return;
762-
io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
763-
764-
// Update gamepad inputs
765-
const int thumb_dead_zone = 8000; // SDL_gamecontroller.h suggests using this value.
766-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadStart, SDL_CONTROLLER_BUTTON_START);
767-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadBack, SDL_CONTROLLER_BUTTON_BACK);
768-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceLeft, SDL_CONTROLLER_BUTTON_X); // Xbox X, PS Square
769-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceRight, SDL_CONTROLLER_BUTTON_B); // Xbox B, PS Circle
770-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceUp, SDL_CONTROLLER_BUTTON_Y); // Xbox Y, PS Triangle
771-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceDown, SDL_CONTROLLER_BUTTON_A); // Xbox A, PS Cross
772-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadLeft, SDL_CONTROLLER_BUTTON_DPAD_LEFT);
773-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT);
774-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadUp, SDL_CONTROLLER_BUTTON_DPAD_UP);
775-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN);
776-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadL1, SDL_CONTROLLER_BUTTON_LEFTSHOULDER);
777-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadR1, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER);
778-
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadL2, SDL_CONTROLLER_AXIS_TRIGGERLEFT, 0.0f, 32767);
779-
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadR2, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, 0.0f, 32767);
780-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadL3, SDL_CONTROLLER_BUTTON_LEFTSTICK);
781-
ImGui_ImplSDL2_UpdateGamepadButton(bd, io, ImGuiKey_GamepadR3, SDL_CONTROLLER_BUTTON_RIGHTSTICK);
782-
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickLeft, SDL_CONTROLLER_AXIS_LEFTX, -thumb_dead_zone, -32768);
783-
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickRight, SDL_CONTROLLER_AXIS_LEFTX, +thumb_dead_zone, +32767);
784-
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickUp, SDL_CONTROLLER_AXIS_LEFTY, -thumb_dead_zone, -32768);
785-
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickDown, SDL_CONTROLLER_AXIS_LEFTY, +thumb_dead_zone, +32767);
786-
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickLeft, SDL_CONTROLLER_AXIS_RIGHTX, -thumb_dead_zone, -32768);
787-
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickRight, SDL_CONTROLLER_AXIS_RIGHTX, +thumb_dead_zone, +32767);
788-
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickUp, SDL_CONTROLLER_AXIS_RIGHTY, -thumb_dead_zone, -32768);
789-
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickDown, SDL_CONTROLLER_AXIS_RIGHTY, +thumb_dead_zone, +32767);
816+
if (bd->Gamepads.Size > 0)
817+
io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
790818
}
791819

792820
void ImGui_ImplSDL2_NewFrame()

backends/imgui_impl_sdl3.cpp

+78-51
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,41 @@ static void ImGui_ImplSDL3_UpdateKeyModifiers(SDL_Keymod sdl_key_mods)
328328
io.AddKeyEvent(ImGuiMod_Super, (sdl_key_mods & SDL_KMOD_GUI) != 0);
329329
}
330330

331+
static ImGuiKey ImGui_ImplSDL3_GamepadButtonEventToImGuiKey(SDL_GamepadButton button)
332+
{
333+
switch (button)
334+
{
335+
case SDL_GAMEPAD_BUTTON_START: return ImGuiKey_GamepadStart;
336+
case SDL_GAMEPAD_BUTTON_BACK: return ImGuiKey_GamepadBack;
337+
case SDL_GAMEPAD_BUTTON_WEST: return ImGuiKey_GamepadFaceLeft; // Xbox X, PS Square
338+
case SDL_GAMEPAD_BUTTON_EAST: return ImGuiKey_GamepadFaceRight; // Xbox B, PS Circle
339+
case SDL_GAMEPAD_BUTTON_NORTH: return ImGuiKey_GamepadFaceUp; // Xbox Y, PS Triangle
340+
case SDL_GAMEPAD_BUTTON_SOUTH: return ImGuiKey_GamepadFaceDown; // Xbox A, PS Cross
341+
case SDL_GAMEPAD_BUTTON_DPAD_LEFT: return ImGuiKey_GamepadDpadLeft;
342+
case SDL_GAMEPAD_BUTTON_DPAD_RIGHT: return ImGuiKey_GamepadDpadRight;
343+
case SDL_GAMEPAD_BUTTON_DPAD_UP: return ImGuiKey_GamepadDpadUp;
344+
case SDL_GAMEPAD_BUTTON_DPAD_DOWN: return ImGuiKey_GamepadDpadDown;
345+
case SDL_GAMEPAD_BUTTON_LEFT_SHOULDER: return ImGuiKey_GamepadL1;
346+
case SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER: return ImGuiKey_GamepadR1;
347+
case SDL_GAMEPAD_BUTTON_LEFT_STICK: return ImGuiKey_GamepadL3;
348+
case SDL_GAMEPAD_BUTTON_RIGHT_STICK: return ImGuiKey_GamepadR3;
349+
default: break;
350+
}
351+
return ImGuiKey_None;
352+
}
353+
354+
static inline float Saturate(float v) { return v < 0.0f ? 0.0f : v > 1.0f ? 1.0f : v; }
355+
static void ImGui_ImplSDL2_UpdateGamepadAnalog(ImGui_ImplSDL3_Data* bd, ImGuiIO& io, ImGuiKey key, SDL_GamepadAxis axis_no, float v0, float v1)
356+
{
357+
float merged_value = 0.0f;
358+
for (SDL_Gamepad* gamepad : bd->Gamepads)
359+
{
360+
float vn = Saturate((float)(SDL_GetGamepadAxis(gamepad, axis_no) - v0) / (float)(v1 - v0));
361+
if (merged_value < vn)
362+
merged_value = vn;
363+
}
364+
io.AddKeyAnalogEvent(key, merged_value > 0.1f, merged_value);
365+
}
331366

332367
static ImGuiViewport* ImGui_ImplSDL3_GetViewportForWindowID(SDL_WindowID window_id)
333368
{
@@ -439,6 +474,47 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
439474
bd->WantUpdateGamepadsList = true;
440475
return true;
441476
}
477+
478+
case SDL_EVENT_GAMEPAD_BUTTON_UP:
479+
case SDL_EVENT_GAMEPAD_BUTTON_DOWN:
480+
{
481+
SDL_GamepadButton button = (SDL_GamepadButton)event->gbutton.button;
482+
bool merged_value = false;
483+
for (SDL_Gamepad* gamepad : bd->Gamepads)
484+
merged_value |= SDL_GetGamepadButton(gamepad, (SDL_GamepadButton)event->gbutton.button);
485+
io.AddKeyEvent(ImGui_ImplSDL3_GamepadButtonEventToImGuiKey(button), merged_value);
486+
return true;
487+
}
488+
489+
case SDL_EVENT_GAMEPAD_AXIS_MOTION:
490+
{
491+
const int thumb_dead_zone = 8000; // SDL_gamepad.h suggests using this value.
492+
switch ((SDL_GamepadAxis)event->gaxis.axis)
493+
{
494+
case SDL_GAMEPAD_AXIS_LEFT_TRIGGER:
495+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadL2, SDL_GAMEPAD_AXIS_LEFT_TRIGGER, 0.0f, 32767);
496+
break;
497+
case SDL_GAMEPAD_AXIS_RIGHT_TRIGGER:
498+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadR2, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, 0.0f, 32767);
499+
break;
500+
case SDL_GAMEPAD_AXIS_LEFTX:
501+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickLeft, SDL_GAMEPAD_AXIS_LEFTX, -thumb_dead_zone, -32768);
502+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickRight, SDL_GAMEPAD_AXIS_LEFTX, +thumb_dead_zone, +32767);
503+
break;
504+
case SDL_GAMEPAD_AXIS_LEFTY:
505+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickUp, SDL_GAMEPAD_AXIS_LEFTY, -thumb_dead_zone, -32768);
506+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickDown, SDL_GAMEPAD_AXIS_LEFTY, +thumb_dead_zone, +32767);
507+
break;
508+
case SDL_GAMEPAD_AXIS_RIGHTX:
509+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickLeft, SDL_GAMEPAD_AXIS_RIGHTX, -thumb_dead_zone, -32768);
510+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickRight, SDL_GAMEPAD_AXIS_RIGHTX, +thumb_dead_zone, +32767);
511+
break;
512+
case SDL_GAMEPAD_AXIS_RIGHTY:
513+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickUp, SDL_GAMEPAD_AXIS_RIGHTY, -thumb_dead_zone, -32768);
514+
ImGui_ImplSDL2_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickDown, SDL_GAMEPAD_AXIS_RIGHTY, +thumb_dead_zone, +32767);
515+
break;
516+
}
517+
}
442518
}
443519
return false;
444520
}
@@ -682,27 +758,6 @@ void ImGui_ImplSDL3_SetGamepadMode(ImGui_ImplSDL3_GamepadMode mode, SDL_Gamepad*
682758
bd->GamepadMode = mode;
683759
}
684760

685-
static void ImGui_ImplSDL3_UpdateGamepadButton(ImGui_ImplSDL3_Data* bd, ImGuiIO& io, ImGuiKey key, SDL_GamepadButton button_no)
686-
{
687-
bool merged_value = false;
688-
for (SDL_Gamepad* gamepad : bd->Gamepads)
689-
merged_value |= SDL_GetGamepadButton(gamepad, button_no) != 0;
690-
io.AddKeyEvent(key, merged_value);
691-
}
692-
693-
static inline float Saturate(float v) { return v < 0.0f ? 0.0f : v > 1.0f ? 1.0f : v; }
694-
static void ImGui_ImplSDL3_UpdateGamepadAnalog(ImGui_ImplSDL3_Data* bd, ImGuiIO& io, ImGuiKey key, SDL_GamepadAxis axis_no, float v0, float v1)
695-
{
696-
float merged_value = 0.0f;
697-
for (SDL_Gamepad* gamepad : bd->Gamepads)
698-
{
699-
float vn = Saturate((float)(SDL_GetGamepadAxis(gamepad, axis_no) - v0) / (float)(v1 - v0));
700-
if (merged_value < vn)
701-
merged_value = vn;
702-
}
703-
io.AddKeyAnalogEvent(key, merged_value > 0.1f, merged_value);
704-
}
705-
706761
static void ImGui_ImplSDL3_UpdateGamepads()
707762
{
708763
ImGuiIO& io = ImGui::GetIO();
@@ -726,36 +781,8 @@ static void ImGui_ImplSDL3_UpdateGamepads()
726781
}
727782

728783
io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
729-
if (bd->Gamepads.Size == 0)
730-
return;
731-
io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
732-
733-
// Update gamepad inputs
734-
const int thumb_dead_zone = 8000; // SDL_gamepad.h suggests using this value.
735-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadStart, SDL_GAMEPAD_BUTTON_START);
736-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadBack, SDL_GAMEPAD_BUTTON_BACK);
737-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceLeft, SDL_GAMEPAD_BUTTON_WEST); // Xbox X, PS Square
738-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceRight, SDL_GAMEPAD_BUTTON_EAST); // Xbox B, PS Circle
739-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceUp, SDL_GAMEPAD_BUTTON_NORTH); // Xbox Y, PS Triangle
740-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadFaceDown, SDL_GAMEPAD_BUTTON_SOUTH); // Xbox A, PS Cross
741-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadLeft, SDL_GAMEPAD_BUTTON_DPAD_LEFT);
742-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadRight, SDL_GAMEPAD_BUTTON_DPAD_RIGHT);
743-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadUp, SDL_GAMEPAD_BUTTON_DPAD_UP);
744-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadDpadDown, SDL_GAMEPAD_BUTTON_DPAD_DOWN);
745-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadL1, SDL_GAMEPAD_BUTTON_LEFT_SHOULDER);
746-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadR1, SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER);
747-
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadL2, SDL_GAMEPAD_AXIS_LEFT_TRIGGER, 0.0f, 32767);
748-
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadR2, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, 0.0f, 32767);
749-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadL3, SDL_GAMEPAD_BUTTON_LEFT_STICK);
750-
ImGui_ImplSDL3_UpdateGamepadButton(bd, io, ImGuiKey_GamepadR3, SDL_GAMEPAD_BUTTON_RIGHT_STICK);
751-
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickLeft, SDL_GAMEPAD_AXIS_LEFTX, -thumb_dead_zone, -32768);
752-
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickRight, SDL_GAMEPAD_AXIS_LEFTX, +thumb_dead_zone, +32767);
753-
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickUp, SDL_GAMEPAD_AXIS_LEFTY, -thumb_dead_zone, -32768);
754-
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadLStickDown, SDL_GAMEPAD_AXIS_LEFTY, +thumb_dead_zone, +32767);
755-
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickLeft, SDL_GAMEPAD_AXIS_RIGHTX, -thumb_dead_zone, -32768);
756-
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickRight, SDL_GAMEPAD_AXIS_RIGHTX, +thumb_dead_zone, +32767);
757-
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickUp, SDL_GAMEPAD_AXIS_RIGHTY, -thumb_dead_zone, -32768);
758-
ImGui_ImplSDL3_UpdateGamepadAnalog(bd, io, ImGuiKey_GamepadRStickDown, SDL_GAMEPAD_AXIS_RIGHTY, +thumb_dead_zone, +32767);
784+
if (bd->Gamepads.Size > 0)
785+
io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
759786
}
760787

761788
void ImGui_ImplSDL3_NewFrame()

0 commit comments

Comments
 (0)