Fixed creating multiple-context (regression in 28ba54a). (#5135)

This commit is contained in:
ocornut 2022-03-24 10:57:28 +01:00
parent 1ad8ad623e
commit 16ddc1698d
3 changed files with 17 additions and 19 deletions

View File

@ -3697,20 +3697,23 @@ void ImGui::GetAllocatorFunctions(ImGuiMemAllocFunc* p_alloc_func, ImGuiMemFreeF
ImGuiContext* ImGui::CreateContext(ImFontAtlas* shared_font_atlas) ImGuiContext* ImGui::CreateContext(ImFontAtlas* shared_font_atlas)
{ {
ImGuiContext* prev_ctx = GetCurrentContext();
ImGuiContext* ctx = IM_NEW(ImGuiContext)(shared_font_atlas); ImGuiContext* ctx = IM_NEW(ImGuiContext)(shared_font_atlas);
if (GImGui == NULL) SetCurrentContext(ctx);
SetCurrentContext(ctx); Initialize();
Initialize(ctx); if (prev_ctx != NULL)
SetCurrentContext(prev_ctx); // Restore previous context if any, else keep new one.
return ctx; return ctx;
} }
void ImGui::DestroyContext(ImGuiContext* ctx) void ImGui::DestroyContext(ImGuiContext* ctx)
{ {
ImGuiContext* prev_ctx = GetCurrentContext();
if (ctx == NULL) if (ctx == NULL)
ctx = GImGui; ctx = prev_ctx;
Shutdown(ctx); SetCurrentContext(ctx);
if (GImGui == ctx) Shutdown();
SetCurrentContext(NULL); SetCurrentContext((prev_ctx != ctx) ? prev_ctx : NULL);
IM_DELETE(ctx); IM_DELETE(ctx);
} }
@ -4464,9 +4467,9 @@ void ImGui::NewFrame()
CallContextHooks(&g, ImGuiContextHookType_NewFramePost); CallContextHooks(&g, ImGuiContextHookType_NewFramePost);
} }
void ImGui::Initialize(ImGuiContext* context) void ImGui::Initialize()
{ {
ImGuiContext& g = *context; ImGuiContext& g = *GImGui;
IM_ASSERT(!g.Initialized && !g.SettingsLoaded); IM_ASSERT(!g.Initialized && !g.SettingsLoaded);
// Add .ini handle for ImGuiWindow type // Add .ini handle for ImGuiWindow type
@ -4496,10 +4499,10 @@ void ImGui::Initialize(ImGuiContext* context)
} }
// This function is merely here to free heap allocations. // This function is merely here to free heap allocations.
void ImGui::Shutdown(ImGuiContext* context) void ImGui::Shutdown()
{ {
// The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame) // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame)
ImGuiContext& g = *context; ImGuiContext& g = *GImGui;
if (g.IO.Fonts && g.FontAtlasOwnedByContext) if (g.IO.Fonts && g.FontAtlasOwnedByContext)
{ {
g.IO.Fonts->Locked = false; g.IO.Fonts->Locked = false;
@ -4513,12 +4516,7 @@ void ImGui::Shutdown(ImGuiContext* context)
// Save settings (unless we haven't attempted to load them: CreateContext/DestroyContext without a call to NewFrame shouldn't save an empty file) // Save settings (unless we haven't attempted to load them: CreateContext/DestroyContext without a call to NewFrame shouldn't save an empty file)
if (g.SettingsLoaded && g.IO.IniFilename != NULL) if (g.SettingsLoaded && g.IO.IniFilename != NULL)
{
ImGuiContext* backup_context = GImGui;
SetCurrentContext(&g);
SaveIniSettingsToDisk(g.IO.IniFilename); SaveIniSettingsToDisk(g.IO.IniFilename);
SetCurrentContext(backup_context);
}
CallContextHooks(&g, ImGuiContextHookType_Shutdown); CallContextHooks(&g, ImGuiContextHookType_Shutdown);

View File

@ -65,7 +65,7 @@ Index of this file:
// Version // Version
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens)
#define IMGUI_VERSION "1.88 WIP" #define IMGUI_VERSION "1.88 WIP"
#define IMGUI_VERSION_NUM 18710 #define IMGUI_VERSION_NUM 18711
#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) #define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx))
#define IMGUI_HAS_TABLE #define IMGUI_HAS_TABLE

View File

@ -2519,8 +2519,8 @@ namespace ImGui
IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents.
// Init // Init
IMGUI_API void Initialize(ImGuiContext* context); IMGUI_API void Initialize();
IMGUI_API void Shutdown(ImGuiContext* context); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext(). IMGUI_API void Shutdown(); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext().
// NewFrame // NewFrame
IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs); IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs);