From fcdaa327938741b0359ffde68ba9253ac1ace4a1 Mon Sep 17 00:00:00 2001 From: ocornut Date: Sat, 26 Apr 2025 14:52:14 +0200 Subject: [PATCH] Backends: GLFW: Disable multi-viewports under Wayland. (#8587) --- backends/imgui_impl_glfw.cpp | 15 +++++++++++++-- backends/imgui_impl_sdl2.cpp | 1 - docs/CHANGELOG.txt | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/backends/imgui_impl_glfw.cpp b/backends/imgui_impl_glfw.cpp index 0d4c8759f..f2c67ff1e 100644 --- a/backends/imgui_impl_glfw.cpp +++ b/backends/imgui_impl_glfw.cpp @@ -31,6 +31,7 @@ // CHANGELOG // (minor and older changes stripped away, please see git history for details) // 2025-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface. +// 2025-04-26: Disable multi-viewports under Wayland. (#8587) // 2025-03-10: Map GLFW_KEY_WORLD_1 and GLFW_KEY_WORLD_2 into ImGuiKey_Oem102. // 2025-03-03: Fixed clipboard handler assertion when using GLFW <= 3.2.1 compiled with asserts enabled. // 2025-02-21: [Docking] Update monitors and work areas information every frame, as the later may change regardless of monitor changes. (#8415) @@ -162,6 +163,7 @@ #define GLFW_HAS_GAMEPAD_API (GLFW_VERSION_COMBINED >= 3300) // 3.3+ glfwGetGamepadState() new api #define GLFW_HAS_GETKEYNAME (GLFW_VERSION_COMBINED >= 3200) // 3.2+ glfwGetKeyName() #define GLFW_HAS_GETERROR (GLFW_VERSION_COMBINED >= 3300) // 3.3+ glfwGetError() +#define GLFW_HAS_GETPLATFORM (GLFW_VERSION_COMBINED >= 3400) // 3.4+ glfwGetPlatform() // GLFW data enum GlfwClientApi @@ -622,8 +624,16 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw io.BackendPlatformName = "imgui_impl_glfw"; io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional) io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used) + + bool has_viewports = false; #ifndef __EMSCRIPTEN__ - io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; // We can create multi-viewports on the Platform side (optional) + has_viewports = true; +#if GLFW_HAS_GETPLATFORM + if (glfwGetPlatform() == GLFW_PLATFORM_WAYLAND) + has_viewports = false; +#endif + if (has_viewports) + io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; // We can create multi-viewports on the Platform side (optional) #endif #if GLFW_HAS_MOUSE_PASSTHROUGH || GLFW_HAS_WINDOW_HOVERED io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport; // We can call io.AddMouseViewportEvent() with correct data (optional) @@ -690,7 +700,8 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw #else IM_UNUSED(main_viewport); #endif - ImGui_ImplGlfw_InitMultiViewportSupport(); + if (has_viewports) + ImGui_ImplGlfw_InitMultiViewportSupport(); // Windows: register a WndProc hook so we can intercept some messages. #ifdef _WIN32 diff --git a/backends/imgui_impl_sdl2.cpp b/backends/imgui_impl_sdl2.cpp index 6c38e8e2d..a2fc05e4f 100644 --- a/backends/imgui_impl_sdl2.cpp +++ b/backends/imgui_impl_sdl2.cpp @@ -561,7 +561,6 @@ static bool ImGui_ImplSDL2_Init(SDL_Window* window, SDL_Renderer* renderer, void if (bd->MouseCanUseGlobalState) io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; // We can create multi-viewports on the Platform side (optional) - ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO(); platform_io.Platform_SetClipboardTextFn = ImGui_ImplSDL2_SetClipboardText; platform_io.Platform_GetClipboardTextFn = ImGui_ImplSDL2_GetClipboardText; diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index b858f1d8d..85deea60a 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -125,6 +125,7 @@ Docking+Viewports Branch: - Backends: SDL2, SDL3: revert updating monitors and work areas info every frame. Only do it on Windows to detect task-bar resize until we get an adequate event for it. (#8415, #8558) +- Backends: GLFW: Disable multi-viewports under Wayland (require GLFW 3.4). (#8587) -----------------------------------------------------------------------