From 7f960616e0b7bee6ccadea26d92726dbab3ec7b8 Mon Sep 17 00:00:00 2001 From: omar Date: Wed, 16 May 2018 14:34:46 +0200 Subject: [PATCH] Viewport: When resizing/moving a window using the host OS/WM we attempt to merge back into host viewport. (#1542) --- imgui.cpp | 10 ++++++++-- imgui.h | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 5c50f720..22c07fbf 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -3553,7 +3553,7 @@ static void ImGui::UpdateViewports() if (viewport->PlatformRequestResize) viewport->Size = g.PlatformIO.Platform_GetWindowSize(viewport); - // Translate imgui windows when a host viewport has been moved + // Translate imgui windows when a Host Viewport has been moved ImVec2 delta = viewport->Pos - viewport->LastPos; if ((viewport->Flags & ImGuiViewportFlags_CanHostOtherWindows) && (delta.x != 0.0f || delta.y != 0.0f)) for (int window_n = 0; window_n < g.Windows.Size; window_n++) @@ -6827,13 +6827,19 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) } } - // Synchronize viewport --> window + // Synchronize viewport --> window in case the platform window has been moved or resized from the OS/WM if (window->ViewportOwned) { if (window->Viewport->PlatformRequestMove) + { window->Pos = window->Viewport->Pos; + window->ViewportTryMerge = true; + } if (window->Viewport->PlatformRequestResize) + { window->Size = window->SizeFull = window->Viewport->Size; + window->ViewportTryMerge = true; + } // We also tell the back-end that clearing the platform window won't be necessary, as our window is filling the viewport and we have disabled BgAlpha window->Viewport->Flags |= ImGuiViewportFlags_NoRendererClear; diff --git a/imgui.h b/imgui.h index 8c07ed33..7d86b287 100644 --- a/imgui.h +++ b/imgui.h @@ -2004,8 +2004,8 @@ struct ImGuiViewport void* PlatformUserData; // void* to hold custom data structure for the platform (e.g. windowing info, render context) void* PlatformHandle; // void* for FindViewportByPlatformHandle(). (e.g. suggested to use natural platform handle such as HWND, GlfwWindow*, SDL_Window*) bool PlatformRequestClose; // Platform window requested closure - bool PlatformRequestMove; // Platform window requested move (e.g. window was moved using OS windowing facility) - bool PlatformRequestResize; // Platform window requested resize (e.g. window was resize using OS windowing facility) + bool PlatformRequestMove; // Platform window requested move (e.g. window was moved by the OS / host window manager) + bool PlatformRequestResize; // Platform window requested resize (e.g. window was resize by the OS / host window manager) void* RendererUserData; // void* to hold custom data structure for the renderer (e.g. swap chain, frame-buffers etc.) ImGuiViewport() { ID = 0; Flags = 0; DpiScale = 0.0f; DrawData = NULL; PlatformUserData = PlatformHandle = NULL; PlatformRequestClose = PlatformRequestMove = PlatformRequestResize = false; RendererUserData = NULL; }