Viewports, GLFW: Fix window having incorrect size after uncollapse. Issue manifests on Linux when window is in it's own viewport. (#2756, #2117)

This commit is contained in:
Rokas Kupstys 2019-08-23 16:12:06 +03:00 committed by omar
parent 09780b8b3d
commit a89a3cd2f1

View File

@ -406,8 +406,9 @@ struct ImGuiViewportDataGlfw
{ {
GLFWwindow* Window; GLFWwindow* Window;
bool WindowOwned; bool WindowOwned;
bool IgnoreSetWindowSizeEvent;
ImGuiViewportDataGlfw() { Window = NULL; WindowOwned = false; } ImGuiViewportDataGlfw() { Window = NULL; WindowOwned = false; IgnoreSetWindowSizeEvent = false; }
~ImGuiViewportDataGlfw() { IM_ASSERT(Window == NULL); } ~ImGuiViewportDataGlfw() { IM_ASSERT(Window == NULL); }
}; };
@ -426,7 +427,21 @@ static void ImGui_ImplGlfw_WindowPosCallback(GLFWwindow* window, int, int)
static void ImGui_ImplGlfw_WindowSizeCallback(GLFWwindow* window, int, int) static void ImGui_ImplGlfw_WindowSizeCallback(GLFWwindow* window, int, int)
{ {
if (ImGuiViewport* viewport = ImGui::FindViewportByPlatformHandle(window)) if (ImGuiViewport* viewport = ImGui::FindViewportByPlatformHandle(window))
{
if (ImGuiViewportDataGlfw* data = (ImGuiViewportDataGlfw*)viewport->PlatformUserData)
{
if (data->IgnoreSetWindowSizeEvent)
{
// GLFW will dispatch window size event. ImGui expects no such event sent when library explicitly requests setting
// window size. Depending on the platform this callback may be invoked during glfwSetWindowSize() call or queued
// for the next frame and invoked during glfwPollEvents() call. When latter happens - restoring collapsed window
// would have incorrect size.
data->IgnoreSetWindowSizeEvent = false;
return;
}
}
viewport->PlatformRequestResize = true; viewport->PlatformRequestResize = true;
}
} }
static void ImGui_ImplGlfw_CreateWindow(ImGuiViewport* viewport) static void ImGui_ImplGlfw_CreateWindow(ImGuiViewport* viewport)
@ -569,6 +584,8 @@ static ImVec2 ImGui_ImplGlfw_GetWindowSize(ImGuiViewport* viewport)
static void ImGui_ImplGlfw_SetWindowSize(ImGuiViewport* viewport, ImVec2 size) static void ImGui_ImplGlfw_SetWindowSize(ImGuiViewport* viewport, ImVec2 size)
{ {
if (ImGuiViewportDataGlfw* data = (ImGuiViewportDataGlfw*)viewport->PlatformUserData)
data->IgnoreSetWindowSizeEvent = true;
ImGuiViewportDataGlfw* data = (ImGuiViewportDataGlfw*)viewport->PlatformUserData; ImGuiViewportDataGlfw* data = (ImGuiViewportDataGlfw*)viewport->PlatformUserData;
#if __APPLE__ #if __APPLE__
// Native OS windows are positioned from the bottom-left corner on macOS, whereas on other platforms they are // Native OS windows are positioned from the bottom-left corner on macOS, whereas on other platforms they are