@@ -346,6 +346,42 @@ static void ImGui_ImplSDL2_UpdateKeyModifiers(SDL_Keymod sdl_key_mods)
346
346
io.AddKeyEvent (ImGuiMod_Super, (sdl_key_mods & KMOD_GUI) != 0 );
347
347
}
348
348
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
+
349
385
static ImGuiViewport* ImGui_ImplSDL2_GetViewportForWindowID (Uint32 window_id)
350
386
{
351
387
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData ();
@@ -460,6 +496,47 @@ bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
460
496
bd->WantUpdateGamepadsList = true ;
461
497
return true ;
462
498
}
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
+ }
463
540
}
464
541
return false ;
465
542
}
@@ -714,27 +791,6 @@ void ImGui_ImplSDL2_SetGamepadMode(ImGui_ImplSDL2_GamepadMode mode, struct _SDL_
714
791
bd->GamepadMode = mode;
715
792
}
716
793
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
-
738
794
static void ImGui_ImplSDL2_UpdateGamepads ()
739
795
{
740
796
ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData ();
@@ -757,36 +813,8 @@ static void ImGui_ImplSDL2_UpdateGamepads()
757
813
}
758
814
759
815
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;
790
818
}
791
819
792
820
void ImGui_ImplSDL2_NewFrame ()
0 commit comments