mirror of
https://github.com/ghostty-org/ghostty.git
synced 2026-05-30 16:45:44 +00:00
Fixes #10406 ImGui_ImplOpenGL3_Shutdown() calls imgl3wShutdown() which dlcloses the GL library handles but does not zero out the imgl3w function pointer table (imgl3wProcs). When a GLArea is re-realized (e.g. during reparenting), ImGui_ImplOpenGL3_Init() calls ImGui_ImplOpenGL3_InitLoader() which checks "if (glGetIntegerv == nullptr)". Since the stale pointers are non-null, it skips re-initialization. The next GL call through a dangling function pointer causes a SIGSEGV. Fix this by introducing ImGui_ImplOpenGL3_ShutdownWithLoaderCleanup() which calls the normal shutdown and then zeroes the imgl3wProcs table, forcing the next Init to reload GL function pointers via imgl3wInit(). Also properly destroy the ImGui context and reset widget state in glAreaUnrealize so re-realize starts clean. This was extra but was probably leaking memory.
52 lines
1.8 KiB
C++
52 lines
1.8 KiB
C++
#include "imgui.h"
|
|
|
|
// This file contains custom extensions for functionality that isn't
|
|
// properly supported by Dear Bindings yet. Namely:
|
|
// https://github.com/dearimgui/dear_bindings/issues/55
|
|
|
|
// Wrap this in a namespace to keep it separate from the C++ API
|
|
namespace cimgui
|
|
{
|
|
#include "dcimgui.h"
|
|
}
|
|
|
|
extern "C"
|
|
{
|
|
CIMGUI_API void ImFontConfig_ImFontConfig(cimgui::ImFontConfig* self)
|
|
{
|
|
static_assert(sizeof(cimgui::ImFontConfig) == sizeof(::ImFontConfig), "ImFontConfig size mismatch");
|
|
static_assert(alignof(cimgui::ImFontConfig) == alignof(::ImFontConfig), "ImFontConfig alignment mismatch");
|
|
::ImFontConfig defaults;
|
|
*reinterpret_cast<::ImFontConfig*>(self) = defaults;
|
|
}
|
|
|
|
CIMGUI_API void ImGuiStyle_ImGuiStyle(cimgui::ImGuiStyle* self)
|
|
{
|
|
static_assert(sizeof(cimgui::ImGuiStyle) == sizeof(::ImGuiStyle), "ImGuiStyle size mismatch");
|
|
static_assert(alignof(cimgui::ImGuiStyle) == alignof(::ImGuiStyle), "ImGuiStyle alignment mismatch");
|
|
::ImGuiStyle defaults;
|
|
*reinterpret_cast<::ImGuiStyle*>(self) = defaults;
|
|
}
|
|
|
|
// Perform the OpenGL3 backend shutdown and then zero out the imgl3w
|
|
// function pointer table. ImGui_ImplOpenGL3_Shutdown() calls
|
|
// imgl3wShutdown() which dlcloses the GL library handles but does not
|
|
// zero out the function pointers. A subsequent ImGui_ImplOpenGL3_Init()
|
|
// sees the stale (non-null) pointers, skips loader re-initialization,
|
|
// and crashes when calling through them. Zeroing the table forces the
|
|
// next Init to reload the GL function pointers via imgl3wInit().
|
|
#ifndef IMGUI_DISABLE
|
|
#if __has_include("backends/imgui_impl_opengl3.h")
|
|
#include "backends/imgui_impl_opengl3.h"
|
|
#include "backends/imgui_impl_opengl3_loader.h"
|
|
|
|
CIMGUI_API void ImGui_ImplOpenGL3_ShutdownWithLoaderCleanup()
|
|
{
|
|
::ImGui_ImplOpenGL3_Shutdown();
|
|
memset(&imgl3wProcs, 0, sizeof(imgl3wProcs));
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
}
|