ScummVM API documentation
imgui_internal.h
1 // dear imgui, v1.92.6
2 // (internal structures/api)
3 
4 // You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
5 
6 /*
7 
8 Index of this file:
9 
10 // [SECTION] Header mess
11 // [SECTION] Forward declarations
12 // [SECTION] Context pointer
13 // [SECTION] STB libraries includes
14 // [SECTION] Macros
15 // [SECTION] Generic helpers
16 // [SECTION] ImDrawList support
17 // [SECTION] Style support
18 // [SECTION] Data types support
19 // [SECTION] Widgets support: flags, enums, data structures
20 // [SECTION] Popup support
21 // [SECTION] Inputs support
22 // [SECTION] Clipper support
23 // [SECTION] Navigation support
24 // [SECTION] Typing-select support
25 // [SECTION] Columns support
26 // [SECTION] Box-select support
27 // [SECTION] Multi-select support
28 // [SECTION] Docking support
29 // [SECTION] Viewport support
30 // [SECTION] Settings support
31 // [SECTION] Localization support
32 // [SECTION] Error handling, State recovery support
33 // [SECTION] Metrics, Debug tools
34 // [SECTION] Generic context hooks
35 // [SECTION] ImGuiContext (main imgui context)
36 // [SECTION] ImGuiWindowTempData, ImGuiWindow
37 // [SECTION] Tab bar, Tab item support
38 // [SECTION] Table support
39 // [SECTION] ImGui internal API
40 // [SECTION] ImFontLoader
41 // [SECTION] ImFontAtlas internal API
42 // [SECTION] Test Engine specific hooks (imgui_test_engine)
43 
44 */
45 
46 #pragma once
47 #ifndef IMGUI_DISABLE
48 
49 //-----------------------------------------------------------------------------
50 // [SECTION] Header mess
51 //-----------------------------------------------------------------------------
52 
53 #ifndef IMGUI_VERSION
54 #include "imgui.h"
55 #endif
56 
57 #include <stdio.h> // FILE*, sscanf
58 #include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof
59 #include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf
60 #include <limits.h> // INT_MIN, INT_MAX
61 
62 // Enable SSE intrinsics if available
63 #if (defined __SSE__ || defined __x86_64__ || defined _M_X64 || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1))) && !defined(IMGUI_DISABLE_SSE) && !defined(_M_ARM64) && !defined(_M_ARM64EC)
64 #define IMGUI_ENABLE_SSE
65 #include <immintrin.h>
66 #if (defined __AVX__ || defined __SSE4_2__)
67 #define IMGUI_ENABLE_SSE4_2
68 #include <nmmintrin.h>
69 #endif
70 #endif
71 // Emscripten has partial SSE 4.2 support where _mm_crc32_u32 is not available. See https://emscripten.org/docs/porting/simd.html#id11 and #8213
72 #if defined(IMGUI_ENABLE_SSE4_2) && !defined(IMGUI_USE_LEGACY_CRC32_ADLER) && !defined(__EMSCRIPTEN__)
73 #define IMGUI_ENABLE_SSE4_2_CRC
74 #endif
75 
76 // Visual Studio warnings
77 #ifdef _MSC_VER
78 #pragma warning (push)
79 #pragma warning (disable: 4251) // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport)
80 #pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6).
81 #pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3).
82 #if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later
83 #pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types
84 #endif
85 #endif
86 
87 // Clang/GCC warnings with -Weverything
88 #if defined(__clang__)
89 #pragma clang diagnostic push
90 #if __has_warning("-Wunknown-warning-option")
91 #pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx'
92 #endif
93 #pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'
94 #pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloor()
95 #pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast
96 #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant
97 #pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
98 #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
99 #pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn'
100 #pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
101 #pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access
102 #pragma clang diagnostic ignored "-Wnontrivial-memaccess" // warning: first argument in call to 'memset' is a pointer to non-trivially copyable type
103 #elif defined(__GNUC__)
104 #pragma GCC diagnostic push
105 #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
106 #pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating-point with '==' or '!=' is unsafe
107 #pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
108 #pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated
109 #pragma GCC diagnostic ignored "-Wsign-conversion" // warning: conversion to 'xxxx' from 'xxxx' may change the sign of the result
110 #endif
111 
112 // In 1.89.4, we moved the implementation of "courtesy maths operators" from imgui_internal.h in imgui.h
113 // As they are frequently requested, we do not want to encourage to many people using imgui_internal.h
114 #if defined(IMGUI_DEFINE_MATH_OPERATORS) && !defined(IMGUI_DEFINE_MATH_OPERATORS_IMPLEMENTED)
115 #error Please '#define IMGUI_DEFINE_MATH_OPERATORS' _BEFORE_ including imgui.h!
116 #endif
117 
118 // Legacy defines
119 #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74
120 #error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
121 #endif
122 #ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74
123 #error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
124 #endif
125 
126 // Enable stb_truetype by default unless FreeType is enabled.
127 // You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together.
128 #ifndef IMGUI_ENABLE_FREETYPE
129 #define IMGUI_ENABLE_STB_TRUETYPE
130 #endif
131 
132 //-----------------------------------------------------------------------------
133 // [SECTION] Forward declarations
134 //-----------------------------------------------------------------------------
135 
136 // Utilities
137 // (other types which are not forwarded declared are: ImBitArray<>, ImSpan<>, ImSpanAllocator<>, ImStableVector<>, ImPool<>, ImChunkStream<>)
138 struct ImBitVector; // Store 1-bit per value
139 struct ImRect; // An axis-aligned rectangle (2 points)
140 struct ImGuiTextIndex; // Maintain a line index for a text buffer.
141 
142 // ImDrawList/ImFontAtlas
143 struct ImDrawDataBuilder; // Helper to build a ImDrawData instance
144 struct ImDrawListSharedData; // Data shared between all ImDrawList instances
145 struct ImFontAtlasBuilder; // Internal storage for incrementally packing and building a ImFontAtlas
146 struct ImFontAtlasPostProcessData; // Data available to potential texture post-processing functions
147 struct ImFontAtlasRectEntry; // Packed rectangle lookup entry
148 
149 // ImGui
150 struct ImGuiBoxSelectState; // Box-selection state (currently used by multi-selection, could potentially be used by others)
151 struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it
152 struct ImGuiContext; // Main Dear ImGui context
153 struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine
154 struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum
155 struct ImGuiDeactivatedItemData; // Data for IsItemDeactivated()/IsItemDeactivatedAfterEdit() function.
156 struct ImGuiDockContext; // Docking system context
157 struct ImGuiDockRequest; // Docking system dock/undock queued request
158 struct ImGuiDockNode; // Docking system node (hold a list of Windows OR two child dock nodes)
159 struct ImGuiDockNodeSettings; // Storage for a dock node in .ini file (we preserve those even if the associated dock node isn't active during the session)
160 struct ImGuiErrorRecoveryState; // Storage of stack sizes for error handling and recovery
161 struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()
162 struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box
163 struct ImGuiInputTextDeactivateData;// Short term storage to backup text of a deactivating InputText() while another is stealing active id
164 struct ImGuiLastItemData; // Status storage for last submitted items
165 struct ImGuiLocEntry; // A localization entry.
166 struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only
167 struct ImGuiMultiSelectState; // Multi-selection persistent state (for focused selection).
168 struct ImGuiMultiSelectTempData; // Multi-selection temporary state (while traversing).
169 struct ImGuiNavItemData; // Result of a keyboard/gamepad directional navigation move query result
170 struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions
171 struct ImGuiNextWindowData; // Storage for SetNextWindow** functions
172 struct ImGuiNextItemData; // Storage for SetNextItem** functions
173 struct ImGuiOldColumnData; // Storage data for a single column for legacy Columns() api
174 struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api
175 struct ImGuiPopupData; // Storage for current popup stack
176 struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file
177 struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it
178 struct ImGuiStyleVarInfo; // Style variable information (e.g. to access style variables from an enum)
179 struct ImGuiTabBar; // Storage for a tab bar
180 struct ImGuiTabItem; // Storage for a tab item (within a tab bar)
181 struct ImGuiTable; // Storage for a table
182 struct ImGuiTableHeaderData; // Storage for TableAngledHeadersRow()
183 struct ImGuiTableColumn; // Storage for one column of a table
184 struct ImGuiTableInstanceData; // Storage for one instance of a same table
185 struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables.
186 struct ImGuiTableSettings; // Storage for a table .ini settings
187 struct ImGuiTableColumnsSettings; // Storage for a column .ini settings
188 struct ImGuiTreeNodeStackData; // Temporary storage for TreeNode().
189 struct ImGuiTypingSelectState; // Storage for GetTypingSelectRequest()
190 struct ImGuiTypingSelectRequest; // Storage for GetTypingSelectRequest() (aimed to be public)
191 struct ImGuiWindow; // Storage for one window
192 struct ImGuiWindowDockStyle; // Storage for window-style data which needs to be stored for docking purpose
193 struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window)
194 struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session)
195 
196 // Enumerations
197 // Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.
198 enum ImGuiLocKey : int; // -> enum ImGuiLocKey // Enum: a localization entry for translation.
199 typedef int ImGuiDataAuthority; // -> enum ImGuiDataAuthority_ // Enum: for storing the source authority (dock node vs window) of a field
200 typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical
201 
202 // Flags
203 typedef int ImDrawTextFlags; // -> enum ImDrawTextFlags_ // Flags: for ImTextCalcWordWrapPositionEx()
204 typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later)
205 typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags
206 typedef int ImGuiFocusRequestFlags; // -> enum ImGuiFocusRequestFlags_ // Flags: for FocusWindow()
207 typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for g.LastItemData.StatusFlags
208 typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns()
209 typedef int ImGuiLogFlags; // -> enum ImGuiLogFlags_ // Flags: for LogBegin() text capturing function
210 typedef int ImGuiNavRenderCursorFlags; // -> enum ImGuiNavRenderCursorFlags_//Flags: for RenderNavCursor()
211 typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests
212 typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions
213 typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions
214 typedef int ImGuiScrollFlags; // -> enum ImGuiScrollFlags_ // Flags: for ScrollToItem() and navigation requests
215 typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx()
216 typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx()
217 typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx()
218 typedef int ImGuiTypingSelectFlags; // -> enum ImGuiTypingSelectFlags_ // Flags: for GetTypingSelectRequest()
219 typedef int ImGuiWindowBgClickFlags; // -> enum ImGuiWindowBgClickFlags_ // Flags: for overriding behavior of clicking on window background/void.
220 typedef int ImGuiWindowRefreshFlags; // -> enum ImGuiWindowRefreshFlags_ // Flags: for SetNextWindowRefreshPolicy()
221 
222 // Table column indexing
223 typedef ImS16 ImGuiTableColumnIdx;
224 typedef ImU16 ImGuiTableDrawChannelIdx;
225 
226 //-----------------------------------------------------------------------------
227 // [SECTION] Context pointer
228 // See implementation of this variable in imgui.cpp for comments and details.
229 //-----------------------------------------------------------------------------
230 
231 #ifndef GImGui
232 extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
233 #endif
234 
235 //-----------------------------------------------------------------------------
236 // [SECTION] Macros
237 //-----------------------------------------------------------------------------
238 
239 // Internal Drag and Drop payload types. String starting with '_' are reserved for Dear ImGui.
240 #define IMGUI_PAYLOAD_TYPE_WINDOW "_IMWINDOW" // Payload == ImGuiWindow*
241 
242 // Debug Printing Into TTY
243 // (since IMGUI_VERSION_NUM >= 18729: IMGUI_DEBUG_LOG was reworked into IMGUI_DEBUG_PRINTF (and removed framecount from it). If you were using a #define IMGUI_DEBUG_LOG please rename)
244 #ifndef IMGUI_DEBUG_PRINTF
245 #ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
246 #define IMGUI_DEBUG_PRINTF(_FMT,...) printf(_FMT, __VA_ARGS__)
247 #else
248 #define IMGUI_DEBUG_PRINTF(_FMT,...) ((void)0)
249 #endif
250 #endif
251 
252 // Debug Logging for ShowDebugLogWindow(). This is designed for relatively rare events so please don't spam.
253 #define IMGUI_DEBUG_LOG_ERROR(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventError) IMGUI_DEBUG_LOG(__VA_ARGS__); else g.DebugLogSkippedErrors++; } while (0)
254 #define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
255 #define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
256 #define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
257 #define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
258 #define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
259 #define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
260 #define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
261 #define IMGUI_DEBUG_LOG_FONT(...) do { ImGuiContext* g2 = GImGui; if (g2 && g2->DebugLogFlags & ImGuiDebugLogFlags_EventFont) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) // Called from ImFontAtlas function which may operate without a context.
262 #define IMGUI_DEBUG_LOG_INPUTROUTING(...) do{if (g.DebugLogFlags & ImGuiDebugLogFlags_EventInputRouting)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
263 #define IMGUI_DEBUG_LOG_DOCKING(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventDocking) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
264 #define IMGUI_DEBUG_LOG_VIEWPORT(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventViewport) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
265 
266 // Static Asserts
267 #define IM_STATIC_ASSERT(_COND) static_assert(_COND, "")
268 
269 // "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much.
270 // We currently don't have many of those so the effect is currently negligible, but onward intent to add more aggressive ones in the code.
271 //#define IMGUI_DEBUG_PARANOID
272 #ifdef IMGUI_DEBUG_PARANOID
273 #define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR)
274 #else
275 #define IM_ASSERT_PARANOID(_EXPR)
276 #endif
277 
278 // Misc Macros
279 #define IM_PI 3.14159265358979323846f
280 #ifdef _WIN32
281 #define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!)
282 #else
283 #define IM_NEWLINE "\n"
284 #endif
285 #ifndef IM_TABSIZE // Until we move this to runtime and/or add proper tab support, at least allow users to compile-time override
286 #define IM_TABSIZE (4)
287 #endif
288 #define IM_MEMALIGN(_OFF,_ALIGN) (((_OFF) + ((_ALIGN) - 1)) & ~((_ALIGN) - 1)) // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8
289 #define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose
290 #define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255
291 #define IM_TRUNC(_VAL) ((float)(int)(_VAL)) // Positive values only! ImTrunc() is not inlined in MSVC debug builds
292 #define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) // Positive values only!
293 //#define IM_FLOOR IM_TRUNC // [OBSOLETE] Renamed in 1.90.0 (Sept 2023)
294 
295 // Hint for branch prediction
296 #if (defined(__cplusplus) && (__cplusplus >= 202002L)) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 202002L))
297 #define IM_LIKELY [[likely]]
298 #define IM_UNLIKELY [[unlikely]]
299 #else
300 #define IM_LIKELY
301 #define IM_UNLIKELY
302 #endif
303 
304 // Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
305 #ifdef _MSC_VER
306 #define IMGUI_CDECL __cdecl
307 #else
308 #define IMGUI_CDECL
309 #endif
310 
311 // Warnings
312 #if defined(_MSC_VER) && !defined(__clang__)
313 #define IM_MSVC_WARNING_SUPPRESS(XXXX) __pragma(warning(suppress: XXXX))
314 #else
315 #define IM_MSVC_WARNING_SUPPRESS(XXXX)
316 #endif
317 
318 // Debug Tools
319 // Use 'Metrics/Debugger->Tools->Item Picker' to break into the call-stack of a specific item.
320 // This will call IM_DEBUG_BREAK() which you may redefine yourself. See https://github.com/scottt/debugbreak for more reference.
321 #ifndef IM_DEBUG_BREAK
322 #if defined (_MSC_VER)
323 #define IM_DEBUG_BREAK() __debugbreak()
324 #elif defined(__clang__)
325 #define IM_DEBUG_BREAK() __builtin_debugtrap()
326 #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
327 #define IM_DEBUG_BREAK() __asm__ volatile("int3;nop")
328 #elif defined(__GNUC__) && defined(__thumb__)
329 #define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xde01")
330 #elif defined(__GNUC__) && defined(__arm__) && !defined(__thumb__)
331 #define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0")
332 #else
333 #define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger!
334 #endif
335 #endif // #ifndef IM_DEBUG_BREAK
336 
337 // Format specifiers, printing 64-bit hasn't been decently standardized...
338 // In a real application you should be using PRId64 and PRIu64 from <inttypes.h> (non-windows) and on Windows define them yourself.
339 #if defined(_MSC_VER) && !defined(__clang__)
340 #define IM_PRId64 "I64d"
341 #define IM_PRIu64 "I64u"
342 #define IM_PRIX64 "I64X"
343 #else
344 #define IM_PRId64 "lld"
345 #define IM_PRIu64 "llu"
346 #define IM_PRIX64 "llX"
347 #endif
348 
349 //-----------------------------------------------------------------------------
350 // [SECTION] Generic helpers
351 // Note that the ImXXX helpers functions are lower-level than ImGui functions.
352 // ImGui functions or the ImGui context are never called/used from other ImXXX functions.
353 //-----------------------------------------------------------------------------
354 // - Helpers: Hashing
355 // - Helpers: Sorting
356 // - Helpers: Bit manipulation
357 // - Helpers: String
358 // - Helpers: Formatting
359 // - Helpers: UTF-8 <> wchar conversions
360 // - Helpers: ImVec2/ImVec4 operators
361 // - Helpers: Maths
362 // - Helpers: Geometry
363 // - Helper: ImVec1
364 // - Helper: ImVec2ih
365 // - Helper: ImRect
366 // - Helper: ImBitArray
367 // - Helper: ImBitVector
368 // - Helper: ImSpan<>, ImSpanAllocator<>
369 // - Helper: ImStableVector<>
370 // - Helper: ImPool<>
371 // - Helper: ImChunkStream<>
372 // - Helper: ImGuiTextIndex
373 // - Helper: ImGuiStorage
374 //-----------------------------------------------------------------------------
375 
376 // Helpers: Hashing
377 IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImGuiID seed = 0);
378 IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImGuiID seed = 0);
379 IMGUI_API const char* ImHashSkipUncontributingPrefix(const char* label);
380 
381 // Helpers: Sorting
382 #ifndef ImQsort
383 inline void ImQsort(void* base, size_t count, size_t size_of_element, int(IMGUI_CDECL *compare_func)(void const*, void const*)) { if (count > 1) qsort(base, count, size_of_element, compare_func); }
384 #endif
385 
386 // Helpers: Color Blending
387 IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b);
388 
389 // Helpers: Bit manipulation
390 inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
391 inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; }
392 inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
393 inline unsigned int ImCountSetBits(unsigned int v) { unsigned int count = 0; while (v > 0) { v = v & (v - 1); count++; } return count; }
394 
395 // Helpers: String
396 #define ImStrlen strlen
397 #define ImMemchr memchr
398 IMGUI_API int ImStricmp(const char* str1, const char* str2); // Case insensitive compare.
399 IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); // Case insensitive compare to a certain count.
400 IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); // Copy to a certain count and always zero terminate (strncpy doesn't).
401 IMGUI_API char* ImStrdup(const char* str); // Duplicate a string.
402 IMGUI_API void* ImMemdup(const void* src, size_t size); // Duplicate a chunk of memory.
403 IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); // Copy in provided buffer, recreate buffer if needed.
404 IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); // Find first occurrence of 'c' in string range.
405 IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line
406 IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); // Find a substring in a string range.
407 IMGUI_API void ImStrTrimBlanks(char* str); // Remove leading and trailing blanks from a buffer.
408 IMGUI_API const char* ImStrSkipBlank(const char* str); // Find first non-blank character.
409 IMGUI_API int ImStrlenW(const ImWchar* str); // Computer string length (ImWchar string)
410 IMGUI_API const char* ImStrbol(const char* buf_mid_line, const char* buf_begin); // Find beginning-of-line
411 IM_MSVC_RUNTIME_CHECKS_OFF
412 inline char ImToUpper(char c) { return (c >= 'a' && c <= 'z') ? c &= ~32 : c; }
413 inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; }
414 inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; }
415 inline bool ImCharIsXdigitA(char c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); }
416 IM_MSVC_RUNTIME_CHECKS_RESTORE
417 
418 // Helpers: Formatting
419 IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3);
420 IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);
421 IMGUI_API void ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...) IM_FMTARGS(3);
422 IMGUI_API void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, const char* fmt, va_list args) IM_FMTLIST(3);
423 IMGUI_API const char* ImParseFormatFindStart(const char* format);
424 IMGUI_API const char* ImParseFormatFindEnd(const char* format);
425 IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size);
426 IMGUI_API void ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t fmt_out_size);
427 IMGUI_API const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size);
428 IMGUI_API int ImParseFormatPrecision(const char* format, int default_value);
429 
430 // Helpers: UTF-8 <> wchar conversions
431 IMGUI_API int ImTextCharToUtf8(char out_buf[5], unsigned int c); // return output UTF-8 bytes count
432 IMGUI_API int ImTextStrToUtf8(char* out_buf, int out_buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count
433 IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // read one character. return input UTF-8 bytes count
434 IMGUI_API int ImTextStrFromUtf8(ImWchar* out_buf, int out_buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count
435 IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count)
436 IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8
437 IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8
438 IMGUI_API const char* ImTextFindPreviousUtf8Codepoint(const char* in_text_start, const char* in_p); // return previous UTF-8 code-point.
439 IMGUI_API const char* ImTextFindValidUtf8CodepointEnd(const char* in_text_start, const char* in_text_end, const char* in_p); // return previous UTF-8 code-point if 'in_p' is not the end of a valid one.
440 IMGUI_API int ImTextCountLines(const char* in_text, const char* in_text_end); // return number of lines taken by text. trailing carriage return doesn't count as an extra line.
441 
442 // Helpers: High-level text functions (DO NOT USE!!! THIS IS A MINIMAL SUBSET OF LARGER UPCOMING CHANGES)
443 enum ImDrawTextFlags_
444 {
445  ImDrawTextFlags_None = 0,
446  ImDrawTextFlags_CpuFineClip = 1 << 0, // Must be == 1/true for legacy with 'bool cpu_fine_clip' arg to RenderText()
447  ImDrawTextFlags_WrapKeepBlanks = 1 << 1,
448  ImDrawTextFlags_StopOnNewLine = 1 << 2,
449 };
450 IMGUI_API ImVec2 ImFontCalcTextSizeEx(ImFont* font, float size, float max_width, float wrap_width, const char* text_begin, const char* text_end_display, const char* text_end, const char** out_remaining, ImVec2* out_offset, ImDrawTextFlags flags);
451 IMGUI_API const char* ImFontCalcWordWrapPositionEx(ImFont* font, float size, const char* text, const char* text_end, float wrap_width, ImDrawTextFlags flags = 0);
452 IMGUI_API const char* ImTextCalcWordWrapNextLineStart(const char* text, const char* text_end, ImDrawTextFlags flags = 0); // trim trailing space and find beginning of next line
453 
454 // Character classification for word-wrapping logic
455 enum ImWcharClass
456 {
457  ImWcharClass_Blank, ImWcharClass_Punct, ImWcharClass_Other
458 };
459 IMGUI_API void ImTextInitClassifiers();
460 IMGUI_API void ImTextClassifierClear(ImU32* bits, unsigned int codepoint_min, unsigned int codepoint_end, ImWcharClass char_class);
461 IMGUI_API void ImTextClassifierSetCharClass(ImU32* bits, unsigned int codepoint_min, unsigned int codepoint_end, ImWcharClass char_class, unsigned int c);
462 IMGUI_API void ImTextClassifierSetCharClassFromStr(ImU32* bits, unsigned int codepoint_min, unsigned int codepoint_end, ImWcharClass char_class, const char* s);
463 
464 // Helpers: File System
465 #ifdef IMGUI_DISABLE_FILE_FUNCTIONS
466 #define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
467 typedef void* ImFileHandle;
468 inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; }
469 inline bool ImFileClose(ImFileHandle) { return false; }
470 inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; }
471 inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; }
472 inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; }
473 #endif
474 #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
475 typedef FILE* ImFileHandle;
476 IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode);
477 IMGUI_API bool ImFileClose(ImFileHandle file);
478 IMGUI_API ImU64 ImFileGetSize(ImFileHandle file);
479 IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file);
480 IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file);
481 #else
482 #define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions
483 #endif
484 IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0);
485 
486 // Helpers: Maths
487 IM_MSVC_RUNTIME_CHECKS_OFF
488 // - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy)
489 #ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
490 #define ImFabs(X) fabsf(X)
491 #define ImSqrt(X) sqrtf(X)
492 #define ImFmod(X, Y) fmodf((X), (Y))
493 #define ImCos(X) cosf(X)
494 #define ImSin(X) sinf(X)
495 #define ImAcos(X) acosf(X)
496 #define ImAtan2(Y, X) atan2f((Y), (X))
497 #define ImAtof(STR) atof(STR)
498 #define ImCeil(X) ceilf(X)
499 inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision
500 inline double ImPow(double x, double y) { return pow(x, y); }
501 inline float ImLog(float x) { return logf(x); } // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision
502 inline double ImLog(double x) { return log(x); }
503 inline int ImAbs(int x) { return x < 0 ? -x : x; }
504 inline float ImAbs(float x) { return fabsf(x); }
505 inline double ImAbs(double x) { return fabs(x); }
506 inline float ImSign(float x) { return (x < 0.0f) ? -1.0f : (x > 0.0f) ? 1.0f : 0.0f; } // Sign operator - returns -1, 0 or 1 based on sign of argument
507 inline double ImSign(double x) { return (x < 0.0) ? -1.0 : (x > 0.0) ? 1.0 : 0.0; }
508 #ifdef IMGUI_ENABLE_SSE
509 inline float ImRsqrt(float x) { return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(x))); }
510 #else
511 inline float ImRsqrt(float x) { return 1.0f / sqrtf(x); }
512 #endif
513 inline double ImRsqrt(double x) { return 1.0 / sqrt(x); }
514 #endif
515 // - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double
516 // (Exceptionally using templates here but we could also redefine them for those types)
517 template<typename T> T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; }
518 template<typename T> T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; }
519 template<typename T> T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; }
520 template<typename T> T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); }
521 template<typename T> void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; }
522 template<typename T> T ImAddClampOverflow(T a, T b, T mn, T mx) { if (b < 0 && (a < mn - b)) return mn; if (b > 0 && (a > mx - b)) return mx; return a + b; }
523 template<typename T> T ImSubClampOverflow(T a, T b, T mn, T mx) { if (b > 0 && (a < mn + b)) return mn; if (b < 0 && (a > mx + b)) return mx; return a - b; }
524 // - Misc maths helpers
525 inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); }
526 inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); }
527 inline ImVec2 ImClamp(const ImVec2& v, const ImVec2&mn, const ImVec2&mx){ return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); }
528 inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); }
529 inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); }
530 inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t) { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); }
531 inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }
532 inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); }
533 inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); }
534 inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return ImRsqrt(d); return fail_value; }
535 inline float ImTrunc(float f) { return (float)(int)(f); }
536 inline ImVec2 ImTrunc(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); }
537 inline float ImFloor(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf()
538 inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2(ImFloor(v.x), ImFloor(v.y)); }
539 inline float ImTrunc64(float f) { return (float)(ImS64)(f); }
540 inline float ImRound64(float f) { return (float)(ImS64)(f + 0.5f); } // FIXME: Positive values only.
541 inline int ImModPositive(int a, int b) { return (a + b) % b; }
542 inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; }
543 inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); }
544 inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; }
545 inline float ImLinearRemapClamp(float s0, float s1, float d0, float d1, float x) { return ImSaturate((x - s0) / (s1 - s0)) * (d1 - d0) + d0; }
546 inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
547 inline bool ImIsFloatAboveGuaranteedIntegerPrecision(float f) { return f <= -16777216 || f >= 16777216; }
548 inline float ImExponentialMovingAverage(float avg, float sample, int n){ avg -= avg / n; avg += sample / n; return avg; }
549 IM_MSVC_RUNTIME_CHECKS_RESTORE
550 
551 // Helpers: Geometry
552 IMGUI_API ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t);
553 IMGUI_API ImVec2 ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments); // For curves with explicit number of segments
554 IMGUI_API ImVec2 ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol);// For auto-tessellated curves you can use tess_tol = style.CurveTessellationTol
555 IMGUI_API ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t);
556 IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);
557 IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
558 IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
559 IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
560 inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; }
561 inline bool ImTriangleIsClockwise(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ((b.x - a.x) * (c.y - b.y)) - ((c.x - b.x) * (b.y - a.y)) > 0.0f; }
562 
563 // Helper: ImVec1 (1D vector)
564 // (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
565 IM_MSVC_RUNTIME_CHECKS_OFF
566 struct ImVec1
567 {
568  float x;
569  constexpr ImVec1() : x(0.0f) { }
570  constexpr ImVec1(float _x) : x(_x) { }
571 };
572 
573 // Helper: ImVec2i (2D vector, integer)
574 struct ImVec2i
575 {
576  int x, y;
577  constexpr ImVec2i() : x(0), y(0) {}
578  constexpr ImVec2i(int _x, int _y) : x(_x), y(_y) {}
579 };
580 
581 // Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage)
582 struct ImVec2ih
583 {
584  short x, y;
585  constexpr ImVec2ih() : x(0), y(0) {}
586  constexpr ImVec2ih(short _x, short _y) : x(_x), y(_y) {}
587  constexpr explicit ImVec2ih(const ImVec2& rhs) : x((short)rhs.x), y((short)rhs.y) {}
588 };
589 
590 // Helper: ImRect (2D axis aligned bounding-box)
591 // NB: we can't rely on ImVec2 math operators being available here!
592 struct IMGUI_API ImRect
593 {
594  ImVec2 Min; // Upper-left
595  ImVec2 Max; // Lower-right
596 
597  constexpr ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {}
598  constexpr ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}
599  constexpr ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}
600  constexpr ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}
601 
602  ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }
603  ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
604  float GetWidth() const { return Max.x - Min.x; }
605  float GetHeight() const { return Max.y - Min.y; }
606  float GetArea() const { return (Max.x - Min.x) * (Max.y - Min.y); }
607  ImVec2 GetTL() const { return Min; } // Top-left
608  ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right
609  ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left
610  ImVec2 GetBR() const { return Max; } // Bottom-right
611  bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }
612  bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; }
613  bool ContainsWithPad(const ImVec2& p, const ImVec2& pad) const { return p.x >= Min.x - pad.x && p.y >= Min.y - pad.y && p.x < Max.x + pad.x && p.y < Max.y + pad.y; }
614  bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; }
615  void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; }
616  void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; }
617  void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
618  void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
619  void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
620  void TranslateX(float dx) { Min.x += dx; Max.x += dx; }
621  void TranslateY(float dy) { Min.y += dy; Max.y += dy; }
622  void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display.
623  void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped.
624  bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }
625  ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); }
626  const ImVec4& AsVec4() const { return *(const ImVec4*)&Min.x; }
627 };
628 
629 // Helper: ImBitArray
630 #define IM_BITARRAY_TESTBIT(_ARRAY, _N) ((_ARRAY[(_N) >> 5] & ((ImU32)1 << ((_N) & 31))) != 0) // Macro version of ImBitArrayTestBit(): ensure args have side-effect or are costly!
631 #define IM_BITARRAY_CLEARBIT(_ARRAY, _N) ((_ARRAY[(_N) >> 5] &= ~((ImU32)1 << ((_N) & 31)))) // Macro version of ImBitArrayClearBit(): ensure args have side-effect or are costly!
632 inline size_t ImBitArrayGetStorageSizeInBytes(int bitcount) { return (size_t)((bitcount + 31) >> 5) << 2; }
633 inline void ImBitArrayClearAllBits(ImU32* arr, int bitcount){ memset(arr, 0, ImBitArrayGetStorageSizeInBytes(bitcount)); }
634 inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; }
635 inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; }
636 inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; }
637 inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2)
638 {
639  n2--;
640  while (n <= n2)
641  {
642  int a_mod = (n & 31);
643  int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1;
644  ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1);
645  arr[n >> 5] |= mask;
646  n = (n + 32) & ~31;
647  }
648 }
649 
650 typedef ImU32* ImBitArrayPtr; // Name for use in structs
651 
652 // Helper: ImBitArray class (wrapper over ImBitArray functions)
653 // Store 1-bit per value.
654 template<int BITCOUNT, int OFFSET = 0>
656 {
657  ImU32 Data[(BITCOUNT + 31) >> 5];
658  ImBitArray() { ClearAllBits(); }
659  void ClearAllBits() { memset(Data, 0, sizeof(Data)); }
660  void SetAllBits() { memset(Data, 255, sizeof(Data)); }
661  bool TestBit(int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Data, n); }
662  void SetBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArraySetBit(Data, n); }
663  void ClearBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArrayClearBit(Data, n); }
664  void SetBitRange(int n, int n2) { n += OFFSET; n2 += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT && n2 > n && n2 <= BITCOUNT); ImBitArraySetBitRange(Data, n, n2); } // Works on range [n..n2)
665  bool operator[](int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Data, n); }
666 };
667 
668 // Helper: ImBitVector
669 // Store 1-bit per value.
670 struct IMGUI_API ImBitVector
671 {
672  ImVector<ImU32> Storage;
673  void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); }
674  void Clear() { Storage.clear(); }
675  bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return IM_BITARRAY_TESTBIT(Storage.Data, n); }
676  void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); }
677  void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); }
678 };
679 IM_MSVC_RUNTIME_CHECKS_RESTORE
680 
681 // Helper: ImSpan<>
682 // Pointing to a span of data we don't own.
683 template<typename T>
684 struct ImSpan
685 {
686  T* Data;
687  T* DataEnd;
688 
689  // Constructors, destructor
690  inline ImSpan() { Data = DataEnd = NULL; }
691  inline ImSpan(T* data, int size) { Data = data; DataEnd = data + size; }
692  inline ImSpan(T* data, T* data_end) { Data = data; DataEnd = data_end; }
693 
694  inline void set(T* data, int size) { Data = data; DataEnd = data + size; }
695  inline void set(T* data, T* data_end) { Data = data; DataEnd = data_end; }
696  inline int size() const { return (int)(ptrdiff_t)(DataEnd - Data); }
697  inline int size_in_bytes() const { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); }
698  inline T& operator[](int i) { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
699  inline const T& operator[](int i) const { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
700 
701  inline T* begin() { return Data; }
702  inline const T* begin() const { return Data; }
703  inline T* end() { return DataEnd; }
704  inline const T* end() const { return DataEnd; }
705 
706  // Utilities
707  inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; }
708 };
709 
710 // Helper: ImSpanAllocator<>
711 // Facilitate storing multiple chunks into a single large block (the "arena")
712 // - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges.
713 template<int CHUNKS>
715 {
716  char* BasePtr;
717  int CurrOff;
718  int CurrIdx;
719  int Offsets[CHUNKS];
720  int Sizes[CHUNKS];
721 
722  ImSpanAllocator() { memset((void*)this, 0, sizeof(*this)); }
723  inline void Reserve(int n, size_t sz, int a=4) { IM_ASSERT(n == CurrIdx && n < CHUNKS); CurrOff = IM_MEMALIGN(CurrOff, a); Offsets[n] = CurrOff; Sizes[n] = (int)sz; CurrIdx++; CurrOff += (int)sz; }
724  inline int GetArenaSizeInBytes() { return CurrOff; }
725  inline void SetArenaBasePtr(void* base_ptr) { BasePtr = (char*)base_ptr; }
726  inline void* GetSpanPtrBegin(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); }
727  inline void* GetSpanPtrEnd(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); }
728  template<typename T>
729  inline void GetSpan(int n, ImSpan<T>* span) { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); }
730 };
731 
732 // Helper: ImStableVector<>
733 // Allocating chunks of BLOCKSIZE items. Objects pointers are never invalidated when growing, only by clear().
734 // Important: does not destruct anything!
735 // Implemented only the minimum set of functions we need for it.
736 template<typename T, int BLOCKSIZE>
738 {
739  int Size = 0;
740  int Capacity = 0;
741  ImVector<T*> Blocks;
742 
743  // Functions
744  inline ~ImStableVector() { for (T* block : Blocks) IM_FREE(block); }
745 
746  inline void clear() { Size = Capacity = 0; Blocks.clear_delete(); }
747  inline void resize(int new_size) { if (new_size > Capacity) reserve(new_size); Size = new_size; }
748  inline void reserve(int new_cap)
749  {
750  new_cap = IM_MEMALIGN(new_cap, BLOCKSIZE);
751  int old_count = Capacity / BLOCKSIZE;
752  int new_count = new_cap / BLOCKSIZE;
753  if (new_count <= old_count)
754  return;
755  Blocks.resize(new_count);
756  for (int n = old_count; n < new_count; n++)
757  Blocks[n] = (T*)IM_ALLOC(sizeof(T) * BLOCKSIZE);
758  Capacity = new_cap;
759  }
760  inline T& operator[](int i) { IM_ASSERT(i >= 0 && i < Size); return Blocks[i / BLOCKSIZE][i % BLOCKSIZE]; }
761  inline const T& operator[](int i) const { IM_ASSERT(i >= 0 && i < Size); return Blocks[i / BLOCKSIZE][i % BLOCKSIZE]; }
762  inline T* push_back(const T& v) { int i = Size; IM_ASSERT(i >= 0); if (Size == Capacity) reserve(Capacity + BLOCKSIZE); void* ptr = &Blocks[i / BLOCKSIZE][i % BLOCKSIZE]; memcpy(ptr, &v, sizeof(v)); Size++; return (T*)ptr; }
763 };
764 
765 // Helper: ImPool<>
766 // Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer,
767 // Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object.
768 typedef int ImPoolIdx;
769 template<typename T>
770 struct ImPool
771 {
772  ImVector<T> Buf; // Contiguous data
773  ImGuiStorage Map; // ID->Index
774  ImPoolIdx FreeIdx; // Next free idx to use
775  ImPoolIdx AliveCount; // Number of active/alive items (for display purpose)
776 
777  ImPool() { FreeIdx = AliveCount = 0; }
778  ~ImPool() { Clear(); }
779  T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; }
780  T* GetByIndex(ImPoolIdx n) { return &Buf[n]; }
781  ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); }
782  T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); }
783  bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); }
784  void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Buf[idx].~T(); } Map.Clear(); Buf.clear(); FreeIdx = AliveCount = 0; }
785  T* Add() { int idx = FreeIdx; if (idx == Buf.Size) { Buf.resize(Buf.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Buf[idx]; } IM_PLACEMENT_NEW(&Buf[idx]) T(); AliveCount++; return &Buf[idx]; }
786  void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); }
787  void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); AliveCount--; }
788  void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); }
789 
790  // To iterate a ImPool: for (int n = 0; n < pool.GetMapSize(); n++) if (T* t = pool.TryGetMapData(n)) { ... }
791  // Can be avoided if you know .Remove() has never been called on the pool, or AliveCount == GetMapSize()
792  int GetAliveCount() const { return AliveCount; } // Number of active/alive items in the pool (for display purpose)
793  int GetBufSize() const { return Buf.Size; }
794  int GetMapSize() const { return Map.Data.Size; } // It is the map we need iterate to find valid items, since we don't have "alive" storage anywhere
795  T* TryGetMapData(ImPoolIdx n) { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); }
796 };
797 
798 // Helper: ImChunkStream<>
799 // Build and iterate a contiguous stream of variable-sized structures.
800 // This is used by Settings to store persistent data while reducing allocation count.
801 // We store the chunk size first, and align the final size on 4 bytes boundaries.
802 // The tedious/zealous amount of casting is to avoid -Wcast-align warnings.
803 template<typename T>
805 {
806  ImVector<char> Buf;
807 
808  void clear() { Buf.clear(); }
809  bool empty() const { return Buf.Size == 0; }
810  int size() const { return Buf.Size; }
811  T* alloc_chunk(size_t sz) { size_t HDR_SZ = 4; sz = IM_MEMALIGN(HDR_SZ + sz, 4u); int off = Buf.Size; Buf.resize(off + (int)sz); ((int*)(void*)(Buf.Data + off))[0] = (int)sz; return (T*)(void*)(Buf.Data + off + (int)HDR_SZ); }
812  T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); }
813  T* next_chunk(T* p) { size_t HDR_SZ = 4; IM_ASSERT(p >= begin() && p < end()); p = (T*)(void*)((char*)(void*)p + chunk_size(p)); if (p == (T*)(void*)((char*)end() + HDR_SZ)) return (T*)0; IM_ASSERT(p < end()); return p; }
814  int chunk_size(const T* p) { return ((const int*)p)[-1]; }
815  T* end() { return (T*)(void*)(Buf.Data + Buf.Size); }
816  int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; }
817  T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); }
818  void swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); }
819 };
820 
821 // Helper: ImGuiTextIndex
822 // Maintain a line index for a text buffer. This is a strong candidate to be moved into the public API.
824 {
825  ImVector<int> Offsets;
826  int EndOffset = 0; // Because we don't own text buffer we need to maintain EndOffset (may bake in LineOffsets?)
827 
828  void clear() { Offsets.clear(); EndOffset = 0; }
829  int size() { return Offsets.Size; }
830  const char* get_line_begin(const char* base, int n) { return base + (Offsets.Size != 0 ? Offsets[n] : 0); }
831  const char* get_line_end(const char* base, int n) { return base + (n + 1 < Offsets.Size ? (Offsets[n + 1] - 1) : EndOffset); }
832  void append(const char* base, int old_size, int new_size);
833 };
834 
835 // Helper: ImGuiStorage
836 IMGUI_API ImGuiStoragePair* ImLowerBound(ImGuiStoragePair* in_begin, ImGuiStoragePair* in_end, ImGuiID key);
837 
838 //-----------------------------------------------------------------------------
839 // [SECTION] ImDrawList support
840 //-----------------------------------------------------------------------------
841 
842 // ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value.
843 // Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693
844 // Number of segments (N) is calculated using equation:
845 // N = ceil ( pi / acos(1 - error / r) ) where r > 0, error <= r
846 // Our equation is significantly simpler that one in the post thanks for choosing segment that is
847 // perpendicular to X axis. Follow steps in the article from this starting condition and you will
848 // will get this result.
849 //
850 // Rendering circles with an odd number of segments, while mathematically correct will produce
851 // asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.)
852 #define IM_ROUNDUP_TO_EVEN(_V) ((((_V) + 1) / 2) * 2)
853 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 4
854 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512
855 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR) ImClamp(IM_ROUNDUP_TO_EVEN((int)ImCeil(IM_PI / ImAcos(1 - ImMin((_MAXERROR), (_RAD)) / (_RAD)))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX)
856 
857 // Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'.
858 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR) ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))))
859 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD) ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD))
860 
861 // ImDrawList: Lookup table size for adaptive arc drawing, cover full circle.
862 #ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE
863 #define IM_DRAWLIST_ARCFAST_TABLE_SIZE 48 // Number of samples in lookup table.
864 #endif
865 #define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle.
866 
867 // Data shared between all ImDrawList instances
868 // Conceptually this could have been called e.g. ImDrawListSharedContext
869 // Typically one ImGui context would create and maintain one of this.
870 // You may want to create your own instance of you try to ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
871 struct IMGUI_API ImDrawListSharedData
872 {
873  ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas (== FontAtlas->TexUvWhitePixel)
874  const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas (== FontAtlas->TexUvLines)
875  ImFontAtlas* FontAtlas; // Current font atlas
876  ImFont* Font; // Current font (used for simplified AddText overload)
877  float FontSize; // Current font size (used for for simplified AddText overload)
878  float FontScale; // Current font scale (== FontSize / Font->FontSize)
879  float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo()
880  float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc
881  float InitialFringeScale; // Initial scale to apply to AA fringe
882  ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
883  ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
884  ImVector<ImVec2> TempBuffer; // Temporary write buffer
885  ImVector<ImDrawList*> DrawLists; // All draw lists associated to this ImDrawListSharedData
886  ImGuiContext* Context; // [OPTIONAL] Link to Dear ImGui context. 99% of ImDrawList/ImFontAtlas can function without an ImGui context, but this facilitate handling one legacy edge case.
887 
888  // Lookup tables
889  ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.
890  float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo()
891  ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)
892 
895  void SetCircleTessellationMaxError(float max_error);
896 };
897 
899 {
900  ImVector<ImDrawList*>* Layers[2]; // Pointers to global layers for: regular, tooltip. LayersP[0] is owned by DrawData.
901  ImVector<ImDrawList*> LayerData1;
902 
903  ImDrawDataBuilder() { memset((void*)this, 0, sizeof(*this)); }
904 };
905 
907 {
908  ImFont* Font;
909  float FontSizeBeforeScaling; // ~~ style.FontSizeBase
910  float FontSizeAfterScaling; // ~~ g.FontSize
911 };
912 
913 //-----------------------------------------------------------------------------
914 // [SECTION] Style support
915 //-----------------------------------------------------------------------------
916 
918 {
919  ImU32 Count : 8; // 1+
920  ImGuiDataType DataType : 8;
921  ImU32 Offset : 16; // Offset in parent structure
922  void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); }
923 };
924 
925 // Stacked color modifier, backup of modified data so we can restore it
927 {
928  ImGuiCol Col;
929  ImVec4 BackupValue;
930 };
931 
932 // Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.
934 {
935  ImGuiStyleVar VarIdx;
936  union { int BackupInt[2]; float BackupFloat[2]; };
937  ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; }
938  ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; }
939  ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
940 };
941 
942 //-----------------------------------------------------------------------------
943 // [SECTION] Data types support
944 //-----------------------------------------------------------------------------
945 
947 {
948  ImU8 Data[8]; // Opaque storage to fit any data up to ImGuiDataType_COUNT
949 };
950 
951 // Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().
953 {
954  size_t Size; // Size in bytes
955  const char* Name; // Short descriptive name for the type, for debugging
956  const char* PrintFmt; // Default printf format for the type
957  const char* ScanFmt; // Default scanf format for the type
958 };
959 
960 // Extend ImGuiDataType_
961 enum ImGuiDataTypePrivate_
962 {
963  ImGuiDataType_Pointer = ImGuiDataType_COUNT,
964  ImGuiDataType_ID,
965 };
966 
967 //-----------------------------------------------------------------------------
968 // [SECTION] Widgets support: flags, enums, data structures
969 //-----------------------------------------------------------------------------
970 
971 // Extend ImGuiItemFlags
972 // - input: PushItemFlag() manipulates g.CurrentItemFlags, g.NextItemData.ItemFlags, ItemAdd() calls may add extra flags too.
973 // - output: stored in g.LastItemData.ItemFlags
974 enum ImGuiItemFlagsPrivate_
975 {
976  // Controlled by user
977  ImGuiItemFlags_ReadOnly = 1 << 11, // false // [ALPHA] Allow hovering interactions but underlying value is not changed.
978  ImGuiItemFlags_MixedValue = 1 << 12, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets)
979  ImGuiItemFlags_NoWindowHoverableCheck = 1 << 13, // false // Disable hoverable check in ItemHoverable()
980  ImGuiItemFlags_AllowOverlap = 1 << 14, // false // Allow being overlapped by another widget. Not-hovered to Hovered transition deferred by a frame.
981  ImGuiItemFlags_NoNavDisableMouseHover = 1 << 15, // false // Nav keyboard/gamepad mode doesn't disable hover highlight (behave as if NavHighlightItemUnderNav==false).
982  ImGuiItemFlags_NoMarkEdited = 1 << 16, // false // Skip calling MarkItemEdited()
983  ImGuiItemFlags_NoFocus = 1 << 17, // false // [EXPERIMENTAL: Not very well specced] Clicking doesn't take focus. Automatically sets ImGuiButtonFlags_NoFocus + ImGuiButtonFlags_NoNavFocus in ButtonBehavior().
984 
985  // Controlled by widget code
986  ImGuiItemFlags_Inputable = 1 << 20, // false // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature.
987  ImGuiItemFlags_HasSelectionUserData = 1 << 21, // false // Set by SetNextItemSelectionUserData()
988  ImGuiItemFlags_IsMultiSelect = 1 << 22, // false // Set by SetNextItemSelectionUserData()
989 
990  ImGuiItemFlags_Default_ = ImGuiItemFlags_AutoClosePopups, // Please don't change, use PushItemFlag() instead.
991 
992  // Obsolete
993  //ImGuiItemFlags_SelectableDontClosePopup = !ImGuiItemFlags_AutoClosePopups, // Can't have a redirect as we inverted the behavior
994 };
995 
996 // Status flags for an already submitted item
997 // - output: stored in g.LastItemData.StatusFlags
998 enum ImGuiItemStatusFlags_
999 {
1000  ImGuiItemStatusFlags_None = 0,
1001  ImGuiItemStatusFlags_HoveredRect = 1 << 0, // Mouse position is within item rectangle (does NOT mean that the window is in correct z-order and can be hovered!, this is only one part of the most-common IsItemHovered test)
1002  ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, // g.LastItemData.DisplayRect is valid
1003  ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)
1004  ImGuiItemStatusFlags_ToggledSelection = 1 << 3, // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected", only state changes, in order to easily handle clipping with less issues.
1005  ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state.
1006  ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag.
1007  ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
1008  ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing.
1009  ImGuiItemStatusFlags_Visible = 1 << 8, // [WIP] Set when item is overlapping the current clipping rectangle (Used internally. Please don't use yet: API/system will change as we refactor Itemadd()).
1010  ImGuiItemStatusFlags_HasClipRect = 1 << 9, // g.LastItemData.ClipRect is valid.
1011  ImGuiItemStatusFlags_HasShortcut = 1 << 10, // g.LastItemData.Shortcut valid. Set by SetNextItemShortcut() -> ItemAdd().
1012  //ImGuiItemStatusFlags_FocusedByTabbing = 1 << 8, // Removed IN 1.90.1 (Dec 2023). The trigger is part of g.NavActivateId. See commit 54c1bdeceb.
1013 
1014  // Additional status + semantic for ImGuiTestEngine
1015 #ifdef IMGUI_ENABLE_TEST_ENGINE
1016  ImGuiItemStatusFlags_Openable = 1 << 20, // Item is an openable (e.g. TreeNode)
1017  ImGuiItemStatusFlags_Opened = 1 << 21, // Opened status
1018  ImGuiItemStatusFlags_Checkable = 1 << 22, // Item is a checkable (e.g. CheckBox, MenuItem)
1019  ImGuiItemStatusFlags_Checked = 1 << 23, // Checked status
1020  ImGuiItemStatusFlags_Inputable = 1 << 24, // Item is a text-inputable (e.g. InputText, SliderXXX, DragXXX)
1021 #endif
1022 };
1023 
1024 // Extend ImGuiHoveredFlags_
1025 enum ImGuiHoveredFlagsPrivate_
1026 {
1027  ImGuiHoveredFlags_DelayMask_ = ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay,
1028  ImGuiHoveredFlags_AllowedMaskForIsWindowHovered = ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_NoPopupHierarchy | ImGuiHoveredFlags_DockHierarchy | ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary,
1029  ImGuiHoveredFlags_AllowedMaskForIsItemHovered = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled | ImGuiHoveredFlags_NoNavOverride | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayMask_,
1030 };
1031 
1032 // Extend ImGuiInputTextFlags_
1033 enum ImGuiInputTextFlagsPrivate_
1034 {
1035  // [Internal]
1036  ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline()
1037  ImGuiInputTextFlags_MergedItem = 1 << 27, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.
1038  ImGuiInputTextFlags_LocalizeDecimalPoint= 1 << 28, // For internal use by InputScalar() and TempInputScalar()
1039 };
1040 
1041 // Extend ImGuiButtonFlags_
1042 enum ImGuiButtonFlagsPrivate_
1043 {
1044  ImGuiButtonFlags_PressedOnClick = 1 << 4, // return true on click (mouse down event)
1045  ImGuiButtonFlags_PressedOnClickRelease = 1 << 5, // [Default] return true on click + release on same item <-- this is what the majority of Button are using
1046  ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item
1047  ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release)
1048  ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release)
1049  ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers)
1050  //ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat -> use ImGuiItemFlags_ButtonRepeat instead.
1051  ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping
1052  ImGuiButtonFlags_AllowOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable.
1053  //ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press
1054  //ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled
1055  ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine
1056  ImGuiButtonFlags_NoKeyModsAllowed = 1 << 16, // disable mouse interaction if a key modifier is held
1057  ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
1058  ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated (FIXME: this is essentially used every time an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.ItemFlags)
1059  ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item
1060  ImGuiButtonFlags_NoSetKeyOwner = 1 << 20, // don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)
1061  ImGuiButtonFlags_NoTestKeyOwner = 1 << 21, // don't test key/input owner when polling the key (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)
1062  ImGuiButtonFlags_NoFocus = 1 << 22, // [EXPERIMENTAL: Not very well specced]. Don't focus parent window when clicking.
1063  ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold,
1064  ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease,
1065  //ImGuiButtonFlags_NoKeyModifiers = ImGuiButtonFlags_NoKeyModsAllowed, // Renamed in 1.91.4
1066 };
1067 
1068 // Extend ImGuiComboFlags_
1069 enum ImGuiComboFlagsPrivate_
1070 {
1071  ImGuiComboFlags_CustomPreview = 1 << 20, // enable BeginComboPreview()
1072 };
1073 
1074 // Extend ImGuiSliderFlags_
1075 enum ImGuiSliderFlagsPrivate_
1076 {
1077  ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically?
1078  ImGuiSliderFlags_ReadOnly = 1 << 21, // Consider using g.NextItemData.ItemFlags |= ImGuiItemFlags_ReadOnly instead.
1079 };
1080 
1081 // Extend ImGuiSelectableFlags_
1082 enum ImGuiSelectableFlagsPrivate_
1083 {
1084  // NB: need to be in sync with last value of ImGuiSelectableFlags_
1085  ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20,
1086  ImGuiSelectableFlags_SelectOnClick = 1 << 22, // Override button behavior to react on Click (default is Click+Release)
1087  ImGuiSelectableFlags_SelectOnRelease = 1 << 23, // Override button behavior to react on Release (default is Click+Release)
1088  ImGuiSelectableFlags_SpanAvailWidth = 1 << 24, // Span all avail width even if we declared less for layout purpose. FIXME: We may be able to remove this (added in 6251d379, 2bcafc86 for menus)
1089  ImGuiSelectableFlags_SetNavIdOnHover = 1 << 25, // Set Nav/Focus ID on mouse hover (used by MenuItem)
1090  ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 26, // Disable padding each side with ItemSpacing * 0.5f
1091  ImGuiSelectableFlags_NoSetKeyOwner = 1 << 27, // Don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!)
1092 };
1093 
1094 // Extend ImGuiTreeNodeFlags_
1095 enum ImGuiTreeNodeFlagsPrivate_
1096 {
1097  ImGuiTreeNodeFlags_NoNavFocus = 1 << 27,// Don't claim nav focus when interacting with this item (#8551)
1098  ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 28,// FIXME-WIP: Hard-coded for CollapsingHeader()
1099  ImGuiTreeNodeFlags_UpsideDownArrow = 1 << 29,// FIXME-WIP: Turn Down arrow into an Up arrow, for reversed trees (#6517)
1100  ImGuiTreeNodeFlags_OpenOnMask_ = ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_OpenOnArrow,
1101  ImGuiTreeNodeFlags_DrawLinesMask_ = ImGuiTreeNodeFlags_DrawLinesNone | ImGuiTreeNodeFlags_DrawLinesFull | ImGuiTreeNodeFlags_DrawLinesToNodes,
1102 };
1103 
1104 enum ImGuiSeparatorFlags_
1105 {
1106  ImGuiSeparatorFlags_None = 0,
1107  ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
1108  ImGuiSeparatorFlags_Vertical = 1 << 1,
1109  ImGuiSeparatorFlags_SpanAllColumns = 1 << 2, // Make separator cover all columns of a legacy Columns() set.
1110 };
1111 
1112 // Flags for FocusWindow(). This is not called ImGuiFocusFlags to avoid confusion with public-facing ImGuiFocusedFlags.
1113 // FIXME: Once we finishing replacing more uses of GetTopMostPopupModal()+IsWindowWithinBeginStackOf()
1114 // and FindBlockingModal() with this, we may want to change the flag to be opt-out instead of opt-in.
1115 enum ImGuiFocusRequestFlags_
1116 {
1117  ImGuiFocusRequestFlags_None = 0,
1118  ImGuiFocusRequestFlags_RestoreFocusedChild = 1 << 0, // Find last focused child (if any) and focus it instead.
1119  ImGuiFocusRequestFlags_UnlessBelowModal = 1 << 1, // Do not set focus if the window is below a modal.
1120 };
1121 
1122 enum ImGuiTextFlags_
1123 {
1124  ImGuiTextFlags_None = 0,
1125  ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0,
1126 };
1127 
1128 enum ImGuiTooltipFlags_
1129 {
1130  ImGuiTooltipFlags_None = 0,
1131  ImGuiTooltipFlags_OverridePrevious = 1 << 1, // Clear/ignore previously submitted tooltip (defaults to append)
1132 };
1133 
1134 // FIXME: this is in development, not exposed/functional as a generic feature yet.
1135 // Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2
1136 enum ImGuiLayoutType_
1137 {
1138  ImGuiLayoutType_Horizontal = 0,
1139  ImGuiLayoutType_Vertical = 1
1140 };
1141 
1142 // Flags for LogBegin() text capturing function
1143 enum ImGuiLogFlags_
1144 {
1145  ImGuiLogFlags_None = 0,
1146 
1147  ImGuiLogFlags_OutputTTY = 1 << 0,
1148  ImGuiLogFlags_OutputFile = 1 << 1,
1149  ImGuiLogFlags_OutputBuffer = 1 << 2,
1150  ImGuiLogFlags_OutputClipboard = 1 << 3,
1151  ImGuiLogFlags_OutputMask_ = ImGuiLogFlags_OutputTTY | ImGuiLogFlags_OutputFile | ImGuiLogFlags_OutputBuffer | ImGuiLogFlags_OutputClipboard,
1152 };
1153 
1154 // X/Y enums are fixed to 0/1 so they may be used to index ImVec2
1155 enum ImGuiAxis
1156 {
1157  ImGuiAxis_None = -1,
1158  ImGuiAxis_X = 0,
1159  ImGuiAxis_Y = 1
1160 };
1161 
1162 enum ImGuiPlotType
1163 {
1164  ImGuiPlotType_Lines,
1165  ImGuiPlotType_Histogram,
1166 };
1167 
1168 // Storage data for BeginComboPreview()/EndComboPreview()
1169 struct IMGUI_API ImGuiComboPreviewData
1170 {
1171  ImRect PreviewRect;
1172  ImVec2 BackupCursorPos;
1173  ImVec2 BackupCursorMaxPos;
1174  ImVec2 BackupCursorPosPrevLine;
1175  float BackupPrevLineTextBaseOffset;
1176  ImGuiLayoutType BackupLayout;
1177 
1178  ImGuiComboPreviewData() { memset((void*)this, 0, sizeof(*this)); }
1179 };
1180 
1181 // Stacked storage data for BeginGroup()/EndGroup()
1182 struct IMGUI_API ImGuiGroupData
1183 {
1184  ImGuiID WindowID;
1185  ImVec2 BackupCursorPos;
1186  ImVec2 BackupCursorMaxPos;
1187  ImVec2 BackupCursorPosPrevLine;
1188  ImVec1 BackupIndent;
1189  ImVec1 BackupGroupOffset;
1190  ImVec2 BackupCurrLineSize;
1191  float BackupCurrLineTextBaseOffset;
1192  ImGuiID BackupActiveIdIsAlive;
1193  bool BackupActiveIdHasBeenEditedThisFrame;
1194  bool BackupDeactivatedIdIsAlive;
1195  bool BackupHoveredIdIsAlive;
1196  bool BackupIsSameLine;
1197  bool EmitItem;
1198 };
1199 
1200 // Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper.
1201 struct IMGUI_API ImGuiMenuColumns
1202 {
1203  ImU32 TotalWidth;
1204  ImU32 NextTotalWidth;
1205  ImU16 Spacing;
1206  ImU16 OffsetIcon; // Always zero for now
1207  ImU16 OffsetLabel; // Offsets are locked in Update()
1208  ImU16 OffsetShortcut;
1209  ImU16 OffsetMark;
1210  ImU16 Widths[4]; // Width of: Icon, Label, Shortcut, Mark (accumulators for current frame)
1211 
1212  ImGuiMenuColumns() { memset((void*)this, 0, sizeof(*this)); }
1213  void Update(float spacing, bool window_reappearing);
1214  float DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark);
1215  void CalcNextTotalWidth(bool update_offsets);
1216 };
1217 
1218 // Internal temporary state for deactivating InputText() instances.
1220 {
1221  ImGuiID ID; // widget id owning the text state (which just got deactivated)
1222  ImVector<char> TextA; // text buffer
1223 
1224  ImGuiInputTextDeactivatedState() { memset((void*)this, 0, sizeof(*this)); }
1225  void ClearFreeMemory() { ID = 0; TextA.clear(); }
1226 };
1227 
1228 // Forward declare imstb_textedit.h structure + make its main configuration define accessible
1229 #undef IMSTB_TEXTEDIT_STRING
1230 #undef IMSTB_TEXTEDIT_CHARTYPE
1231 #define IMSTB_TEXTEDIT_STRING ImGuiInputTextState
1232 #define IMSTB_TEXTEDIT_CHARTYPE char
1233 #define IMSTB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f)
1234 #define IMSTB_TEXTEDIT_UNDOSTATECOUNT 99
1235 #define IMSTB_TEXTEDIT_UNDOCHARCOUNT 999
1236 namespace ImStb { struct STB_TexteditState; }
1237 typedef ImStb::STB_TexteditState ImStbTexteditState;
1238 
1239 // Internal state of the currently focused/edited text input box
1240 // For a given item ID, access with ImGui::GetInputTextState()
1241 struct IMGUI_API ImGuiInputTextState
1242 {
1243  ImGuiContext* Ctx; // parent UI context (needs to be set explicitly by parent).
1244  ImStbTexteditState* Stb; // State for stb_textedit.h
1245  ImGuiInputTextFlags Flags; // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set.
1246  ImGuiID ID; // widget id owning the text state
1247  int TextLen; // UTF-8 length of the string in TextA (in bytes)
1248  const char* TextSrc; // == TextA.Data unless read-only, in which case == buf passed to InputText(). For _ReadOnly fields, pointer will be null outside the InputText() call.
1249  ImVector<char> TextA; // main UTF8 buffer. TextA.Size is a buffer size! Should always be >= buf_size passed by user (and of course >= CurLenA + 1).
1250  ImVector<char> TextToRevertTo; // value to revert to when pressing Escape = backup of end-user buffer at the time of focus (in UTF-8, unaltered)
1251  ImVector<char> CallbackTextBackup; // temporary storage for callback to support automatic reconcile of undo-stack
1252  int BufCapacity; // end-user buffer capacity (include zero terminator)
1253  ImVec2 Scroll; // horizontal offset (managed manually) + vertical scrolling (pulled from child window's own Scroll.y)
1254  int LineCount; // last line count (solely for debugging)
1255  float WrapWidth; // word-wrapping width
1256  float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately
1257  bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!)
1258  bool CursorCenterY; // set when we want scrolling to be centered over the cursor position (while resizing a word-wrapping field)
1259  bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection
1260  bool Edited; // edited this frame
1261  bool WantReloadUserBuf; // force a reload of user buf so it may be modified externally. may be automatic in future version.
1262  ImS8 LastMoveDirectionLR; // ImGuiDir_Left or ImGuiDir_Right. track last movement direction so when cursor cross over a word-wrapping boundaries we can display it on either line depending on last move.s
1263  int ReloadSelectionStart;
1264  int ReloadSelectionEnd;
1265 
1268  void ClearText() { TextLen = 0; TextA[0] = 0; CursorClamp(); }
1269  void ClearFreeMemory() { TextA.clear(); TextToRevertTo.clear(); }
1270  void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation
1271  void OnCharPressed(unsigned int c);
1272  float GetPreferredOffsetX() const;
1273 
1274  // Cursor & Selection
1275  void CursorAnimReset();
1276  void CursorClamp();
1277  bool HasSelection() const;
1278  void ClearSelection();
1279  int GetCursorPos() const;
1280  int GetSelectionStart() const;
1281  int GetSelectionEnd() const;
1282  void SetSelection(int start, int end);
1283  void SelectAll();
1284 
1285  // Reload user buf (WIP #2890)
1286  // If you modify underlying user-passed const char* while active you need to call this (InputText V2 may lift this)
1287  // strcpy(my_buf, "hello");
1288  // if (ImGuiInputTextState* state = ImGui::GetInputTextState(id)) // id may be ImGui::GetItemID() is last item
1289  // state->ReloadUserBufAndSelectAll();
1290  void ReloadUserBufAndSelectAll();
1291  void ReloadUserBufAndKeepSelection();
1292  void ReloadUserBufAndMoveToEnd();
1293 };
1294 
1295 enum ImGuiWindowRefreshFlags_
1296 {
1297  ImGuiWindowRefreshFlags_None = 0,
1298  ImGuiWindowRefreshFlags_TryToAvoidRefresh = 1 << 0, // [EXPERIMENTAL] Try to keep existing contents, USER MUST NOT HONOR BEGIN() RETURNING FALSE AND NOT APPEND.
1299  ImGuiWindowRefreshFlags_RefreshOnHover = 1 << 1, // [EXPERIMENTAL] Always refresh on hover
1300  ImGuiWindowRefreshFlags_RefreshOnFocus = 1 << 2, // [EXPERIMENTAL] Always refresh on focus
1301  // Refresh policy/frequency, Load Balancing etc.
1302 };
1303 
1304 enum ImGuiWindowBgClickFlags_
1305 {
1306  ImGuiWindowBgClickFlags_None = 0,
1307  ImGuiWindowBgClickFlags_Move = 1 << 0, // Click on bg/void + drag to move window. Cleared by default when using io.ConfigWindowsMoveFromTitleBarOnly.
1308 };
1309 
1310 enum ImGuiNextWindowDataFlags_
1311 {
1312  ImGuiNextWindowDataFlags_None = 0,
1313  ImGuiNextWindowDataFlags_HasPos = 1 << 0,
1314  ImGuiNextWindowDataFlags_HasSize = 1 << 1,
1315  ImGuiNextWindowDataFlags_HasContentSize = 1 << 2,
1316  ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3,
1317  ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4,
1318  ImGuiNextWindowDataFlags_HasFocus = 1 << 5,
1319  ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6,
1320  ImGuiNextWindowDataFlags_HasScroll = 1 << 7,
1321  ImGuiNextWindowDataFlags_HasWindowFlags = 1 << 8,
1322  ImGuiNextWindowDataFlags_HasChildFlags = 1 << 9,
1323  ImGuiNextWindowDataFlags_HasRefreshPolicy = 1 << 10,
1324  ImGuiNextWindowDataFlags_HasViewport = 1 << 11,
1325  ImGuiNextWindowDataFlags_HasDock = 1 << 12,
1326  ImGuiNextWindowDataFlags_HasWindowClass = 1 << 13,
1327 };
1328 
1329 // Storage for SetNexWindow** functions
1331 {
1332  ImGuiNextWindowDataFlags HasFlags;
1333 
1334  // Members below are NOT cleared. Always rely on HasFlags.
1335  ImGuiCond PosCond;
1336  ImGuiCond SizeCond;
1337  ImGuiCond CollapsedCond;
1338  ImGuiCond DockCond;
1339  ImVec2 PosVal;
1340  ImVec2 PosPivotVal;
1341  ImVec2 SizeVal;
1342  ImVec2 ContentSizeVal;
1343  ImVec2 ScrollVal;
1344  ImGuiWindowFlags WindowFlags; // Only honored by BeginTable()
1345  ImGuiChildFlags ChildFlags;
1346  bool PosUndock;
1347  bool CollapsedVal;
1348  ImRect SizeConstraintRect;
1349  ImGuiSizeCallback SizeCallback;
1350  void* SizeCallbackUserData;
1351  float BgAlphaVal; // Override background alpha
1352  ImGuiID ViewportId;
1353  ImGuiID DockId;
1354  ImGuiWindowClass WindowClass;
1355  ImVec2 MenuBarOffsetMinVal; // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?)
1356  ImGuiWindowRefreshFlags RefreshFlagsVal;
1357 
1358  ImGuiNextWindowData() { memset((void*)this, 0, sizeof(*this)); }
1359  inline void ClearFlags() { HasFlags = ImGuiNextWindowDataFlags_None; }
1360 };
1361 
1362 enum ImGuiNextItemDataFlags_
1363 {
1364  ImGuiNextItemDataFlags_None = 0,
1365  ImGuiNextItemDataFlags_HasWidth = 1 << 0,
1366  ImGuiNextItemDataFlags_HasOpen = 1 << 1,
1367  ImGuiNextItemDataFlags_HasShortcut = 1 << 2,
1368  ImGuiNextItemDataFlags_HasRefVal = 1 << 3,
1369  ImGuiNextItemDataFlags_HasStorageID = 1 << 4,
1370  ImGuiNextItemDataFlags_HasColorMarker = 1 << 5,
1371 };
1372 
1374 {
1375  ImGuiNextItemDataFlags HasFlags; // Called HasFlags instead of Flags to avoid mistaking this
1376  ImGuiItemFlags ItemFlags; // Currently only tested/used for ImGuiItemFlags_AllowOverlap and ImGuiItemFlags_HasSelectionUserData.
1377 
1378  // Members below are NOT cleared by ItemAdd() meaning they are still valid during e.g. NavProcessItem(). Always rely on HasFlags.
1379  ImGuiID FocusScopeId; // Set by SetNextItemSelectionUserData()
1380  ImGuiSelectionUserData SelectionUserData; // Set by SetNextItemSelectionUserData() (note that NULL/0 is a valid value, we use -1 == ImGuiSelectionUserData_Invalid to mark invalid values)
1381  float Width; // Set by SetNextItemWidth()
1382  ImGuiKeyChord Shortcut; // Set by SetNextItemShortcut()
1383  ImGuiInputFlags ShortcutFlags; // Set by SetNextItemShortcut()
1384  bool OpenVal; // Set by SetNextItemOpen()
1385  ImU8 OpenCond; // Set by SetNextItemOpen()
1386  ImGuiDataTypeStorage RefVal; // Not exposed yet, for ImGuiInputTextFlags_ParseEmptyAsRefVal
1387  ImGuiID StorageId; // Set by SetNextItemStorageID()
1388  ImU32 ColorMarker; // Set by SetNextItemColorMarker(). Not exposed yet, supported by DragScalar,SliderScalar and for ImGuiSliderFlags_ColorMarkers.
1389 
1390  ImGuiNextItemData() { memset((void*)this, 0, sizeof(*this)); SelectionUserData = -1; }
1391  inline void ClearFlags() { HasFlags = ImGuiNextItemDataFlags_None; ItemFlags = ImGuiItemFlags_None; } // Also cleared manually by ItemAdd()!
1392 };
1393 
1394 // Status storage for the last submitted item
1396 {
1397  ImGuiID ID;
1398  ImGuiItemFlags ItemFlags; // See ImGuiItemFlags_ (called 'InFlags' before v1.91.4).
1399  ImGuiItemStatusFlags StatusFlags; // See ImGuiItemStatusFlags_
1400  ImRect Rect; // Full rectangle
1401  ImRect NavRect; // Navigation scoring rectangle (not displayed)
1402  // Rarely used fields are not explicitly cleared, only valid when the corresponding ImGuiItemStatusFlags are set.
1403  ImRect DisplayRect; // Display rectangle. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasDisplayRect) is set.
1404  ImRect ClipRect; // Clip rectangle at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasClipRect) is set..
1405  ImGuiKeyChord Shortcut; // Shortcut at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasShortcut) is set..
1406 
1407  ImGuiLastItemData() { memset((void*)this, 0, sizeof(*this)); }
1408 };
1409 
1410 // Store data emitted by TreeNode() for usage by TreePop()
1411 // - To implement ImGuiTreeNodeFlags_NavLeftJumpsToParent: store the minimum amount of data
1412 // which we can't infer in TreePop(), to perform the equivalent of NavApplyItemToResult().
1413 // Only stored when the node is a potential candidate for landing on a Left arrow jump.
1415 {
1416  ImGuiID ID;
1417  ImGuiTreeNodeFlags TreeFlags;
1418  ImGuiItemFlags ItemFlags; // Used for nav landing
1419  ImRect NavRect; // Used for nav landing
1420  float DrawLinesX1;
1421  float DrawLinesToNodesY2;
1422  ImGuiTableColumnIdx DrawLinesTableColumn;
1423 };
1424 
1425 // sizeof() = 20
1426 struct IMGUI_API ImGuiErrorRecoveryState
1427 {
1428  short SizeOfWindowStack;
1429  short SizeOfIDStack;
1430  short SizeOfTreeStack;
1431  short SizeOfColorStack;
1432  short SizeOfStyleVarStack;
1433  short SizeOfFontStack;
1434  short SizeOfFocusScopeStack;
1435  short SizeOfGroupStack;
1436  short SizeOfItemFlagsStack;
1437  short SizeOfBeginPopupStack;
1438  short SizeOfDisabledStack;
1439 
1440  ImGuiErrorRecoveryState() { memset((void*)this, 0, sizeof(*this)); }
1441 };
1442 
1443 // Data saved for each window pushed into the stack
1445 {
1446  ImGuiWindow* Window;
1447  ImGuiLastItemData ParentLastItemDataBackup;
1448  ImGuiErrorRecoveryState StackSizesInBegin; // Store size of various stacks for asserting
1449  bool DisabledOverrideReenable; // Non-child window override disabled flag
1450  float DisabledOverrideReenableAlphaBackup;
1451 };
1452 
1454 {
1455  int Index;
1456  float Width;
1457  float InitialWidth;
1458 };
1459 
1461 {
1462  void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool.
1463  int Index; // Usually index in a main pool.
1464 
1465  ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; }
1466  ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; }
1467 };
1468 
1469 // Data used by IsItemDeactivated()/IsItemDeactivatedAfterEdit() functions
1471 {
1472  ImGuiID ID;
1473  int ElapseFrame;
1474  bool HasBeenEditedBefore;
1475  bool IsAlive;
1476 };
1477 
1478 //-----------------------------------------------------------------------------
1479 // [SECTION] Popup support
1480 //-----------------------------------------------------------------------------
1481 
1482 enum ImGuiPopupPositionPolicy
1483 {
1484  ImGuiPopupPositionPolicy_Default,
1485  ImGuiPopupPositionPolicy_ComboBox,
1486  ImGuiPopupPositionPolicy_Tooltip,
1487 };
1488 
1489 // Storage for popup stacks (g.OpenPopupStack and g.BeginPopupStack)
1491 {
1492  ImGuiID PopupId; // Set on OpenPopup()
1493  ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
1494  ImGuiWindow* RestoreNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close
1495  int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value
1496  int OpenFrameCount; // Set on OpenPopup()
1497  ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
1498  ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
1499  ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup
1500 
1501  ImGuiPopupData() { memset((void*)this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; }
1502 };
1503 
1504 //-----------------------------------------------------------------------------
1505 // [SECTION] Inputs support
1506 //-----------------------------------------------------------------------------
1507 
1508 // Bit array for named keys
1509 typedef ImBitArray<ImGuiKey_NamedKey_COUNT, -ImGuiKey_NamedKey_BEGIN> ImBitArrayForNamedKeys;
1510 
1511 // [Internal] Key ranges
1512 #define ImGuiKey_LegacyNativeKey_BEGIN 0
1513 #define ImGuiKey_LegacyNativeKey_END 512
1514 #define ImGuiKey_Keyboard_BEGIN (ImGuiKey_NamedKey_BEGIN)
1515 #define ImGuiKey_Keyboard_END (ImGuiKey_GamepadStart)
1516 #define ImGuiKey_Gamepad_BEGIN (ImGuiKey_GamepadStart)
1517 #define ImGuiKey_Gamepad_END (ImGuiKey_GamepadRStickDown + 1)
1518 #define ImGuiKey_Mouse_BEGIN (ImGuiKey_MouseLeft)
1519 #define ImGuiKey_Mouse_END (ImGuiKey_MouseWheelY + 1)
1520 #define ImGuiKey_Aliases_BEGIN (ImGuiKey_Mouse_BEGIN)
1521 #define ImGuiKey_Aliases_END (ImGuiKey_Mouse_END)
1522 
1523 // [Internal] Named shortcuts for Navigation
1524 #define ImGuiKey_NavKeyboardTweakSlow ImGuiMod_Ctrl
1525 #define ImGuiKey_NavKeyboardTweakFast ImGuiMod_Shift
1526 #define ImGuiKey_NavGamepadTweakSlow ImGuiKey_GamepadL1
1527 #define ImGuiKey_NavGamepadTweakFast ImGuiKey_GamepadR1
1528 #define ImGuiKey_NavGamepadActivate (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceRight : ImGuiKey_GamepadFaceDown)
1529 #define ImGuiKey_NavGamepadCancel (g.IO.ConfigNavSwapGamepadButtons ? ImGuiKey_GamepadFaceDown : ImGuiKey_GamepadFaceRight)
1530 #define ImGuiKey_NavGamepadMenu ImGuiKey_GamepadFaceLeft
1531 #define ImGuiKey_NavGamepadInput ImGuiKey_GamepadFaceUp
1532 
1533 enum ImGuiInputEventType
1534 {
1535  ImGuiInputEventType_None = 0,
1536  ImGuiInputEventType_MousePos,
1537  ImGuiInputEventType_MouseWheel,
1538  ImGuiInputEventType_MouseButton,
1539  ImGuiInputEventType_MouseViewport,
1540  ImGuiInputEventType_Key,
1541  ImGuiInputEventType_Text,
1542  ImGuiInputEventType_Focus,
1543  ImGuiInputEventType_COUNT
1544 };
1545 
1546 enum ImGuiInputSource : int
1547 {
1548  ImGuiInputSource_None = 0,
1549  ImGuiInputSource_Mouse, // Note: may be Mouse or TouchScreen or Pen. See io.MouseSource to distinguish them.
1550  ImGuiInputSource_Keyboard,
1551  ImGuiInputSource_Gamepad,
1552  ImGuiInputSource_COUNT
1553 };
1554 
1555 // FIXME: Structures in the union below need to be declared as anonymous unions appears to be an extension?
1556 // Using ImVec2() would fail on Clang 'union member 'MousePos' has a non-trivial default constructor'
1557 struct ImGuiInputEventMousePos { float PosX, PosY; ImGuiMouseSource MouseSource; };
1558 struct ImGuiInputEventMouseWheel { float WheelX, WheelY; ImGuiMouseSource MouseSource; };
1559 struct ImGuiInputEventMouseButton { int Button; bool Down; ImGuiMouseSource MouseSource; };
1560 struct ImGuiInputEventMouseViewport { ImGuiID HoveredViewportID; };
1561 struct ImGuiInputEventKey { ImGuiKey Key; bool Down; float AnalogValue; };
1562 struct ImGuiInputEventText { unsigned int Char; };
1563 struct ImGuiInputEventAppFocused { bool Focused; };
1564 
1566 {
1567  ImGuiInputEventType Type;
1568  ImGuiInputSource Source;
1569  ImU32 EventId; // Unique, sequential increasing integer to identify an event (if you need to correlate them to other data).
1570  union
1571  {
1572  ImGuiInputEventMousePos MousePos; // if Type == ImGuiInputEventType_MousePos
1573  ImGuiInputEventMouseWheel MouseWheel; // if Type == ImGuiInputEventType_MouseWheel
1574  ImGuiInputEventMouseButton MouseButton; // if Type == ImGuiInputEventType_MouseButton
1575  ImGuiInputEventMouseViewport MouseViewport; // if Type == ImGuiInputEventType_MouseViewport
1576  ImGuiInputEventKey Key; // if Type == ImGuiInputEventType_Key
1577  ImGuiInputEventText Text; // if Type == ImGuiInputEventType_Text
1578  ImGuiInputEventAppFocused AppFocused; // if Type == ImGuiInputEventType_Focus
1579  };
1580  bool AddedByTestEngine;
1581 
1582  ImGuiInputEvent() { memset((void*)this, 0, sizeof(*this)); }
1583 };
1584 
1585 // Input function taking an 'ImGuiID owner_id' argument defaults to (ImGuiKeyOwner_Any == 0) aka don't test ownership, which matches legacy behavior.
1586 #define ImGuiKeyOwner_Any ((ImGuiID)0) // Accept key that have an owner, UNLESS a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.
1587 #define ImGuiKeyOwner_NoOwner ((ImGuiID)-1) // Require key to have no owner.
1588 //#define ImGuiKeyOwner_None ImGuiKeyOwner_NoOwner // We previously called this 'ImGuiKeyOwner_None' but it was inconsistent with our pattern that _None values == 0 and quite dangerous. Also using _NoOwner makes the IsKeyPressed() calls more explicit.
1589 
1590 typedef ImS16 ImGuiKeyRoutingIndex;
1591 
1592 // Routing table entry (sizeof() == 16 bytes)
1594 {
1595  ImGuiKeyRoutingIndex NextEntryIndex;
1596  ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits.
1597  ImU16 RoutingCurrScore; // [DEBUG] For debug display
1598  ImU16 RoutingNextScore; // Lower is better (0: perfect score)
1599  ImGuiID RoutingCurr;
1600  ImGuiID RoutingNext;
1601 
1602  ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingCurrScore = RoutingNextScore = 0; RoutingCurr = RoutingNext = ImGuiKeyOwner_NoOwner; }
1603 };
1604 
1605 // Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching.
1606 // Stored in main context (1 instance)
1608 {
1609  ImGuiKeyRoutingIndex Index[ImGuiKey_NamedKey_COUNT]; // Index of first entry in Entries[]
1611  ImVector<ImGuiKeyRoutingData> EntriesNext; // Double-buffer to avoid reallocation (could use a shared buffer)
1612 
1613  ImGuiKeyRoutingTable() { Clear(); }
1614  void Clear() { for (int n = 0; n < IM_COUNTOF(Index); n++) Index[n] = -1; Entries.clear(); EntriesNext.clear(); }
1615 };
1616 
1617 // This extends ImGuiKeyData but only for named keys (legacy keys don't support the new features)
1618 // Stored in main context (1 per named key). In the future it might be merged into ImGuiKeyData.
1620 {
1621  ImGuiID OwnerCurr;
1622  ImGuiID OwnerNext;
1623  bool LockThisFrame; // Reading this key requires explicit owner id (until end of frame). Set by ImGuiInputFlags_LockThisFrame.
1624  bool LockUntilRelease; // Reading this key requires explicit owner id (until key is released). Set by ImGuiInputFlags_LockUntilRelease. When this is true LockThisFrame is always true as well.
1625 
1626  ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_NoOwner; LockThisFrame = LockUntilRelease = false; }
1627 };
1628 
1629 // Extend ImGuiInputFlags_
1630 // Flags for extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner()
1631 // Don't mistake with ImGuiInputTextFlags! (which is for ImGui::InputText() function)
1632 enum ImGuiInputFlagsPrivate_
1633 {
1634  // Flags for IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(), Shortcut()
1635  // - Repeat mode: Repeat rate selection
1636  ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default)
1637  ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast
1638  ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster
1639  // - Repeat mode: Specify when repeating key pressed can be interrupted.
1640  // - In theory ImGuiInputFlags_RepeatUntilOtherKeyPress may be a desirable default, but it would break too many behavior so everything is opt-in.
1641  ImGuiInputFlags_RepeatUntilRelease = 1 << 4, // Stop repeating when released (default for all functions except Shortcut). This only exists to allow overriding Shortcut() default behavior.
1642  ImGuiInputFlags_RepeatUntilKeyModsChange = 1 << 5, // Stop repeating when released OR if keyboard mods are changed (default for Shortcut)
1643  ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone = 1 << 6, // Stop repeating when released OR if keyboard mods are leaving the None state. Allows going from Mod+Key to Key by releasing Mod.
1644  ImGuiInputFlags_RepeatUntilOtherKeyPress = 1 << 7, // Stop repeating when released OR if any other keyboard key is pressed during the repeat
1645 
1646  // Flags for SetKeyOwner(), SetItemKeyOwner()
1647  // - Locking key away from non-input aware code. Locking is useful to make input-owner-aware code steal keys from non-input-owner-aware code. If all code is input-owner-aware locking would never be necessary.
1648  ImGuiInputFlags_LockThisFrame = 1 << 20, // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame.
1649  ImGuiInputFlags_LockUntilRelease = 1 << 21, // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared when the key is released or at end of each frame if key is released.
1650 
1651  // - Condition for SetItemKeyOwner()
1652  ImGuiInputFlags_CondHovered = 1 << 22, // Only set if item is hovered (default to both)
1653  ImGuiInputFlags_CondActive = 1 << 23, // Only set if item is active (default to both)
1654  ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
1655 
1656  // [Internal] Mask of which function support which flags
1657  ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak,
1658  ImGuiInputFlags_RepeatUntilMask_ = ImGuiInputFlags_RepeatUntilRelease | ImGuiInputFlags_RepeatUntilKeyModsChange | ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone | ImGuiInputFlags_RepeatUntilOtherKeyPress,
1659  ImGuiInputFlags_RepeatMask_ = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RepeatUntilMask_,
1660  ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
1661  ImGuiInputFlags_RouteTypeMask_ = ImGuiInputFlags_RouteActive | ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteAlways,
1662  ImGuiInputFlags_RouteOptionsMask_ = ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused | ImGuiInputFlags_RouteFromRootWindow,
1663  ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_RepeatMask_,
1664  ImGuiInputFlags_SupportedByIsMouseClicked = ImGuiInputFlags_Repeat,
1665  ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_,
1666  ImGuiInputFlags_SupportedBySetNextItemShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_ | ImGuiInputFlags_Tooltip,
1667  ImGuiInputFlags_SupportedBySetKeyOwner = ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease,
1668  ImGuiInputFlags_SupportedBySetItemKeyOwner = ImGuiInputFlags_SupportedBySetKeyOwner | ImGuiInputFlags_CondMask_,
1669 };
1670 
1671 //-----------------------------------------------------------------------------
1672 // [SECTION] Clipper support
1673 //-----------------------------------------------------------------------------
1674 
1675 // Note that Max is exclusive, so perhaps should be using a Begin/End convention.
1677 {
1678  int Min;
1679  int Max;
1680  bool PosToIndexConvert; // Begin/End are absolute position (will be converted to indices later)
1681  ImS8 PosToIndexOffsetMin; // Add to Min after converting to indices
1682  ImS8 PosToIndexOffsetMax; // Add to Min after converting to indices
1683 
1684  static ImGuiListClipperRange FromIndices(int min, int max) { ImGuiListClipperRange r = { min, max, false, 0, 0 }; return r; }
1685  static ImGuiListClipperRange FromPositions(float y1, float y2, int off_min, int off_max) { ImGuiListClipperRange r = { (int)y1, (int)y2, true, (ImS8)off_min, (ImS8)off_max }; return r; }
1686 };
1687 
1688 // Temporary clipper data, buffers shared/reused between instances
1690 {
1691  ImGuiListClipper* ListClipper;
1692  float LossynessOffset;
1693  int StepNo;
1694  int ItemsFrozen;
1696 
1697  ImGuiListClipperData() { memset((void*)this, 0, sizeof(*this)); }
1698  void Reset(ImGuiListClipper* clipper) { ListClipper = clipper; StepNo = ItemsFrozen = 0; Ranges.resize(0); }
1699 };
1700 
1701 //-----------------------------------------------------------------------------
1702 // [SECTION] Navigation support
1703 //-----------------------------------------------------------------------------
1704 
1705 enum ImGuiActivateFlags_
1706 {
1707  ImGuiActivateFlags_None = 0,
1708  ImGuiActivateFlags_PreferInput = 1 << 0, // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default for Enter key.
1709  ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default for Space key and if keyboard is not used.
1710  ImGuiActivateFlags_TryToPreserveState = 1 << 2, // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection)
1711  ImGuiActivateFlags_FromTabbing = 1 << 3, // Activation requested by a tabbing request (ImGuiNavMoveFlags_IsTabbing)
1712  ImGuiActivateFlags_FromShortcut = 1 << 4, // Activation requested by an item shortcut via SetNextItemShortcut() function.
1713  ImGuiActivateFlags_FromFocusApi = 1 << 5, // Activation requested by an api request (ImGuiNavMoveFlags_FocusApi)
1714 };
1715 
1716 // Early work-in-progress API for ScrollToItem()
1717 enum ImGuiScrollFlags_
1718 {
1719  ImGuiScrollFlags_None = 0,
1720  ImGuiScrollFlags_KeepVisibleEdgeX = 1 << 0, // If item is not visible: scroll as little as possible on X axis to bring item back into view [default for X axis]
1721  ImGuiScrollFlags_KeepVisibleEdgeY = 1 << 1, // If item is not visible: scroll as little as possible on Y axis to bring item back into view [default for Y axis for windows that are already visible]
1722  ImGuiScrollFlags_KeepVisibleCenterX = 1 << 2, // If item is not visible: scroll to make the item centered on X axis [rarely used]
1723  ImGuiScrollFlags_KeepVisibleCenterY = 1 << 3, // If item is not visible: scroll to make the item centered on Y axis
1724  ImGuiScrollFlags_AlwaysCenterX = 1 << 4, // Always center the result item on X axis [rarely used]
1725  ImGuiScrollFlags_AlwaysCenterY = 1 << 5, // Always center the result item on Y axis [default for Y axis for appearing window)
1726  ImGuiScrollFlags_NoScrollParent = 1 << 6, // Disable forwarding scrolling to parent window if required to keep item/rect visible (only scroll window the function was applied to).
1727  ImGuiScrollFlags_MaskX_ = ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleCenterX | ImGuiScrollFlags_AlwaysCenterX,
1728  ImGuiScrollFlags_MaskY_ = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY,
1729 };
1730 
1731 enum ImGuiNavRenderCursorFlags_
1732 {
1733  ImGuiNavRenderCursorFlags_None = 0,
1734  ImGuiNavRenderCursorFlags_Compact = 1 << 1, // Compact highlight, no padding/distance from focused item
1735  ImGuiNavRenderCursorFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) even when g.NavCursorVisible == false, aka even when using the mouse.
1736  ImGuiNavRenderCursorFlags_NoRounding = 1 << 3,
1737 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1738  ImGuiNavHighlightFlags_None = ImGuiNavRenderCursorFlags_None, // Renamed in 1.91.4
1739  ImGuiNavHighlightFlags_Compact = ImGuiNavRenderCursorFlags_Compact, // Renamed in 1.91.4
1740  ImGuiNavHighlightFlags_AlwaysDraw = ImGuiNavRenderCursorFlags_AlwaysDraw, // Renamed in 1.91.4
1741  ImGuiNavHighlightFlags_NoRounding = ImGuiNavRenderCursorFlags_NoRounding, // Renamed in 1.91.4
1742  //ImGuiNavHighlightFlags_TypeThin = ImGuiNavRenderCursorFlags_Compact, // Renamed in 1.90.2
1743 #endif
1744 };
1745 
1746 enum ImGuiNavMoveFlags_
1747 {
1748  ImGuiNavMoveFlags_None = 0,
1749  ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side
1750  ImGuiNavMoveFlags_LoopY = 1 << 1,
1751  ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)
1752  ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful but provided for completeness
1753  ImGuiNavMoveFlags_WrapMask_ = ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_LoopY | ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_WrapY,
1754  ImGuiNavMoveFlags_AllowCurrentNavId = 1 << 4, // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place)
1755  ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown)
1756  ImGuiNavMoveFlags_ScrollToEdgeY = 1 << 6, // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword as ImGuiScrollFlags
1757  ImGuiNavMoveFlags_Forwarded = 1 << 7,
1758  ImGuiNavMoveFlags_DebugNoResult = 1 << 8, // Dummy scoring for debug purpose, don't apply result
1759  ImGuiNavMoveFlags_FocusApi = 1 << 9, // Requests from focus API can land/focus/activate items even if they are marked with _NoTabStop (see NavProcessItemForTabbingRequest() for details)
1760  ImGuiNavMoveFlags_IsTabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight
1761  ImGuiNavMoveFlags_IsPageMove = 1 << 11, // Identify a PageDown/PageUp request.
1762  ImGuiNavMoveFlags_Activate = 1 << 12, // Activate/select target item.
1763  ImGuiNavMoveFlags_NoSelect = 1 << 13, // Don't trigger selection by not setting g.NavJustMovedTo
1764  ImGuiNavMoveFlags_NoSetNavCursorVisible = 1 << 14, // Do not alter the nav cursor visible state
1765  ImGuiNavMoveFlags_NoClearActiveId = 1 << 15, // (Experimental) Do not clear active id when applying move result
1766 };
1767 
1768 enum ImGuiNavLayer
1769 {
1770  ImGuiNavLayer_Main = 0, // Main scrolling layer
1771  ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt)
1772  ImGuiNavLayer_COUNT
1773 };
1774 
1775 // Storage for navigation query/results
1777 {
1778  ImGuiWindow* Window; // Init,Move // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window)
1779  ImGuiID ID; // Init,Move // Best candidate item ID
1780  ImGuiID FocusScopeId; // Init,Move // Best candidate focus scope ID
1781  ImRect RectRel; // Init,Move // Best candidate bounding box in window relative space
1782  ImGuiItemFlags ItemFlags; // ????,Move // Best candidate item flags
1783  float DistBox; // Move // Best candidate box distance to current NavId
1784  float DistCenter; // Move // Best candidate center distance to current NavId
1785  float DistAxial; // Move // Best candidate axial distance to current NavId
1786  ImGuiSelectionUserData SelectionUserData;//I+Mov // Best candidate SetNextItemSelectionUserData() value. Valid if (ItemFlags & ImGuiItemFlags_HasSelectionUserData)
1787 
1788  ImGuiNavItemData() { Clear(); }
1789  void Clear() { Window = NULL; ID = FocusScopeId = 0; ItemFlags = 0; SelectionUserData = -1; DistBox = DistCenter = DistAxial = FLT_MAX; }
1790 };
1791 
1792 // Storage for PushFocusScope(), g.FocusScopeStack[], g.NavFocusRoute[]
1794 {
1795  ImGuiID ID;
1796  ImGuiID WindowID;
1797 };
1798 
1799 //-----------------------------------------------------------------------------
1800 // [SECTION] Typing-select support
1801 //-----------------------------------------------------------------------------
1802 
1803 // Flags for GetTypingSelectRequest()
1804 enum ImGuiTypingSelectFlags_
1805 {
1806  ImGuiTypingSelectFlags_None = 0,
1807  ImGuiTypingSelectFlags_AllowBackspace = 1 << 0, // Backspace to delete character inputs. If using: ensure GetTypingSelectRequest() is not called more than once per frame (filter by e.g. focus state)
1808  ImGuiTypingSelectFlags_AllowSingleCharMode = 1 << 1, // Allow "single char" search mode which is activated when pressing the same character multiple times.
1809 };
1810 
1811 // Returned by GetTypingSelectRequest(), designed to eventually be public.
1813 {
1814  ImGuiTypingSelectFlags Flags; // Flags passed to GetTypingSelectRequest()
1815  int SearchBufferLen;
1816  const char* SearchBuffer; // Search buffer contents (use full string. unless SingleCharMode is set, in which case use SingleCharSize).
1817  bool SelectRequest; // Set when buffer was modified this frame, requesting a selection.
1818  bool SingleCharMode; // Notify when buffer contains same character repeated, to implement special mode. In this situation it preferred to not display any on-screen search indication.
1819  ImS8 SingleCharSize; // Length in bytes of first letter codepoint (1 for ascii, 2-4 for UTF-8). If (SearchBufferLen==RepeatCharSize) only 1 letter has been input.
1820 };
1821 
1822 // Storage for GetTypingSelectRequest()
1823 struct IMGUI_API ImGuiTypingSelectState
1824 {
1825  ImGuiTypingSelectRequest Request; // User-facing data
1826  char SearchBuffer[64]; // Search buffer: no need to make dynamic as this search is very transient.
1827  ImGuiID FocusScope;
1828  int LastRequestFrame = 0;
1829  float LastRequestTime = 0.0f;
1830  bool SingleCharModeLock = false; // After a certain single char repeat count we lock into SingleCharMode. Two benefits: 1) buffer never fill, 2) we can provide an immediate SingleChar mode without timer elapsing.
1831 
1832  ImGuiTypingSelectState() { memset((void*)this, 0, sizeof(*this)); }
1833  void Clear() { SearchBuffer[0] = 0; SingleCharModeLock = false; } // We preserve remaining data for easier debugging
1834 };
1835 
1836 //-----------------------------------------------------------------------------
1837 // [SECTION] Columns support
1838 //-----------------------------------------------------------------------------
1839 
1840 // Flags for internal's BeginColumns(). This is an obsolete API. Prefer using BeginTable() nowadays!
1841 enum ImGuiOldColumnFlags_
1842 {
1843  ImGuiOldColumnFlags_None = 0,
1844  ImGuiOldColumnFlags_NoBorder = 1 << 0, // Disable column dividers
1845  ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers
1846  ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns
1847  ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window
1848  ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4, // Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.
1849 
1850  // Obsolete names (will be removed)
1851 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1852  //ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None,
1853  //ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder,
1854  //ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize,
1855  //ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths,
1856  //ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow,
1857  //ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize,
1858 #endif
1859 };
1860 
1862 {
1863  float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
1864  float OffsetNormBeforeResize;
1865  ImGuiOldColumnFlags Flags; // Not exposed
1866  ImRect ClipRect;
1867 
1868  ImGuiOldColumnData() { memset((void*)this, 0, sizeof(*this)); }
1869 };
1870 
1872 {
1873  ImGuiID ID;
1874  ImGuiOldColumnFlags Flags;
1875  bool IsFirstFrame;
1876  bool IsBeingResized;
1877  int Current;
1878  int Count;
1879  float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x
1880  float LineMinY, LineMaxY;
1881  float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns()
1882  float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns()
1883  ImRect HostInitialClipRect; // Backup of ClipRect at the time of BeginColumns()
1884  ImRect HostBackupClipRect; // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground()
1885  ImRect HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns()
1887  ImDrawListSplitter Splitter;
1888 
1889  ImGuiOldColumns() { memset((void*)this, 0, sizeof(*this)); }
1890 };
1891 
1892 //-----------------------------------------------------------------------------
1893 // [SECTION] Box-select support
1894 //-----------------------------------------------------------------------------
1895 
1897 {
1898  // Active box-selection data (persistent, 1 active at a time)
1899  ImGuiID ID;
1900  bool IsActive;
1901  bool IsStarting;
1902  bool IsStartedFromVoid; // Starting click was not from an item.
1903  bool IsStartedSetNavIdOnce;
1904  bool RequestClear;
1905  ImGuiKeyChord KeyMods : 16; // Latched key-mods for box-select logic.
1906  ImVec2 StartPosRel; // Start position in window-contents relative space (to support scrolling)
1907  ImVec2 EndPosRel; // End position in window-contents relative space
1908  ImVec2 ScrollAccum; // Scrolling accumulator (to behave at high-frame spaces)
1909  ImGuiWindow* Window;
1910 
1911  // Temporary/Transient data
1912  bool UnclipMode; // (Temp/Transient, here in hot area). Set/cleared by the BeginMultiSelect()/EndMultiSelect() owning active box-select.
1913  ImRect UnclipRect; // Rectangle where ItemAdd() clipping may be temporarily disabled. Need support by multi-select supporting widgets.
1914  ImRect BoxSelectRectPrev; // Selection rectangle in absolute coordinates (derived every frame from BoxSelectStartPosRel and MousePos)
1915  ImRect BoxSelectRectCurr;
1916 
1917  ImGuiBoxSelectState() { memset((void*)this, 0, sizeof(*this)); }
1918 };
1919 
1920 //-----------------------------------------------------------------------------
1921 // [SECTION] Multi-select support
1922 //-----------------------------------------------------------------------------
1923 
1924 // We always assume that -1 is an invalid value (which works for indices and pointers)
1925 #define ImGuiSelectionUserData_Invalid ((ImGuiSelectionUserData)-1)
1926 
1927 // Temporary storage for multi-select
1929 {
1930  ImGuiMultiSelectIO IO; // MUST BE FIRST FIELD. Requests are set and returned by BeginMultiSelect()/EndMultiSelect() + written to by user during the loop.
1931  ImGuiMultiSelectState* Storage;
1932  ImGuiID FocusScopeId; // Copied from g.CurrentFocusScopeId (unless another selection scope was pushed manually)
1933  ImGuiMultiSelectFlags Flags;
1934  ImVec2 ScopeRectMin;
1935  ImVec2 BackupCursorMaxPos;
1936  ImGuiSelectionUserData LastSubmittedItem; // Copy of last submitted item data, used to merge output ranges.
1937  ImGuiID BoxSelectId;
1938  ImGuiKeyChord KeyMods;
1939  ImS8 LoopRequestSetAll; // -1: no operation, 0: clear all, 1: select all.
1940  bool IsEndIO; // Set when switching IO from BeginMultiSelect() to EndMultiSelect() state.
1941  bool IsFocused; // Set if currently focusing the selection scope (any item of the selection). May be used if you have custom shortcut associated to selection.
1942  bool IsKeyboardSetRange; // Set by BeginMultiSelect() when using Shift+Navigation. Because scrolling may be affected we can't afford a frame of lag with Shift+Navigation.
1943  bool NavIdPassedBy;
1944  bool RangeSrcPassedBy; // Set by the item that matches RangeSrcItem.
1945  bool RangeDstPassedBy; // Set by the item that matches NavJustMovedToId when IsSetRange is set.
1946 
1947  ImGuiMultiSelectTempData() { Clear(); }
1948  void Clear() { size_t io_sz = sizeof(IO); ClearIO(); memset((void*)(&IO + 1), 0, sizeof(*this) - io_sz); } // Zero-clear except IO as we preserve IO.Requests[] buffer allocation.
1949  void ClearIO() { IO.Requests.resize(0); IO.RangeSrcItem = IO.NavIdItem = ImGuiSelectionUserData_Invalid; IO.NavIdSelected = IO.RangeSrcReset = false; }
1950 };
1951 
1952 // Persistent storage for multi-select (as long as selection is alive)
1953 struct IMGUI_API ImGuiMultiSelectState
1954 {
1955  ImGuiWindow* Window;
1956  ImGuiID ID;
1957  int LastFrameActive; // Last used frame-count, for GC.
1958  int LastSelectionSize; // Set by BeginMultiSelect() based on optional info provided by user. May be -1 if unknown.
1959  ImS8 RangeSelected; // -1 (don't have) or true/false
1960  ImS8 NavIdSelected; // -1 (don't have) or true/false
1961  ImGuiSelectionUserData RangeSrcItem; //
1962  ImGuiSelectionUserData NavIdItem; // SetNextItemSelectionUserData() value for NavId (if part of submitted items)
1963 
1964  ImGuiMultiSelectState() { Window = NULL; ID = 0; LastFrameActive = LastSelectionSize = 0; RangeSelected = NavIdSelected = -1; RangeSrcItem = NavIdItem = ImGuiSelectionUserData_Invalid; }
1965 };
1966 
1967 //-----------------------------------------------------------------------------
1968 // [SECTION] Docking support
1969 //-----------------------------------------------------------------------------
1970 
1971 #define DOCKING_HOST_DRAW_CHANNEL_BG 0 // Dock host: background fill
1972 #define DOCKING_HOST_DRAW_CHANNEL_FG 1 // Dock host: decorations and contents
1973 
1974 #ifdef IMGUI_HAS_DOCK
1975 
1976 // Extend ImGuiDockNodeFlags_
1977 enum ImGuiDockNodeFlagsPrivate_
1978 {
1979  // [Internal]
1980  ImGuiDockNodeFlags_DockSpace = 1 << 10, // Saved // A dockspace is a node that occupy space within an existing user window. Otherwise the node is floating and create its own window.
1981  ImGuiDockNodeFlags_CentralNode = 1 << 11, // Saved // The central node has 2 main properties: stay visible when empty, only use "remaining" spaces from its neighbor.
1982  ImGuiDockNodeFlags_NoTabBar = 1 << 12, // Saved // Tab bar is completely unavailable. No triangle in the corner to enable it back.
1983  ImGuiDockNodeFlags_HiddenTabBar = 1 << 13, // Saved // Tab bar is hidden, with a triangle in the corner to show it again (NB: actual tab-bar instance may be destroyed as this is only used for single-window tab bar)
1984  ImGuiDockNodeFlags_NoWindowMenuButton = 1 << 14, // Saved // Disable window/docking menu (that one that appears instead of the collapse button)
1985  ImGuiDockNodeFlags_NoCloseButton = 1 << 15, // Saved // Disable close button
1986  ImGuiDockNodeFlags_NoResizeX = 1 << 16, // //
1987  ImGuiDockNodeFlags_NoResizeY = 1 << 17, // //
1988  ImGuiDockNodeFlags_DockedWindowsInFocusRoute= 1 << 18, // // Any docked window will be automatically be focus-route chained (window->ParentWindowForFocusRoute set to this) so Shortcut() in this window can run when any docked window is focused.
1989 
1990  // Disable docking/undocking actions in this dockspace or individual node (existing docked nodes will be preserved)
1991  // Those are not exposed in public because the desirable sharing/inheriting/copy-flag-on-split behaviors are quite difficult to design and understand.
1992  // The two public flags ImGuiDockNodeFlags_NoDockingOverCentralNode/ImGuiDockNodeFlags_NoDockingSplit don't have those issues.
1993  ImGuiDockNodeFlags_NoDockingSplitOther = 1 << 19, // // Disable this node from splitting other windows/nodes.
1994  ImGuiDockNodeFlags_NoDockingOverMe = 1 << 20, // // Disable other windows/nodes from being docked over this node.
1995  ImGuiDockNodeFlags_NoDockingOverOther = 1 << 21, // // Disable this node from being docked over another window or non-empty node.
1996  ImGuiDockNodeFlags_NoDockingOverEmpty = 1 << 22, // // Disable this node from being docked over an empty node (e.g. DockSpace with no other windows)
1997  ImGuiDockNodeFlags_NoDocking = ImGuiDockNodeFlags_NoDockingOverMe | ImGuiDockNodeFlags_NoDockingOverOther | ImGuiDockNodeFlags_NoDockingOverEmpty | ImGuiDockNodeFlags_NoDockingSplit | ImGuiDockNodeFlags_NoDockingSplitOther,
1998 
1999  // Masks
2000  ImGuiDockNodeFlags_SharedFlagsInheritMask_ = ~0,
2001  ImGuiDockNodeFlags_NoResizeFlagsMask_ = (int)ImGuiDockNodeFlags_NoResize | ImGuiDockNodeFlags_NoResizeX | ImGuiDockNodeFlags_NoResizeY,
2002 
2003  // When splitting, those local flags are moved to the inheriting child, never duplicated
2004  ImGuiDockNodeFlags_LocalFlagsTransferMask_ = (int)ImGuiDockNodeFlags_NoDockingSplit | ImGuiDockNodeFlags_NoResizeFlagsMask_ | (int)ImGuiDockNodeFlags_AutoHideTabBar | ImGuiDockNodeFlags_CentralNode | ImGuiDockNodeFlags_NoTabBar | ImGuiDockNodeFlags_HiddenTabBar | ImGuiDockNodeFlags_NoWindowMenuButton | ImGuiDockNodeFlags_NoCloseButton,
2005  ImGuiDockNodeFlags_SavedFlagsMask_ = ImGuiDockNodeFlags_NoResizeFlagsMask_ | ImGuiDockNodeFlags_DockSpace | ImGuiDockNodeFlags_CentralNode | ImGuiDockNodeFlags_NoTabBar | ImGuiDockNodeFlags_HiddenTabBar | ImGuiDockNodeFlags_NoWindowMenuButton | ImGuiDockNodeFlags_NoCloseButton,
2006 };
2007 
2008 // Store the source authority (dock node vs window) of a field
2009 enum ImGuiDataAuthority_
2010 {
2011  ImGuiDataAuthority_Auto,
2012  ImGuiDataAuthority_DockNode,
2013  ImGuiDataAuthority_Window,
2014 };
2015 
2016 enum ImGuiDockNodeState
2017 {
2018  ImGuiDockNodeState_Unknown,
2019  ImGuiDockNodeState_HostWindowHiddenBecauseSingleWindow,
2020  ImGuiDockNodeState_HostWindowHiddenBecauseWindowsAreResizing,
2021  ImGuiDockNodeState_HostWindowVisible,
2022 };
2023 
2024 // sizeof() 156~192
2025 struct IMGUI_API ImGuiDockNode
2026 {
2027  ImGuiID ID;
2028  ImGuiDockNodeFlags SharedFlags; // (Write) Flags shared by all nodes of a same dockspace hierarchy (inherited from the root node)
2029  ImGuiDockNodeFlags LocalFlags; // (Write) Flags specific to this node
2030  ImGuiDockNodeFlags LocalFlagsInWindows; // (Write) Flags specific to this node, applied from windows
2031  ImGuiDockNodeFlags MergedFlags; // (Read) Effective flags (== SharedFlags | LocalFlagsInNode | LocalFlagsInWindows)
2032  ImGuiDockNodeState State;
2033  ImGuiDockNode* ParentNode;
2034  ImGuiDockNode* ChildNodes[2]; // [Split node only] Child nodes (left/right or top/bottom). Consider switching to an array.
2035  ImVector<ImGuiWindow*> Windows; // Note: unordered list! Iterate TabBar->Tabs for user-order.
2036  ImGuiTabBar* TabBar;
2037  ImVec2 Pos; // Current position
2038  ImVec2 Size; // Current size
2039  ImVec2 SizeRef; // [Split node only] Last explicitly written-to size (overridden when using a splitter affecting the node), used to calculate Size.
2040  ImGuiAxis SplitAxis; // [Split node only] Split axis (X or Y)
2041  ImGuiWindowClass WindowClass; // [Root node only]
2042  ImU32 LastBgColor;
2043 
2044  ImGuiWindow* HostWindow;
2045  ImGuiWindow* VisibleWindow; // Generally point to window which is ID is == SelectedTabID, but when CTRL+Tabbing this can be a different window.
2046  ImGuiDockNode* CentralNode; // [Root node only] Pointer to central node.
2047  ImGuiDockNode* OnlyNodeWithWindows; // [Root node only] Set when there is a single visible node within the hierarchy.
2048  int CountNodeWithWindows; // [Root node only]
2049  int LastFrameAlive; // Last frame number the node was updated or kept alive explicitly with DockSpace() + ImGuiDockNodeFlags_KeepAliveOnly
2050  int LastFrameActive; // Last frame number the node was updated.
2051  int LastFrameFocused; // Last frame number the node was focused.
2052  ImGuiID LastFocusedNodeId; // [Root node only] Which of our child docking node (any ancestor in the hierarchy) was last focused.
2053  ImGuiID SelectedTabId; // [Leaf node only] Which of our tab/window is selected.
2054  ImGuiID WantCloseTabId; // [Leaf node only] Set when closing a specific tab/window.
2055  ImGuiID RefViewportId; // Reference viewport ID from visible window when HostWindow == NULL.
2056  ImGuiDataAuthority AuthorityForPos :3;
2057  ImGuiDataAuthority AuthorityForSize :3;
2058  ImGuiDataAuthority AuthorityForViewport :3;
2059  bool IsVisible :1; // Set to false when the node is hidden (usually disabled as it has no active window)
2060  bool IsFocused :1;
2061  bool IsBgDrawnThisFrame :1;
2062  bool HasCloseButton :1; // Provide space for a close button (if any of the docked window has one). Note that button may be hidden on window without one.
2063  bool HasWindowMenuButton :1;
2064  bool HasCentralNodeChild :1;
2065  bool WantCloseAll :1; // Set when closing all tabs at once.
2066  bool WantLockSizeOnce :1;
2067  bool WantMouseMove :1; // After a node extraction we need to transition toward moving the newly created host window
2068  bool WantHiddenTabBarUpdate :1;
2069  bool WantHiddenTabBarToggle :1;
2070 
2071  ImGuiDockNode(ImGuiID id);
2072  ~ImGuiDockNode();
2073  bool IsRootNode() const { return ParentNode == NULL; }
2074  bool IsDockSpace() const { return (MergedFlags & ImGuiDockNodeFlags_DockSpace) != 0; }
2075  bool IsFloatingNode() const { return ParentNode == NULL && (MergedFlags & ImGuiDockNodeFlags_DockSpace) == 0; }
2076  bool IsCentralNode() const { return (MergedFlags & ImGuiDockNodeFlags_CentralNode) != 0; }
2077  bool IsHiddenTabBar() const { return (MergedFlags & ImGuiDockNodeFlags_HiddenTabBar) != 0; } // Hidden tab bar can be shown back by clicking the small triangle
2078  bool IsNoTabBar() const { return (MergedFlags & ImGuiDockNodeFlags_NoTabBar) != 0; } // Never show a tab bar
2079  bool IsSplitNode() const { return ChildNodes[0] != NULL; }
2080  bool IsLeafNode() const { return ChildNodes[0] == NULL; }
2081  bool IsEmpty() const { return ChildNodes[0] == NULL && Windows.Size == 0; }
2082  ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
2083 
2084  void SetLocalFlags(ImGuiDockNodeFlags flags) { LocalFlags = flags; UpdateMergedFlags(); }
2085  void UpdateMergedFlags() { MergedFlags = SharedFlags | LocalFlags | LocalFlagsInWindows; }
2086 };
2087 
2088 // List of colors that are stored at the time of Begin() into Docked Windows.
2089 // We currently store the packed colors in a simple array window->DockStyle.Colors[].
2090 // A better solution may involve appending into a log of colors in ImGuiContext + store offsets into those arrays in ImGuiWindow,
2091 // but it would be more complex as we'd need to double-buffer both as e.g. drop target may refer to window from last frame.
2092 enum ImGuiWindowDockStyleCol
2093 {
2094  ImGuiWindowDockStyleCol_Text,
2095  ImGuiWindowDockStyleCol_TabHovered,
2096  ImGuiWindowDockStyleCol_TabFocused,
2097  ImGuiWindowDockStyleCol_TabSelected,
2098  ImGuiWindowDockStyleCol_TabSelectedOverline,
2099  ImGuiWindowDockStyleCol_TabDimmed,
2100  ImGuiWindowDockStyleCol_TabDimmedSelected,
2101  ImGuiWindowDockStyleCol_TabDimmedSelectedOverline,
2102  ImGuiWindowDockStyleCol_UnsavedMarker,
2103  ImGuiWindowDockStyleCol_COUNT
2104 };
2105 
2106 // We don't store style.Alpha: dock_node->LastBgColor embeds it and otherwise it would only affect the docking tab, which intuitively I would say we don't want to.
2108 {
2109  ImU32 Colors[ImGuiWindowDockStyleCol_COUNT];
2110 };
2111 
2113 {
2114  ImGuiStorage Nodes; // Map ID -> ImGuiDockNode*: Active nodes
2115  ImVector<ImGuiDockRequest> Requests;
2116  ImVector<ImGuiDockNodeSettings> NodesSettings;
2117  bool WantFullRebuild;
2118  ImGuiDockContext() { memset((void*)this, 0, sizeof(*this)); }
2119 };
2120 
2121 #endif // #ifdef IMGUI_HAS_DOCK
2122 
2123 //-----------------------------------------------------------------------------
2124 // [SECTION] Viewport support
2125 //-----------------------------------------------------------------------------
2126 
2127 // ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!)
2128 // Every instance of ImGuiViewport is in fact a ImGuiViewportP.
2130 {
2131  ImGuiWindow* Window; // Set when the viewport is owned by a window (and ImGuiViewportFlags_CanHostOtherWindows is NOT set)
2132  int Idx;
2133  int LastFrameActive; // Last frame number this viewport was activated by a window
2134  int LastFocusedStampCount; // Last stamp number from when a window hosted by this viewport was focused (by comparing this value between two viewport we have an implicit viewport z-order we use as fallback)
2135  ImGuiID LastNameHash;
2136  ImVec2 LastPos;
2137  ImVec2 LastSize;
2138  float Alpha; // Window opacity (when dragging dockable windows/viewports we make them transparent)
2139  float LastAlpha;
2140  bool LastFocusedHadNavWindow;// Instead of maintaining a LastFocusedWindow (which may harder to correctly maintain), we merely store weither NavWindow != NULL last time the viewport was focused.
2141  short PlatformMonitor;
2142  int BgFgDrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used
2143  ImDrawList* BgFgDrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays.
2144  ImDrawData DrawDataP;
2145  ImDrawDataBuilder DrawDataBuilder; // Temporary data while building final ImDrawData
2146  ImVec2 LastPlatformPos;
2147  ImVec2 LastPlatformSize;
2148  ImVec2 LastRendererSize;
2149 
2150  // Per-viewport work area
2151  // - Insets are >= 0.0f values, distance from viewport corners to work area.
2152  // - BeginMainMenuBar() and DockspaceOverViewport() tend to use work area to avoid stepping over existing contents.
2153  // - Generally 'safeAreaInsets' in iOS land, 'DisplayCutout' in Android land.
2154  ImVec2 WorkInsetMin; // Work Area inset locked for the frame. GetWorkRect() always fits within GetMainRect().
2155  ImVec2 WorkInsetMax; // "
2156  ImVec2 BuildWorkInsetMin; // Work Area inset accumulator for current frame, to become next frame's WorkInset
2157  ImVec2 BuildWorkInsetMax; // "
2158 
2159  ImGuiViewportP() { Window = NULL; Idx = -1; LastFrameActive = BgFgDrawListsLastFrame[0] = BgFgDrawListsLastFrame[1] = LastFocusedStampCount = -1; LastNameHash = 0; Alpha = LastAlpha = 1.0f; LastFocusedHadNavWindow = false; PlatformMonitor = -1; BgFgDrawLists[0] = BgFgDrawLists[1] = NULL; LastPlatformPos = LastPlatformSize = LastRendererSize = ImVec2(FLT_MAX, FLT_MAX); }
2160  ~ImGuiViewportP() { if (BgFgDrawLists[0]) IM_DELETE(BgFgDrawLists[0]); if (BgFgDrawLists[1]) IM_DELETE(BgFgDrawLists[1]); }
2161  void ClearRequestFlags() { PlatformRequestClose = PlatformRequestMove = PlatformRequestResize = false; }
2162 
2163  // Calculate work rect pos/size given a set of offset (we have 1 pair of offset for rect locked from last frame data, and 1 pair for currently building rect)
2164  ImVec2 CalcWorkRectPos(const ImVec2& inset_min) const { return ImVec2(Pos.x + inset_min.x, Pos.y + inset_min.y); }
2165  ImVec2 CalcWorkRectSize(const ImVec2& inset_min, const ImVec2& inset_max) const { return ImVec2(ImMax(0.0f, Size.x - inset_min.x - inset_max.x), ImMax(0.0f, Size.y - inset_min.y - inset_max.y)); }
2166  void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkInsetMin); WorkSize = CalcWorkRectSize(WorkInsetMin, WorkInsetMax); } // Update public fields
2167 
2168  // Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry)
2169  ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
2170  ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); }
2171  ImRect GetBuildWorkRect() const { ImVec2 pos = CalcWorkRectPos(BuildWorkInsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkInsetMin, BuildWorkInsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); }
2172 };
2173 
2174 //-----------------------------------------------------------------------------
2175 // [SECTION] Settings support
2176 //-----------------------------------------------------------------------------
2177 
2178 // Windows data saved in imgui.ini file
2179 // Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily.
2180 // (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure)
2182 {
2183  ImGuiID ID;
2184  ImVec2ih Pos; // NB: Settings position are stored RELATIVE to the viewport! Whereas runtime ones are absolute positions.
2185  ImVec2ih Size;
2186  ImVec2ih ViewportPos;
2187  ImGuiID ViewportId;
2188  ImGuiID DockId; // ID of last known DockNode (even if the DockNode is invisible because it has only 1 active window), or 0 if none.
2189  ImGuiID ClassId; // ID of window class if specified
2190  short DockOrder; // Order of the last time the window was visible within its DockNode. This is used to reorder windows that are reappearing on the same frame. Same value between windows that were active and windows that were none are possible.
2191  bool Collapsed;
2192  bool IsChild;
2193  bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
2194  bool WantDelete; // Set to invalidate/delete the settings entry
2195 
2196  ImGuiWindowSettings() { memset((void*)this, 0, sizeof(*this)); DockOrder = -1; }
2197  char* GetName() { return (char*)(this + 1); }
2198 };
2199 
2201 {
2202  const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'
2203  ImGuiID TypeHash; // == ImHashStr(TypeName)
2204  void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data
2205  void (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called before reading (in registration order)
2206  void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]"
2207  void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry
2208  void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order)
2209  void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf'
2210  void* UserData;
2211 
2212  ImGuiSettingsHandler() { memset((void*)this, 0, sizeof(*this)); }
2213 };
2214 
2215 //-----------------------------------------------------------------------------
2216 // [SECTION] Localization support
2217 //-----------------------------------------------------------------------------
2218 
2219 // This is experimental and not officially supported, it'll probably fall short of features, if/when it does we may backtrack.
2220 enum ImGuiLocKey : int
2221 {
2222  ImGuiLocKey_VersionStr,
2223  ImGuiLocKey_TableSizeOne,
2224  ImGuiLocKey_TableSizeAllFit,
2225  ImGuiLocKey_TableSizeAllDefault,
2226  ImGuiLocKey_TableResetOrder,
2227  ImGuiLocKey_WindowingMainMenuBar,
2228  ImGuiLocKey_WindowingPopup,
2229  ImGuiLocKey_WindowingUntitled,
2230  ImGuiLocKey_OpenLink_s,
2231  ImGuiLocKey_CopyLink,
2232  ImGuiLocKey_DockingHideTabBar,
2233  ImGuiLocKey_DockingHoldShiftToDock,
2234  ImGuiLocKey_DockingDragToUndockOrMoveNode,
2235  ImGuiLocKey_COUNT
2236 };
2237 
2239 {
2240  ImGuiLocKey Key;
2241  const char* Text;
2242 };
2243 
2244 //-----------------------------------------------------------------------------
2245 // [SECTION] Error handling, State recovery support
2246 //-----------------------------------------------------------------------------
2247 
2248 // Macros used by Recoverable Error handling
2249 // - Only dispatch error if _EXPR: evaluate as assert (similar to an assert macro).
2250 // - The message will always be a string literal, in order to increase likelihood of being display by an assert handler.
2251 // - See 'Demo->Configuration->Error Handling' and ImGuiIO definitions for details on error handling.
2252 // - Read https://github.com/ocornut/imgui/wiki/Error-Handling for details on error handling.
2253 #ifndef IM_ASSERT_USER_ERROR
2254 #define IM_ASSERT_USER_ERROR(_EXPR,_MSG) do { if (!(_EXPR)) { if (ImGui::ErrorLog(_MSG)) { IM_ASSERT((_EXPR) && _MSG); } } } while (0) // Recoverable User Error
2255 #define IM_ASSERT_USER_ERROR_RET(_EXPR,_MSG) do { if (!(_EXPR)) { if (ImGui::ErrorLog(_MSG)) { IM_ASSERT((_EXPR) && _MSG); } return; } } while (0) // Recoverable User Error
2256 #define IM_ASSERT_USER_ERROR_RETV(_EXPR,_RETV,_MSG) do { if (!(_EXPR)) { if (ImGui::ErrorLog(_MSG)) { IM_ASSERT((_EXPR) && _MSG); } return _RETV; } } while (0) // Recoverable User Error
2257 #endif
2258 
2259 // The error callback is currently not public, as it is expected that only advanced users will rely on it.
2260 typedef void (*ImGuiErrorCallback)(ImGuiContext* ctx, void* user_data, const char* msg); // Function signature for g.ErrorCallback
2261 
2262 //-----------------------------------------------------------------------------
2263 // [SECTION] Metrics, Debug Tools
2264 //-----------------------------------------------------------------------------
2265 
2266 // See IMGUI_DEBUG_LOG() and IMGUI_DEBUG_LOG_XXX() macros.
2267 enum ImGuiDebugLogFlags_
2268 {
2269  // Event types
2270  ImGuiDebugLogFlags_None = 0,
2271  ImGuiDebugLogFlags_EventError = 1 << 0, // Error submitted by IM_ASSERT_USER_ERROR()
2272  ImGuiDebugLogFlags_EventActiveId = 1 << 1,
2273  ImGuiDebugLogFlags_EventFocus = 1 << 2,
2274  ImGuiDebugLogFlags_EventPopup = 1 << 3,
2275  ImGuiDebugLogFlags_EventNav = 1 << 4,
2276  ImGuiDebugLogFlags_EventClipper = 1 << 5,
2277  ImGuiDebugLogFlags_EventSelection = 1 << 6,
2278  ImGuiDebugLogFlags_EventIO = 1 << 7,
2279  ImGuiDebugLogFlags_EventFont = 1 << 8,
2280  ImGuiDebugLogFlags_EventInputRouting = 1 << 9,
2281  ImGuiDebugLogFlags_EventDocking = 1 << 10,
2282  ImGuiDebugLogFlags_EventViewport = 1 << 11,
2283 
2284  ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventError | ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventFont | ImGuiDebugLogFlags_EventInputRouting | ImGuiDebugLogFlags_EventDocking | ImGuiDebugLogFlags_EventViewport,
2285  ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY
2286  ImGuiDebugLogFlags_OutputToDebugger = 1 << 21, // Also send output to Debugger Console [Windows only]
2287  ImGuiDebugLogFlags_OutputToTestEngine = 1 << 22, // Also send output to Dear ImGui Test Engine
2288 };
2289 
2291 {
2292  int FrameCount;
2293  ImS16 AllocCount;
2294  ImS16 FreeCount;
2295 };
2296 
2298 {
2299  int TotalAllocCount; // Number of call to MemAlloc().
2300  int TotalFreeCount;
2301  ImS16 LastEntriesIdx; // Current index in buffer
2302  ImGuiDebugAllocEntry LastEntriesBuf[6]; // Track last 6 frames that had allocations
2303 
2304  ImGuiDebugAllocInfo() { memset((void*)this, 0, sizeof(*this)); }
2305 };
2306 
2308 {
2309  bool ShowDebugLog = false;
2310  bool ShowIDStackTool = false;
2311  bool ShowWindowsRects = false;
2312  bool ShowWindowsBeginOrder = false;
2313  bool ShowTablesRects = false;
2314  bool ShowDrawCmdMesh = true;
2315  bool ShowDrawCmdBoundingBoxes = true;
2316  bool ShowTextEncodingViewer = false;
2317  bool ShowTextureUsedRect = false;
2318  bool ShowDockingNodes = false;
2319  int ShowWindowsRectsType = -1;
2320  int ShowTablesRectsType = -1;
2321  int HighlightMonitorIdx = -1;
2322  ImGuiID HighlightViewportID = 0;
2323  bool ShowFontPreview = true;
2324 };
2325 
2327 {
2328  ImGuiID ID;
2329  ImS8 QueryFrameCount; // >= 1: Sub-query in progress
2330  bool QuerySuccess; // Sub-query obtained result from DebugHookIdInfo()
2331  ImS8 DataType; // ImGuiDataType
2332  int DescOffset; // -1 or offset into parent's ResultsPathsBuf
2333 
2334  ImGuiStackLevelInfo() { memset((void*)this, 0, sizeof(*this)); DataType = -1; DescOffset = -1; }
2335 };
2336 
2338 {
2339  ImGuiID MainID; // ID to query details for.
2340  bool Active; // Used to disambiguate the case when ID == 0 and e.g. some code calls PushOverrideID(0).
2341  bool Complete; // All sub-queries are finished (some may have failed).
2342  ImS8 Step; // -1: query stack + init Results, >= 0: filling individual stack level.
2344  ImGuiTextBuffer ResultsDescBuf;
2345  ImGuiTextBuffer ResultPathBuf;
2346 
2347  ImGuiDebugItemPathQuery() { memset((void*)this, 0, sizeof(*this)); }
2348 };
2349 
2350 // State for ID Stack tool queries
2352 {
2353  bool OptHexEncodeNonAsciiChars;
2354  bool OptCopyToClipboardOnCtrlC;
2355  int LastActiveFrame;
2356  float CopyToClipboardLastTime;
2357 
2358  ImGuiIDStackTool() { memset((void*)this, 0, sizeof(*this)); LastActiveFrame = -1; OptHexEncodeNonAsciiChars = true; CopyToClipboardLastTime = -FLT_MAX; }
2359 };
2360 
2361 //-----------------------------------------------------------------------------
2362 // [SECTION] Generic context hooks
2363 //-----------------------------------------------------------------------------
2364 
2365 typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook);
2366 enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ };
2367 
2369 {
2370  ImGuiID HookId; // A unique ID assigned by AddContextHook()
2371  ImGuiContextHookType Type;
2372  ImGuiID Owner;
2373  ImGuiContextHookCallback Callback;
2374  void* UserData;
2375 
2376  ImGuiContextHook() { memset((void*)this, 0, sizeof(*this)); }
2377 };
2378 
2379 //-----------------------------------------------------------------------------
2380 // [SECTION] ImGuiContext (main Dear ImGui context)
2381 //-----------------------------------------------------------------------------
2382 
2384 {
2385  bool Initialized;
2386  bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame()
2387  bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed
2388  bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log()
2389  int FrameCount;
2390  int FrameCountEnded;
2391  int FrameCountPlatformEnded;
2392  int FrameCountRendered;
2393  double Time;
2394  char ContextName[16]; // Storage for a context name (to facilitate debugging multi-context setups)
2395  ImGuiIO IO;
2396  ImGuiPlatformIO PlatformIO;
2397  ImGuiStyle Style;
2398  ImGuiConfigFlags ConfigFlagsCurrFrame; // = g.IO.ConfigFlags at the time of NewFrame()
2399  ImGuiConfigFlags ConfigFlagsLastFrame;
2400  ImVector<ImFontAtlas*> FontAtlases; // List of font atlases used by the context (generally only contains g.IO.Fonts aka the main font atlas)
2401  ImFont* Font; // Currently bound font. (== FontStack.back().Font)
2402  ImFontBaked* FontBaked; // Currently bound font at currently bound size. (== Font->GetFontBaked(FontSize))
2403  float FontSize; // Currently bound font size == line height (== FontSizeBase + externals scales applied in the UpdateCurrentFontSize() function).
2404  float FontSizeBase; // Font size before scaling == style.FontSizeBase == value passed to PushFont() when specified.
2405  float FontBakedScale; // == FontBaked->Size / FontSize. Scale factor over baked size. Rarely used nowadays, very often == 1.0f.
2406  float FontRasterizerDensity; // Current font density. Used by all calls to GetFontBaked().
2407  float CurrentDpiScale; // Current window/viewport DpiScale == CurrentViewport->DpiScale
2408  ImDrawListSharedData DrawListSharedData;
2409  ImGuiID WithinEndChildID; // Set within EndChild()
2410  void* TestEngine; // Test engine user data
2411 
2412  // Inputs
2413  ImVector<ImGuiInputEvent> InputEventsQueue; // Input events which will be trickled/written into IO structure.
2414  ImVector<ImGuiInputEvent> InputEventsTrail; // Past input events processed in NewFrame(). This is to allow domain-specific application to access e.g mouse/pen trail.
2415  ImGuiMouseSource InputEventsNextMouseSource;
2416  ImU32 InputEventsNextEventId;
2417 
2418  // Windows state
2419  ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front
2420  ImVector<ImGuiWindow*> WindowsFocusOrder; // Root windows, sorted in focus order, back to front.
2421  ImVector<ImGuiWindow*> WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child
2422  ImVector<ImGuiWindowStackData> CurrentWindowStack;
2423  ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow*
2424  int WindowsActiveCount; // Number of unique windows submitted by frame
2425  float WindowsBorderHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, style.WindowBorderHoverPadding). This isn't so multi-dpi friendly.
2426  ImGuiID DebugBreakInWindow; // Set to break in Begin() call.
2427  ImGuiWindow* CurrentWindow; // Window being drawn into
2428  ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs.
2429  ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.
2430  ImGuiWindow* HoveredWindowBeforeClear; // Window the mouse is hovering. Filled even with _NoMouse. This is currently useful for multi-context compositors.
2431  ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindowDockTree.
2432  ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window.
2433  ImVec2 WheelingWindowRefMousePos;
2434  int WheelingWindowStartFrame; // This may be set one frame before WheelingWindow is != NULL
2435  int WheelingWindowScrolledFrame;
2436  float WheelingWindowReleaseTimer;
2437  ImVec2 WheelingWindowWheelRemainder;
2438  ImVec2 WheelingAxisAvg;
2439 
2440  // Item/widgets state and tracking information
2441  ImGuiID DebugDrawIdConflictsId; // Set when we detect multiple items with the same identifier
2442  ImGuiID DebugHookIdInfoId; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by ID Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line]
2443  ImGuiID HoveredId; // Hovered widget, filled during the frame
2444  ImGuiID HoveredIdPreviousFrame;
2445  int HoveredIdPreviousFrameItemCount; // Count numbers of items using the same ID as last frame's hovered id
2446  float HoveredIdTimer; // Measure contiguous hovering time
2447  float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active
2448  bool HoveredIdAllowOverlap;
2449  bool HoveredIdIsDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0.
2450  bool ItemUnclipByLog; // Disable ItemAdd() clipping, essentially a memory-locality friendly copy of LogEnabled
2451  ImGuiID ActiveId; // Active widget
2452  ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)
2453  float ActiveIdTimer;
2454  bool ActiveIdIsJustActivated; // Set at the time of activation for one frame
2455  bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
2456  bool ActiveIdNoClearOnFocusLoss; // Disable losing active id if the active id window gets unfocused.
2457  bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch.
2458  bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state.
2459  bool ActiveIdHasBeenEditedThisFrame;
2460  bool ActiveIdFromShortcut;
2461  ImS8 ActiveIdMouseButton;
2462  ImGuiID ActiveIdDisabledId; // When clicking a disabled item we set ActiveId=window->MoveId to avoid interference with widget code. Actual item ID is stored here.
2463  ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
2464  ImGuiInputSource ActiveIdSource; // Activating source: ImGuiInputSource_Mouse OR ImGuiInputSource_Keyboard OR ImGuiInputSource_Gamepad
2465  ImGuiWindow* ActiveIdWindow;
2466  ImGuiID ActiveIdPreviousFrame;
2467  ImGuiDeactivatedItemData DeactivatedItemData;
2468  ImGuiDataTypeStorage ActiveIdValueOnActivation; // Backup of initial value at the time of activation. ONLY SET BY SPECIFIC WIDGETS: DragXXX and SliderXXX.
2469  ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.
2470  float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
2471 
2472  // Key/Input Ownership + Shortcut Routing system
2473  // - The idea is that instead of "eating" a given key, we can link to an owner.
2474  // - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID.
2475  // - Routing is requested ahead of time for a given chord (Key + Mods) and granted in NewFrame().
2476  double LastKeyModsChangeTime; // Record the last time key mods changed (affect repeat delay when using shortcut logic)
2477  double LastKeyModsChangeFromNoneTime; // Record the last time key mods changed away from being 0 (affect repeat delay when using shortcut logic)
2478  double LastKeyboardKeyPressTime; // Record the last time a keyboard key (ignore mouse/gamepad ones) was pressed.
2479  ImBitArrayForNamedKeys KeysMayBeCharInput; // Lookup to tell if a key can emit char input, see IsKeyChordPotentiallyCharInput(). sizeof() = 20 bytes
2480  ImGuiKeyOwnerData KeysOwnerData[ImGuiKey_NamedKey_COUNT];
2481  ImGuiKeyRoutingTable KeysRoutingTable;
2482  ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it)
2483  bool ActiveIdUsingAllKeyboardKeys; // Active widget will want to read all keyboard keys inputs. (this is a shortcut for not taking ownership of 100+ keys, frequently used by drag operations)
2484  ImGuiKeyChord DebugBreakInShortcutRouting; // Set to break in SetShortcutRouting()/Shortcut() calls.
2485  //ImU32 ActiveIdUsingNavInputMask; // [OBSOLETE] Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes --> 'SetKeyOwner(ImGuiKey_Escape, g.ActiveId) and/or SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId);'
2486 
2487  // Next window/item data
2488  ImGuiID CurrentFocusScopeId; // Value for currently appending items == g.FocusScopeStack.back(). Not to be mistaken with g.NavFocusScopeId.
2489  ImGuiItemFlags CurrentItemFlags; // Value for currently appending items == g.ItemFlagsStack.back()
2490  ImGuiID DebugLocateId; // Storage for DebugLocateItemOnHover() feature: this is read by ItemAdd() so we keep it in a hot/cached location
2491  ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions
2492  ImGuiLastItemData LastItemData; // Storage for last submitted item (setup by ItemAdd)
2493  ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions
2494  bool DebugShowGroupRects;
2495  bool GcCompactAll; // Request full GC
2496 
2497  // Shared stacks
2498  ImGuiCol DebugFlashStyleColorIdx; // (Keep close to ColorStack to share cache line)
2499  ImVector<ImGuiColorMod> ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin()
2500  ImVector<ImGuiStyleMod> StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin()
2501  ImVector<ImFontStackData> FontStack; // Stack for PushFont()/PopFont() - inherited by Begin()
2502  ImVector<ImGuiFocusScopeData> FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin()
2503  ImVector<ImGuiItemFlags> ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin()
2504  ImVector<ImGuiGroupData> GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin()
2505  ImVector<ImGuiPopupData> OpenPopupStack; // Which popups are open (persistent)
2506  ImVector<ImGuiPopupData> BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)
2507  ImVector<ImGuiTreeNodeStackData>TreeNodeStack; // Stack for TreeNode()
2508 
2509  // Viewports
2510  ImVector<ImGuiViewportP*> Viewports; // Active viewports (always 1+, and generally 1 unless multi-viewports are enabled). Each viewports hold their copy of ImDrawData.
2511  ImGuiViewportP* CurrentViewport; // We track changes of viewport (happening in Begin) so we can call Platform_OnChangedViewport()
2512  ImGuiViewportP* MouseViewport;
2513  ImGuiViewportP* MouseLastHoveredViewport; // Last known viewport that was hovered by mouse (even if we are not hovering any viewport any more) + honoring the _NoInputs flag.
2514  ImGuiID PlatformLastFocusedViewportId;
2515  ImGuiPlatformMonitor FallbackMonitor; // Virtual monitor used as fallback if backend doesn't provide monitor information.
2516  ImRect PlatformMonitorsFullWorkRect; // Bounding box of all platform monitors
2517  int ViewportCreatedCount; // Unique sequential creation counter (mostly for testing/debugging)
2518  int PlatformWindowsCreatedCount; // Unique sequential creation counter (mostly for testing/debugging)
2519  int ViewportFocusedStampCount; // Every time the front-most window changes, we stamp its viewport with an incrementing counter
2520 
2521  // Keyboard/Gamepad Navigation
2522  bool NavCursorVisible; // Nav focus cursor/rectangle is visible? We hide it after a mouse click. We show it after a nav move.
2523  bool NavHighlightItemUnderNav; // Disable mouse hovering highlight. Highlight navigation focused item instead of mouse hovered item.
2524  //bool NavDisableHighlight; // Old name for !g.NavCursorVisible before 1.91.4 (2024/10/18). OPPOSITE VALUE (g.NavDisableHighlight == !g.NavCursorVisible)
2525  //bool NavDisableMouseHover; // Old name for g.NavHighlightItemUnderNav before 1.91.1 (2024/10/18) this was called When user starts using keyboard/gamepad, we hide mouse hovering highlight until mouse is touched again.
2526  bool NavMousePosDirty; // When set we will update mouse position if io.ConfigNavMoveSetMousePos is set (not enabled by default)
2527  bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid
2528  ImGuiID NavId; // Focused item for navigation
2529  ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow'
2530  ImGuiID NavFocusScopeId; // Focused focus scope (e.g. selection code often wants to "clear other items" when landing on an item of the same scope)
2531  ImGuiNavLayer NavLayer; // Focused layer (main scrolling layer, or menu/title bar layer)
2532  ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItemByID()
2533  ImGuiID NavActivateDownId; // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 0
2534  ImGuiID NavActivatePressedId; // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat)
2535  ImGuiActivateFlags NavActivateFlags;
2536  ImVector<ImGuiFocusScopeData> NavFocusRoute; // Reversed copy focus scope stack for NavId (should contains NavFocusScopeId). This essentially follow the window->ParentWindowForFocusRoute chain.
2537  ImGuiID NavHighlightActivatedId;
2538  float NavHighlightActivatedTimer;
2539  ImGuiID NavNextActivateId; // Set by ActivateItemByID(), queued until next frame.
2540  ImGuiActivateFlags NavNextActivateFlags;
2541  ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS CAN ONLY BE ImGuiInputSource_Keyboard or ImGuiInputSource_Gamepad
2542  ImGuiSelectionUserData NavLastValidSelectionUserData; // Last valid data passed to SetNextItemSelectionUser(), or -1. For current window. Not reset when focusing an item that doesn't have selection data.
2543  ImS8 NavCursorHideFrames;
2544  //ImGuiID NavActivateInputId; // Removed in 1.89.4 (July 2023). This is now part of g.NavActivateId and sets g.NavActivateFlags |= ImGuiActivateFlags_PreferInput. See commit c9a53aa74, issue #5606.
2545 
2546  // Navigation: Init & Move Requests
2547  bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest this is to perform early out in ItemAdd()
2548  bool NavInitRequest; // Init request for appearing window to select first item
2549  bool NavInitRequestFromMove;
2550  ImGuiNavItemData NavInitResult; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called)
2551  bool NavMoveSubmitted; // Move request submitted, will process result on next NewFrame()
2552  bool NavMoveScoringItems; // Move request submitted, still scoring incoming items
2553  bool NavMoveForwardToNextFrame;
2554  ImGuiNavMoveFlags NavMoveFlags;
2555  ImGuiScrollFlags NavMoveScrollFlags;
2556  ImGuiKeyChord NavMoveKeyMods;
2557  ImGuiDir NavMoveDir; // Direction of the move request (left/right/up/down)
2558  ImGuiDir NavMoveDirForDebug;
2559  ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename?
2560  ImRect NavScoringRect; // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring.
2561  ImRect NavScoringNoClipRect; // Some nav operations (such as PageUp/PageDown) enforce a region which clipper will attempt to always keep submitted. Unset/invalid if inverted.
2562  int NavScoringDebugCount; // Metrics for debugging
2563  int NavTabbingDir; // Generally -1 or +1, 0 when tabbing without a nav id
2564  int NavTabbingCounter; // >0 when counting items for tabbing
2565  ImGuiNavItemData NavMoveResultLocal; // Best move request candidate within NavWindow
2566  ImGuiNavItemData NavMoveResultLocalVisible; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag)
2567  ImGuiNavItemData NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)
2568  ImGuiNavItemData NavTabbingResultFirst; // First tabbing request candidate within NavWindow and flattened hierarchy
2569 
2570  // Navigation: record of last move request
2571  ImGuiID NavJustMovedFromFocusScopeId; // Just navigated from this focus scope id (result of a successfully MoveRequest).
2572  ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest).
2573  ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest).
2574  ImGuiKeyChord NavJustMovedToKeyMods;
2575  bool NavJustMovedToIsTabbing; // Copy of ImGuiNavMoveFlags_IsTabbing. Maybe we should store whole flags.
2576  bool NavJustMovedToHasSelectionData; // Copy of move result's ItemFlags & ImGuiItemFlags_HasSelectionUserData). Maybe we should just store ImGuiNavItemData.
2577 
2578  // Navigation: extra config options (will be made public eventually)
2579  // - Tabbing (Tab, Shift+Tab) and Windowing (Ctrl+Tab, Ctrl+Shift+Tab) are enabled REGARDLESS of ImGuiConfigFlags_NavEnableKeyboard being set.
2580  // - Ctrl+Tab is reconfigurable because it is the only shortcut that may be polled when no window are focused. It also doesn't work e.g. Web platforms.
2581  bool ConfigNavEnableTabbing; // = true. Enable tabbing (Tab, Shift+Tab). PLEASE LET ME KNOW IF YOU USE THIS.
2582  bool ConfigNavWindowingWithGamepad; // = true. Enable Ctrl+Tab by holding ImGuiKey_GamepadFaceLeft (== ImGuiKey_NavGamepadMenu). When false, the button may still be used to toggle Menu layer.
2583  ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiKey_Tab on OS X). Set to 0 to disable. For reconfiguration (see #4828)
2584  ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab on OS X)
2585 
2586  // Navigation: Windowing (Ctrl+Tab for list, or Menu button + keys or directional pads to move/resize)
2587  ImGuiWindow* NavWindowingTarget; // Target window when doing Ctrl+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most!
2588  ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it.
2589  ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the Ctrl+Tab contents
2590  float NavWindowingTimer;
2591  float NavWindowingHighlightAlpha;
2592  ImGuiInputSource NavWindowingInputSource;
2593  bool NavWindowingToggleLayer; // Set while Alt or GamepadMenu is held, may be cleared by other operations, and processed when releasing the key.
2594  ImGuiKey NavWindowingToggleKey; // Keyboard/gamepad key used when toggling to menu layer.
2595  ImVec2 NavWindowingAccumDeltaPos;
2596  ImVec2 NavWindowingAccumDeltaSize;
2597 
2598  // Render
2599  float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and Ctrl+Tab list)
2600 
2601  // Drag and Drop
2602  bool DragDropActive;
2603  bool DragDropWithinSource; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source.
2604  bool DragDropWithinTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target.
2605  ImGuiDragDropFlags DragDropSourceFlags;
2606  int DragDropSourceFrameCount;
2607  int DragDropMouseButton;
2608  ImGuiPayload DragDropPayload;
2609  ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping)
2610  ImRect DragDropTargetClipRect; // Store ClipRect at the time of item's drawing
2611  ImGuiID DragDropTargetId;
2612  ImGuiID DragDropTargetFullViewport;
2613  ImGuiDragDropFlags DragDropAcceptFlagsCurr;
2614  ImGuiDragDropFlags DragDropAcceptFlagsPrev;
2615  float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface)
2616  ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload)
2617  ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets)
2618  int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source
2619  ImGuiID DragDropHoldJustPressedId; // Set when holding a payload just made ButtonBehavior() return a press.
2620  ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size
2621  unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads
2622 
2623  // Clipper
2624  int ClipperTempDataStacked;
2625  ImVector<ImGuiListClipperData> ClipperTempData;
2626 
2627  // Tables
2628  ImGuiTable* CurrentTable;
2629  ImGuiID DebugBreakInTable; // Set to break in BeginTable() call.
2630  int TablesTempDataStacked; // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size)
2631  ImVector<ImGuiTableTempData> TablesTempData; // Temporary table data (buffers reused/shared across instances, support nesting)
2632  ImPool<ImGuiTable> Tables; // Persistent table data
2633  ImVector<float> TablesLastTimeActive; // Last used timestamp of each tables (SOA, for efficient GC)
2634  ImVector<ImDrawChannel> DrawChannelsTempMergeBuffer;
2635 
2636  // Tab bars
2637  ImGuiTabBar* CurrentTabBar;
2638  ImPool<ImGuiTabBar> TabBars;
2639  ImVector<ImGuiPtrOrIndex> CurrentTabBarStack;
2640  ImVector<ImGuiShrinkWidthItem> ShrinkWidthBuffer;
2641 
2642  // Multi-Select state
2643  ImGuiBoxSelectState BoxSelectState;
2644  ImGuiMultiSelectTempData* CurrentMultiSelect;
2645  int MultiSelectTempDataStacked; // Temporary multi-select data size (because we leave previous instances undestructed, we generally don't use MultiSelectTempData.Size)
2646  ImVector<ImGuiMultiSelectTempData> MultiSelectTempData;
2647  ImPool<ImGuiMultiSelectState> MultiSelectStorage;
2648 
2649  // Hover Delay system
2650  ImGuiID HoverItemDelayId;
2651  ImGuiID HoverItemDelayIdPreviousFrame;
2652  float HoverItemDelayTimer; // Currently used by IsItemHovered()
2653  float HoverItemDelayClearTimer; // Currently used by IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared.
2654  ImGuiID HoverItemUnlockedStationaryId; // Mouse has once been stationary on this item. Only reset after departing the item.
2655  ImGuiID HoverWindowUnlockedStationaryId; // Mouse has once been stationary on this window. Only reset after departing the window.
2656 
2657  // Mouse state
2658  ImGuiMouseCursor MouseCursor;
2659  float MouseStationaryTimer; // Time the mouse has been stationary (with some loose heuristic)
2660  ImVec2 MouseLastValidPos;
2661 
2662  // Widget state
2663  ImGuiInputTextState InputTextState;
2664  ImGuiTextIndex InputTextLineIndex; // Temporary storage
2665  ImGuiInputTextDeactivatedState InputTextDeactivatedState;
2666  ImFontBaked InputTextPasswordFontBackupBaked;
2667  ImFontFlags InputTextPasswordFontBackupFlags;
2668  ImGuiID TempInputId; // Temporary text input when using Ctrl+Click on a slider, etc.
2669  ImGuiDataTypeStorage DataTypeZeroValue; // 0 for all data types
2670  int BeginMenuDepth;
2671  int BeginComboDepth;
2672  ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
2673  ImGuiID ColorEditCurrentID; // Set temporarily while inside of the parent-most ColorEdit4/ColorPicker4 (because they call each others).
2674  ImGuiID ColorEditSavedID; // ID we are saving/restoring HS for
2675  float ColorEditSavedHue; // Backup of last Hue associated to LastColor, so we can restore Hue in lossy RGB<>HSV round trips
2676  float ColorEditSavedSat; // Backup of last Saturation associated to LastColor, so we can restore Saturation in lossy RGB<>HSV round trips
2677  ImU32 ColorEditSavedColor; // RGB value with alpha set to 0.
2678  ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker.
2679  ImGuiComboPreviewData ComboPreviewData;
2680  ImRect WindowResizeBorderExpectedRect; // Expected border rect, switch to relative edit if moving
2681  bool WindowResizeRelativeMode;
2682  short ScrollbarSeekMode; // 0: scroll to clicked location, -1/+1: prev/next page.
2683  float ScrollbarClickDeltaToGrabCenter; // When scrolling to mouse location: distance between mouse and center of grab box, normalized in parent space.
2684  float SliderGrabClickOffset;
2685  float SliderCurrentAccum; // Accumulated slider delta when using navigation controls.
2686  bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it?
2687  bool DragCurrentAccumDirty;
2688  float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
2689  float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
2690  float DisabledAlphaBackup; // Backup for style.Alpha for BeginDisabled()
2691  short DisabledStackSize;
2692  short TooltipOverrideCount;
2693  ImGuiWindow* TooltipPreviousWindow; // Window of last tooltip submitted during the frame
2694  ImVector<char> ClipboardHandlerData; // If no custom clipboard handler is defined
2695  ImVector<ImGuiID> MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once
2696  ImGuiTypingSelectState TypingSelectState; // State for GetTypingSelectRequest()
2697 
2698  // Platform support
2699  ImGuiPlatformImeData PlatformImeData; // Data updated by current frame. Will be applied at end of the frame. For some backends, this is required to have WantVisible=true in order to receive text message.
2700  ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data. When changed we call the platform_io.Platform_SetImeDataFn() handler.
2701 
2702  // Extensions
2703  // FIXME: We could provide an API to register one slot in an array held in ImGuiContext?
2704  ImVector<ImTextureData*> UserTextures; // List of textures created/managed by user or third-party extension. Automatically appended into platform_io.Textures[].
2705  ImGuiDockContext DockContext;
2706  void (*DockNodeWindowMenuHandler)(ImGuiContext* ctx, ImGuiDockNode* node, ImGuiTabBar* tab_bar);
2707 
2708  // Settings
2709  bool SettingsLoaded;
2710  float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero
2711  ImGuiTextBuffer SettingsIniData; // In memory .ini settings
2712  ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers
2713  ImChunkStream<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries
2714  ImChunkStream<ImGuiTableSettings> SettingsTables; // ImGuiTable .ini settings entries
2715  ImVector<ImGuiContextHook> Hooks; // Hooks for extensions (e.g. test engine)
2716  ImGuiID HookIdNext; // Next available HookId
2717 
2718  // Localization
2719  const char* LocalizationTable[ImGuiLocKey_COUNT];
2720 
2721  // Capture/Logging
2722  bool LogEnabled; // Currently capturing
2723  bool LogLineFirstItem;
2724  ImGuiLogFlags LogFlags; // Capture flags/type
2725  ImGuiWindow* LogWindow;
2726  ImFileHandle LogFile; // If != NULL log to stdout/ file
2727  ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
2728  const char* LogNextPrefix; // See comment in LogSetNextTextDecoration(): doesn't copy underlying data, use carefully!
2729  const char* LogNextSuffix;
2730  float LogLinePosY;
2731  int LogDepthRef;
2732  int LogDepthToExpand;
2733  int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call.
2734 
2735  // Error Handling
2736  ImGuiErrorCallback ErrorCallback; // = NULL. May be exposed in public API eventually.
2737  void* ErrorCallbackUserData; // = NULL
2738  ImVec2 ErrorTooltipLockedPos;
2739  bool ErrorFirst;
2740  int ErrorCountCurrentFrame; // [Internal] Number of errors submitted this frame.
2741  ImGuiErrorRecoveryState StackSizesInNewFrame; // [Internal]
2742  ImGuiErrorRecoveryState*StackSizesInBeginForCurrentWindow; // [Internal]
2743 
2744  // Debug Tools
2745  // (some of the highly frequently used data are interleaved in other structures above: DebugBreakXXX fields, DebugHookIdInfo, DebugLocateId etc.)
2746  int DebugDrawIdConflictsCount; // Locked count (preserved when holding Ctrl)
2747  ImGuiDebugLogFlags DebugLogFlags;
2748  ImGuiTextBuffer DebugLogBuf;
2749  ImGuiTextIndex DebugLogIndex;
2750  int DebugLogSkippedErrors;
2751  ImGuiDebugLogFlags DebugLogAutoDisableFlags;
2752  ImU8 DebugLogAutoDisableFrames;
2753  ImU8 DebugLocateFrames; // For DebugLocateItemOnHover(). This is used together with DebugLocateId which is in a hot/cached spot above.
2754  bool DebugBreakInLocateId; // Debug break in ItemAdd() call for g.DebugLocateId.
2755  ImGuiKeyChord DebugBreakKeyChord; // = ImGuiKey_Pause
2756  ImS8 DebugBeginReturnValueCullDepth; // Cycle between 0..9 then wrap around.
2757  bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker())
2758  ImU8 DebugItemPickerMouseButton;
2759  ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this ID
2760  float DebugFlashStyleColorTime;
2761  ImVec4 DebugFlashStyleColorBackup;
2762  ImGuiMetricsConfig DebugMetricsConfig;
2763  ImGuiDebugItemPathQuery DebugItemPathQuery;
2764  ImGuiIDStackTool DebugIDStackTool;
2765  ImGuiDebugAllocInfo DebugAllocInfo;
2766  ImGuiDockNode* DebugHoveredDockNode; // Hovered dock node.
2767 #if defined(IMGUI_DEBUG_HIGHLIGHT_ALL_ID_CONFLICTS) && !defined(IMGUI_DISABLE_DEBUG_TOOLS)
2768  ImGuiStorage DebugDrawIdConflictsAliveCount;
2769  ImGuiStorage DebugDrawIdConflictsHighlightSet;
2770 #endif
2771 
2772  // Misc
2773  float FramerateSecPerFrame[60]; // Calculate estimate of framerate for user over the last 60 frames..
2774  int FramerateSecPerFrameIdx;
2775  int FramerateSecPerFrameCount;
2776  float FramerateSecPerFrameAccum;
2777  int WantCaptureMouseNextFrame; // Explicit capture override via SetNextFrameWantCaptureMouse()/SetNextFrameWantCaptureKeyboard(). Default to -1.
2778  int WantCaptureKeyboardNextFrame; // "
2779  int WantTextInputNextFrame; // Copied in EndFrame() from g.PlatformImeData.WantTextInput. Needs to be set for some backends (SDL3) to emit character inputs.
2780  ImVector<char> TempBuffer; // Temporary text buffer
2781  char TempKeychordName[64];
2782 
2783  ImGuiContext(ImFontAtlas* shared_font_atlas);
2784  ~ImGuiContext();
2785 };
2786 
2787 //-----------------------------------------------------------------------------
2788 // [SECTION] ImGuiWindowTempData, ImGuiWindow
2789 //-----------------------------------------------------------------------------
2790 
2791 #define IMGUI_WINDOW_HARD_MIN_SIZE 4.0f
2792 
2793 // Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.
2794 // (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..)
2795 // (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin)
2796 struct IMGUI_API ImGuiWindowTempData
2797 {
2798  // Layout
2799  ImVec2 CursorPos; // Current emitting position, in absolute coordinates.
2800  ImVec2 CursorPosPrevLine;
2801  ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding.
2802  ImVec2 CursorMaxPos; // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame.
2803  ImVec2 IdealMaxPos; // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame.
2804  ImVec2 CurrLineSize;
2805  ImVec2 PrevLineSize;
2806  float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added).
2807  float PrevLineTextBaseOffset;
2808  bool IsSameLine;
2809  bool IsSetPos;
2810  ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
2811  ImVec1 ColumnsOffset; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.
2812  ImVec1 GroupOffset;
2813  ImVec2 CursorStartPosLossyness;// Record the loss of precision of CursorStartPos due to really large scrolling amount. This is used by clipper to compensate and fix the most common use case of large scroll area.
2814 
2815  // Keyboard/Gamepad navigation
2816  ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1)
2817  short NavLayersActiveMask; // Which layers have been written to (result from previous frame)
2818  short NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame)
2819  bool NavIsScrollPushableX; // Set when current work location may be scrolled horizontally when moving left / right. This is generally always true UNLESS within a column.
2820  bool NavHideHighlightOneFrame;
2821  bool NavWindowHasScrollY; // Set per window when scrolling can be used (== ScrollMax.y > 0.0f)
2822 
2823  // Miscellaneous
2824  bool MenuBarAppending; // FIXME: Remove this
2825  ImVec2 MenuBarOffset; // MenuBarOffset.x is sort of equivalent of a per-layer CursorPos.x, saved/restored as we switch to the menu bar. The only situation when MenuBarOffset.y is > 0 if when (SafeAreaPadding.y > FramePadding.y), often used on TVs.
2826  ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement
2827  int TreeDepth; // Current tree depth.
2828  ImU32 TreeHasStackDataDepthMask; // Store whether given depth has ImGuiTreeNodeStackData data. Could be turned into a ImU64 if necessary.
2829  ImU32 TreeRecordsClippedNodesY2Mask; // Store whether we should keep recording Y2. Cleared when passing clip max. Equivalent TreeHasStackDataDepthMask value should always be set.
2830  ImVector<ImGuiWindow*> ChildWindows;
2831  ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state)
2832  ImGuiOldColumns* CurrentColumns; // Current columns set
2833  int CurrentTableIdx; // Current table index (into g.Tables)
2834  ImGuiLayoutType LayoutType;
2835  ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin()
2836  ImU32 ModalDimBgColor;
2837 
2838  // Status flags
2839  ImGuiItemStatusFlags WindowItemStatusFlags;
2840  ImGuiItemStatusFlags ChildItemStatusFlags;
2841  ImGuiItemStatusFlags DockTabItemStatusFlags;
2842  ImRect DockTabItemRect;
2843 
2844  // Local parameters stacks
2845  // We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings.
2846  float ItemWidth; // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window).
2847  float ItemWidthDefault;
2848  float TextWrapPos; // Current text wrap pos.
2849  ImVector<float> ItemWidthStack; // Store item widths to restore (attention: .back() is not == ItemWidth)
2850  ImVector<float> TextWrapPosStack; // Store text wrap pos to restore (attention: .back() is not == TextWrapPos)
2851 };
2852 
2853 // Storage for one window
2854 struct IMGUI_API ImGuiWindow
2855 {
2856  ImGuiContext* Ctx; // Parent UI context (needs to be set explicitly by parent).
2857  char* Name; // Window name, owned by the window.
2858  ImGuiID ID; // == ImHashStr(Name)
2859  ImGuiWindowFlags Flags, FlagsPreviousFrame; // See enum ImGuiWindowFlags_
2860  ImGuiChildFlags ChildFlags; // Set when window is a child window. See enum ImGuiChildFlags_
2861  ImGuiWindowClass WindowClass; // Advanced users only. Set with SetNextWindowClass()
2862  ImGuiViewportP* Viewport; // Always set in Begin(). Inactive windows may have a NULL value here if their viewport was discarded.
2863  ImGuiID ViewportId; // We backup the viewport id (since the viewport may disappear or never be created if the window is inactive)
2864  ImVec2 ViewportPos; // We backup the viewport position (since the viewport may disappear or never be created if the window is inactive)
2865  int ViewportAllowPlatformMonitorExtend; // Reset to -1 every frame (index is guaranteed to be valid between NewFrame..EndFrame), only used in the Appearing frame of a tooltip/popup to enforce clamping to a given monitor
2866  ImVec2 Pos; // Position (always rounded-up to nearest pixel)
2867  ImVec2 Size; // Current size (==SizeFull or collapsed title bar size)
2868  ImVec2 SizeFull; // Size when non collapsed
2869  ImVec2 ContentSize; // Size of contents/scrollable client area (calculated from the extents reach of the cursor) from previous frame. Does not include window decoration or window padding.
2870  ImVec2 ContentSizeIdeal;
2871  ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize().
2872  ImVec2 WindowPadding; // Window padding at the time of Begin().
2873  float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc.
2874  float WindowBorderSize; // Window border size at the time of Begin().
2875  float TitleBarHeight, MenuBarHeight; // Note that those used to be function before 2024/05/28. If you have old code calling TitleBarHeight() you can change it to TitleBarHeight.
2876  float DecoOuterSizeX1, DecoOuterSizeY1; // Left/Up offsets. Sum of non-scrolling outer decorations (X1 generally == 0.0f. Y1 generally = TitleBarHeight + MenuBarHeight). Locked during Begin().
2877  float DecoOuterSizeX2, DecoOuterSizeY2; // Right/Down offsets (X2 generally == ScrollbarSize.x, Y2 == ScrollbarSizes.y).
2878  float DecoInnerSizeX1, DecoInnerSizeY1; // Applied AFTER/OVER InnerRect. Specialized for Tables as they use specialized form of clipping and frozen rows/columns are inside InnerRect (and not part of regular decoration sizes).
2879  int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)!
2880  ImGuiID MoveId; // == window->GetID("#MOVE")
2881  ImGuiID TabId; // == window->GetID("#TAB")
2882  ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window)
2883  ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
2884  ImVec2 Scroll;
2885  ImVec2 ScrollMax;
2886  ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change)
2887  ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
2888  ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold
2889  ImVec2 ScrollbarSizes; // Size taken by each scrollbars on their smaller axis. Pay attention! ScrollbarSizes.x == width of the vertical scrollbar, ScrollbarSizes.y = height of the horizontal scrollbar.
2890  bool ScrollbarX, ScrollbarY; // Are scrollbars visible?
2891  bool ScrollbarXStabilizeEnabled; // Was ScrollbarX previously auto-stabilized?
2892  ImU8 ScrollbarXStabilizeToggledHistory; // Used to stabilize scrollbar visibility in case of feedback loops
2893  bool ViewportOwned;
2894  bool Active; // Set to true on Begin(), unless Collapsed
2895  bool WasActive;
2896  bool WriteAccessed; // Set to true when any widget access the current window
2897  bool Collapsed; // Set when collapsing window to become only title-bar
2898  bool WantCollapseToggle;
2899  bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed)
2900  bool SkipRefresh; // [EXPERIMENTAL] Reuse previous frame drawn contents, Begin() returns false.
2901  bool Appearing; // Set during the frame where the window is appearing (or re-appearing)
2902  bool Hidden; // Do not display (== HiddenFrames*** > 0)
2903  bool IsFallbackWindow; // Set on the "Debug##Default" window.
2904  bool IsExplicitChild; // Set when passed _ChildWindow, left to false by BeginDocked()
2905  bool HasCloseButton; // Set when the window has a close button (p_open != NULL)
2906  signed char ResizeBorderHovered; // Current border being hovered for resize (-1: none, otherwise 0-3)
2907  signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3)
2908  short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
2909  short BeginCountPreviousFrame; // Number of Begin() during the previous frame
2910  short BeginOrderWithinParent; // Begin() order within immediate parent window, if we are a child window. Otherwise 0.
2911  short BeginOrderWithinContext; // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues.
2912  short FocusOrder; // Order within WindowsFocusOrder[], altered when windows are focused.
2913  ImGuiDir AutoPosLastDirection;
2914  ImS8 AutoFitFramesX, AutoFitFramesY;
2915  bool AutoFitOnlyGrows;
2916  ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames
2917  ImS8 HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size
2918  ImS8 HiddenFramesForRenderOnly; // Hide the window until frame N at Render() time only
2919  ImS8 DisableInputsFrames; // Disable window interactions for N frames
2920  ImGuiWindowBgClickFlags BgClickFlags : 8; // Configure behavior of click+dragging on window bg/void or over items. Default sets by io.ConfigWindowsMoveFromTitleBarOnly. If you use this please report in #3379.
2921  ImGuiCond SetWindowPosAllowFlags : 8; // store acceptable condition flags for SetNextWindowPos() use.
2922  ImGuiCond SetWindowSizeAllowFlags : 8; // store acceptable condition flags for SetNextWindowSize() use.
2923  ImGuiCond SetWindowCollapsedAllowFlags : 8; // store acceptable condition flags for SetNextWindowCollapsed() use.
2924  ImGuiCond SetWindowDockAllowFlags : 8; // store acceptable condition flags for SetNextWindowDock() use.
2925  ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
2926  ImVec2 SetWindowPosPivot; // store window pivot for positioning. ImVec2(0, 0) when positioning from top-left corner; ImVec2(0.5f, 0.5f) for centering; ImVec2(1, 1) for bottom right.
2927 
2928  ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack. (In theory this should be in the TempData structure)
2929  ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name.
2930 
2931  // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer.
2932  // The main 'OuterRect', omitted as a field, is window->Rect().
2933  ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window.
2934  ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar)
2935  ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect.
2936  ImRect WorkRect; // Initially covers the whole scrolling region. Reduced by containers e.g columns/tables when active. Shrunk by WindowPadding*1.0f on each side. This is meant to replace ContentRegionRect over time (from 1.71+ onward).
2937  ImRect ParentWorkRect; // Backup of WorkRect before entering a container such as columns/tables. Used by e.g. SpanAllColumns functions to easily access. Stacked containers are responsible for maintaining this. // FIXME-WORKRECT: Could be a stack?
2938  ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back().
2939  ImRect ContentRegionRect; // FIXME: This is currently confusing/misleading. It is essentially WorkRect but not handling of scrolling. We currently rely on it as right/bottom aligned sizing operation need some size to rely on.
2940  ImVec2ih HitTestHoleSize; // Define an optional rectangular hole where mouse will pass-through the window.
2941  ImVec2ih HitTestHoleOffset;
2942 
2943  int LastFrameActive; // Last frame number the window was Active.
2944  int LastFrameJustFocused; // Last frame number the window was made Focused.
2945  float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there)
2946  ImGuiStorage StateStorage;
2947  ImVector<ImGuiOldColumns> ColumnsStorage;
2948  float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale()
2949  float FontWindowScaleParents;
2950  float FontRefSize; // This is a copy of window->CalcFontSize() at the time of Begin(), trying to phase out CalcFontSize() especially as it may be called on non-current window.
2951  int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back)
2952 
2953  ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)
2954  ImDrawList DrawListInst;
2955  ImGuiWindow* ParentWindow; // If we are a child _or_ popup _or_ docked window, this is pointing to our parent. Otherwise NULL.
2956  ImGuiWindow* ParentWindowInBeginStack;
2957  ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window. Doesn't cross through popups/dock nodes.
2958  ImGuiWindow* RootWindowPopupTree; // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child.
2959  ImGuiWindow* RootWindowDockTree; // Point to ourself or first ancestor that is not a child window. Cross through dock nodes.
2960  ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active.
2961  ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag.
2962  ImGuiWindow* ParentWindowForFocusRoute; // Set to manual link a window to its logical parent so that Shortcut() chain are honored (e.g. Tool linked to Document)
2963 
2964  ImGuiWindow* NavLastChildNavWindow; // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.)
2965  ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1)
2966  ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space
2967  ImVec2 NavPreferredScoringPosRel[ImGuiNavLayer_COUNT]; // Preferred X/Y position updated when moving on a given axis, reset to FLT_MAX.
2968  ImGuiID NavRootFocusScopeId; // Focus Scope ID at the time of Begin()
2969 
2970  int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy
2971  int MemoryDrawListVtxCapacity;
2972  bool MemoryCompacted; // Set when window extraneous data have been garbage collected
2973 
2974  // Docking
2975  bool DockIsActive :1; // When docking artifacts are actually visible. When this is set, DockNode is guaranteed to be != NULL. ~~ (DockNode != NULL) && (DockNode->Windows.Size > 1).
2976  bool DockNodeIsVisible :1;
2977  bool DockTabIsVisible :1; // Is our window visible this frame? ~~ is the corresponding tab selected?
2978  bool DockTabWantClose :1;
2979  short DockOrder; // Order of the last time the window was visible within its DockNode. This is used to reorder windows that are reappearing on the same frame. Same value between windows that were active and windows that were none are possible.
2980  ImGuiWindowDockStyle DockStyle;
2981  ImGuiDockNode* DockNode; // Which node are we docked into. Important: Prefer testing DockIsActive in many cases as this will still be set when the dock node is hidden.
2982  ImGuiDockNode* DockNodeAsHost; // Which node are we owning (for parent windows)
2983  ImGuiID DockId; // Backup of last valid DockNode->ID, so single window remember their dock node id even when they are not bound any more
2984 
2985 public:
2986  ImGuiWindow(ImGuiContext* context, const char* name);
2987  ~ImGuiWindow();
2988 
2989  ImGuiID GetID(const char* str, const char* str_end = NULL);
2990  ImGuiID GetID(const void* ptr);
2991  ImGuiID GetID(int n);
2992  ImGuiID GetIDFromPos(const ImVec2& p_abs);
2993  ImGuiID GetIDFromRectangle(const ImRect& r_abs);
2994 
2995  // We don't use g.FontSize because the window may be != g.CurrentWindow.
2996  ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
2997  ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight)); }
2998  ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight; return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight); }
2999 
3000  // [OBSOLETE] ImGuiWindow::CalcFontSize() was removed in 1.92.0 because error-prone/misleading. You can use window->FontRefSize for a copy of g.FontSize at the time of the last Begin() call for this window.
3001  //float CalcFontSize() const { ImGuiContext& g = *Ctx; return g.FontSizeBase * FontWindowScale * FontDpiScale * FontWindowScaleParents;
3002 };
3003 
3004 //-----------------------------------------------------------------------------
3005 // [SECTION] Tab bar, Tab item support
3006 //-----------------------------------------------------------------------------
3007 
3008 // Extend ImGuiTabBarFlags_
3009 enum ImGuiTabBarFlagsPrivate_
3010 {
3011  ImGuiTabBarFlags_DockNode = 1 << 20, // Part of a dock node [we don't use this in the master branch but it facilitate branch syncing to keep this around]
3012  ImGuiTabBarFlags_IsFocused = 1 << 21,
3013  ImGuiTabBarFlags_SaveSettings = 1 << 22, // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs
3014 };
3015 
3016 // Extend ImGuiTabItemFlags_
3017 enum ImGuiTabItemFlagsPrivate_
3018 {
3019  ImGuiTabItemFlags_SectionMask_ = ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing,
3020  ImGuiTabItemFlags_NoCloseButton = 1 << 20, // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout)
3021  ImGuiTabItemFlags_Button = 1 << 21, // Used by TabItemButton, change the tab item behavior to mimic a button
3022  ImGuiTabItemFlags_Invisible = 1 << 22, // To reserve space e.g. with ImGuiTabItemFlags_Leading
3023  ImGuiTabItemFlags_Unsorted = 1 << 23, // [Docking] Trailing tabs with the _Unsorted flag will be sorted based on the DockOrder of their Window.
3024 };
3025 
3026 // Storage for one active tab item (sizeof() 48 bytes)
3028 {
3029  ImGuiID ID;
3030  ImGuiTabItemFlags Flags;
3031  ImGuiWindow* Window; // When TabItem is part of a DockNode's TabBar, we hold on to a window.
3032  int LastFrameVisible;
3033  int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance
3034  float Offset; // Position relative to beginning of tab bar
3035  float Width; // Width currently displayed
3036  float ContentWidth; // Width of label + padding, stored during BeginTabItem() call (misnamed as "Content" would normally imply width of label only)
3037  float RequestedWidth; // Width optionally requested by caller, -1.0f is unused
3038  ImS32 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames
3039  ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable
3040  ImS16 IndexDuringLayout; // Index only used during TabBarLayout(). Tabs gets reordered so 'Tabs[n].IndexDuringLayout == n' but may mismatch during additions.
3041  bool WantClose; // Marked as closed by SetTabItemClosed()
3042 
3043  ImGuiTabItem() { memset((void*)this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; RequestedWidth = -1.0f; NameOffset = -1; BeginOrder = IndexDuringLayout = -1; }
3044 };
3045 
3046 // Storage for a tab bar (sizeof() 160 bytes)
3047 struct IMGUI_API ImGuiTabBar
3048 {
3049  ImGuiWindow* Window;
3051  ImGuiTabBarFlags Flags;
3052  ImGuiID ID; // Zero for tab-bars used by docking
3053  ImGuiID SelectedTabId; // Selected tab/window
3054  ImGuiID NextSelectedTabId; // Next selected tab/window. Will also trigger a scrolling animation
3055  ImGuiID NextScrollToTabId;
3056  ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for Ctrl+Tab preview)
3057  int CurrFrameVisible;
3058  int PrevFrameVisible;
3059  ImRect BarRect;
3060  float BarRectPrevWidth; // Backup of previous width. When width change we enforce keep horizontal scroll on focused tab.
3061  float CurrTabsContentsHeight;
3062  float PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar
3063  float WidthAllTabs; // Actual width of all tabs (locked during layout)
3064  float WidthAllTabsIdeal; // Ideal width if all tabs were visible and not clipped
3065  float ScrollingAnim;
3066  float ScrollingTarget;
3067  float ScrollingTargetDistToVisibility;
3068  float ScrollingSpeed;
3069  float ScrollingRectMinX;
3070  float ScrollingRectMaxX;
3071  float SeparatorMinX;
3072  float SeparatorMaxX;
3073  ImGuiID ReorderRequestTabId;
3074  ImS16 ReorderRequestOffset;
3075  ImS8 BeginCount;
3076  bool WantLayout;
3077  bool VisibleTabWasSubmitted;
3078  bool TabsAddedNew; // Set to true when a new tab item or button has been added to the tab bar during last frame
3079  bool ScrollButtonEnabled;
3080  ImS16 TabsActiveCount; // Number of tabs submitted this frame.
3081  ImS16 LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem()
3082  float ItemSpacingY;
3083  ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar()
3084  ImVec2 BackupCursorPos;
3085  ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer.
3086 
3087  ImGuiTabBar();
3088 };
3089 
3090 //-----------------------------------------------------------------------------
3091 // [SECTION] Table support
3092 //-----------------------------------------------------------------------------
3093 
3094 #define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color.
3095 #define IMGUI_TABLE_MAX_COLUMNS 512 // Arbitrary "safety" maximum, may be lifted in the future if needed. Must fit in ImGuiTableColumnIdx/ImGuiTableDrawChannelIdx.
3096 
3097 // [Internal] sizeof() ~ 112
3098 // We use the terminology "Enabled" to refer to a column that is not Hidden by user/api.
3099 // We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping.
3100 // This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped".
3102 {
3103  ImGuiTableColumnFlags Flags; // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_
3104  float WidthGiven; // Final/actual width visible == (MaxX - MinX), locked in TableUpdateLayout(). May be > WidthRequest to honor minimum width, may be < WidthRequest to honor shrinking columns down in tight space.
3105  float MinX; // Absolute positions
3106  float MaxX;
3107  float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout()
3108  float WidthAuto; // Automatic width
3109  float WidthMax; // Maximum width (FIXME: overwritten by each instance)
3110  float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially.
3111  float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_).
3112  ImRect ClipRect; // Clipping rectangle for the column
3113  ImGuiID UserID; // Optional, value passed to TableSetupColumn()
3114  float WorkMinX; // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column
3115  float WorkMaxX; // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2)
3116  float ItemWidth; // Current item width for the column, preserved across rows
3117  float ContentMaxXFrozen; // Contents maximum position for frozen rows (apart from headers), from which we can infer content width.
3118  float ContentMaxXUnfrozen;
3119  float ContentMaxXHeadersUsed; // Contents maximum position for headers rows (regardless of freezing). TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls
3120  float ContentMaxXHeadersIdeal;
3121  ImS16 NameOffset; // Offset into parent ColumnsNames[]
3122  ImGuiTableColumnIdx DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users)
3123  ImGuiTableColumnIdx IndexWithinEnabledSet; // Index within enabled/visible set (<= IndexToDisplayOrder)
3124  ImGuiTableColumnIdx PrevEnabledColumn; // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column
3125  ImGuiTableColumnIdx NextEnabledColumn; // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column
3126  ImGuiTableColumnIdx SortOrder; // Index of this column within sort specs, -1 if not sorting on this column, 0 for single-sort, may be >0 on multi-sort
3127  ImGuiTableDrawChannelIdx DrawChannelCurrent; // Index within DrawSplitter.Channels[]
3128  ImGuiTableDrawChannelIdx DrawChannelFrozen; // Draw channels for frozen rows (often headers)
3129  ImGuiTableDrawChannelIdx DrawChannelUnfrozen; // Draw channels for unfrozen rows
3130  bool IsEnabled; // IsUserEnabled && (Flags & ImGuiTableColumnFlags_Disabled) == 0
3131  bool IsUserEnabled; // Is the column not marked Hidden by the user? (unrelated to being off view, e.g. clipped by scrolling).
3132  bool IsUserEnabledNextFrame;
3133  bool IsVisibleX; // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled).
3134  bool IsVisibleY;
3135  bool IsRequestOutput; // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not.
3136  bool IsSkipItems; // Do we want item submissions to this column to be completely ignored (no layout will happen).
3137  bool IsPreserveWidthAuto;
3138  ImS8 NavLayerCurrent; // ImGuiNavLayer in 1 byte
3139  ImU8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit
3140  ImU8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem
3141  ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending
3142  ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3)
3143  ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each)
3144  ImU8 SortDirectionsAvailList; // Ordered list of available sort directions (2-bits each, total 8-bits)
3145 
3147  {
3148  memset((void*)this, 0, sizeof(*this));
3149  StretchWeight = WidthRequest = -1.0f;
3150  NameOffset = -1;
3151  DisplayOrder = IndexWithinEnabledSet = -1;
3152  PrevEnabledColumn = NextEnabledColumn = -1;
3153  SortOrder = -1;
3154  SortDirection = ImGuiSortDirection_None;
3155  DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1;
3156  }
3157 };
3158 
3159 // Transient cell data stored per row.
3160 // sizeof() ~ 6 bytes
3162 {
3163  ImU32 BgColor; // Actual color
3164  ImGuiTableColumnIdx Column; // Column number
3165 };
3166 
3167 // Parameters for TableAngledHeadersRowEx()
3168 // This may end up being refactored for more general purpose.
3169 // sizeof() ~ 12 bytes
3171 {
3172  ImGuiTableColumnIdx Index; // Column index
3173  ImU32 TextColor;
3174  ImU32 BgColor0;
3175  ImU32 BgColor1;
3176 };
3177 
3178 // Per-instance data that needs preserving across frames (seemingly most others do not need to be preserved aside from debug needs. Does that means they could be moved to ImGuiTableTempData?)
3179 // sizeof() ~ 24 bytes
3181 {
3182  ImGuiID TableInstanceID;
3183  float LastOuterHeight; // Outer height from last frame
3184  float LastTopHeadersRowHeight; // Height of first consecutive header rows from last frame (FIXME: this is used assuming consecutive headers are in same frozen set)
3185  float LastFrozenHeight; // Height of frozen section from last frame
3186  int HoveredRowLast; // Index of row which was hovered last frame.
3187  int HoveredRowNext; // Index of row hovered this frame, set after encountering it.
3188 
3189  ImGuiTableInstanceData() { TableInstanceID = 0; LastOuterHeight = LastTopHeadersRowHeight = LastFrozenHeight = 0.0f; HoveredRowLast = HoveredRowNext = -1; }
3190 };
3191 
3192 // sizeof() ~ 592 bytes + heap allocs described in TableBeginInitMemory()
3193 struct IMGUI_API ImGuiTable
3194 {
3195  ImGuiID ID;
3196  ImGuiTableFlags Flags;
3197  void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[], and RowCellData[]
3198  ImGuiTableTempData* TempData; // Transient data while table is active. Point within g.CurrentTableStack[]
3199  ImSpan<ImGuiTableColumn> Columns; // Point within RawData[]
3200  ImSpan<ImGuiTableColumnIdx> DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1)
3201  ImSpan<ImGuiTableCellData> RowCellData; // Point within RawData[]. Store cells background requests for current row.
3202  ImBitArrayPtr EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map
3203  ImBitArrayPtr EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data
3204  ImBitArrayPtr VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect)
3205  ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order)
3206  int SettingsOffset; // Offset in g.SettingsTables
3207  int LastFrameActive;
3208  int ColumnsCount; // Number of columns declared in BeginTable()
3209  int CurrentRow;
3210  int CurrentColumn;
3211  ImS16 InstanceCurrent; // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple tables with the same ID are multiple tables, they are just synced.
3212  ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with
3213  float RowPosY1;
3214  float RowPosY2;
3215  float RowMinHeight; // Height submitted to TableNextRow()
3216  float RowCellPaddingY; // Top and bottom padding. Reloaded during row change.
3217  float RowTextBaseline;
3218  float RowIndentOffsetX;
3219  ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_
3220  ImGuiTableRowFlags LastRowFlags : 16;
3221  int RowBgColorCounter; // Counter for alternating background colors (can be fast-forwarded by e.g clipper), not same as CurrentRow because header rows typically don't increase this.
3222  ImU32 RowBgColor[2]; // Background color override for current row.
3223  ImU32 BorderColorStrong;
3224  ImU32 BorderColorLight;
3225  float BorderX1;
3226  float BorderX2;
3227  float HostIndentX;
3228  float MinColumnWidth;
3229  float OuterPaddingX;
3230  float CellPaddingX; // Padding from each borders. Locked in BeginTable()/Layout.
3231  float CellSpacingX1; // Spacing between non-bordered cells. Locked in BeginTable()/Layout.
3232  float CellSpacingX2;
3233  float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details.
3234  float ColumnsGivenWidth; // Sum of current column width
3235  float ColumnsAutoFitWidth; // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window
3236  float ColumnsStretchSumWeights; // Sum of weight of all enabled stretching columns
3237  float ResizedColumnNextWidth;
3238  float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table.
3239  float RefScale; // Reference scale to be able to rescale columns on font/dpi changes.
3240  float AngledHeadersHeight; // Set by TableAngledHeadersRow(), used in TableUpdateLayout()
3241  float AngledHeadersSlope; // Set by TableAngledHeadersRow(), used in TableUpdateLayout()
3242  ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable().
3243  ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is "
3244  ImRect WorkRect;
3245  ImRect InnerClipRect;
3246  ImRect BgClipRect; // We use this to cpu-clip cell background color fill, evolve during the frame as we cross frozen rows boundaries
3247  ImRect Bg0ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG0/1 channel. This tends to be == OuterWindow->ClipRect at BeginTable() because output in BG0/BG1 is cpu-clipped
3248  ImRect Bg2ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG2 channel. This tends to be a correct, tight-fit, because output to BG2 are done by widgets relying on regular ClipRect.
3249  ImRect HostClipRect; // This is used to check if we can eventually merge our columns draw calls into the current draw call of the current window.
3250  ImRect HostBackupInnerClipRect; // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground()
3251  ImGuiWindow* OuterWindow; // Parent window for the table
3252  ImGuiWindow* InnerWindow; // Window holding the table data (== OuterWindow or a child window)
3253  ImGuiTextBuffer ColumnsNames; // Contiguous buffer holding columns names
3254  ImDrawListSplitter* DrawSplitter; // Shortcut to TempData->DrawSplitter while in table. Isolate draw commands per columns to avoid switching clip rect constantly
3255  ImGuiTableInstanceData InstanceDataFirst;
3256  ImVector<ImGuiTableInstanceData> InstanceDataExtra; // FIXME-OPT: Using a small-vector pattern would be good.
3257  ImGuiTableColumnSortSpecs SortSpecsSingle;
3258  ImVector<ImGuiTableColumnSortSpecs> SortSpecsMulti; // FIXME-OPT: Using a small-vector pattern would be good.
3259  ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs()
3260  ImGuiTableColumnIdx SortSpecsCount;
3261  ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount)
3262  ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns using fixed width (<= ColumnsCount)
3263  ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn()
3264  ImGuiTableColumnIdx AngledHeadersCount; // Count columns with angled headers
3265  ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column!
3266  ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing).
3267  ImGuiTableColumnIdx HighlightColumnHeader; // Index of column which should be highlighted.
3268  ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit.
3269  ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0.
3270  ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame.
3271  ImGuiTableColumnIdx HeldHeaderColumn; // Index of column header being held.
3272  ImGuiTableColumnIdx ReorderColumn; // Index of column being reordered. (not cleared)
3273  ImGuiTableColumnIdx ReorderColumnDir; // -1 or +1
3274  ImGuiTableColumnIdx LeftMostEnabledColumn; // Index of left-most non-hidden column.
3275  ImGuiTableColumnIdx RightMostEnabledColumn; // Index of right-most non-hidden column.
3276  ImGuiTableColumnIdx LeftMostStretchedColumn; // Index of left-most stretched column.
3277  ImGuiTableColumnIdx RightMostStretchedColumn; // Index of right-most stretched column.
3278  ImGuiTableColumnIdx ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot
3279  ImGuiTableColumnIdx FreezeRowsRequest; // Requested frozen rows count
3280  ImGuiTableColumnIdx FreezeRowsCount; // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset)
3281  ImGuiTableColumnIdx FreezeColumnsRequest; // Requested frozen columns count
3282  ImGuiTableColumnIdx FreezeColumnsCount; // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset)
3283  ImGuiTableColumnIdx RowCellDataCurrent; // Index of current RowCellData[] entry in current row
3284  ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here.
3285  ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[]
3286  ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen;
3287  ImS8 NavLayer; // ImGuiNavLayer at the time of BeginTable().
3288  bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row.
3289  bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow().
3290  bool IsInitializing;
3291  bool IsSortSpecsDirty;
3292  bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag.
3293  bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted).
3294  bool DisableDefaultContextMenu; // Disable default context menu. You may submit your own using TableBeginContextMenuPopup()/EndPopup()
3295  bool IsSettingsRequestLoad;
3296  bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSettings data.
3297  bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1)
3298  bool IsResetAllRequest;
3299  bool IsResetDisplayOrderRequest;
3300  bool IsUnfrozenRows; // Set when we got past the frozen row.
3301  bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable()
3302  bool IsActiveIdAliveBeforeTable;
3303  bool IsActiveIdInTable;
3304  bool HasScrollbarYCurr; // Whether ANY instance of this table had a vertical scrollbar during the current frame.
3305  bool HasScrollbarYPrev; // Whether ANY instance of this table had a vertical scrollbar during the previous.
3306  bool MemoryCompacted;
3307  bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis
3308 
3309  ImGuiTable() { memset((void*)this, 0, sizeof(*this)); LastFrameActive = -1; }
3310  ~ImGuiTable() { IM_FREE(RawData); }
3311 };
3312 
3313 // Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table).
3314 // - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure.
3315 // - We also leave out of this structure data that tend to be particularly useful for debugging/metrics.
3316 // FIXME-TABLE: more transient data could be stored in a stacked ImGuiTableTempData: e.g. SortSpecs.
3317 // sizeof() ~ 136 bytes.
3318 struct IMGUI_API ImGuiTableTempData
3319 {
3320  ImGuiID WindowID; // Shortcut to g.Tables[TableIndex]->OuterWindow->ID.
3321  int TableIndex; // Index in g.Tables.Buf[] pool
3322  float LastTimeActive; // Last timestamp this structure was used
3323  float AngledHeadersExtraWidth; // Used in EndTable()
3324  ImVector<ImGuiTableHeaderData> AngledHeadersRequests; // Used in TableAngledHeadersRow()
3325 
3326  ImVec2 UserOuterSize; // outer_size.x passed to BeginTable()
3327  ImDrawListSplitter DrawSplitter;
3328 
3329  ImRect HostBackupWorkRect; // Backup of InnerWindow->WorkRect at the end of BeginTable()
3330  ImRect HostBackupParentWorkRect; // Backup of InnerWindow->ParentWorkRect at the end of BeginTable()
3331  ImVec2 HostBackupPrevLineSize; // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable()
3332  ImVec2 HostBackupCurrLineSize; // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable()
3333  ImVec2 HostBackupCursorMaxPos; // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable()
3334  ImVec1 HostBackupColumnsOffset; // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable()
3335  float HostBackupItemWidth; // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable()
3336  int HostBackupItemWidthStackSize;//Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable()
3337 
3338  ImGuiTableTempData() { memset((void*)this, 0, sizeof(*this)); LastTimeActive = -1.0f; }
3339 };
3340 
3341 // sizeof() ~ 16
3343 {
3344  float WidthOrWeight;
3345  ImGuiID UserID;
3346  ImGuiTableColumnIdx Index;
3347  ImGuiTableColumnIdx DisplayOrder;
3348  ImGuiTableColumnIdx SortOrder;
3349  ImU8 SortDirection : 2;
3350  ImS8 IsEnabled : 2; // "Visible" in ini file
3351  ImU8 IsStretch : 1;
3352 
3354  {
3355  WidthOrWeight = 0.0f;
3356  UserID = 0;
3357  Index = -1;
3358  DisplayOrder = SortOrder = -1;
3359  SortDirection = ImGuiSortDirection_None;
3360  IsEnabled = -1;
3361  IsStretch = 0;
3362  }
3363 };
3364 
3365 // This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.)
3367 {
3368  ImGuiID ID; // Set to 0 to invalidate/delete the setting
3369  ImGuiTableFlags SaveFlags; // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..)
3370  float RefScale; // Reference scale to be able to rescale columns on font/dpi changes.
3371  ImGuiTableColumnIdx ColumnsCount;
3372  ImGuiTableColumnIdx ColumnsCountMax; // Maximum number of columns this settings instance can store, we can recycle a settings instance with lower number of columns but not higher
3373  bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
3374 
3375  ImGuiTableSettings() { memset((void*)this, 0, sizeof(*this)); }
3376  ImGuiTableColumnSettings* GetColumnSettings() { return (ImGuiTableColumnSettings*)(this + 1); }
3377 };
3378 
3379 //-----------------------------------------------------------------------------
3380 // [SECTION] ImGui internal API
3381 // No guarantee of forward compatibility here!
3382 //-----------------------------------------------------------------------------
3383 
3384 namespace ImGui
3385 {
3386  // Windows
3387  // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
3388  // If this ever crashes because g.CurrentWindow is NULL, it means that either:
3389  // - ImGui::NewFrame() has never been called, which is illegal.
3390  // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.
3391  IMGUI_API ImGuiIO& GetIO(ImGuiContext* ctx);
3392  IMGUI_API ImGuiPlatformIO& GetPlatformIO(ImGuiContext* ctx);
3393  inline float GetScale() { ImGuiContext& g = *GImGui; return g.Style._MainScale; } // FIXME-DPI: I don't want to formalize this just yet. Because reasons. Please don't use.
3394  inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
3395  inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }
3396  IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id);
3397  IMGUI_API ImGuiWindow* FindWindowByName(const char* name);
3398  IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
3399  IMGUI_API void UpdateWindowSkipRefresh(ImGuiWindow* window);
3400  IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window);
3401  IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy, bool dock_hierarchy);
3402  IMGUI_API bool IsWindowInBeginStack(ImGuiWindow* window);
3403  IMGUI_API bool IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
3404  IMGUI_API bool IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below);
3405  IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window);
3406  IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0);
3407  IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0);
3408  IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0);
3409  IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size);
3410  IMGUI_API void SetWindowHiddenAndSkipItemsForCurrentFrame(ImGuiWindow* window);
3411  inline void SetWindowParentWindowForFocusRoute(ImGuiWindow* window, ImGuiWindow* parent_window) { window->ParentWindowForFocusRoute = parent_window; } // You may also use SetNextWindowClass()'s FocusRouteParentWindowId field.
3412  inline ImRect WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); }
3413  inline ImRect WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); }
3414  inline ImVec2 WindowPosAbsToRel(ImGuiWindow* window, const ImVec2& p) { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x - off.x, p.y - off.y); }
3415  inline ImVec2 WindowPosRelToAbs(ImGuiWindow* window, const ImVec2& p) { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x + off.x, p.y + off.y); }
3416 
3417  // Windows: Display Order and Focus Order
3418  IMGUI_API void FocusWindow(ImGuiWindow* window, ImGuiFocusRequestFlags flags = 0);
3419  IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window, ImGuiViewport* filter_viewport, ImGuiFocusRequestFlags flags);
3420  IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);
3421  IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window);
3422  IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window);
3423  IMGUI_API void BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* above_window);
3424  IMGUI_API int FindWindowDisplayIndex(ImGuiWindow* window);
3425  IMGUI_API ImGuiWindow* FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window);
3426 
3427  // Windows: Idle, Refresh Policies [EXPERIMENTAL]
3428  IMGUI_API void SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags);
3429 
3430  // Fonts, drawing
3431  IMGUI_API void RegisterUserTexture(ImTextureData* tex); // Register external texture. EXPERIMENTAL: DO NOT USE YET.
3432  IMGUI_API void UnregisterUserTexture(ImTextureData* tex);
3433  IMGUI_API void RegisterFontAtlas(ImFontAtlas* atlas);
3434  IMGUI_API void UnregisterFontAtlas(ImFontAtlas* atlas);
3435  IMGUI_API void SetCurrentFont(ImFont* font, float font_size_before_scaling, float font_size_after_scaling);
3436  IMGUI_API void UpdateCurrentFontSize(float restore_font_size_after_scaling);
3437  IMGUI_API void SetFontRasterizerDensity(float rasterizer_density);
3438  inline float GetFontRasterizerDensity() { return GImGui->FontRasterizerDensity; }
3439  inline float GetRoundedFontSize(float size) { return IM_ROUND(size); }
3440  IMGUI_API ImFont* GetDefaultFont();
3441  IMGUI_API void PushPasswordFont();
3442  IMGUI_API void PopPasswordFont();
3443  inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { return GetForegroundDrawList(window->Viewport); }
3444  IMGUI_API void AddDrawListToDrawDataEx(ImDrawData* draw_data, ImVector<ImDrawList*>* out_list, ImDrawList* draw_list);
3445 
3446  // Init
3447  IMGUI_API void Initialize();
3448  IMGUI_API void Shutdown(); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext().
3449 
3450  // Context name & generic context hooks
3451  IMGUI_API void SetContextName(ImGuiContext* ctx, const char* name);
3452  IMGUI_API ImGuiID AddContextHook(ImGuiContext* ctx, const ImGuiContextHook* hook);
3453  IMGUI_API void RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_to_remove);
3454  IMGUI_API void CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType type);
3455 
3456  // NewFrame
3457  IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs);
3458  IMGUI_API void UpdateHoveredWindowAndCaptureFlags(const ImVec2& mouse_pos);
3459  IMGUI_API void FindHoveredWindowEx(const ImVec2& pos, bool find_first_and_in_any_viewport, ImGuiWindow** out_hovered_window, ImGuiWindow** out_hovered_window_under_moving_window);
3460  IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window);
3461  IMGUI_API void StartMouseMovingWindowOrNode(ImGuiWindow* window, ImGuiDockNode* node, bool undock);
3462  IMGUI_API void StopMouseMovingWindow();
3463  IMGUI_API void UpdateMouseMovingWindowNewFrame();
3464  IMGUI_API void UpdateMouseMovingWindowEndFrame();
3465 
3466  // Viewports
3467  IMGUI_API void TranslateWindowsInViewport(ImGuiViewportP* viewport, const ImVec2& old_pos, const ImVec2& new_pos, const ImVec2& old_size, const ImVec2& new_size);
3468  IMGUI_API void ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale);
3469  IMGUI_API void DestroyPlatformWindow(ImGuiViewportP* viewport);
3470  IMGUI_API void SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport);
3471  IMGUI_API void SetCurrentViewport(ImGuiWindow* window, ImGuiViewportP* viewport);
3472  IMGUI_API const ImGuiPlatformMonitor* GetViewportPlatformMonitor(ImGuiViewport* viewport);
3473  IMGUI_API ImGuiViewportP* FindHoveredViewportFromPlatformWindowStack(const ImVec2& mouse_platform_pos);
3474 
3475  // Settings
3476  IMGUI_API void MarkIniSettingsDirty();
3477  IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window);
3478  IMGUI_API void ClearIniSettings();
3479  IMGUI_API void AddSettingsHandler(const ImGuiSettingsHandler* handler);
3480  IMGUI_API void RemoveSettingsHandler(const char* type_name);
3481  IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
3482 
3483  // Settings - Windows
3484  IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);
3485  IMGUI_API ImGuiWindowSettings* FindWindowSettingsByID(ImGuiID id);
3486  IMGUI_API ImGuiWindowSettings* FindWindowSettingsByWindow(ImGuiWindow* window);
3487  IMGUI_API void ClearWindowSettings(const char* name);
3488 
3489  // Localization
3490  IMGUI_API void LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count);
3491  inline const char* LocalizeGetMsg(ImGuiLocKey key) { ImGuiContext& g = *GImGui; const char* msg = g.LocalizationTable[key]; return msg ? msg : "*Missing Text*"; }
3492 
3493  // Scrolling
3494  IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x);
3495  IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y);
3496  IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio);
3497  IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio);
3498 
3499  // Early work-in-progress API (ScrollToItem() will become public)
3500  IMGUI_API void ScrollToItem(ImGuiScrollFlags flags = 0);
3501  IMGUI_API void ScrollToRect(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);
3502  IMGUI_API ImVec2 ScrollToRectEx(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);
3503 //#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
3504  inline void ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& rect) { ScrollToRect(window, rect, ImGuiScrollFlags_KeepVisibleEdgeY); }
3505 //#endif
3506 
3507  // Basic Accessors
3508  inline ImGuiItemStatusFlags GetItemStatusFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.StatusFlags; }
3509  inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; }
3510  inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; }
3511  IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);
3512  IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window);
3513  IMGUI_API void ClearActiveID();
3514  IMGUI_API ImGuiID GetHoveredID();
3515  IMGUI_API void SetHoveredID(ImGuiID id);
3516  IMGUI_API void KeepAliveID(ImGuiID id);
3517  IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function.
3518  IMGUI_API void PushOverrideID(ImGuiID id); // Push given value as-is at the top of the ID stack (whereas PushID combines old and new hashes)
3519  IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed);
3520  IMGUI_API ImGuiID GetIDWithSeed(int n, ImGuiID seed);
3521 
3522  // Basic Helpers for widget code
3523  IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f);
3524  inline void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f) { ItemSize(bb.GetSize(), text_baseline_y); } // FIXME: This is a misleading API since we expect CursorPos to be bb.Min.
3525  IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0);
3526  IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flags);
3527  IMGUI_API bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags = 0);
3528  IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id);
3529  IMGUI_API void SetLastItemData(ImGuiID item_id, ImGuiItemFlags item_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect);
3530  IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h);
3531  IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
3532  IMGUI_API void PushMultiItemsWidths(int components, float width_full);
3533  IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess, float width_min);
3534  IMGUI_API void CalcClipRectVisibleItemsY(const ImRect& clip_rect, const ImVec2& pos, float items_height, int* out_visible_start, int* out_visible_end);
3535 
3536  // Parameter stacks (shared)
3537  IMGUI_API const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx);
3538  IMGUI_API void BeginDisabledOverrideReenable();
3539  IMGUI_API void EndDisabledOverrideReenable();
3540 
3541  // Logging/Capture
3542  IMGUI_API void LogBegin(ImGuiLogFlags flags, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name.
3543  IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer
3544  IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL);
3545  IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix);
3546 
3547  // Childs
3548  IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags);
3549 
3550  // Popups, Modals
3551  IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_window_flags);
3552  IMGUI_API bool BeginPopupMenuEx(ImGuiID id, const char* label, ImGuiWindowFlags extra_window_flags);
3553  IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None);
3554  IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup);
3555  IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup);
3556  IMGUI_API void ClosePopupsExceptModals();
3557  IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags);
3558  IMGUI_API ImRect GetPopupAllowedExtentRect(ImGuiWindow* window);
3559  IMGUI_API ImGuiWindow* GetTopMostPopupModal();
3560  IMGUI_API ImGuiWindow* GetTopMostAndVisiblePopupModal();
3561  IMGUI_API ImGuiWindow* FindBlockingModal(ImGuiWindow* window);
3562  IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window);
3563  IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy);
3564  IMGUI_API ImGuiMouseButton GetMouseButtonFromPopupFlags(ImGuiPopupFlags flags);
3565 
3566  // Tooltips
3567  IMGUI_API bool BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags);
3568  IMGUI_API bool BeginTooltipHidden();
3569 
3570  // Menus
3571  IMGUI_API bool BeginViewportSideBar(const char* name, ImGuiViewport* viewport, ImGuiDir dir, float size, ImGuiWindowFlags window_flags);
3572  IMGUI_API bool BeginMenuEx(const char* label, const char* icon, bool enabled = true);
3573  IMGUI_API bool MenuItemEx(const char* label, const char* icon, const char* shortcut = NULL, bool selected = false, bool enabled = true);
3574 
3575  // Combos
3576  IMGUI_API bool BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags);
3577  IMGUI_API bool BeginComboPreview();
3578  IMGUI_API void EndComboPreview();
3579 
3580  // Keyboard/Gamepad Navigation
3581  IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit);
3582  IMGUI_API void NavInitRequestApplyResult();
3583  IMGUI_API bool NavMoveRequestButNoResultYet();
3584  IMGUI_API void NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
3585  IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
3586  IMGUI_API void NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result);
3587  IMGUI_API void NavMoveRequestResolveWithPastTreeNode(ImGuiNavItemData* result, const ImGuiTreeNodeStackData* tree_node_data);
3588  IMGUI_API void NavMoveRequestCancel();
3589  IMGUI_API void NavMoveRequestApplyResult();
3590  IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);
3591  IMGUI_API void NavHighlightActivated(ImGuiID id);
3592  IMGUI_API void NavClearPreferredPosForAxis(ImGuiAxis axis);
3593  IMGUI_API void SetNavCursorVisibleAfterMove();
3594  IMGUI_API void NavUpdateCurrentWindowIsScrollPushableX();
3595  IMGUI_API void SetNavWindow(ImGuiWindow* window);
3596  IMGUI_API void SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel);
3597  IMGUI_API void SetNavFocusScope(ImGuiID focus_scope_id);
3598 
3599  // Focus/Activation
3600  // This should be part of a larger set of API: FocusItem(offset = -1), FocusItemByID(id), ActivateItem(offset = -1), ActivateItemByID(id) etc. which are
3601  // much harder to design and implement than expected. I have a couple of private branches on this matter but it's not simple. For now implementing the easy ones.
3602  IMGUI_API void FocusItem(); // Focus last item (no selection/activation).
3603  IMGUI_API void ActivateItemByID(ImGuiID id); // Activate an item by ID (button, checkbox, tree node etc.). Activation is queued and processed on the next frame when the item is encountered again. Was called 'ActivateItem()' before 1.89.7.
3604 
3605  // Inputs
3606  // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions.
3607  inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; }
3608  inline bool IsNamedKeyOrMod(ImGuiKey key) { return (key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END) || key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super; }
3609  inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; }
3610  inline bool IsKeyboardKey(ImGuiKey key) { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; }
3611  inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; }
3612  inline bool IsMouseKey(ImGuiKey key) { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; }
3613  inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; }
3614  inline bool IsLRModKey(ImGuiKey key) { return key >= ImGuiKey_LeftCtrl && key <= ImGuiKey_RightSuper; }
3615  ImGuiKeyChord FixupKeyChord(ImGuiKeyChord key_chord);
3616  inline ImGuiKey ConvertSingleModFlagToKey(ImGuiKey key)
3617  {
3618  if (key == ImGuiMod_Ctrl) return ImGuiKey_ReservedForModCtrl;
3619  if (key == ImGuiMod_Shift) return ImGuiKey_ReservedForModShift;
3620  if (key == ImGuiMod_Alt) return ImGuiKey_ReservedForModAlt;
3621  if (key == ImGuiMod_Super) return ImGuiKey_ReservedForModSuper;
3622  return key;
3623  }
3624 
3625  IMGUI_API ImGuiKeyData* GetKeyData(ImGuiContext* ctx, ImGuiKey key);
3626  inline ImGuiKeyData* GetKeyData(ImGuiKey key) { ImGuiContext& g = *GImGui; return GetKeyData(&g, key); }
3627  IMGUI_API const char* GetKeyChordName(ImGuiKeyChord key_chord);
3628  inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); }
3629  IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);
3630  IMGUI_API ImVec2 GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down);
3631  IMGUI_API float GetNavTweakPressedAmount(ImGuiAxis axis);
3632  IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate);
3633  IMGUI_API void GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate);
3634  IMGUI_API void TeleportMousePos(const ImVec2& pos);
3635  IMGUI_API void SetActiveIdUsingAllKeyboardKeys();
3636  inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; }
3637 
3638  // [EXPERIMENTAL] Low-Level: Key/Input Ownership
3639  // - The idea is that instead of "eating" a given input, we can link to an owner id.
3640  // - Ownership is most often claimed as a result of reacting to a press/down event (but occasionally may be claimed ahead).
3641  // - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID.
3642  // - Legacy input queries (without specifying an owner or _Any or _None) are equivalent to using ImGuiKeyOwner_Any (== 0).
3643  // - Input ownership is automatically released on the frame after a key is released. Therefore:
3644  // - for ownership registration happening as a result of a down/press event, the SetKeyOwner() call may be done once (common case).
3645  // - for ownership registration happening ahead of a down/press event, the SetKeyOwner() call needs to be made every frame (happens if e.g. claiming ownership on hover).
3646  // - SetItemKeyOwner() is a shortcut for common simple case. A custom widget will probably want to call SetKeyOwner() multiple times directly based on its interaction state.
3647  // - This is marked experimental because not all widgets are fully honoring the Set/Test idioms. We will need to move forward step by step.
3648  // Please open a GitHub Issue to submit your usage scenario or if there's a use case you need solved.
3649  IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key);
3650  IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
3651  IMGUI_API void SetKeyOwnersForKeyChord(ImGuiKeyChord key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
3652  IMGUI_API void SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags); // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'.
3653  IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id'
3654  inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiContext* ctx, ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &ctx->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; }
3655 
3656  // [EXPERIMENTAL] High-Level: Input Access functions w/ support for Key/Input Ownership
3657  // - Important: legacy IsKeyPressed(ImGuiKey, bool repeat=true) _DEFAULTS_ to repeat, new IsKeyPressed() requires _EXPLICIT_ ImGuiInputFlags_Repeat flag.
3658  // - Expected to be later promoted to public API, the prototypes are designed to replace existing ones (since owner_id can default to Any == 0)
3659  // - Specifying a value for 'ImGuiID owner' will test that EITHER the key is NOT owned (UNLESS locked), EITHER the key is owned by 'owner'.
3660  // Legacy functions use ImGuiKeyOwner_Any meaning that they typically ignore ownership, unless a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.
3661  // - Binding generators may want to ignore those for now, or suffix them with Ex() until we decide if this gets moved into public API.
3662  IMGUI_API bool IsKeyDown(ImGuiKey key, ImGuiID owner_id);
3663  IMGUI_API bool IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0); // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requires explicit ImGuiInputFlags_Repeat.
3664  IMGUI_API bool IsKeyReleased(ImGuiKey key, ImGuiID owner_id);
3665  IMGUI_API bool IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id = 0);
3666  IMGUI_API bool IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id);
3667  IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0);
3668  IMGUI_API bool IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id);
3669  IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id);
3670 
3671  // Shortcut Testing & Routing
3672  // - Set Shortcut() and SetNextItemShortcut() in imgui.h
3673  // - When a policy (except for ImGuiInputFlags_RouteAlways *) is set, Shortcut() will register itself with SetShortcutRouting(),
3674  // allowing the system to decide where to route the input among other route-aware calls.
3675  // (* using ImGuiInputFlags_RouteAlways is roughly equivalent to calling IsKeyChordPressed(key) and bypassing route registration and check)
3676  // - When using one of the routing option:
3677  // - The default route is ImGuiInputFlags_RouteFocused (accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window.)
3678  // - Routes are requested given a chord (key + modifiers) and a routing policy.
3679  // - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame.
3680  // - Each route may be granted to a single owner. When multiple requests are made we have policies to select the winning route (e.g. deep most window).
3681  // - Multiple read sites may use the same owner id can all access the granted route.
3682  // - When owner_id is 0 we use the current Focus Scope ID as a owner ID in order to identify our location.
3683  // - You can chain two unrelated windows in the focus stack using SetWindowParentWindowForFocusRoute()
3684  // e.g. if you have a tool window associated to a document, and you want document shortcuts to run when the tool is focused.
3685  IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id);
3686  IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id); // owner_id needs to be explicit and cannot be 0
3687  IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id);
3688  IMGUI_API ImGuiKeyRoutingData* GetShortcutRoutingData(ImGuiKeyChord key_chord);
3689 
3690  // Docking
3691  // (some functions are only declared in imgui.cpp, see Docking section)
3692  IMGUI_API void DockContextInitialize(ImGuiContext* ctx);
3693  IMGUI_API void DockContextShutdown(ImGuiContext* ctx);
3694  IMGUI_API void DockContextClearNodes(ImGuiContext* ctx, ImGuiID root_id, bool clear_settings_refs); // Use root_id==0 to clear all
3695  IMGUI_API void DockContextRebuildNodes(ImGuiContext* ctx);
3696  IMGUI_API void DockContextNewFrameUpdateUndocking(ImGuiContext* ctx);
3697  IMGUI_API void DockContextNewFrameUpdateDocking(ImGuiContext* ctx);
3698  IMGUI_API void DockContextEndFrame(ImGuiContext* ctx);
3699  IMGUI_API ImGuiID DockContextGenNodeID(ImGuiContext* ctx);
3700  IMGUI_API void DockContextQueueDock(ImGuiContext* ctx, ImGuiWindow* target, ImGuiDockNode* target_node, ImGuiWindow* payload, ImGuiDir split_dir, float split_ratio, bool split_outer);
3701  IMGUI_API void DockContextQueueUndockWindow(ImGuiContext* ctx, ImGuiWindow* window);
3702  IMGUI_API void DockContextQueueUndockNode(ImGuiContext* ctx, ImGuiDockNode* node);
3703  IMGUI_API void DockContextProcessUndockWindow(ImGuiContext* ctx, ImGuiWindow* window, bool clear_persistent_docking_ref = true);
3704  IMGUI_API void DockContextProcessUndockNode(ImGuiContext* ctx, ImGuiDockNode* node);
3705  IMGUI_API bool DockContextCalcDropPosForDocking(ImGuiWindow* target, ImGuiDockNode* target_node, ImGuiWindow* payload_window, ImGuiDockNode* payload_node, ImGuiDir split_dir, bool split_outer, ImVec2* out_pos);
3706  IMGUI_API ImGuiDockNode*DockContextFindNodeByID(ImGuiContext* ctx, ImGuiID id);
3707  IMGUI_API void DockNodeWindowMenuHandler_Default(ImGuiContext* ctx, ImGuiDockNode* node, ImGuiTabBar* tab_bar);
3708  IMGUI_API bool DockNodeBeginAmendTabBar(ImGuiDockNode* node);
3709  IMGUI_API void DockNodeEndAmendTabBar();
3710  inline ImGuiDockNode* DockNodeGetRootNode(ImGuiDockNode* node) { while (node->ParentNode) node = node->ParentNode; return node; }
3711  inline bool DockNodeIsInHierarchyOf(ImGuiDockNode* node, ImGuiDockNode* parent) { while (node) { if (node == parent) return true; node = node->ParentNode; } return false; }
3712  inline int DockNodeGetDepth(const ImGuiDockNode* node) { int depth = 0; while (node->ParentNode) { node = node->ParentNode; depth++; } return depth; }
3713  inline ImGuiID DockNodeGetWindowMenuButtonId(const ImGuiDockNode* node) { return ImHashStr("#COLLAPSE", 0, node->ID); }
3714  inline ImGuiDockNode* GetWindowDockNode() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DockNode; }
3715  IMGUI_API bool GetWindowAlwaysWantOwnTabBar(ImGuiWindow* window);
3716  IMGUI_API void BeginDocked(ImGuiWindow* window, bool* p_open);
3717  IMGUI_API void BeginDockableDragDropSource(ImGuiWindow* window);
3718  IMGUI_API void BeginDockableDragDropTarget(ImGuiWindow* window);
3719  IMGUI_API void SetWindowDock(ImGuiWindow* window, ImGuiID dock_id, ImGuiCond cond);
3720 
3721  // Docking - Builder function needs to be generally called before the node is used/submitted.
3722  // - The DockBuilderXXX functions are designed to _eventually_ become a public API, but it is too early to expose it and guarantee stability.
3723  // - Do not hold on ImGuiDockNode* pointers! They may be invalidated by any split/merge/remove operation and every frame.
3724  // - To create a DockSpace() node, make sure to set the ImGuiDockNodeFlags_DockSpace flag when calling DockBuilderAddNode().
3725  // You can create dockspace nodes (attached to a window) _or_ floating nodes (carry its own window) with this API.
3726  // - DockBuilderSplitNode() create 2 child nodes within 1 node. The initial node becomes a parent node.
3727  // - If you intend to split the node immediately after creation using DockBuilderSplitNode(), make sure
3728  // to call DockBuilderSetNodeSize() beforehand. If you don't, the resulting split sizes may not be reliable.
3729  // - Call DockBuilderFinish() after you are done.
3730  IMGUI_API void DockBuilderDockWindow(const char* window_name, ImGuiID node_id);
3731  IMGUI_API ImGuiDockNode*DockBuilderGetNode(ImGuiID node_id);
3732  inline ImGuiDockNode* DockBuilderGetCentralNode(ImGuiID node_id) { ImGuiDockNode* node = DockBuilderGetNode(node_id); if (!node) return NULL; return DockNodeGetRootNode(node)->CentralNode; }
3733  IMGUI_API ImGuiID DockBuilderAddNode(ImGuiID node_id = 0, ImGuiDockNodeFlags flags = 0);
3734  IMGUI_API void DockBuilderRemoveNode(ImGuiID node_id); // Remove node and all its child, undock all windows
3735  IMGUI_API void DockBuilderRemoveNodeDockedWindows(ImGuiID node_id, bool clear_settings_refs = true);
3736  IMGUI_API void DockBuilderRemoveNodeChildNodes(ImGuiID node_id); // Remove all split/hierarchy. All remaining docked windows will be re-docked to the remaining root node (node_id).
3737  IMGUI_API void DockBuilderSetNodePos(ImGuiID node_id, ImVec2 pos);
3738  IMGUI_API void DockBuilderSetNodeSize(ImGuiID node_id, ImVec2 size);
3739  IMGUI_API ImGuiID DockBuilderSplitNode(ImGuiID node_id, ImGuiDir split_dir, float size_ratio_for_node_at_dir, ImGuiID* out_id_at_dir, ImGuiID* out_id_at_opposite_dir); // Create 2 child nodes in this parent node.
3740  IMGUI_API void DockBuilderCopyDockSpace(ImGuiID src_dockspace_id, ImGuiID dst_dockspace_id, ImVector<const char*>* in_window_remap_pairs);
3741  IMGUI_API void DockBuilderCopyNode(ImGuiID src_node_id, ImGuiID dst_node_id, ImVector<ImGuiID>* out_node_remap_pairs);
3742  IMGUI_API void DockBuilderCopyWindowSettings(const char* src_name, const char* dst_name);
3743  IMGUI_API void DockBuilderFinish(ImGuiID node_id);
3744 
3745  // [EXPERIMENTAL] Focus Scope
3746  // This is generally used to identify a unique input location (for e.g. a selection set)
3747  // There is one per window (automatically set in Begin), but:
3748  // - Selection patterns generally need to react (e.g. clear a selection) when landing on one item of the set.
3749  // So in order to identify a set multiple lists in same window may each need a focus scope.
3750  // If you imagine an hypothetical BeginSelectionGroup()/EndSelectionGroup() api, it would likely call PushFocusScope()/EndFocusScope()
3751  // - Shortcut routing also use focus scope as a default location identifier if an owner is not provided.
3752  // We don't use the ID Stack for this as it is common to want them separate.
3753  IMGUI_API void PushFocusScope(ImGuiID id);
3754  IMGUI_API void PopFocusScope();
3755  inline ImGuiID GetCurrentFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentFocusScopeId; } // Focus scope we are outputting into, set by PushFocusScope()
3756 
3757  // Drag and Drop
3758  IMGUI_API bool IsDragDropActive();
3759  IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);
3760  IMGUI_API bool BeginDragDropTargetViewport(ImGuiViewport* viewport, const ImRect* p_bb = NULL);
3761  IMGUI_API void ClearDragDrop();
3762  IMGUI_API bool IsDragDropPayloadBeingAccepted();
3763  IMGUI_API void RenderDragDropTargetRectForItem(const ImRect& bb);
3764  IMGUI_API void RenderDragDropTargetRectEx(ImDrawList* draw_list, const ImRect& bb);
3765 
3766  // Typing-Select API
3767  // (provide Windows Explorer style "select items by typing partial name" + "cycle through items by typing same letter" feature)
3768  // (this is currently not documented nor used by main library, but should work. See "widgets_typingselect" in imgui_test_suite for usage code. Please let us know if you use this!)
3769  IMGUI_API ImGuiTypingSelectRequest* GetTypingSelectRequest(ImGuiTypingSelectFlags flags = ImGuiTypingSelectFlags_None);
3770  IMGUI_API int TypingSelectFindMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx);
3771  IMGUI_API int TypingSelectFindNextSingleCharMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx);
3772  IMGUI_API int TypingSelectFindBestLeadingMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data);
3773 
3774  // Box-Select API
3775  IMGUI_API bool BeginBoxSelect(const ImRect& scope_rect, ImGuiWindow* window, ImGuiID box_select_id, ImGuiMultiSelectFlags ms_flags);
3776  IMGUI_API void EndBoxSelect(const ImRect& scope_rect, ImGuiMultiSelectFlags ms_flags);
3777 
3778  // Multi-Select API
3779  IMGUI_API void MultiSelectItemHeader(ImGuiID id, bool* p_selected, ImGuiButtonFlags* p_button_flags);
3780  IMGUI_API void MultiSelectItemFooter(ImGuiID id, bool* p_selected, bool* p_pressed);
3781  IMGUI_API void MultiSelectAddSetAll(ImGuiMultiSelectTempData* ms, bool selected);
3782  IMGUI_API void MultiSelectAddSetRange(ImGuiMultiSelectTempData* ms, bool selected, int range_dir, ImGuiSelectionUserData first_item, ImGuiSelectionUserData last_item);
3783  inline ImGuiBoxSelectState* GetBoxSelectState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.BoxSelectState.ID == id && g.BoxSelectState.IsActive) ? &g.BoxSelectState : NULL; }
3784  inline ImGuiMultiSelectState* GetMultiSelectState(ImGuiID id) { ImGuiContext& g = *GImGui; return g.MultiSelectStorage.GetByKey(id); }
3785 
3786  // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API)
3787  IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect);
3788  IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiOldColumnFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns().
3789  IMGUI_API void EndColumns(); // close columns
3790  IMGUI_API void PushColumnClipRect(int column_index);
3791  IMGUI_API void PushColumnsBackground();
3792  IMGUI_API void PopColumnsBackground();
3793  IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count);
3794  IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id);
3795  IMGUI_API float GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm);
3796  IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset);
3797 
3798  // Tables: Candidates for public API
3799  IMGUI_API void TableOpenContextMenu(int column_n = -1);
3800  IMGUI_API void TableSetColumnWidth(int column_n, float width);
3801  IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs);
3802  IMGUI_API int TableGetHoveredRow(); // Retrieve *PREVIOUS FRAME* hovered row. This difference with TableGetHoveredColumn() is the reason why this is not public yet.
3803  IMGUI_API float TableGetHeaderRowHeight();
3804  IMGUI_API float TableGetHeaderAngledMaxLabelWidth();
3805  IMGUI_API void TablePushBackgroundChannel();
3806  IMGUI_API void TablePopBackgroundChannel();
3807  IMGUI_API void TablePushColumnChannel(int column_n);
3808  IMGUI_API void TablePopColumnChannel();
3809  IMGUI_API void TableAngledHeadersRowEx(ImGuiID row_id, float angle, float max_label_width, const ImGuiTableHeaderData* data, int data_count);
3810 
3811  // Tables: Internals
3812  inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; }
3813  IMGUI_API ImGuiTable* TableFindByID(ImGuiID id);
3814  IMGUI_API bool BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f);
3815  IMGUI_API void TableBeginInitMemory(ImGuiTable* table, int columns_count);
3816  IMGUI_API void TableBeginApplyRequests(ImGuiTable* table);
3817  IMGUI_API void TableSetupDrawChannels(ImGuiTable* table);
3818  IMGUI_API void TableUpdateLayout(ImGuiTable* table);
3819  IMGUI_API void TableUpdateBorders(ImGuiTable* table);
3820  IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table);
3821  IMGUI_API void TableDrawBorders(ImGuiTable* table);
3822  IMGUI_API void TableDrawDefaultContextMenu(ImGuiTable* table, ImGuiTableFlags flags_for_section_to_display);
3823  IMGUI_API bool TableBeginContextMenuPopup(ImGuiTable* table);
3824  IMGUI_API void TableMergeDrawChannels(ImGuiTable* table);
3825  inline ImGuiTableInstanceData* TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; }
3826  inline ImGuiID TableGetInstanceID(ImGuiTable* table, int instance_no) { return TableGetInstanceData(table, instance_no)->TableInstanceID; }
3827  IMGUI_API void TableFixDisplayOrder(ImGuiTable* table);
3828  IMGUI_API void TableSortSpecsSanitize(ImGuiTable* table);
3829  IMGUI_API void TableSortSpecsBuild(ImGuiTable* table);
3830  IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column);
3831  IMGUI_API void TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column);
3832  IMGUI_API float TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column);
3833  IMGUI_API void TableBeginRow(ImGuiTable* table);
3834  IMGUI_API void TableEndRow(ImGuiTable* table);
3835  IMGUI_API void TableBeginCell(ImGuiTable* table, int column_n);
3836  IMGUI_API void TableEndCell(ImGuiTable* table);
3837  IMGUI_API ImRect TableGetCellBgRect(const ImGuiTable* table, int column_n);
3838  IMGUI_API const char* TableGetColumnName(const ImGuiTable* table, int column_n);
3839  IMGUI_API ImGuiID TableGetColumnResizeID(ImGuiTable* table, int column_n, int instance_no = 0);
3840  IMGUI_API float TableCalcMaxColumnWidth(const ImGuiTable* table, int column_n);
3841  IMGUI_API void TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n);
3842  IMGUI_API void TableSetColumnWidthAutoAll(ImGuiTable* table);
3843  IMGUI_API void TableSetColumnDisplayOrder(ImGuiTable* table, int column_n, int dst_order);
3844  IMGUI_API void TableRemove(ImGuiTable* table);
3845  IMGUI_API void TableGcCompactTransientBuffers(ImGuiTable* table);
3846  IMGUI_API void TableGcCompactTransientBuffers(ImGuiTableTempData* table);
3847  IMGUI_API void TableGcCompactSettings();
3848 
3849  // Tables: Settings
3850  IMGUI_API void TableLoadSettings(ImGuiTable* table);
3851  IMGUI_API void TableSaveSettings(ImGuiTable* table);
3852  IMGUI_API void TableResetSettings(ImGuiTable* table);
3853  IMGUI_API ImGuiTableSettings* TableGetBoundSettings(ImGuiTable* table);
3854  IMGUI_API void TableSettingsAddSettingsHandler();
3855  IMGUI_API ImGuiTableSettings* TableSettingsCreate(ImGuiID id, int columns_count);
3856  IMGUI_API ImGuiTableSettings* TableSettingsFindByID(ImGuiID id);
3857 
3858  // Tab Bars
3859  inline ImGuiTabBar* GetCurrentTabBar() { ImGuiContext& g = *GImGui; return g.CurrentTabBar; }
3860  IMGUI_API ImGuiTabBar* TabBarFindByID(ImGuiID id);
3861  IMGUI_API void TabBarRemove(ImGuiTabBar* tab_bar);
3862  IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags);
3863  IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id);
3864  IMGUI_API ImGuiTabItem* TabBarFindTabByOrder(ImGuiTabBar* tab_bar, int order);
3865  IMGUI_API ImGuiTabItem* TabBarFindMostRecentlySelectedTabForActiveWindow(ImGuiTabBar* tab_bar);
3866  IMGUI_API ImGuiTabItem* TabBarGetCurrentTab(ImGuiTabBar* tab_bar);
3867  inline int TabBarGetTabOrder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) { return tab_bar->Tabs.index_from_ptr(tab); }
3868  IMGUI_API const char* TabBarGetTabName(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
3869  IMGUI_API void TabBarAddTab(ImGuiTabBar* tab_bar, ImGuiTabItemFlags tab_flags, ImGuiWindow* window);
3870  IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id);
3871  IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
3872  IMGUI_API void TabBarQueueFocus(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
3873  IMGUI_API void TabBarQueueFocus(ImGuiTabBar* tab_bar, const char* tab_name);
3874  IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, int offset);
3875  IMGUI_API void TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, ImVec2 mouse_pos);
3876  IMGUI_API bool TabBarProcessReorder(ImGuiTabBar* tab_bar);
3877  IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags, ImGuiWindow* docked_window);
3878  IMGUI_API void TabItemSpacing(const char* str_id, ImGuiTabItemFlags flags, float width);
3879  IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button_or_unsaved_marker);
3880  IMGUI_API ImVec2 TabItemCalcSize(ImGuiWindow* window);
3881  IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col);
3882  IMGUI_API void TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped);
3883 
3884  // Render helpers
3885  // AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT.
3886  // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally)
3887  IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
3888  IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
3889  IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
3890  IMGUI_API void RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
3891  IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known);
3892  IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool borders = true, float rounding = 0.0f);
3893  IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
3894  IMGUI_API void RenderColorComponentMarker(const ImRect& bb, ImU32 col, float rounding);
3895  IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0);
3896  IMGUI_API void RenderNavCursor(const ImRect& bb, ImGuiID id, ImGuiNavRenderCursorFlags flags = ImGuiNavRenderCursorFlags_None); // Navigation highlight
3897 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
3898  inline void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavRenderCursorFlags flags = ImGuiNavRenderCursorFlags_None) { RenderNavCursor(bb, id, flags); } // Renamed in 1.91.4
3899 #endif
3900  IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
3901  IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
3902 
3903  // Render helpers (those functions don't access any ImGui state!)
3904  IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f);
3905  IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);
3906  IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz);
3907  IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);
3908  IMGUI_API void RenderArrowDockMenu(ImDrawList* draw_list, ImVec2 p_min, float sz, ImU32 col);
3909  IMGUI_API void RenderRectFilledInRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float fill_x0, float fill_x1, float rounding);
3910  IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding);
3911  IMGUI_API ImDrawFlags CalcRoundingFlagsForRectInRect(const ImRect& r_in, const ImRect& r_outer, float threshold);
3912 
3913  // Widgets: Text
3914  IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);
3915  IMGUI_API void TextAligned(float align_x, float size_x, const char* fmt, ...); // FIXME-WIP: Works but API is likely to be reworked. This is designed for 1 item on the line. (#7024)
3916  IMGUI_API void TextAlignedV(float align_x, float size_x, const char* fmt, va_list args);
3917 
3918  // Widgets
3919  IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0);
3920  IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);
3921  IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureRef tex_ref, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0);
3922  IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags, float thickness = 1.0f);
3923  IMGUI_API void SeparatorTextEx(ImGuiID id, const char* label, const char* label_end, float extra_width);
3924  IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value);
3925  IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value);
3926 
3927  // Widgets: Window Decorations
3928  IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos);
3929  IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos, ImGuiDockNode* dock_node);
3930  IMGUI_API void Scrollbar(ImGuiAxis axis);
3931  IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 avail_v, ImS64 contents_v, ImDrawFlags draw_rounding_flags = 0);
3932  IMGUI_API ImRect GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis);
3933  IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis);
3934  IMGUI_API ImGuiID GetWindowResizeCornerID(ImGuiWindow* window, int n); // 0..3: corners
3935  IMGUI_API ImGuiID GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir);
3936 
3937  // Widgets low-level behaviors
3938  IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
3939  IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags);
3940  IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb);
3941  IMGUI_API bool SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f, ImU32 bg_col = 0);
3942 
3943  // Widgets: Tree Nodes
3944  IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);
3945  IMGUI_API void TreeNodeDrawLineToChildNode(const ImVec2& target_pos);
3946  IMGUI_API void TreeNodeDrawLineToTreePop(const ImGuiTreeNodeStackData* data);
3947  IMGUI_API void TreePushOverrideID(ImGuiID id);
3948  IMGUI_API bool TreeNodeGetOpen(ImGuiID storage_id);
3949  IMGUI_API void TreeNodeSetOpen(ImGuiID storage_id, bool open);
3950  IMGUI_API bool TreeNodeUpdateNextOpen(ImGuiID storage_id, ImGuiTreeNodeFlags flags); // Return open state. Consume previous SetNextItemOpen() data, if any. May return true when logging.
3951 
3952  // Template functions are instantiated in imgui_widgets.cpp for a finite number of types.
3953  // To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036).
3954  // e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); "
3955  template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API float ScaleRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size);
3956  template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API T ScaleValueFromRatioT(ImGuiDataType data_type, float t, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size);
3957  template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, ImGuiSliderFlags flags);
3958  template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb);
3959  template<typename T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);
3960  template<typename T> IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value);
3961 
3962  // Data type helpers
3963  IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type);
3964  IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format);
3965  IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2);
3966  IMGUI_API bool DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format, void* p_data_when_empty = NULL);
3967  IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2);
3968  IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max);
3969  IMGUI_API bool DataTypeIsZero(ImGuiDataType data_type, const void* p_data);
3970 
3971  // InputText
3972  IMGUI_API bool InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
3973  IMGUI_API void InputTextDeactivateHook(ImGuiID id);
3974  IMGUI_API bool TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags);
3975  IMGUI_API bool TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min = NULL, const void* p_clamp_max = NULL);
3976  inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return g.ActiveId == id && g.TempInputId == id; }
3977  inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active
3978  IMGUI_API void SetNextItemRefVal(ImGuiDataType data_type, void* p_data);
3979  inline bool IsItemActiveAsInputText() { ImGuiContext& g = *GImGui; return g.ActiveId != 0 && g.ActiveId == g.LastItemData.ID && g.InputTextState.ID == g.LastItemData.ID; } // This may be useful to apply workaround that a based on distinguish whenever an item is active as a text input field.
3980 
3981  // Color
3982  IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
3983  IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags);
3984  IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags);
3985  inline void SetNextItemColorMarker(ImU32 col) { ImGuiContext& g = *GImGui; g.NextItemData.HasFlags |= ImGuiNextItemDataFlags_HasColorMarker; g.NextItemData.ColorMarker = col; }
3986 
3987  // Plot
3988  IMGUI_API int PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, const ImVec2& size_arg);
3989 
3990  // Shade functions (write over already created vertices)
3991  IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);
3992  IMGUI_API void ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp);
3993  IMGUI_API void ShadeVertsTransformPos(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& pivot_in, float cos_a, float sin_a, const ImVec2& pivot_out);
3994 
3995  // Garbage collection
3996  IMGUI_API void GcCompactTransientMiscBuffers();
3997  IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window);
3998  IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window);
3999 
4000  // Error handling, State Recovery
4001  IMGUI_API bool ErrorLog(const char* msg);
4002  IMGUI_API void ErrorRecoveryStoreState(ImGuiErrorRecoveryState* state_out);
4003  IMGUI_API void ErrorRecoveryTryToRecoverState(const ImGuiErrorRecoveryState* state_in);
4004  IMGUI_API void ErrorRecoveryTryToRecoverWindowState(const ImGuiErrorRecoveryState* state_in);
4005  IMGUI_API void ErrorCheckUsingSetCursorPosToExtendParentBoundaries();
4006  IMGUI_API void ErrorCheckEndFrameFinalizeErrorTooltip();
4007  IMGUI_API bool BeginErrorTooltip();
4008  IMGUI_API void EndErrorTooltip();
4009 
4010  // Debug Tools
4011  IMGUI_API void DebugAllocHook(ImGuiDebugAllocInfo* info, int frame_count, void* ptr, size_t size); // size >= 0 : alloc, size = -1 : free
4012  IMGUI_API void DebugDrawCursorPos(ImU32 col = IM_COL32(255, 0, 0, 255));
4013  IMGUI_API void DebugDrawLineExtents(ImU32 col = IM_COL32(255, 0, 0, 255));
4014  IMGUI_API void DebugDrawItemRect(ImU32 col = IM_COL32(255, 0, 0, 255));
4015  IMGUI_API void DebugTextUnformattedWithLocateItem(const char* line_begin, const char* line_end);
4016  IMGUI_API void DebugLocateItem(ImGuiID target_id); // Call sparingly: only 1 at the same time!
4017  IMGUI_API void DebugLocateItemOnHover(ImGuiID target_id); // Only call on reaction to a mouse Hover: because only 1 at the same time!
4018  IMGUI_API void DebugLocateItemResolveWithLastItem();
4019  IMGUI_API void DebugBreakClearData();
4020  IMGUI_API bool DebugBreakButton(const char* label, const char* description_of_location);
4021  IMGUI_API void DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location);
4022  IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas);
4023  IMGUI_API ImU64 DebugTextureIDToU64(ImTextureID tex_id);
4024  IMGUI_API void DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end);
4025  IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns);
4026  IMGUI_API void DebugNodeDockNode(ImGuiDockNode* node, const char* label);
4027  IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label);
4028  IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb);
4029  IMGUI_API void DebugNodeFont(ImFont* font);
4030  IMGUI_API void DebugNodeFontGlyphesForSrcMask(ImFont* font, ImFontBaked* baked, int src_mask);
4031  IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph);
4032  IMGUI_API void DebugNodeTexture(ImTextureData* tex, int int_id, const ImFontAtlasRect* highlight_rect = NULL); // ID used to facilitate persisting the "current" texture.
4033  IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label);
4034  IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label);
4035  IMGUI_API void DebugNodeTable(ImGuiTable* table);
4036  IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings);
4037  IMGUI_API void DebugNodeInputTextState(ImGuiInputTextState* state);
4038  IMGUI_API void DebugNodeTypingSelectState(ImGuiTypingSelectState* state);
4039  IMGUI_API void DebugNodeMultiSelectState(ImGuiMultiSelectState* state);
4040  IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label);
4041  IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings);
4042  IMGUI_API void DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label);
4043  IMGUI_API void DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack);
4044  IMGUI_API void DebugNodeViewport(ImGuiViewportP* viewport);
4045  IMGUI_API void DebugNodePlatformMonitor(ImGuiPlatformMonitor* monitor, const char* label, int idx);
4046  IMGUI_API void DebugRenderKeyboardPreview(ImDrawList* draw_list);
4047  IMGUI_API void DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb);
4048 
4049  // Obsolete functions
4050 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
4051  //inline void SetItemUsingMouseWheel() { SetItemKeyOwner(ImGuiKey_MouseWheelY); } // Changed in 1.89
4052  //inline bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0) { return TreeNodeUpdateNextOpen(id, flags); } // Renamed in 1.89
4053  //inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // Removed in 1.87: Mapping from named key is always identity!
4054 
4055  // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets which used FocusableItemRegister():
4056  // (Old) IMGUI_VERSION_NUM < 18209: using 'ItemAdd(....)' and 'bool tab_focused = FocusableItemRegister(...)'
4057  // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Focused) != 0'
4058  // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))'
4059  //inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd()
4060  //inline void FocusableItemUnregister(ImGuiWindow* window) // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem
4061 #endif
4062 
4063 } // namespace ImGui
4064 
4065 
4066 //-----------------------------------------------------------------------------
4067 // [SECTION] ImFontLoader
4068 //-----------------------------------------------------------------------------
4069 
4070 // Hooks and storage for a given font backend.
4071 // This structure is likely to evolve as we add support for incremental atlas updates.
4072 // Conceptually this could be public, but API is still going to be evolve.
4074 {
4075  const char* Name;
4076  bool (*LoaderInit)(ImFontAtlas* atlas);
4077  void (*LoaderShutdown)(ImFontAtlas* atlas);
4078  bool (*FontSrcInit)(ImFontAtlas* atlas, ImFontConfig* src);
4079  void (*FontSrcDestroy)(ImFontAtlas* atlas, ImFontConfig* src);
4080  bool (*FontSrcContainsGlyph)(ImFontAtlas* atlas, ImFontConfig* src, ImWchar codepoint);
4081  bool (*FontBakedInit)(ImFontAtlas* atlas, ImFontConfig* src, ImFontBaked* baked, void* loader_data_for_baked_src);
4082  void (*FontBakedDestroy)(ImFontAtlas* atlas, ImFontConfig* src, ImFontBaked* baked, void* loader_data_for_baked_src);
4083  bool (*FontBakedLoadGlyph)(ImFontAtlas* atlas, ImFontConfig* src, ImFontBaked* baked, void* loader_data_for_baked_src, ImWchar codepoint, ImFontGlyph* out_glyph, float* out_advance_x);
4084 
4085  // Size of backend data, Per Baked * Per Source. Buffers are managed by core to avoid excessive allocations.
4086  // FIXME: At this point the two other types of buffers may be managed by core to be consistent?
4087  size_t FontBakedSrcLoaderDataSize;
4088 
4089  ImFontLoader() { memset((void*)this, 0, sizeof(*this)); }
4090 };
4091 
4092 #ifdef IMGUI_ENABLE_STB_TRUETYPE
4093 IMGUI_API const ImFontLoader* ImFontAtlasGetFontLoaderForStbTruetype();
4094 #endif
4095 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
4096 typedef ImFontLoader ImFontBuilderIO; // [renamed/changed in 1.92.0] The types are not actually compatible but we provide this as a compile-time error report helper.
4097 #endif
4098 
4099 //-----------------------------------------------------------------------------
4100 // [SECTION] ImFontAtlas internal API
4101 //-----------------------------------------------------------------------------
4102 
4103 #define IMGUI_FONT_SIZE_MAX (512.0f)
4104 #define IMGUI_FONT_SIZE_THRESHOLD_FOR_LOADADVANCEXONLYMODE (128.0f)
4105 
4106 // Helpers: ImTextureRef ==/!= operators provided as convenience
4107 // (note that _TexID and _TexData are never set simultaneously)
4108 inline bool operator==(const ImTextureRef& lhs, const ImTextureRef& rhs) { return lhs._TexID == rhs._TexID && lhs._TexData == rhs._TexData; }
4109 inline bool operator!=(const ImTextureRef& lhs, const ImTextureRef& rhs) { return lhs._TexID != rhs._TexID || lhs._TexData != rhs._TexData; }
4110 
4111 // Refer to ImFontAtlasPackGetRect() to better understand how this works.
4112 #define ImFontAtlasRectId_IndexMask_ (0x0007FFFF) // 20-bits signed: index to access builder->RectsIndex[].
4113 #define ImFontAtlasRectId_GenerationMask_ (0x3FF00000) // 10-bits: entry generation, so each ID is unique and get can safely detected old identifiers.
4114 #define ImFontAtlasRectId_GenerationShift_ (20)
4115 inline int ImFontAtlasRectId_GetIndex(ImFontAtlasRectId id) { return (id & ImFontAtlasRectId_IndexMask_); }
4116 inline unsigned int ImFontAtlasRectId_GetGeneration(ImFontAtlasRectId id) { return (unsigned int)(id & ImFontAtlasRectId_GenerationMask_) >> ImFontAtlasRectId_GenerationShift_; }
4117 inline ImFontAtlasRectId ImFontAtlasRectId_Make(int index_idx, int gen_idx) { IM_ASSERT(index_idx >= 0 && index_idx <= ImFontAtlasRectId_IndexMask_ && gen_idx <= (ImFontAtlasRectId_GenerationMask_ >> ImFontAtlasRectId_GenerationShift_)); return (ImFontAtlasRectId)(index_idx | (gen_idx << ImFontAtlasRectId_GenerationShift_)); }
4118 
4119 // Packed rectangle lookup entry (we need an indirection to allow removing/reordering rectangles)
4120 // User are returned ImFontAtlasRectId values which are meant to be persistent.
4121 // We handle this with an indirection. While Rects[] may be in theory shuffled, compacted etc., RectsIndex[] cannot it is keyed by ImFontAtlasRectId.
4122 // RectsIndex[] is used both as an index into Rects[] and an index into itself. This is basically a free-list. See ImFontAtlasBuildAllocRectIndexEntry() code.
4123 // Having this also makes it easier to e.g. sort rectangles during repack.
4125 {
4126  int TargetIndex : 20; // When Used: ImFontAtlasRectId -> into Rects[]. When unused: index to next unused RectsIndex[] slot to consume free-list.
4127  unsigned int Generation : 10; // Increased each time the entry is reused for a new rectangle.
4128  unsigned int IsUsed : 1;
4129 };
4130 
4131 // Data available to potential texture post-processing functions
4133 {
4134  ImFontAtlas* FontAtlas;
4135  ImFont* Font;
4136  ImFontConfig* FontSrc;
4137  ImFontBaked* FontBaked;
4138  ImFontGlyph* Glyph;
4139 
4140  // Pixel data
4141  void* Pixels;
4142  ImTextureFormat Format;
4143  int Pitch;
4144  int Width;
4145  int Height;
4146 };
4147 
4148 // We avoid dragging imstb_rectpack.h into public header (partly because binding generators are having issues with it)
4149 #ifdef IMGUI_STB_NAMESPACE
4150 namespace IMGUI_STB_NAMESPACE { struct stbrp_node; }
4151 typedef IMGUI_STB_NAMESPACE::stbrp_node stbrp_node_im;
4152 #else
4153 struct stbrp_node;
4154 typedef stbrp_node stbrp_node_im;
4155 #endif
4156 struct stbrp_context_opaque { char data[80]; };
4157 
4158 // Internal storage for incrementally packing and building a ImFontAtlas
4160 {
4161  stbrp_context_opaque PackContext; // Actually 'stbrp_context' but we don't want to define this in the header file.
4162  ImVector<stbrp_node_im> PackNodes;
4164  ImVector<ImFontAtlasRectEntry> RectsIndex; // ImFontAtlasRectId -> index into Rects[]
4165  ImVector<unsigned char> TempBuffer; // Misc scratch buffer
4166  int RectsIndexFreeListStart;// First unused entry
4167  int RectsPackedCount; // Number of packed rectangles.
4168  int RectsPackedSurface; // Number of packed pixels. Used when compacting to heuristically find the ideal texture size.
4169  int RectsDiscardedCount;
4170  int RectsDiscardedSurface;
4171  int FrameCount; // Current frame count
4172  ImVec2i MaxRectSize; // Largest rectangle to pack (de-facto used as a "minimum texture size")
4173  ImVec2i MaxRectBounds; // Bottom-right most used pixels
4174  bool LockDisableResize; // Disable resizing texture
4175  bool PreloadedAllGlyphsRanges; // Set when missing ImGuiBackendFlags_RendererHasTextures features forces atlas to preload everything.
4176 
4177  // Cache of all ImFontBaked
4179  ImGuiStorage BakedMap; // BakedId --> ImFontBaked*
4180  int BakedDiscardedCount;
4181 
4182  // Custom rectangle identifiers
4183  ImFontAtlasRectId PackIdMouseCursors; // White pixel + mouse cursors. Also happen to be fallback in case of packing failure.
4184  ImFontAtlasRectId PackIdLinesTexData;
4185 
4186  ImFontAtlasBuilder() { memset((void*)this, 0, sizeof(*this)); FrameCount = -1; RectsIndexFreeListStart = -1; PackIdMouseCursors = PackIdLinesTexData = -1; }
4187 };
4188 
4189 IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas);
4190 IMGUI_API void ImFontAtlasBuildDestroy(ImFontAtlas* atlas);
4191 IMGUI_API void ImFontAtlasBuildMain(ImFontAtlas* atlas);
4192 IMGUI_API void ImFontAtlasBuildSetupFontLoader(ImFontAtlas* atlas, const ImFontLoader* font_loader);
4193 IMGUI_API void ImFontAtlasBuildNotifySetFont(ImFontAtlas* atlas, ImFont* old_font, ImFont* new_font);
4194 IMGUI_API void ImFontAtlasBuildUpdatePointers(ImFontAtlas* atlas);
4195 IMGUI_API void ImFontAtlasBuildRenderBitmapFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char);
4196 IMGUI_API void ImFontAtlasBuildClear(ImFontAtlas* atlas); // Clear output and custom rects
4197 
4198 IMGUI_API ImTextureData* ImFontAtlasTextureAdd(ImFontAtlas* atlas, int w, int h);
4199 IMGUI_API void ImFontAtlasTextureMakeSpace(ImFontAtlas* atlas);
4200 IMGUI_API void ImFontAtlasTextureRepack(ImFontAtlas* atlas, int w, int h);
4201 IMGUI_API void ImFontAtlasTextureGrow(ImFontAtlas* atlas, int old_w = -1, int old_h = -1);
4202 IMGUI_API void ImFontAtlasTextureCompact(ImFontAtlas* atlas);
4203 IMGUI_API ImVec2i ImFontAtlasTextureGetSizeEstimate(ImFontAtlas* atlas);
4204 
4205 IMGUI_API void ImFontAtlasBuildSetupFontSpecialGlyphs(ImFontAtlas* atlas, ImFont* font, ImFontConfig* src);
4206 IMGUI_API void ImFontAtlasBuildLegacyPreloadAllGlyphRanges(ImFontAtlas* atlas); // Legacy
4207 IMGUI_API void ImFontAtlasBuildGetOversampleFactors(ImFontConfig* src, ImFontBaked* baked, int* out_oversample_h, int* out_oversample_v);
4208 IMGUI_API void ImFontAtlasBuildDiscardBakes(ImFontAtlas* atlas, int unused_frames);
4209 
4210 IMGUI_API bool ImFontAtlasFontSourceInit(ImFontAtlas* atlas, ImFontConfig* src);
4211 IMGUI_API void ImFontAtlasFontSourceAddToFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* src);
4212 IMGUI_API void ImFontAtlasFontDestroySourceData(ImFontAtlas* atlas, ImFontConfig* src);
4213 IMGUI_API bool ImFontAtlasFontInitOutput(ImFontAtlas* atlas, ImFont* font); // Using FontDestroyOutput/FontInitOutput sequence useful notably if font loader params have changed
4214 IMGUI_API void ImFontAtlasFontDestroyOutput(ImFontAtlas* atlas, ImFont* font);
4215 IMGUI_API void ImFontAtlasFontRebuildOutput(ImFontAtlas* atlas, ImFont* font);
4216 IMGUI_API void ImFontAtlasFontDiscardBakes(ImFontAtlas* atlas, ImFont* font, int unused_frames);
4217 
4218 IMGUI_API ImGuiID ImFontAtlasBakedGetId(ImGuiID font_id, float baked_size, float rasterizer_density);
4219 IMGUI_API ImFontBaked* ImFontAtlasBakedGetOrAdd(ImFontAtlas* atlas, ImFont* font, float font_size, float font_rasterizer_density);
4220 IMGUI_API ImFontBaked* ImFontAtlasBakedGetClosestMatch(ImFontAtlas* atlas, ImFont* font, float font_size, float font_rasterizer_density);
4221 IMGUI_API ImFontBaked* ImFontAtlasBakedAdd(ImFontAtlas* atlas, ImFont* font, float font_size, float font_rasterizer_density, ImGuiID baked_id);
4222 IMGUI_API void ImFontAtlasBakedDiscard(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked);
4223 IMGUI_API ImFontGlyph* ImFontAtlasBakedAddFontGlyph(ImFontAtlas* atlas, ImFontBaked* baked, ImFontConfig* src, const ImFontGlyph* in_glyph);
4224 IMGUI_API void ImFontAtlasBakedAddFontGlyphAdvancedX(ImFontAtlas* atlas, ImFontBaked* baked, ImFontConfig* src, ImWchar codepoint, float advance_x);
4225 IMGUI_API void ImFontAtlasBakedDiscardFontGlyph(ImFontAtlas* atlas, ImFont* font, ImFontBaked* baked, ImFontGlyph* glyph);
4226 IMGUI_API void ImFontAtlasBakedSetFontGlyphBitmap(ImFontAtlas* atlas, ImFontBaked* baked, ImFontConfig* src, ImFontGlyph* glyph, ImTextureRect* r, const unsigned char* src_pixels, ImTextureFormat src_fmt, int src_pitch);
4227 
4228 IMGUI_API void ImFontAtlasPackInit(ImFontAtlas* atlas);
4229 IMGUI_API ImFontAtlasRectId ImFontAtlasPackAddRect(ImFontAtlas* atlas, int w, int h, ImFontAtlasRectEntry* overwrite_entry = NULL);
4230 IMGUI_API ImTextureRect* ImFontAtlasPackGetRect(ImFontAtlas* atlas, ImFontAtlasRectId id);
4231 IMGUI_API ImTextureRect* ImFontAtlasPackGetRectSafe(ImFontAtlas* atlas, ImFontAtlasRectId id);
4232 IMGUI_API void ImFontAtlasPackDiscardRect(ImFontAtlas* atlas, ImFontAtlasRectId id);
4233 
4234 IMGUI_API void ImFontAtlasUpdateNewFrame(ImFontAtlas* atlas, int frame_count, bool renderer_has_textures);
4235 IMGUI_API void ImFontAtlasAddDrawListSharedData(ImFontAtlas* atlas, ImDrawListSharedData* data);
4236 IMGUI_API void ImFontAtlasRemoveDrawListSharedData(ImFontAtlas* atlas, ImDrawListSharedData* data);
4237 IMGUI_API void ImFontAtlasUpdateDrawListsTextures(ImFontAtlas* atlas, ImTextureRef old_tex, ImTextureRef new_tex);
4238 IMGUI_API void ImFontAtlasUpdateDrawListsSharedData(ImFontAtlas* atlas);
4239 
4240 IMGUI_API void ImFontAtlasTextureBlockConvert(const unsigned char* src_pixels, ImTextureFormat src_fmt, int src_pitch, unsigned char* dst_pixels, ImTextureFormat dst_fmt, int dst_pitch, int w, int h);
4241 IMGUI_API void ImFontAtlasTextureBlockPostProcess(ImFontAtlasPostProcessData* data);
4242 IMGUI_API void ImFontAtlasTextureBlockPostProcessMultiply(ImFontAtlasPostProcessData* data, float multiply_factor);
4243 IMGUI_API void ImFontAtlasTextureBlockFill(ImTextureData* dst_tex, int dst_x, int dst_y, int w, int h, ImU32 col);
4244 IMGUI_API void ImFontAtlasTextureBlockCopy(ImTextureData* src_tex, int src_x, int src_y, ImTextureData* dst_tex, int dst_x, int dst_y, int w, int h);
4245 IMGUI_API void ImFontAtlasTextureBlockQueueUpload(ImFontAtlas* atlas, ImTextureData* tex, int x, int y, int w, int h);
4246 
4247 IMGUI_API int ImTextureDataGetFormatBytesPerPixel(ImTextureFormat format);
4248 IMGUI_API const char* ImTextureDataGetStatusName(ImTextureStatus status);
4249 IMGUI_API const char* ImTextureDataGetFormatName(ImTextureFormat format);
4250 
4251 #ifndef IMGUI_DISABLE_DEBUG_TOOLS
4252 IMGUI_API void ImFontAtlasDebugLogTextureRequests(ImFontAtlas* atlas);
4253 #endif
4254 
4255 IMGUI_API bool ImFontAtlasGetMouseCursorTexData(ImFontAtlas* atlas, ImGuiMouseCursor cursor_type, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]);
4256 
4257 //-----------------------------------------------------------------------------
4258 // [SECTION] Test Engine specific hooks (imgui_test_engine)
4259 //-----------------------------------------------------------------------------
4260 
4261 #ifdef IMGUI_ENABLE_TEST_ENGINE
4262 extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, ImGuiID id, const ImRect& bb, const ImGuiLastItemData* item_data); // item_data may be NULL
4263 extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags);
4264 extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...);
4265 extern const char* ImGuiTestEngine_FindItemDebugLabel(ImGuiContext* ctx, ImGuiID id);
4266 
4267 // In IMGUI_VERSION_NUM >= 18934: changed IMGUI_TEST_ENGINE_ITEM_ADD(bb,id) to IMGUI_TEST_ENGINE_ITEM_ADD(id,bb,item_data);
4268 #define IMGUI_TEST_ENGINE_ITEM_ADD(_ID,_BB,_ITEM_DATA) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _ID, _BB, _ITEM_DATA) // Register item bounding box
4269 #define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register item label and status flags (optional)
4270 #define IMGUI_TEST_ENGINE_LOG(_FMT,...) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log
4271 #else
4272 #define IMGUI_TEST_ENGINE_ITEM_ADD(_ID,_BB,_ITEM_DATA) ((void)0)
4273 #define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) ((void)g)
4274 #endif
4275 
4276 //-----------------------------------------------------------------------------
4277 
4278 #if defined(__clang__)
4279 #pragma clang diagnostic pop
4280 #elif defined(__GNUC__)
4281 #pragma GCC diagnostic pop
4282 #endif
4283 
4284 #ifdef _MSC_VER
4285 #pragma warning (pop)
4286 #endif
4287 
4288 #endif // #ifndef IMGUI_DISABLE
Definition: imgui_internal.h:1395
Definition: imgui_internal.h:3047
Definition: imgui_internal.h:871
Definition: imgui_internal.h:1562
Definition: imgui.h:3665
Definition: imgui.h:3621
Definition: imgui_internal.h:1560
Definition: imgui_internal.h:1861
Definition: imgui.h:3934
Definition: imgui.h:2883
Definition: imgui_internal.h:1565
Definition: imgui_internal.h:2181
Definition: imgui_internal.h:1823
Definition: imgui_internal.h:804
Definition: imgui_internal.h:1812
Definition: imgui_internal.h:2290
Definition: imgui.h:3291
Definition: imgui_internal.h:737
Definition: imgui_internal.h:823
Definition: imgui_internal.h:1219
Definition: imgui_internal.h:1793
Definition: imgui_internal.h:3170
Definition: imgui_internal.h:1559
Definition: imgui_internal.h:566
Definition: imstb_rectpack.h:179
Definition: imgui_internal.h:933
Definition: imgui_internal.h:1558
Definition: imgui_internal.h:3027
Definition: imgui_internal.h:2337
Definition: imgui_internal.h:1241
Definition: imgui.h:372
Definition: imgui.h:3783
Definition: imgui.h:315
Definition: imgui_internal.h:4132
Definition: imgui_internal.h:1563
Definition: imgui_internal.h:2107
Definition: imgui_internal.h:4156
Definition: imgui.h:4167
Definition: imgui_internal.h:1444
Definition: imgui_internal.h:1896
Definition: imgui.h:2474
Definition: imgui.h:2797
Definition: imgui_internal.h:4124
Definition: imgui.h:2904
Definition: imgui_internal.h:655
Definition: imgui.h:2239
Definition: imgui_internal.h:2297
Definition: imgui.h:393
Definition: imgui_internal.h:1236
Definition: imgui.h:2229
Definition: imgui.h:2985
Definition: imgui_internal.h:2326
Definition: imgui_internal.h:1453
Definition: imgui.h:2921
Definition: imgui.h:3398
Definition: imgui_internal.h:1169
Definition: imgui.h:302
Type
Definition: log.h:33
Definition: imgui.h:3982
Definition: imgui_internal.h:1460
Definition: imgui_internal.h:670
Definition: imgui_internal.h:1414
Definition: imgui_internal.h:3318
Definition: imgui_internal.h:4073
Definition: imgui_internal.h:2129
Definition: imgui_internal.h:1330
Graphics::Surface * scale(const Graphics::Surface &srcImage, int xSize, int ySize)
Definition: imgui_internal.h:3193
MouseButton
Definition: events.h:194
Definition: imgui_internal.h:1182
Definition: imgui_internal.h:684
Definition: imgui_internal.h:2307
Definition: imgui_internal.h:1619
Definition: imgui.h:2482
Definition: imgui_internal.h:1201
Definition: imgui_internal.h:1593
Definition: imgui.h:3608
Definition: imgui_internal.h:1607
Definition: imgui_internal.h:1557
Definition: imgui_internal.h:2854
Definition: imgui_internal.h:926
Definition: imgui.h:2813
Definition: imgui_internal.h:1928
Definition: imgui_internal.h:1689
Definition: imgui.h:4080
Definition: imgui.h:3172
Definition: imgui_internal.h:1953
Definition: imgui_internal.h:946
Definition: imgui_internal.h:2112
Definition: imgui_internal.h:4159
Definition: imgui_internal.h:1470
Definition: imgui_internal.h:3101
Definition: imgui_internal.h:1871
Definition: imgui.h:4289
Definition: imgui_internal.h:1373
Definition: imgui_internal.h:1561
Definition: imgui_internal.h:582
Definition: imgui_internal.h:3161
Definition: imstb_textedit.h:342
Definition: imgui_internal.h:1776
Definition: imgui_internal.h:2025
Definition: imgui.h:3343
Definition: imgui.h:2363
Definition: imgui_internal.h:3366
Definition: imgui_internal.h:2796
Definition: imgui.h:3556
Definition: imgui_internal.h:714
Definition: imgui_internal.h:906
Definition: imgui.h:4279
Definition: imgui_internal.h:2383
Definition: imgui_internal.h:1490
Definition: imgui_internal.h:2351
Definition: imgui_internal.h:952
Definition: imgui.h:3746
Definition: imgui_internal.h:3180
Definition: imgui_internal.h:898
Definition: imgui_internal.h:1426
Definition: imgui_internal.h:2238
Definition: input.h:69
Definition: imgui.h:3708
Definition: imgui_internal.h:3342
Definition: imgui_internal.h:917
Definition: imgui_internal.h:2368
Definition: imgui_internal.h:770
Definition: imgui_internal.h:592
Definition: imgui_internal.h:574
Definition: imgui_internal.h:2200
Definition: imgui_internal.h:1676