Browse Source

Backends: SDL2, SDL3: ignore events of other SDL windows. (#7853)

Anonymous Maarten 1 year ago
parent
commit
591a18a9c4
2 changed files with 30 additions and 0 deletions
  1. 12 0
      backends/imgui_impl_sdl2.cpp
  2. 18 0
      backends/imgui_impl_sdl3.cpp

+ 12 - 0
backends/imgui_impl_sdl2.cpp

@@ -321,6 +321,8 @@ bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
     {
     {
         case SDL_MOUSEMOTION:
         case SDL_MOUSEMOTION:
         {
         {
+            if (event->motion.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             ImVec2 mouse_pos((float)event->motion.x, (float)event->motion.y);
             ImVec2 mouse_pos((float)event->motion.x, (float)event->motion.y);
             io.AddMouseSourceEvent(event->motion.which == SDL_TOUCH_MOUSEID ? ImGuiMouseSource_TouchScreen : ImGuiMouseSource_Mouse);
             io.AddMouseSourceEvent(event->motion.which == SDL_TOUCH_MOUSEID ? ImGuiMouseSource_TouchScreen : ImGuiMouseSource_Mouse);
             io.AddMousePosEvent(mouse_pos.x, mouse_pos.y);
             io.AddMousePosEvent(mouse_pos.x, mouse_pos.y);
@@ -328,6 +330,8 @@ bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
         }
         }
         case SDL_MOUSEWHEEL:
         case SDL_MOUSEWHEEL:
         {
         {
+            if (event->wheel.windowID != SDL_GetWindowID(bd->Window))
+                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);
             //IMGUI_DEBUG_LOG("wheel %.2f %.2f, precise %.2f %.2f\n", (float)event->wheel.x, (float)event->wheel.y, event->wheel.preciseX, event->wheel.preciseY);
 #if SDL_VERSION_ATLEAST(2,0,18) // If this fails to compile on Emscripten: update to latest Emscripten!
 #if SDL_VERSION_ATLEAST(2,0,18) // If this fails to compile on Emscripten: update to latest Emscripten!
             float wheel_x = -event->wheel.preciseX;
             float wheel_x = -event->wheel.preciseX;
@@ -346,6 +350,8 @@ bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
         case SDL_MOUSEBUTTONDOWN:
         case SDL_MOUSEBUTTONDOWN:
         case SDL_MOUSEBUTTONUP:
         case SDL_MOUSEBUTTONUP:
         {
         {
+            if (event->button.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             int mouse_button = -1;
             int mouse_button = -1;
             if (event->button.button == SDL_BUTTON_LEFT) { mouse_button = 0; }
             if (event->button.button == SDL_BUTTON_LEFT) { mouse_button = 0; }
             if (event->button.button == SDL_BUTTON_RIGHT) { mouse_button = 1; }
             if (event->button.button == SDL_BUTTON_RIGHT) { mouse_button = 1; }
@@ -361,12 +367,16 @@ bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
         }
         }
         case SDL_TEXTINPUT:
         case SDL_TEXTINPUT:
         {
         {
+            if (event->text.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             io.AddInputCharactersUTF8(event->text.text);
             io.AddInputCharactersUTF8(event->text.text);
             return true;
             return true;
         }
         }
         case SDL_KEYDOWN:
         case SDL_KEYDOWN:
         case SDL_KEYUP:
         case SDL_KEYUP:
         {
         {
+            if (event->key.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             ImGui_ImplSDL2_UpdateKeyModifiers((SDL_Keymod)event->key.keysym.mod);
             ImGui_ImplSDL2_UpdateKeyModifiers((SDL_Keymod)event->key.keysym.mod);
             ImGuiKey key = ImGui_ImplSDL2_KeyEventToImGuiKey(event->key.keysym.sym, event->key.keysym.scancode);
             ImGuiKey key = ImGui_ImplSDL2_KeyEventToImGuiKey(event->key.keysym.sym, event->key.keysym.scancode);
             io.AddKeyEvent(key, (event->type == SDL_KEYDOWN));
             io.AddKeyEvent(key, (event->type == SDL_KEYDOWN));
@@ -375,6 +385,8 @@ bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
         }
         }
         case SDL_WINDOWEVENT:
         case SDL_WINDOWEVENT:
         {
         {
+            if (event->window.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             // - When capturing mouse, SDL will send a bunch of conflicting LEAVE/ENTER event on every mouse move, but the final ENTER tends to be right.
             // - When capturing mouse, SDL will send a bunch of conflicting LEAVE/ENTER event on every mouse move, but the final ENTER tends to be right.
             // - However we won't get a correct LEAVE event for a captured window.
             // - However we won't get a correct LEAVE event for a captured window.
             // - In some cases, when detaching a window from main viewport SDL may send SDL_WINDOWEVENT_ENTER one frame too late,
             // - In some cases, when detaching a window from main viewport SDL may send SDL_WINDOWEVENT_ENTER one frame too late,

+ 18 - 0
backends/imgui_impl_sdl3.cpp

@@ -307,6 +307,8 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
     {
     {
         case SDL_EVENT_MOUSE_MOTION:
         case SDL_EVENT_MOUSE_MOTION:
         {
         {
+            if (event->motion.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             ImVec2 mouse_pos((float)event->motion.x, (float)event->motion.y);
             ImVec2 mouse_pos((float)event->motion.x, (float)event->motion.y);
             io.AddMouseSourceEvent(event->motion.which == SDL_TOUCH_MOUSEID ? ImGuiMouseSource_TouchScreen : ImGuiMouseSource_Mouse);
             io.AddMouseSourceEvent(event->motion.which == SDL_TOUCH_MOUSEID ? ImGuiMouseSource_TouchScreen : ImGuiMouseSource_Mouse);
             io.AddMousePosEvent(mouse_pos.x, mouse_pos.y);
             io.AddMousePosEvent(mouse_pos.x, mouse_pos.y);
@@ -314,6 +316,8 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
         }
         }
         case SDL_EVENT_MOUSE_WHEEL:
         case SDL_EVENT_MOUSE_WHEEL:
         {
         {
+            if (event->wheel.windowID != SDL_GetWindowID(bd->Window))
+                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);
             //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_x = -event->wheel.x;
             float wheel_y = event->wheel.y;
             float wheel_y = event->wheel.y;
@@ -327,6 +331,8 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
         case SDL_EVENT_MOUSE_BUTTON_DOWN:
         case SDL_EVENT_MOUSE_BUTTON_DOWN:
         case SDL_EVENT_MOUSE_BUTTON_UP:
         case SDL_EVENT_MOUSE_BUTTON_UP:
         {
         {
+            if (event->button.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             int mouse_button = -1;
             int mouse_button = -1;
             if (event->button.button == SDL_BUTTON_LEFT) { mouse_button = 0; }
             if (event->button.button == SDL_BUTTON_LEFT) { mouse_button = 0; }
             if (event->button.button == SDL_BUTTON_RIGHT) { mouse_button = 1; }
             if (event->button.button == SDL_BUTTON_RIGHT) { mouse_button = 1; }
@@ -342,12 +348,16 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
         }
         }
         case SDL_EVENT_TEXT_INPUT:
         case SDL_EVENT_TEXT_INPUT:
         {
         {
+            if (event->text.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             io.AddInputCharactersUTF8(event->text.text);
             io.AddInputCharactersUTF8(event->text.text);
             return true;
             return true;
         }
         }
         case SDL_EVENT_KEY_DOWN:
         case SDL_EVENT_KEY_DOWN:
         case SDL_EVENT_KEY_UP:
         case SDL_EVENT_KEY_UP:
         {
         {
+            if (event->key.windowID != SDL_GetWindowID(bd->Window))
+                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_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);
             ImGui_ImplSDL3_UpdateKeyModifiers((SDL_Keymod)event->key.mod);
             ImGuiKey key = ImGui_ImplSDL3_KeyEventToImGuiKey(event->key.key, event->key.scancode);
             ImGuiKey key = ImGui_ImplSDL3_KeyEventToImGuiKey(event->key.key, event->key.scancode);
@@ -357,6 +367,8 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
         }
         }
         case SDL_EVENT_WINDOW_MOUSE_ENTER:
         case SDL_EVENT_WINDOW_MOUSE_ENTER:
         {
         {
+            if (event->window.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             bd->MouseWindowID = event->window.windowID;
             bd->MouseWindowID = event->window.windowID;
             bd->MousePendingLeaveFrame = 0;
             bd->MousePendingLeaveFrame = 0;
             return true;
             return true;
@@ -367,13 +379,19 @@ bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event)
         // FIXME: Unconfirmed whether this is still needed with SDL3.
         // FIXME: Unconfirmed whether this is still needed with SDL3.
         case SDL_EVENT_WINDOW_MOUSE_LEAVE:
         case SDL_EVENT_WINDOW_MOUSE_LEAVE:
         {
         {
+            if (event->window.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             bd->MousePendingLeaveFrame = ImGui::GetFrameCount() + 1;
             bd->MousePendingLeaveFrame = ImGui::GetFrameCount() + 1;
             return true;
             return true;
         }
         }
         case SDL_EVENT_WINDOW_FOCUS_GAINED:
         case SDL_EVENT_WINDOW_FOCUS_GAINED:
+            if (event->window.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             io.AddFocusEvent(true);
             io.AddFocusEvent(true);
             return true;
             return true;
         case SDL_EVENT_WINDOW_FOCUS_LOST:
         case SDL_EVENT_WINDOW_FOCUS_LOST:
+            if (event->window.windowID != SDL_GetWindowID(bd->Window))
+                return false;
             io.AddFocusEvent(false);
             io.AddFocusEvent(false);
             return true;
             return true;
         case SDL_EVENT_GAMEPAD_ADDED:
         case SDL_EVENT_GAMEPAD_ADDED: