|
@@ -26,6 +26,8 @@
|
|
|
// CHANGELOG
|
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
// 2024-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
|
|
|
+// 2024-08-19: Storing SDL_WindowID inside ImGuiViewport::PlatformHandle instead of SDL_Window*.
|
|
|
+// 2024-08-19: ImGui_ImplSDL3_ProcessEvent() now ignores events intended for other SDL windows. (#7853)
|
|
|
// 2024-07-22: Update for SDL3 api changes: SDL_GetGamepads() memory ownership change. (#7807)
|
|
|
// 2024-07-18: Update for SDL3 api changes: SDL_GetClipboardText() memory ownership change. (#7801)
|
|
|
// 2024-07-15: Update for SDL3 api changes: SDL_GetProperty() change to SDL_GetPointerProperty(). (#7794)
|
|
@@ -85,6 +87,7 @@
|
|
|
struct ImGui_ImplSDL3_Data
|
|
|
{
|
|
|
SDL_Window* Window;
|
|
|
+ SDL_WindowID WindowID;
|
|
|
SDL_Renderer* Renderer;
|
|
|
Uint64 Time;
|
|
|
char* ClipboardTextData;
|
|
@@ -144,7 +147,8 @@ static void ImGui_ImplSDL3_SetClipboardText(void*, const char* text)
|
|
|
static void ImGui_ImplSDL3_PlatformSetImeData(ImGuiContext*, ImGuiViewport* viewport, ImGuiPlatformImeData* data)
|
|
|
{
|
|
|
ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
|
- SDL_Window* window = (SDL_Window*)viewport->PlatformHandle;
|
|
|
+ SDL_WindowID window_id = (SDL_WindowID)(intptr_t)viewport->PlatformHandle;
|
|
|
+ SDL_Window* window = SDL_GetWindowFromID(window_id);
|
|
|
if ((data->WantVisible == false || bd->ImeWindow != window) && bd->ImeWindow != NULL)
|
|
|
{
|
|
|
SDL_StopTextInput(bd->ImeWindow);
|
|
@@ -305,6 +309,13 @@ static void ImGui_ImplSDL3_UpdateKeyModifiers(SDL_Keymod sdl_key_mods)
|
|
|
io.AddKeyEvent(ImGuiMod_Super, (sdl_key_mods & SDL_KMOD_GUI) != 0);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+static ImGuiViewport* ImGui_ImplSDL3_GetViewportForWindowID(SDL_WindowID window_id)
|
|
|
+{
|
|
|
+ ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData();
|
|
|
+ return (window_id == bd->WindowID) ? ImGui::GetMainViewport() : NULL;
|
|
|
+}
|
|
|
+
|
|
|
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
|
|
|
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
|
|
|
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
|
|
@@ -320,6 +331,8 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
|
|
|
{
|
|
|
case SDL_EVENT_MOUSE_MOTION:
|
|
|
{
|
|
|
+ if (ImGui_ImplSDL3_GetViewportForWindowID(event->motion.windowID) == NULL)
|
|
|
+ return false;
|
|
|
ImVec2 mouse_pos((float)event->motion.x, (float)event->motion.y);
|
|
|
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
|
|
{
|
|
@@ -334,6 +347,8 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
|
|
|
}
|
|
|
case SDL_EVENT_MOUSE_WHEEL:
|
|
|
{
|
|
|
+ if (ImGui_ImplSDL3_GetViewportForWindowID(event->wheel.windowID) == NULL)
|
|
|
+ return false;
|
|
|
//IMGUI_DEBUG_LOG("wheel %.2f %.2f, precise %.2f %.2f\n", (float)event->wheel.x, (float)event->wheel.y, event->wheel.preciseX, event->wheel.preciseY);
|
|
|
float wheel_x = -event->wheel.x;
|
|
|
float wheel_y = event->wheel.y;
|
|
@@ -347,6 +362,8 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
|
|
|
case SDL_EVENT_MOUSE_BUTTON_DOWN:
|
|
|
case SDL_EVENT_MOUSE_BUTTON_UP:
|
|
|
{
|
|
|
+ if (ImGui_ImplSDL3_GetViewportForWindowID(event->button.windowID) == NULL)
|
|
|
+ return false;
|
|
|
int mouse_button = -1;
|
|
|
if (event->button.button == SDL_BUTTON_LEFT) { mouse_button = 0; }
|
|
|
if (event->button.button == SDL_BUTTON_RIGHT) { mouse_button = 1; }
|
|
@@ -362,12 +379,16 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
|
|
|
}
|
|
|
case SDL_EVENT_TEXT_INPUT:
|
|
|
{
|
|
|
+ if (ImGui_ImplSDL3_GetViewportForWindowID(event->text.windowID) == NULL)
|
|
|
+ return false;
|
|
|
io.AddInputCharactersUTF8(event->text.text);
|
|
|
return true;
|
|
|
}
|
|
|
case SDL_EVENT_KEY_DOWN:
|
|
|
case SDL_EVENT_KEY_UP:
|
|
|
{
|
|
|
+ if (ImGui_ImplSDL3_GetViewportForWindowID(event->key.windowID) == NULL)
|
|
|
+ return false;
|
|
|
//IMGUI_DEBUG_LOG("SDL_EVENT_KEY_%d: key=%d, scancode=%d, mod=%X\n", (event->type == SDL_EVENT_KEY_DOWN) ? "DOWN" : "UP", event->key.key, event->key.scancode, event->key.mod);
|
|
|
ImGui_ImplSDL3_UpdateKeyModifiers((SDL_Keymod)event->key.mod);
|
|
|
ImGuiKey key = ImGui_ImplSDL3_KeyEventToImGuiKey(event->key.key, event->key.scancode);
|
|
@@ -386,6 +407,8 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
|
|
|
}
|
|
|
case SDL_EVENT_WINDOW_MOUSE_ENTER:
|
|
|
{
|
|
|
+ if (ImGui_ImplSDL3_GetViewportForWindowID(event->window.windowID) == NULL)
|
|
|
+ return false;
|
|
|
bd->MouseWindowID = event->window.windowID;
|
|
|
bd->MousePendingLeaveFrame = 0;
|
|
|
return true;
|
|
@@ -396,18 +419,23 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
|
|
|
// FIXME: Unconfirmed whether this is still needed with SDL3.
|
|
|
case SDL_EVENT_WINDOW_MOUSE_LEAVE:
|
|
|
{
|
|
|
+ if (ImGui_ImplSDL3_GetViewportForWindowID(event->window.windowID) == NULL)
|
|
|
+ return false;
|
|
|
bd->MousePendingLeaveFrame = ImGui::GetFrameCount() + 1;
|
|
|
return true;
|
|
|
}
|
|
|
case SDL_EVENT_WINDOW_FOCUS_GAINED:
|
|
|
- io.AddFocusEvent(true);
|
|
|
- return true;
|
|
|
case SDL_EVENT_WINDOW_FOCUS_LOST:
|
|
|
- io.AddFocusEvent(false);
|
|
|
+ {
|
|
|
+ if (ImGui_ImplSDL3_GetViewportForWindowID(event->window.windowID) == NULL)
|
|
|
+ return false;
|
|
|
+ io.AddFocusEvent(event->type == SDL_EVENT_WINDOW_FOCUS_GAINED);
|
|
|
return true;
|
|
|
+ }
|
|
|
case SDL_EVENT_WINDOW_CLOSE_REQUESTED:
|
|
|
case SDL_EVENT_WINDOW_MOVED:
|
|
|
case SDL_EVENT_WINDOW_RESIZED:
|
|
|
+ {
|
|
|
if (ImGuiViewport* viewport = ImGui::FindViewportByPlatformHandle((void*)SDL_GetWindowFromID(event->window.windowID)))
|
|
|
{
|
|
|
if (event->type == SDL_EVENT_WINDOW_CLOSE_REQUESTED)
|
|
@@ -419,6 +447,7 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
|
|
|
return true;
|
|
|
}
|
|
|
return true;
|
|
|
+ }
|
|
|
case SDL_EVENT_GAMEPAD_ADDED:
|
|
|
case SDL_EVENT_GAMEPAD_REMOVED:
|
|
|
{
|
|
@@ -431,7 +460,7 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
|
|
|
|
|
|
static void ImGui_ImplSDL3_SetupPlatformHandles(ImGuiViewport* viewport, SDL_Window* window)
|
|
|
{
|
|
|
- viewport->PlatformHandle = window;
|
|
|
+ viewport->PlatformHandle = (void*)(intptr_t)SDL_GetWindowID(window);
|
|
|
viewport->PlatformHandleRaw = nullptr;
|
|
|
#if defined(_WIN32) && !defined(__WINRT__)
|
|
|
viewport->PlatformHandleRaw = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, nullptr);
|
|
@@ -468,6 +497,7 @@ static bool ImGui_ImplSDL3_Init(SDL_Window* window, SDL_Renderer* renderer, void
|
|
|
io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; // We can create multi-viewports on the Platform side (optional)
|
|
|
|
|
|
bd->Window = window;
|
|
|
+ bd->WindowID = SDL_GetWindowID(window);
|
|
|
bd->Renderer = renderer;
|
|
|
|
|
|
// SDL on Linux/OSX doesn't report events for unfocused windows (see https://github.com/ocornut/imgui/issues/4960)
|