Skip to content

Commit 70179e0

Browse files
Attempt to fix nativechildwindows opened from other nativechildwindows
1 parent ff15610 commit 70179e0

File tree

1 file changed

+20
-12
lines changed

1 file changed

+20
-12
lines changed

backends/imgui_impl_sdl2.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -876,19 +876,25 @@ static void ImGui_ImplSDL2_CreateWindow(ImGuiViewport* viewport)
876876
float y_pos = viewport->Pos.y - main_viewport->Pos.y;
877877

878878
NativeChildWindow *child_window = new NativeChildWindow;
879-
880-
void *parent_ptr = nullptr;
881-
882-
SDL_Window* sdl_mouse_window = SDL_GetWindowFromID(bd->MouseWindowID);
883879

880+
ImGuiViewport *parent_viewport = ImGui::FindViewportByID(viewport->ParentViewportId);
881+
882+
while (parent_viewport->Flags & ImGuiViewportFlags_NativeChild)
883+
parent_viewport = ImGui::FindViewportByID(parent_viewport->ParentViewportId);
884+
885+
ImGui_ImplSDL2_ViewportData *parent_viewport_data = (ImGui_ImplSDL2_ViewportData *)parent_viewport->PlatformUserData;
886+
887+
void *parent_ptr = nullptr;
888+
SDL_Window *parent_window = parent_viewport_data->Window;
889+
884890
#ifdef __linux__
885891
parent_ptr = sdl_mouse_window;
886892
#else
887-
if(sdl_mouse_window != nullptr)
893+
if (parent_window != nullptr)
888894
{
889895
SDL_SysWMinfo wmInfo;
890896
SDL_VERSION(&wmInfo.version);
891-
SDL_GetWindowWMInfo(sdl_mouse_window, &wmInfo);
897+
SDL_GetWindowWMInfo(parent_window, &wmInfo);
892898

893899
#if defined _WIN32
894900
parent_ptr = wmInfo.info.win.window;
@@ -1023,24 +1029,26 @@ static ImVec2 ImGui_ImplSDL2_GetWindowPos(ImGuiViewport* viewport)
10231029
static void ImGui_ImplSDL2_SetWindowPos(ImGuiViewport* viewport, ImVec2 pos)
10241030
{
10251031
ImGui_ImplSDL2_ViewportData* vd = (ImGui_ImplSDL2_ViewportData*)viewport->PlatformUserData;
1026-
1032+
10271033
int pos_x = (int)pos.x, pos_y = (int)pos.y;
10281034

1035+
ImGuiViewport *parent_viewport = ImGui::FindViewportByID(viewport->ParentViewportId);
1036+
1037+
while (parent_viewport->Flags & ImGuiViewportFlags_NativeChild)
1038+
parent_viewport = ImGui::FindViewportByID(parent_viewport->ParentViewportId);
1039+
10291040
//Microstrain edit (use child coordinates for child windows)
10301041
#if defined(_WIN32)
10311042
if(vd->ChildWindow != nullptr)
10321043
{
1033-
ImGuiViewport* main_viewport = ImGui::GetMainViewport();
1034-
1035-
pos_x = (int)(viewport->Pos.x - main_viewport->Pos.x);
1036-
pos_y = (int)(viewport->Pos.y - main_viewport->Pos.y);
1044+
pos_x = (int)(viewport->Pos.x - parent_viewport->Pos.x);
1045+
pos_y = (int)(viewport->Pos.y - parent_viewport->Pos.y);
10371046

10381047
SetWindowPos((HWND)vd->ChildWindow->get(), HWND_TOP, pos_x, pos_y, 0, 0, SWP_NOCOPYBITS | SWP_NOACTIVATE | SWP_NOSIZE);
10391048
}
10401049
#elif defined __linux__
10411050
if(vd->ChildWindow != nullptr)
10421051
{
1043-
ImGuiViewport* main_viewport = ImGui::GetMainViewport();
10441052
pos_x = viewport->Pos.x - main_viewport->Pos.x;
10451053
pos_y = viewport->Pos.y - main_viewport->Pos.y;
10461054

0 commit comments

Comments
 (0)