mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Internals: Added support for context hooks (for test engine or other extensions)
This commit is contained in:
		
							
								
								
									
										41
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -3310,6 +3310,24 @@ void ImGui::DestroyContext(ImGuiContext* ctx) | ||||
|     IM_DELETE(ctx); | ||||
| } | ||||
|  | ||||
| // No specific ordering/dependency support, will see as needed | ||||
| void ImGui::AddContextHook(ImGuiContext* ctx, const ImGuiContextHook* hook) | ||||
| { | ||||
|     ImGuiContext& g = *ctx; | ||||
|     IM_ASSERT(hook->Callback != NULL); | ||||
|     g.Hooks.push_back(*hook); | ||||
| } | ||||
|  | ||||
| // Call context hooks (used by e.g. test engine) | ||||
| // We assume a small number of hooks so all stored in same array | ||||
| void ImGui::CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType hook_type) | ||||
| { | ||||
|     ImGuiContext& g = *ctx; | ||||
|     for (int n = 0; n < g.Hooks.Size; n++) | ||||
|         if (g.Hooks[n].Type == hook_type) | ||||
|             g.Hooks[n].Callback(&g, &g.Hooks[n]); | ||||
| } | ||||
|  | ||||
| ImGuiIO& ImGui::GetIO() | ||||
| { | ||||
|     IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); | ||||
| @@ -3735,9 +3753,7 @@ void ImGui::NewFrame() | ||||
|     IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); | ||||
|     ImGuiContext& g = *GImGui; | ||||
|  | ||||
| #ifdef IMGUI_ENABLE_TEST_ENGINE | ||||
|     ImGuiTestEngineHook_PreNewFrame(&g); | ||||
| #endif | ||||
|     CallContextHooks(&g, ImGuiContextHookType_NewFramePre); | ||||
|  | ||||
|     // Check and assert for various common IO and Configuration mistakes | ||||
|     ErrorCheckNewFrameSanityChecks(); | ||||
| @@ -3907,9 +3923,7 @@ void ImGui::NewFrame() | ||||
|     Begin("Debug##Default"); | ||||
|     IM_ASSERT(g.CurrentWindow->IsFallbackWindow == true); | ||||
|  | ||||
| #ifdef IMGUI_ENABLE_TEST_ENGINE | ||||
|     ImGuiTestEngineHook_PostNewFrame(&g); | ||||
| #endif | ||||
|     CallContextHooks(&g, ImGuiContextHookType_NewFramePost); | ||||
| } | ||||
|  | ||||
| // [DEBUG] Item picker tool - start with DebugStartItemPicker() - useful to visually select an item and break into its call-stack. | ||||
| @@ -3994,15 +4008,12 @@ void ImGui::Shutdown(ImGuiContext* context) | ||||
|     if (g.SettingsLoaded && g.IO.IniFilename != NULL) | ||||
|     { | ||||
|         ImGuiContext* backup_context = GImGui; | ||||
|         SetCurrentContext(context); | ||||
|         SetCurrentContext(&g); | ||||
|         SaveIniSettingsToDisk(g.IO.IniFilename); | ||||
|         SetCurrentContext(backup_context); | ||||
|     } | ||||
|  | ||||
|     // Notify hooked test engine, if any | ||||
| #ifdef IMGUI_ENABLE_TEST_ENGINE | ||||
|     ImGuiTestEngineHook_Shutdown(context); | ||||
| #endif | ||||
|     CallContextHooks(&g, ImGuiContextHookType_Shutdown); | ||||
|  | ||||
|     // Clear everything else | ||||
|     for (int i = 0; i < g.Windows.Size; i++) | ||||
| @@ -4202,6 +4213,8 @@ void ImGui::EndFrame() | ||||
|         return; | ||||
|     IM_ASSERT(g.WithinFrameScope && "Forgot to call ImGui::NewFrame()?"); | ||||
|  | ||||
|     CallContextHooks(&g, ImGuiContextHookType_EndFramePre); | ||||
|  | ||||
|     ErrorCheckEndFrameSanityChecks(); | ||||
|  | ||||
|     // Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME) | ||||
| @@ -4268,6 +4281,8 @@ void ImGui::EndFrame() | ||||
|     g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f; | ||||
|     g.IO.InputQueueCharacters.resize(0); | ||||
|     memset(g.IO.NavInputs, 0, sizeof(g.IO.NavInputs)); | ||||
|  | ||||
|     CallContextHooks(&g, ImGuiContextHookType_EndFramePost); | ||||
| } | ||||
|  | ||||
| void ImGui::Render() | ||||
| @@ -4281,6 +4296,8 @@ void ImGui::Render() | ||||
|     g.IO.MetricsRenderWindows = 0; | ||||
|     g.DrawDataBuilder.Clear(); | ||||
|  | ||||
|     CallContextHooks(&g, ImGuiContextHookType_RenderPre); | ||||
|  | ||||
|     // Add background ImDrawList | ||||
|     if (!g.BackgroundDrawList.VtxBuffer.empty()) | ||||
|         AddDrawListToDrawData(&g.DrawDataBuilder.Layers[0], &g.BackgroundDrawList); | ||||
| @@ -4318,6 +4335,8 @@ void ImGui::Render() | ||||
|     if (g.DrawData.CmdListsCount > 0 && g.IO.RenderDrawListsFn != NULL) | ||||
|         g.IO.RenderDrawListsFn(&g.DrawData); | ||||
| #endif | ||||
|  | ||||
|     CallContextHooks(&g, ImGuiContextHookType_RenderPost); | ||||
| } | ||||
|  | ||||
| // Calculate text size. Text can be multi-line. Optionally ignore text after a ## marker. | ||||
|   | ||||
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -60,7 +60,7 @@ Index of this file: | ||||
| // 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) | ||||
| #define IMGUI_VERSION               "1.79" | ||||
| #define IMGUI_VERSION_NUM           17900 | ||||
| #define IMGUI_VERSION_NUM           17901 | ||||
| #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | ||||
|  | ||||
| // Define attributes of all API symbols declarations (e.g. for DLL under Windows) | ||||
|   | ||||
| @@ -19,16 +19,17 @@ Index of this file: | ||||
| // [SECTION] ImDrawList support | ||||
| // [SECTION] Widgets support: flags, enums, data structures | ||||
| // [SECTION] Columns support | ||||
| // [SECTION] Settings support | ||||
| // [SECTION] Multi-select support | ||||
| // [SECTION] Docking support | ||||
| // [SECTION] Viewport support | ||||
| // [SECTION] Settings support | ||||
| // [SECTION] Generic context hooks | ||||
| // [SECTION] ImGuiContext (main imgui context) | ||||
| // [SECTION] ImGuiWindowTempData, ImGuiWindow | ||||
| // [SECTION] Tab bar, Tab item support | ||||
| // [SECTION] Table support | ||||
| // [SECTION] Internal API | ||||
| // [SECTION] Test Engine Hooks (imgui_test_engine) | ||||
| // [SECTION] Test Engine specific hooks (imgui_test_engine) | ||||
|  | ||||
| */ | ||||
|  | ||||
| @@ -93,6 +94,7 @@ struct ImGuiColorMod;               // Stacked color modifier, backup of modifie | ||||
| struct ImGuiColumnData;             // Storage data for a single column | ||||
| struct ImGuiColumns;                // Storage data for a columns set | ||||
| struct ImGuiContext;                // Main Dear ImGui context | ||||
| struct ImGuiContextHook;            // Hook for extensions like ImGuiTestEngine | ||||
| struct ImGuiDataTypeInfo;           // Type information associated to a ImGuiDataType enum | ||||
| struct ImGuiGroupData;              // Stacked storage data for BeginGroup()/EndGroup() | ||||
| struct ImGuiInputTextState;         // Internal state of the currently focused/edited text input box | ||||
| @@ -1099,6 +1101,23 @@ struct ImGuiSettingsHandler | ||||
|     ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); } | ||||
| }; | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // [SECTION] Generic context hooks | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook); | ||||
| enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown }; | ||||
|  | ||||
| struct ImGuiContextHook | ||||
| { | ||||
|     ImGuiContextHookType        Type; | ||||
|     ImGuiID                     Owner; | ||||
|     ImGuiContextHookCallback    Callback; | ||||
|     void*                       UserData; | ||||
|  | ||||
|     ImGuiContextHook()          { memset(this, 0, sizeof(*this)); } | ||||
| }; | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // [SECTION] ImGuiContext (main imgui context) | ||||
| //----------------------------------------------------------------------------- | ||||
| @@ -1301,6 +1320,7 @@ struct ImGuiContext | ||||
|     ImGuiTextBuffer         SettingsIniData;                    // In memory .ini settings | ||||
|     ImVector<ImGuiSettingsHandler>      SettingsHandlers;       // List of .ini settings handlers | ||||
|     ImChunkStream<ImGuiWindowSettings>  SettingsWindows;        // ImGuiWindow .ini settings entries | ||||
|     ImVector<ImGuiContextHook>          Hooks;                  // Hooks for extensions (e.g. test engine) | ||||
|  | ||||
|     // Capture/Logging | ||||
|     bool                    LogEnabled;                         // Currently capturing | ||||
| @@ -1819,6 +1839,10 @@ namespace ImGui | ||||
|     IMGUI_API void          UpdateMouseMovingWindowNewFrame(); | ||||
|     IMGUI_API void          UpdateMouseMovingWindowEndFrame(); | ||||
|  | ||||
|     // Generic context hooks | ||||
|     IMGUI_API void          AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook); | ||||
|     IMGUI_API void          CallContextHooks(ImGuiContext* context, ImGuiContextHookType type); | ||||
|  | ||||
|     // Settings | ||||
|     IMGUI_API void                  MarkIniSettingsDirty(); | ||||
|     IMGUI_API void                  MarkIniSettingsDirty(ImGuiWindow* window); | ||||
| @@ -2055,13 +2079,10 @@ IMGUI_API void              ImFontAtlasBuildMultiplyCalcLookupTable(unsigned cha | ||||
| IMGUI_API void              ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride); | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // [SECTION] Test Engine Hooks (imgui_test_engine) | ||||
| // [SECTION] Test Engine specific hooks (imgui_test_engine) | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| #ifdef IMGUI_ENABLE_TEST_ENGINE | ||||
| extern void                 ImGuiTestEngineHook_Shutdown(ImGuiContext* ctx); | ||||
| extern void                 ImGuiTestEngineHook_PreNewFrame(ImGuiContext* ctx); | ||||
| extern void                 ImGuiTestEngineHook_PostNewFrame(ImGuiContext* ctx); | ||||
| extern void                 ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id); | ||||
| extern void                 ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags); | ||||
| extern void                 ImGuiTestEngineHook_IdInfo(ImGuiContext* ctx, ImGuiDataType data_type, ImGuiID id, const void* data_id); | ||||
| @@ -2080,6 +2101,8 @@ extern void                 ImGuiTestEngineHook_Log(ImGuiContext* ctx, const cha | ||||
| #define IMGUI_TEST_ENGINE_ID_INFO2(_ID,_TYPE,_DATA,_DATA2)  do { } while (0) | ||||
| #endif | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| #if defined(__clang__) | ||||
| #pragma clang diagnostic pop | ||||
| #elif defined(__GNUC__) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user