@@ -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+
349385static 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-
738794static 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
792820void ImGui_ImplSDL2_NewFrame ()
0 commit comments