From 3e8eebfbec4092b69009d7b0ca51eeace114a0a1 Mon Sep 17 00:00:00 2001 From: Vincent Hamm Date: Mon, 17 Jun 2019 21:03:00 -0700 Subject: [PATCH] Viewport: Added PlatformHandleRaw. Update SDL+DX11 example. (#1542, #2635) --- examples/imgui_impl_dx11.cpp | 8 +++++++- examples/imgui_impl_sdl.cpp | 10 ++++++++++ imgui.h | 3 ++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/examples/imgui_impl_dx11.cpp b/examples/imgui_impl_dx11.cpp index e43a75af..b0aad0e1 100644 --- a/examples/imgui_impl_dx11.cpp +++ b/examples/imgui_impl_dx11.cpp @@ -564,7 +564,13 @@ static void ImGui_ImplDX11_CreateWindow(ImGuiViewport* viewport) ImGuiViewportDataDx11* data = IM_NEW(ImGuiViewportDataDx11)(); viewport->RendererUserData = data; - HWND hwnd = (HWND)viewport->PlatformHandle; + // When using SDL, PlatformHandleRaw will be the HWND (because PlatformHandle would be the SDL_Window) + // If not using SDL, PlatformHandleRaw will be null and PlatformHandle will contain the HWND + HWND hwnd = (HWND)viewport->PlatformHandleRaw; + if (hwnd == 0) + { + hwnd = (HWND)viewport->PlatformHandle; + } IM_ASSERT(hwnd != 0); // Create swap chain diff --git a/examples/imgui_impl_sdl.cpp b/examples/imgui_impl_sdl.cpp index 27aa2017..e115e27f 100644 --- a/examples/imgui_impl_sdl.cpp +++ b/examples/imgui_impl_sdl.cpp @@ -456,6 +456,16 @@ static void ImGui_ImplSDL2_CreateWindow(ImGuiViewport* viewport) if (use_opengl && backup_context) SDL_GL_MakeCurrent(data->Window, backup_context); viewport->PlatformHandle = (void*)data->Window; + +#if defined(_WIN32) + // save the window handle for render that needs it (directX) + SDL_SysWMinfo info; + SDL_VERSION(&info.version); + if (SDL_GetWindowWMInfo(data->Window, &info)) + { + viewport->PlatformHandleRaw = info.info.win.window; + } +#endif } static void ImGui_ImplSDL2_DestroyWindow(ImGuiViewport* viewport) diff --git a/imgui.h b/imgui.h index 75272220..be07f2fe 100644 --- a/imgui.h +++ b/imgui.h @@ -2399,11 +2399,12 @@ struct ImGuiViewport void* RendererUserData; // void* to hold custom data structure for the renderer (e.g. swap chain, frame-buffers etc.) void* PlatformUserData; // void* to hold custom data structure for the OS / 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*) + void* PlatformHandleRaw; // void* to hold the platfor-native windows handle (e.g. the HWND) when using an abstraction layer like SDL (where PlatformHandle would be a SDL_Window*) bool PlatformRequestClose; // Platform window requested closure (e.g. window was moved by the OS / host window manager, e.g. pressing ALT-F4) bool PlatformRequestMove; // Platform window requested move (e.g. window was moved by the OS / host window manager, authoritative position will be OS window position) bool PlatformRequestResize; // Platform window requested resize (e.g. window was resized by the OS / host window manager, authoritative size will be OS window size) - ImGuiViewport() { ID = 0; Flags = 0; DpiScale = 0.0f; DrawData = NULL; ParentViewportId = 0; RendererUserData = PlatformUserData = PlatformHandle = NULL; PlatformRequestClose = PlatformRequestMove = PlatformRequestResize = false; } + ImGuiViewport() { ID = 0; Flags = 0; DpiScale = 0.0f; DrawData = NULL; ParentViewportId = 0; RendererUserData = PlatformUserData = PlatformHandle = PlatformHandleRaw = NULL; PlatformRequestClose = PlatformRequestMove = PlatformRequestResize = false; } ~ImGuiViewport() { IM_ASSERT(PlatformUserData == NULL && RendererUserData == NULL); } };