@@ -266,6 +266,49 @@ static void ImGui_ImplSDL2_UpdateMouseCursor()
266
266
}
267
267
}
268
268
269
+ static void ImGui_ImplSDL2_UpdateGamepads ()
270
+ {
271
+ ImGuiIO& io = ImGui::GetIO ();
272
+ memset (io.NavInputs , 0 , sizeof (io.NavInputs ));
273
+ if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0 )
274
+ return ;
275
+
276
+ // Update gamepad inputs
277
+ #define MAP_BUTTON (NAV_NO, BUTTON_NO ) { io.NavInputs [NAV_NO] = (SDL_GameControllerGetButton (game_controller, BUTTON_NO) == 1 ) ? 1 .0f : 0 .0f ; }
278
+ #define MAP_ANALOG (NAV_NO, AXIS_NO, V0, V1 ) { float vn = (float )(SDL_GameControllerGetAxis (game_controller, AXIS_NO) - V0) / (float )(V1 - V0); if (vn > 1 .0f ) vn = 1 .0f ; if (vn > 0 .0f && io.NavInputs [NAV_NO] < vn) io.NavInputs [NAV_NO] = vn; }
279
+
280
+ int axes_count = 0 , buttons_count = 0 ;
281
+ SDL_GameController* game_controller = SDL_GameControllerOpen (0 );
282
+ if (game_controller !=NULL )
283
+ {
284
+ const int thumb_dead_zone = 8000 ;
285
+
286
+ MAP_BUTTON (ImGuiNavInput_Activate, SDL_CONTROLLER_BUTTON_A); // Cross / A
287
+ MAP_BUTTON (ImGuiNavInput_Cancel, SDL_CONTROLLER_BUTTON_B); // Circle / B
288
+ MAP_BUTTON (ImGuiNavInput_Menu, SDL_CONTROLLER_BUTTON_X); // Square / X
289
+ MAP_BUTTON (ImGuiNavInput_Input, SDL_CONTROLLER_BUTTON_Y); // Triangle / Y
290
+ MAP_BUTTON (ImGuiNavInput_DpadLeft, SDL_CONTROLLER_BUTTON_DPAD_LEFT); // D-Pad Left
291
+ MAP_BUTTON (ImGuiNavInput_DpadRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT); // D-Pad Right
292
+ MAP_BUTTON (ImGuiNavInput_DpadUp, SDL_CONTROLLER_BUTTON_DPAD_UP); // D-Pad Up
293
+ MAP_BUTTON (ImGuiNavInput_DpadDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN); // D-Pad Down
294
+ MAP_BUTTON (ImGuiNavInput_FocusPrev, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); // L1 / LB
295
+ MAP_BUTTON (ImGuiNavInput_FocusNext, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER); // R1 / RB
296
+ MAP_BUTTON (ImGuiNavInput_TweakSlow, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); // L1 / LB
297
+ MAP_BUTTON (ImGuiNavInput_TweakFast, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER); // R1 / RB
298
+ MAP_ANALOG (ImGuiNavInput_LStickLeft, SDL_CONTROLLER_AXIS_LEFTX, -thumb_dead_zone, -32768 );
299
+ MAP_ANALOG (ImGuiNavInput_LStickRight, SDL_CONTROLLER_AXIS_LEFTX, +thumb_dead_zone, +32767 );
300
+ MAP_ANALOG (ImGuiNavInput_LStickUp, SDL_CONTROLLER_AXIS_LEFTY, -thumb_dead_zone, -32767 );
301
+ MAP_ANALOG (ImGuiNavInput_LStickDown, SDL_CONTROLLER_AXIS_LEFTY, +thumb_dead_zone, +32767 );
302
+ #undef MAP_BUTTON
303
+ #undef MAP_ANALOG
304
+ }
305
+
306
+ if (axes_count > 0 && buttons_count > 0 )
307
+ io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
308
+ else
309
+ io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
310
+ }
311
+
269
312
void ImGui_ImplSDL2_NewFrame (SDL_Window* window)
270
313
{
271
314
ImGuiIO& io = ImGui::GetIO ();
@@ -288,4 +331,7 @@ void ImGui_ImplSDL2_NewFrame(SDL_Window* window)
288
331
289
332
ImGui_ImplSDL2_UpdateMousePosAndButtons ();
290
333
ImGui_ImplSDL2_UpdateMouseCursor ();
334
+
335
+ // Gamepad navigation mapping
336
+ ImGui_ImplSDL2_UpdateGamepads ();
291
337
}
0 commit comments