@ -25,6 +25,7 @@
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2023-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
// 2023-11-13: Updated for recent SDL3 API changes.
// 2023-10-05: Inputs: Added support for extra ImGuiKey values: F13 to F24 function keys, app back/forward keys.
// 2023-05-04: Fixed build on Emscripten/iOS/Android. (#6391)
// 2023-04-06: Inputs: Avoid calling SDL_StartTextInput()/SDL_StopTextInput() as they don't only pertain to IME. It's unclear exactly what their relation is to IME. (#6306)
@ -44,10 +45,15 @@
// SDL
# include <SDL3/SDL.h>
# include <SDL3/SDL_syswm.h>
# if defined(__APPLE__)
# include <TargetConditionals.h>
# endif
# ifdef _WIN32
# ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
# endif
# include <windows.h>
# endif
# if !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !(defined(__APPLE__) && TARGET_OS_IOS) && !defined(__amigaos4__)
# define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE 1
@ -369,10 +375,22 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
return false ;
}
static void ImGui_ImplSDL3_SetupPlatformHandles ( ImGuiViewport * viewport , SDL_Window * window )
{
viewport - > PlatformHandle = window ;
viewport - > PlatformHandleRaw = nullptr ;
# if defined(__WIN32__) && !defined(__WINRT__)
viewport - > PlatformHandleRaw = ( HWND ) SDL_GetProperty ( SDL_GetWindowProperties ( window ) , " SDL.window.win32.hwnd " , NULL ) ;
# elif defined(__APPLE__) && defined(SDL_VIDEO_DRIVER_COCOA)
viewport - > PlatformHandleRaw = ( void * ) SDL_GetProperty ( SDL_GetWindowProperties ( window ) , " SDL.window.cocoa.window " , NULL ) ;
# endif
}
static bool ImGui_ImplSDL3_Init ( SDL_Window * window , SDL_Renderer * renderer , void * sdl_gl_context )
{
ImGuiIO & io = ImGui : : GetIO ( ) ;
IM_ASSERT ( io . BackendPlatformUserData = = nullptr & & " Already initialized a platform backend! " ) ;
IM_UNUSED ( sdl_gl_context ) ; // Unused in this branch
// Check and store if we are on a SDL backend that supports global mouse position
// ("wayland" and "rpi" don't support it, but we chose to use a white-list instead of a black-list)
@ -426,17 +444,7 @@ static bool ImGui_ImplSDL3_Init(SDL_Window* window, SDL_Renderer* renderer, void
// Set platform dependent data in viewport
// Our mouse update function expect PlatformHandle to be filled for the main viewport
ImGuiViewport * main_viewport = ImGui : : GetMainViewport ( ) ;
main_viewport - > PlatformHandle = ( void * ) window ;
main_viewport - > PlatformHandleRaw = nullptr ;
SDL_SysWMinfo info ;
if ( SDL_GetWindowWMInfo ( window , & info , SDL_SYSWM_CURRENT_VERSION ) = = 0 )
{
# if defined(SDL_ENABLE_SYSWM_WINDOWS)
main_viewport - > PlatformHandleRaw = ( void * ) info . info . win . window ;
# elif defined(__APPLE__) && defined(SDL_ENABLE_SYSWM_COCOA)
main_viewport - > PlatformHandleRaw = ( void * ) info . info . cocoa . window ;
# endif
}
ImGui_ImplSDL3_SetupPlatformHandles ( main_viewport , window ) ;
// From 2.0.5: Set SDL hint to receive mouse click events on window focus, otherwise SDL doesn't emit the event.
// Without this, when clicking to gain focus, our widgets wouldn't activate even though they showed as hovered.
@ -626,10 +634,10 @@ static void ImGui_ImplSDL3_UpdateGamepads()
const int thumb_dead_zone = 8000 ; // SDL_gamecontroller.h suggests using this value.
MAP_BUTTON ( ImGuiKey_GamepadStart , SDL_GAMEPAD_BUTTON_START ) ;
MAP_BUTTON ( ImGuiKey_GamepadBack , SDL_GAMEPAD_BUTTON_BACK ) ;
MAP_BUTTON ( ImGuiKey_GamepadFaceLeft , SDL_GAMEPAD_BUTTON_X ) ; // Xbox X, PS Square
MAP_BUTTON ( ImGuiKey_GamepadFaceRight , SDL_GAMEPAD_BUTTON_B ) ; // Xbox B, PS Circle
MAP_BUTTON ( ImGuiKey_GamepadFaceUp , SDL_GAMEPAD_BUTTON_Y ) ; // Xbox Y, PS Triangle
MAP_BUTTON ( ImGuiKey_GamepadFaceDown , SDL_GAMEPAD_BUTTON_A ) ; // Xbox A, PS Cross
MAP_BUTTON ( ImGuiKey_GamepadFaceLeft , SDL_GAMEPAD_BUTTON_WEST ) ; // Xbox X, PS Square
MAP_BUTTON ( ImGuiKey_GamepadFaceRight , SDL_GAMEPAD_BUTTON_EAST ) ; // Xbox B, PS Circle
MAP_BUTTON ( ImGuiKey_GamepadFaceUp , SDL_GAMEPAD_BUTTON_NORTH ) ; // Xbox Y, PS Triangle
MAP_BUTTON ( ImGuiKey_GamepadFaceDown , SDL_GAMEPAD_BUTTON_SOUTH ) ; // Xbox A, PS Cross
MAP_BUTTON ( ImGuiKey_GamepadDpadLeft , SDL_GAMEPAD_BUTTON_DPAD_LEFT ) ;
MAP_BUTTON ( ImGuiKey_GamepadDpadRight , SDL_GAMEPAD_BUTTON_DPAD_RIGHT ) ;
MAP_BUTTON ( ImGuiKey_GamepadDpadUp , SDL_GAMEPAD_BUTTON_DPAD_UP ) ;
@ -790,17 +798,7 @@ static void ImGui_ImplSDL3_CreateWindow(ImGuiViewport* viewport)
if ( use_opengl & & backup_context )
SDL_GL_MakeCurrent ( vd - > Window , backup_context ) ;
viewport - > PlatformHandle = ( void * ) vd - > Window ;
viewport - > PlatformHandleRaw = nullptr ;
SDL_SysWMinfo info ;
if ( SDL_GetWindowWMInfo ( vd - > Window , & info , SDL_SYSWM_CURRENT_VERSION ) )
{
# if defined(SDL_VIDEO_DRIVER_WINDOWS)
viewport - > PlatformHandleRaw = info . info . win . window ;
# elif defined(__APPLE__) && defined(SDL_VIDEO_DRIVER_COCOA)
viewport - > PlatformHandleRaw = ( void * ) info . info . cocoa . window ;
# endif
}
ImGui_ImplSDL3_SetupPlatformHandles ( viewport , vd - > Window ) ;
}
static void ImGui_ImplSDL3_DestroyWindow ( ImGuiViewport * viewport )
@ -927,7 +925,7 @@ static int ImGui_ImplSDL3_CreateVkSurface(ImGuiViewport* viewport, ImU64 vk_inst
{
ImGui_ImplSDL3_ViewportData * vd = ( ImGui_ImplSDL3_ViewportData * ) viewport - > PlatformUserData ;
( void ) vk_allocator ;
SDL_bool ret = SDL_Vulkan_CreateSurface ( vd - > Window , ( VkInstance ) vk_instance , ( VkSurfaceKHR * ) out_vk_surface ) ;
SDL_bool ret = SDL_Vulkan_CreateSurface ( vd - > Window , ( VkInstance ) vk_instance , ( VkAllocationCallbacks * ) vk_allocator , ( Vk SurfaceKHR * ) out_vk_surface ) ;
return ret ? 0 : 1 ; // ret ? VK_SUCCESS : VK_NOT_READY
}