|
@@ -911,27 +911,33 @@ static void UpdateViewportsNewFrame();
|
|
|
// [SECTION] CONTEXT AND MEMORY ALLOCATORS
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
+// DLL users:
|
|
|
+// - Heaps and globals are not shared across DLL boundaries!
|
|
|
+// - You will need to call SetCurrentContext() + SetAllocatorFunctions() for each static/DLL boundary you are calling from.
|
|
|
+// - Same apply for hot-reloading mechanisms that are reliant on reloading DLL (note that many hot-reloading mechanism works without DLL).
|
|
|
+// - Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility.
|
|
|
+// - Confused? In a debugger: add GImGui to your watch window and notice how its value changes depending on your current location (which DLL boundary you are in).
|
|
|
+
|
|
|
// Current context pointer. Implicitly used by all Dear ImGui functions. Always assumed to be != NULL.
|
|
|
-// ImGui::CreateContext() will automatically set this pointer if it is NULL. Change to a different context by calling ImGui::SetCurrentContext().
|
|
|
-// 1) Important: globals are not shared across DLL boundaries! If you use DLLs or any form of hot-reloading: you will need to call
|
|
|
-// SetCurrentContext() (with the pointer you got from CreateContext) from each unique static/DLL boundary, and after each hot-reloading.
|
|
|
-// In your debugger, add GImGui to your watch window and notice how its value changes depending on which location you are currently stepping into.
|
|
|
-// 2) Important: Dear ImGui functions are not thread-safe because of this pointer.
|
|
|
-// If you want thread-safety to allow N threads to access N different contexts, you can:
|
|
|
-// - Change this variable to use thread local storage so each thread can refer to a different context, in imconfig.h:
|
|
|
-// struct ImGuiContext;
|
|
|
-// extern thread_local ImGuiContext* MyImGuiTLS;
|
|
|
-// #define GImGui MyImGuiTLS
|
|
|
-// And then define MyImGuiTLS in one of your cpp file. Note that thread_local is a C++11 keyword, earlier C++ uses compiler-specific keyword.
|
|
|
-// - Future development aim to make this context pointer explicit to all calls. Also read https://github.com/ocornut/imgui/issues/586
|
|
|
-// - If you need a finite number of contexts, you may compile and use multiple instances of the ImGui code from different namespace.
|
|
|
+// - ImGui::CreateContext() will automatically set this pointer if it is NULL.
|
|
|
+// Change to a different context by calling ImGui::SetCurrentContext().
|
|
|
+// - Important: Dear ImGui functions are not thread-safe because of this pointer.
|
|
|
+// If you want thread-safety to allow N threads to access N different contexts:
|
|
|
+// - Change this variable to use thread local storage so each thread can refer to a different context, in your imconfig.h:
|
|
|
+// struct ImGuiContext;
|
|
|
+// extern thread_local ImGuiContext* MyImGuiTLS;
|
|
|
+// #define GImGui MyImGuiTLS
|
|
|
+// And then define MyImGuiTLS in one of your cpp file. Note that thread_local is a C++11 keyword, earlier C++ uses compiler-specific keyword.
|
|
|
+// - Future development aim to make this context pointer explicit to all calls. Also read https://github.com/ocornut/imgui/issues/586
|
|
|
+// - If you need a finite number of contexts, you may compile and use multiple instances of the ImGui code from different namespace.
|
|
|
+// - DLL users: read comments above.
|
|
|
#ifndef GImGui
|
|
|
ImGuiContext* GImGui = NULL;
|
|
|
#endif
|
|
|
|
|
|
// Memory Allocator functions. Use SetAllocatorFunctions() to change them.
|
|
|
-// If you use DLL hotreloading you might need to call SetAllocatorFunctions() after reloading code from this file.
|
|
|
-// Otherwise, you probably don't want to modify them mid-program, and if you use global/static e.g. ImVector<> instances you may need to keep them accessible during program destruction.
|
|
|
+// - You probably don't want to modify those mid-program, and if you use global/static e.g. ImVector<> instances you may need to keep them accessible during program destruction.
|
|
|
+// - DLL users: read comments above.
|
|
|
#ifndef IMGUI_DISABLE_DEFAULT_ALLOCATORS
|
|
|
static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); return malloc(size); }
|
|
|
static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); free(ptr); }
|
|
@@ -939,10 +945,9 @@ static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_d
|
|
|
static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(size); IM_ASSERT(0); return NULL; }
|
|
|
static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(ptr); IM_ASSERT(0); }
|
|
|
#endif
|
|
|
-
|
|
|
-static void* (*GImAllocatorAllocFunc)(size_t size, void* user_data) = MallocWrapper;
|
|
|
-static void (*GImAllocatorFreeFunc)(void* ptr, void* user_data) = FreeWrapper;
|
|
|
-static void* GImAllocatorUserData = NULL;
|
|
|
+static ImGuiMemAllocFunc* GImAllocatorAllocFunc = MallocWrapper;
|
|
|
+static ImGuiMemFreeFunc* GImAllocatorFreeFunc = FreeWrapper;
|
|
|
+static void* GImAllocatorUserData = NULL;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO)
|
|
@@ -3330,13 +3335,21 @@ void ImGui::SetCurrentContext(ImGuiContext* ctx)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-void ImGui::SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data)
|
|
|
+void ImGui::SetAllocatorFunctions(ImGuiMemAllocFunc* alloc_func, ImGuiMemFreeFunc* free_func, void* user_data)
|
|
|
{
|
|
|
GImAllocatorAllocFunc = alloc_func;
|
|
|
GImAllocatorFreeFunc = free_func;
|
|
|
GImAllocatorUserData = user_data;
|
|
|
}
|
|
|
|
|
|
+// This is provided to facilitate copying allocators from one static/DLL boundary to another (e.g. retrieve default allocator of your executable address space)
|
|
|
+void ImGui::GetAllocatorFunctions(ImGuiMemAllocFunc** p_alloc_func, ImGuiMemFreeFunc** p_free_func, void** p_user_data)
|
|
|
+{
|
|
|
+ *p_alloc_func = GImAllocatorAllocFunc;
|
|
|
+ *p_free_func = GImAllocatorFreeFunc;
|
|
|
+ *p_user_data = GImAllocatorUserData;
|
|
|
+}
|
|
|
+
|
|
|
ImGuiContext* ImGui::CreateContext(ImFontAtlas* shared_font_atlas)
|
|
|
{
|
|
|
ImGuiContext* ctx = IM_NEW(ImGuiContext)(shared_font_atlas);
|