vsgImGui  0.0.0
VulkanSceneGraph 3rd party data integration library
imgui_internal.h
1 // dear imgui, v1.89.2
2 // (internal structures/api)
3 
4 // You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
5 // Set:
6 // #define IMGUI_DEFINE_MATH_OPERATORS
7 // To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators)
8 
9 /*
10 
11 Index of this file:
12 
13 // [SECTION] Header mess
14 // [SECTION] Forward declarations
15 // [SECTION] Context pointer
16 // [SECTION] STB libraries includes
17 // [SECTION] Macros
18 // [SECTION] Generic helpers
19 // [SECTION] ImDrawList support
20 // [SECTION] Widgets support: flags, enums, data structures
21 // [SECTION] Inputs support
22 // [SECTION] Clipper support
23 // [SECTION] Navigation support
24 // [SECTION] Columns support
25 // [SECTION] Multi-select support
26 // [SECTION] Docking support
27 // [SECTION] Viewport support
28 // [SECTION] Settings support
29 // [SECTION] Localization support
30 // [SECTION] Metrics, Debug tools
31 // [SECTION] Generic context hooks
32 // [SECTION] ImGuiContext (main imgui context)
33 // [SECTION] ImGuiWindowTempData, ImGuiWindow
34 // [SECTION] Tab bar, Tab item support
35 // [SECTION] Table support
36 // [SECTION] ImGui internal API
37 // [SECTION] ImFontAtlas internal API
38 // [SECTION] Test Engine specific hooks (imgui_test_engine)
39 
40 */
41 
42 #pragma once
43 #ifndef IMGUI_DISABLE
44 
45 //-----------------------------------------------------------------------------
46 // [SECTION] Header mess
47 //-----------------------------------------------------------------------------
48 
49 #ifndef IMGUI_VERSION
50 #include "imgui.h"
51 #endif
52 
53 #include <stdio.h> // FILE*, sscanf
54 #include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof
55 #include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf
56 #include <limits.h> // INT_MIN, INT_MAX
57 
58 // Enable SSE intrinsics if available
59 #if (defined __SSE__ || defined __x86_64__ || defined _M_X64 || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1))) && !defined(IMGUI_DISABLE_SSE)
60 #define IMGUI_ENABLE_SSE
61 #include <immintrin.h>
62 #endif
63 
64 // Visual Studio warnings
65 #ifdef _MSC_VER
66 #pragma warning (push)
67 #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)
68 #pragma warning (disable: 26812) // The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). [MSVC Static Analyzer)
69 #pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6).
70 #if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later
71 #pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types
72 #endif
73 #endif
74 
75 // Clang/GCC warnings with -Weverything
76 #if defined(__clang__)
77 #pragma clang diagnostic push
78 #if __has_warning("-Wunknown-warning-option")
79 #pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx'
80 #endif
81 #pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx'
82 #pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloorSigned()
83 #pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h
84 #pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h
85 #pragma clang diagnostic ignored "-Wold-style-cast"
86 #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
87 #pragma clang diagnostic ignored "-Wdouble-promotion"
88 #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision
89 #pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn'
90 #elif defined(__GNUC__)
91 #pragma GCC diagnostic push
92 #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
93 #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
94 #endif
95 
96 // Legacy defines
97 #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74
98 #error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
99 #endif
100 #ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74
101 #error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
102 #endif
103 
104 // Enable stb_truetype by default unless FreeType is enabled.
105 // You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together.
106 #ifndef IMGUI_ENABLE_FREETYPE
107 #define IMGUI_ENABLE_STB_TRUETYPE
108 #endif
109 
110 //-----------------------------------------------------------------------------
111 // [SECTION] Forward declarations
112 //-----------------------------------------------------------------------------
113 
114 struct ImBitVector; // Store 1-bit per value
115 struct ImRect; // An axis-aligned rectangle (2 points)
116 struct ImDrawDataBuilder; // Helper to build a ImDrawData instance
117 struct ImDrawListSharedData; // Data shared between all ImDrawList instances
118 struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it
119 struct ImGuiContext; // Main Dear ImGui context
120 struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine
121 struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum
122 struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()
123 struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box
124 struct ImGuiLastItemData; // Status storage for last submitted items
125 struct ImGuiLocEntry; // A localization entry.
126 struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only
127 struct ImGuiNavItemData; // Result of a gamepad/keyboard directional navigation move query result
128 struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions
129 struct ImGuiNextWindowData; // Storage for SetNextWindow** functions
130 struct ImGuiNextItemData; // Storage for SetNextItem** functions
131 struct ImGuiOldColumnData; // Storage data for a single column for legacy Columns() api
132 struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api
133 struct ImGuiPopupData; // Storage for current popup stack
134 struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file
135 struct ImGuiStackSizes; // Storage of stack sizes for debugging/asserting
136 struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it
137 struct ImGuiTabBar; // Storage for a tab bar
138 struct ImGuiTabItem; // Storage for a tab item (within a tab bar)
139 struct ImGuiTable; // Storage for a table
140 struct ImGuiTableColumn; // Storage for one column of a table
141 struct ImGuiTableInstanceData; // Storage for one instance of a same table
142 struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables.
143 struct ImGuiTableSettings; // Storage for a table .ini settings
144 struct ImGuiTableColumnsSettings; // Storage for a column .ini settings
145 struct ImGuiWindow; // Storage for one window
146 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)
147 struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session)
148 
149 // Enumerations
150 // Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.
151 enum ImGuiLocKey : int; // -> enum ImGuiLocKey // Enum: a localization entry for translation.
152 typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical
153 
154 // Flags
155 typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later)
156 typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags
157 typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for IsKeyPressed(), IsMouseClicked(), SetKeyOwner(), SetItemKeyOwner() etc.
158 typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag(), g.LastItemData.InFlags
159 typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for g.LastItemData.StatusFlags
160 typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns()
161 typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight()
162 typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests
163 typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions
164 typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions
165 typedef int ImGuiScrollFlags; // -> enum ImGuiScrollFlags_ // Flags: for ScrollToItem() and navigation requests
166 typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx()
167 typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx()
168 typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx()
169 
170 typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...);
171 
172 //-----------------------------------------------------------------------------
173 // [SECTION] Context pointer
174 // See implementation of this variable in imgui.cpp for comments and details.
175 //-----------------------------------------------------------------------------
176 
177 #ifndef GImGui
178 extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
179 #endif
180 
181 //-------------------------------------------------------------------------
182 // [SECTION] STB libraries includes
183 //-------------------------------------------------------------------------
184 
185 namespace ImStb
186 {
187 
188 #undef STB_TEXTEDIT_STRING
189 #undef STB_TEXTEDIT_CHARTYPE
190 #define STB_TEXTEDIT_STRING ImGuiInputTextState
191 #define STB_TEXTEDIT_CHARTYPE ImWchar
192 #define STB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f)
193 #define STB_TEXTEDIT_UNDOSTATECOUNT 99
194 #define STB_TEXTEDIT_UNDOCHARCOUNT 999
195 #include "imstb_textedit.h"
196 
197 } // namespace ImStb
198 
199 //-----------------------------------------------------------------------------
200 // [SECTION] Macros
201 //-----------------------------------------------------------------------------
202 
203 // Debug Printing Into TTY
204 // (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)
205 #ifndef IMGUI_DEBUG_PRINTF
206 #ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
207 #define IMGUI_DEBUG_PRINTF(_FMT,...) printf(_FMT, __VA_ARGS__)
208 #else
209 #define IMGUI_DEBUG_PRINTF(_FMT,...) ((void)0)
210 #endif
211 #endif
212 
213 // Debug Logging for ShowDebugLogWindow(). This is designed for relatively rare events so please don't spam.
214 #ifndef IMGUI_DISABLE_DEBUG_TOOLS
215 #define IMGUI_DEBUG_LOG(...) ImGui::DebugLog(__VA_ARGS__)
216 #else
217 #define IMGUI_DEBUG_LOG(...) ((void)0)
218 #endif
219 #define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
220 #define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
221 #define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
222 #define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
223 #define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
224 #define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
225 
226 // Static Asserts
227 #define IM_STATIC_ASSERT(_COND) static_assert(_COND, "")
228 
229 // "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much.
230 // 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.
231 //#define IMGUI_DEBUG_PARANOID
232 #ifdef IMGUI_DEBUG_PARANOID
233 #define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR)
234 #else
235 #define IM_ASSERT_PARANOID(_EXPR)
236 #endif
237 
238 // Error handling
239 // Down the line in some frameworks/languages we would like to have a way to redirect those to the programmer and recover from more faults.
240 #ifndef IM_ASSERT_USER_ERROR
241 #define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG) // Recoverable User Error
242 #endif
243 
244 // Misc Macros
245 #define IM_PI 3.14159265358979323846f
246 #ifdef _WIN32
247 #define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!)
248 #else
249 #define IM_NEWLINE "\n"
250 #endif
251 #ifndef IM_TABSIZE // Until we move this to runtime and/or add proper tab support, at least allow users to compile-time override
252 #define IM_TABSIZE (4)
253 #endif
254 #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
255 #define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose
256 #define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255
257 #define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds
258 #define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) //
259 
260 // Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
261 #ifdef _MSC_VER
262 #define IMGUI_CDECL __cdecl
263 #else
264 #define IMGUI_CDECL
265 #endif
266 
267 // Warnings
268 #if defined(_MSC_VER) && !defined(__clang__)
269 #define IM_MSVC_WARNING_SUPPRESS(XXXX) __pragma(warning(suppress: XXXX))
270 #else
271 #define IM_MSVC_WARNING_SUPPRESS(XXXX)
272 #endif
273 
274 // Debug Tools
275 // Use 'Metrics/Debugger->Tools->Item Picker' to break into the call-stack of a specific item.
276 // This will call IM_DEBUG_BREAK() which you may redefine yourself. See https://github.com/scottt/debugbreak for more reference.
277 #ifndef IM_DEBUG_BREAK
278 #if defined (_MSC_VER)
279 #define IM_DEBUG_BREAK() __debugbreak()
280 #elif defined(__clang__)
281 #define IM_DEBUG_BREAK() __builtin_debugtrap()
282 #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
283 #define IM_DEBUG_BREAK() __asm__ volatile("int $0x03")
284 #elif defined(__GNUC__) && defined(__thumb__)
285 #define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xde01")
286 #elif defined(__GNUC__) && defined(__arm__) && !defined(__thumb__)
287 #define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0");
288 #else
289 #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!
290 #endif
291 #endif // #ifndef IM_DEBUG_BREAK
292 
293 //-----------------------------------------------------------------------------
294 // [SECTION] Generic helpers
295 // Note that the ImXXX helpers functions are lower-level than ImGui functions.
296 // ImGui functions or the ImGui context are never called/used from other ImXXX functions.
297 //-----------------------------------------------------------------------------
298 // - Helpers: Hashing
299 // - Helpers: Sorting
300 // - Helpers: Bit manipulation
301 // - Helpers: String
302 // - Helpers: Formatting
303 // - Helpers: UTF-8 <> wchar conversions
304 // - Helpers: ImVec2/ImVec4 operators
305 // - Helpers: Maths
306 // - Helpers: Geometry
307 // - Helper: ImVec1
308 // - Helper: ImVec2ih
309 // - Helper: ImRect
310 // - Helper: ImBitArray
311 // - Helper: ImBitVector
312 // - Helper: ImSpan<>, ImSpanAllocator<>
313 // - Helper: ImPool<>
314 // - Helper: ImChunkStream<>
315 // - Helper: ImGuiTextIndex
316 //-----------------------------------------------------------------------------
317 
318 // Helpers: Hashing
319 IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImU32 seed = 0);
320 IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0);
321 
322 // Helpers: Sorting
323 #ifndef ImQsort
324 static 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); }
325 #endif
326 
327 // Helpers: Color Blending
328 IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b);
329 
330 // Helpers: Bit manipulation
331 static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
332 static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; }
333 static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
334 
335 // Helpers: String
336 IMGUI_API int ImStricmp(const char* str1, const char* str2);
337 IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count);
338 IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count);
339 IMGUI_API char* ImStrdup(const char* str);
340 IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str);
341 IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c);
342 IMGUI_API int ImStrlenW(const ImWchar* str);
343 IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line
344 IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line
345 IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end);
346 IMGUI_API void ImStrTrimBlanks(char* str);
347 IMGUI_API const char* ImStrSkipBlank(const char* str);
348 IM_MSVC_RUNTIME_CHECKS_OFF
349 static inline char ImToUpper(char c) { return (c >= 'a' && c <= 'z') ? c &= ~32 : c; }
350 static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; }
351 static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; }
352 IM_MSVC_RUNTIME_CHECKS_RESTORE
353 
354 // Helpers: Formatting
355 IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3);
356 IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);
357 IMGUI_API void ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...) IM_FMTARGS(3);
358 IMGUI_API void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, const char* fmt, va_list args) IM_FMTLIST(3);
359 IMGUI_API const char* ImParseFormatFindStart(const char* format);
360 IMGUI_API const char* ImParseFormatFindEnd(const char* format);
361 IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size);
362 IMGUI_API void ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t fmt_out_size);
363 IMGUI_API const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size);
364 IMGUI_API int ImParseFormatPrecision(const char* format, int default_value);
365 
366 // Helpers: UTF-8 <> wchar conversions
367 IMGUI_API const char* ImTextCharToUtf8(char out_buf[5], unsigned int c); // return out_buf
368 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
369 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
370 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
371 IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count)
372 IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8
373 IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8
374 
375 // Helpers: ImVec2/ImVec4 operators
376 // We are keeping those disabled by default so they don't leak in user space, to allow user enabling implicit cast operators between ImVec2 and their own types (using IM_VEC2_CLASS_EXTRA etc.)
377 // We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself.
378 #ifdef IMGUI_DEFINE_MATH_OPERATORS
379 IM_MSVC_RUNTIME_CHECKS_OFF
380 static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x * rhs, lhs.y * rhs); }
381 static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x / rhs, lhs.y / rhs); }
382 static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y); }
383 static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x - rhs.x, lhs.y - rhs.y); }
384 static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
385 static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x / rhs.x, lhs.y / rhs.y); }
386 static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; }
387 static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; }
388 static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; }
389 static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; }
390 static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; }
391 static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; }
392 static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); }
393 static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); }
394 static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); }
395 IM_MSVC_RUNTIME_CHECKS_RESTORE
396 #endif
397 
398 // Helpers: File System
399 #ifdef IMGUI_DISABLE_FILE_FUNCTIONS
400 #define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
401 typedef void* ImFileHandle;
402 static inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; }
403 static inline bool ImFileClose(ImFileHandle) { return false; }
404 static inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; }
405 static inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; }
406 static inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; }
407 #endif
408 #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
409 typedef FILE* ImFileHandle;
410 IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode);
411 IMGUI_API bool ImFileClose(ImFileHandle file);
412 IMGUI_API ImU64 ImFileGetSize(ImFileHandle file);
413 IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file);
414 IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file);
415 #else
416 #define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions
417 #endif
418 IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0);
419 
420 // Helpers: Maths
421 IM_MSVC_RUNTIME_CHECKS_OFF
422 // - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy)
423 #ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
424 #define ImFabs(X) fabsf(X)
425 #define ImSqrt(X) sqrtf(X)
426 #define ImFmod(X, Y) fmodf((X), (Y))
427 #define ImCos(X) cosf(X)
428 #define ImSin(X) sinf(X)
429 #define ImAcos(X) acosf(X)
430 #define ImAtan2(Y, X) atan2f((Y), (X))
431 #define ImAtof(STR) atof(STR)
432 //#define ImFloorStd(X) floorf(X) // We use our own, see ImFloor() and ImFloorSigned()
433 #define ImCeil(X) ceilf(X)
434 static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision
435 static inline double ImPow(double x, double y) { return pow(x, y); }
436 static inline float ImLog(float x) { return logf(x); } // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision
437 static inline double ImLog(double x) { return log(x); }
438 static inline int ImAbs(int x) { return x < 0 ? -x : x; }
439 static inline float ImAbs(float x) { return fabsf(x); }
440 static inline double ImAbs(double x) { return fabs(x); }
441 static 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
442 static inline double ImSign(double x) { return (x < 0.0) ? -1.0 : (x > 0.0) ? 1.0 : 0.0; }
443 #ifdef IMGUI_ENABLE_SSE
444 static inline float ImRsqrt(float x) { return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(x))); }
445 #else
446 static inline float ImRsqrt(float x) { return 1.0f / sqrtf(x); }
447 #endif
448 static inline double ImRsqrt(double x) { return 1.0 / sqrt(x); }
449 #endif
450 // - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double
451 // (Exceptionally using templates here but we could also redefine them for those types)
452 template<typename T> static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; }
453 template<typename T> static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; }
454 template<typename T> static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; }
455 template<typename T> static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); }
456 template<typename T> static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; }
457 template<typename T> static inline 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; }
458 template<typename T> static inline 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; }
459 // - Misc maths helpers
460 static 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); }
461 static 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); }
462 static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, 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); }
463 static 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); }
464 static 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); }
465 static 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); }
466 static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }
467 static inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); }
468 static inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); }
469 static 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; }
470 static inline float ImFloor(float f) { return (float)(int)(f); }
471 static inline float ImFloorSigned(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf()
472 static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); }
473 static inline ImVec2 ImFloorSigned(const ImVec2& v) { return ImVec2(ImFloorSigned(v.x), ImFloorSigned(v.y)); }
474 static inline int ImModPositive(int a, int b) { return (a + b) % b; }
475 static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; }
476 static 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); }
477 static 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; }
478 static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
479 static inline bool ImIsFloatAboveGuaranteedIntegerPrecision(float f) { return f <= -16777216 || f >= 16777216; }
480 static inline float ImExponentialMovingAverage(float avg, float sample, int n) { avg -= avg / n; avg += sample / n; return avg; }
481 IM_MSVC_RUNTIME_CHECKS_RESTORE
482 
483 // Helpers: Geometry
484 IMGUI_API ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t);
485 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
486 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
487 IMGUI_API ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t);
488 IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);
489 IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
490 IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
491 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);
492 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; }
493 IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy);
494 
495 // Helper: ImVec1 (1D vector)
496 // (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
497 IM_MSVC_RUNTIME_CHECKS_OFF
498 struct ImVec1
499 {
500  float x;
501  constexpr ImVec1() : x(0.0f) { }
502  constexpr ImVec1(float _x) : x(_x) { }
503 };
504 
505 // Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage)
506 struct ImVec2ih
507 {
508  short x, y;
509  constexpr ImVec2ih() : x(0), y(0) {}
510  constexpr ImVec2ih(short _x, short _y) : x(_x), y(_y) {}
511  constexpr explicit ImVec2ih(const ImVec2& rhs) : x((short)rhs.x), y((short)rhs.y) {}
512 };
513 
514 // Helper: ImRect (2D axis aligned bounding-box)
515 // NB: we can't rely on ImVec2 math operators being available here!
516 struct IMGUI_API ImRect
517 {
518  ImVec2 Min; // Upper-left
519  ImVec2 Max; // Lower-right
520 
521  constexpr ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {}
522  constexpr ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}
523  constexpr ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}
524  constexpr ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}
525 
526  ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }
527  ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
528  float GetWidth() const { return Max.x - Min.x; }
529  float GetHeight() const { return Max.y - Min.y; }
530  float GetArea() const { return (Max.x - Min.x) * (Max.y - Min.y); }
531  ImVec2 GetTL() const { return Min; } // Top-left
532  ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right
533  ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left
534  ImVec2 GetBR() const { return Max; } // Bottom-right
535  bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }
536  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; }
537  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; }
538  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; }
539  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; }
540  void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
541  void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
542  void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; }
543  void TranslateX(float dx) { Min.x += dx; Max.x += dx; }
544  void TranslateY(float dy) { Min.y += dy; Max.y += dy; }
545  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.
546  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.
547  void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); }
548  bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }
549  ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); }
550 };
551 IM_MSVC_RUNTIME_CHECKS_RESTORE
552 
553 // Helper: ImBitArray
554 inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; }
555 inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; }
556 inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; }
557 inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2)
558 {
559  n2--;
560  while (n <= n2)
561  {
562  int a_mod = (n & 31);
563  int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1;
564  ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1);
565  arr[n >> 5] |= mask;
566  n = (n + 32) & ~31;
567  }
568 }
569 
570 // Helper: ImBitArray class (wrapper over ImBitArray functions)
571 // Store 1-bit per value.
572 template<int BITCOUNT, int OFFSET = 0>
574 {
575  ImU32 Storage[(BITCOUNT + 31) >> 5];
576  ImBitArray() { ClearAllBits(); }
577  void ClearAllBits() { memset(Storage, 0, sizeof(Storage)); }
578  void SetAllBits() { memset(Storage, 255, sizeof(Storage)); }
579  bool TestBit(int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return ImBitArrayTestBit(Storage, n); }
580  void SetBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArraySetBit(Storage, n); }
581  void ClearBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArrayClearBit(Storage, n); }
582  void SetBitRange(int n, int n2) { n += OFFSET; n2 += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT && n2 > n && n2 <= BITCOUNT); ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2)
583  bool operator[](int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return ImBitArrayTestBit(Storage, n); }
584 };
585 
586 // Helper: ImBitVector
587 // Store 1-bit per value.
588 struct IMGUI_API ImBitVector
589 {
590  ImVector<ImU32> Storage;
591  void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); }
592  void Clear() { Storage.clear(); }
593  bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return ImBitArrayTestBit(Storage.Data, n); }
594  void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); }
595  void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); }
596 };
597 
598 // Helper: ImSpan<>
599 // Pointing to a span of data we don't own.
600 template<typename T>
601 struct ImSpan
602 {
603  T* Data;
604  T* DataEnd;
605 
606  // Constructors, destructor
607  inline ImSpan() { Data = DataEnd = NULL; }
608  inline ImSpan(T* data, int size) { Data = data; DataEnd = data + size; }
609  inline ImSpan(T* data, T* data_end) { Data = data; DataEnd = data_end; }
610 
611  inline void set(T* data, int size) { Data = data; DataEnd = data + size; }
612  inline void set(T* data, T* data_end) { Data = data; DataEnd = data_end; }
613  inline int size() const { return (int)(ptrdiff_t)(DataEnd - Data); }
614  inline int size_in_bytes() const { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); }
615  inline T& operator[](int i) { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
616  inline const T& operator[](int i) const { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; }
617 
618  inline T* begin() { return Data; }
619  inline const T* begin() const { return Data; }
620  inline T* end() { return DataEnd; }
621  inline const T* end() const { return DataEnd; }
622 
623  // Utilities
624  inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; }
625 };
626 
627 // Helper: ImSpanAllocator<>
628 // Facilitate storing multiple chunks into a single large block (the "arena")
629 // - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges.
630 template<int CHUNKS>
632 {
633  char* BasePtr;
634  int CurrOff;
635  int CurrIdx;
636  int Offsets[CHUNKS];
637  int Sizes[CHUNKS];
638 
639  ImSpanAllocator() { memset(this, 0, sizeof(*this)); }
640  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; }
641  inline int GetArenaSizeInBytes() { return CurrOff; }
642  inline void SetArenaBasePtr(void* base_ptr) { BasePtr = (char*)base_ptr; }
643  inline void* GetSpanPtrBegin(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); }
644  inline void* GetSpanPtrEnd(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); }
645  template<typename T>
646  inline void GetSpan(int n, ImSpan<T>* span) { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); }
647 };
648 
649 // Helper: ImPool<>
650 // Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer,
651 // Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object.
652 typedef int ImPoolIdx;
653 template<typename T>
654 struct ImPool
655 {
656  ImVector<T> Buf; // Contiguous data
657  ImGuiStorage Map; // ID->Index
658  ImPoolIdx FreeIdx; // Next free idx to use
659  ImPoolIdx AliveCount; // Number of active/alive items (for display purpose)
660 
661  ImPool() { FreeIdx = AliveCount = 0; }
662  ~ImPool() { Clear(); }
663  T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; }
664  T* GetByIndex(ImPoolIdx n) { return &Buf[n]; }
665  ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); }
666  T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); }
667  bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); }
668  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; }
669  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]; }
670  void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); }
671  void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); AliveCount--; }
672  void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); }
673 
674  // To iterate a ImPool: for (int n = 0; n < pool.GetMapSize(); n++) if (T* t = pool.TryGetMapData(n)) { ... }
675  // Can be avoided if you know .Remove() has never been called on the pool, or AliveCount == GetMapSize()
676  int GetAliveCount() const { return AliveCount; } // Number of active/alive items in the pool (for display purpose)
677  int GetBufSize() const { return Buf.Size; }
678  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
679  T* TryGetMapData(ImPoolIdx n) { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); }
680 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
681  int GetSize() { return GetMapSize(); } // For ImPlot: should use GetMapSize() from (IMGUI_VERSION_NUM >= 18304)
682 #endif
683 };
684 
685 // Helper: ImChunkStream<>
686 // Build and iterate a contiguous stream of variable-sized structures.
687 // This is used by Settings to store persistent data while reducing allocation count.
688 // We store the chunk size first, and align the final size on 4 bytes boundaries.
689 // The tedious/zealous amount of casting is to avoid -Wcast-align warnings.
690 template<typename T>
692 {
693  ImVector<char> Buf;
694 
695  void clear() { Buf.clear(); }
696  bool empty() const { return Buf.Size == 0; }
697  int size() const { return Buf.Size; }
698  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); }
699  T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); }
700  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; }
701  int chunk_size(const T* p) { return ((const int*)p)[-1]; }
702  T* end() { return (T*)(void*)(Buf.Data + Buf.Size); }
703  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; }
704  T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); }
705  void swap(ImChunkStream<T>& rhs) { rhs.Buf.swap(Buf); }
706 
707 };
708 
709 // Helper: ImGuiTextIndex<>
710 // Maintain a line index for a text buffer. This is a strong candidate to be moved into the public API.
712 {
713  ImVector<int> LineOffsets;
714  int EndOffset = 0; // Because we don't own text buffer we need to maintain EndOffset (may bake in LineOffsets?)
715 
716  void clear() { LineOffsets.clear(); EndOffset = 0; }
717  int size() { return LineOffsets.Size; }
718  const char* get_line_begin(const char* base, int n) { return base + LineOffsets[n]; }
719  const char* get_line_end(const char* base, int n) { return base + (n + 1 < LineOffsets.Size ? (LineOffsets[n + 1] - 1) : EndOffset); }
720  void append(const char* base, int old_size, int new_size);
721 };
722 
723 //-----------------------------------------------------------------------------
724 // [SECTION] ImDrawList support
725 //-----------------------------------------------------------------------------
726 
727 // ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value.
728 // Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693
729 // Number of segments (N) is calculated using equation:
730 // N = ceil ( pi / acos(1 - error / r) ) where r > 0, error <= r
731 // Our equation is significantly simpler that one in the post thanks for choosing segment that is
732 // perpendicular to X axis. Follow steps in the article from this starting condition and you will
733 // will get this result.
734 //
735 // Rendering circles with an odd number of segments, while mathematically correct will produce
736 // asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.)
737 #define IM_ROUNDUP_TO_EVEN(_V) ((((_V) + 1) / 2) * 2)
738 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 4
739 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512
740 #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)
741 
742 // Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'.
743 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR) ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))))
744 #define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD) ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD))
745 
746 // ImDrawList: Lookup table size for adaptive arc drawing, cover full circle.
747 #ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE
748 #define IM_DRAWLIST_ARCFAST_TABLE_SIZE 48 // Number of samples in lookup table.
749 #endif
750 #define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle.
751 
752 // Data shared between all ImDrawList instances
753 // You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
754 struct IMGUI_API ImDrawListSharedData
755 {
756  ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
757  ImFont* Font; // Current/default font (optional, for simplified AddText overload)
758  float FontSize; // Current/default font size (optional, for simplified AddText overload)
759  float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo()
760  float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc
761  ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
762  ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
763 
764  // [Internal] Temp write buffer
765  ImVector<ImVec2> TempBuffer;
766 
767  // [Internal] Lookup tables
768  ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.
769  float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo()
770  ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)
771  const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas
772 
774  void SetCircleTessellationMaxError(float max_error);
775 };
776 
778 {
779  ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip
780 
781  void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); }
782  void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); }
783  int GetDrawListCount() const { int count = 0; for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) count += Layers[n].Size; return count; }
784  IMGUI_API void FlattenIntoSingleLayer();
785 };
786 
787 //-----------------------------------------------------------------------------
788 // [SECTION] Widgets support: flags, enums, data structures
789 //-----------------------------------------------------------------------------
790 
791 // Flags used by upcoming items
792 // - input: PushItemFlag() manipulates g.CurrentItemFlags, ItemAdd() calls may add extra flags.
793 // - output: stored in g.LastItemData.InFlags
794 // Current window shared by all windows.
795 // This is going to be exposed in imgui.h when stabilized enough.
796 enum ImGuiItemFlags_
797 {
798  // Controlled by user
799  ImGuiItemFlags_None = 0,
800  ImGuiItemFlags_NoTabStop = 1 << 0, // false // Disable keyboard tabbing (FIXME: should merge with _NoNav)
801  ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.
802  ImGuiItemFlags_Disabled = 1 << 2, // false // Disable interactions but doesn't affect visuals. See BeginDisabled()/EndDisabled(). See github.com/ocornut/imgui/issues/211
803  ImGuiItemFlags_NoNav = 1 << 3, // false // Disable keyboard/gamepad directional navigation (FIXME: should merge with _NoTabStop)
804  ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false // Disable item being a candidate for default focus (e.g. used by title bar items)
805  ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // Disable MenuItem/Selectable() automatically closing their popup window
806  ImGuiItemFlags_MixedValue = 1 << 6, // 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)
807  ImGuiItemFlags_ReadOnly = 1 << 7, // false // [ALPHA] Allow hovering interactions but underlying value is not changed.
808  ImGuiItemFlags_NoWindowHoverableCheck = 1 << 8, // false // Disable hoverable check in ItemHoverable()
809 
810  // Controlled by widget code
811  ImGuiItemFlags_Inputable = 1 << 10, // false // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature.
812 };
813 
814 // Status flags for an already submitted item
815 // - output: stored in g.LastItemData.StatusFlags
816 enum ImGuiItemStatusFlags_
817 {
818  ImGuiItemStatusFlags_None = 0,
819  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)
820  ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, // g.LastItemData.DisplayRect is valid
821  ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)
822  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.
823  ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state.
824  ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag.
825  ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
826  ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing.
827  ImGuiItemStatusFlags_FocusedByTabbing = 1 << 8, // Set when the Focusable item just got focused by Tabbing (FIXME: to be removed soon)
828  ImGuiItemStatusFlags_Visible = 1 << 9, // [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()).
829 
830 #ifdef IMGUI_ENABLE_TEST_ENGINE
831  ImGuiItemStatusFlags_Openable = 1 << 20, // Item is an openable (e.g. TreeNode)
832  ImGuiItemStatusFlags_Opened = 1 << 21, //
833  ImGuiItemStatusFlags_Checkable = 1 << 22, // Item is a checkable (e.g. CheckBox, MenuItem)
834  ImGuiItemStatusFlags_Checked = 1 << 23, //
835 #endif
836 };
837 
838 // Extend ImGuiInputTextFlags_
839 enum ImGuiInputTextFlagsPrivate_
840 {
841  // [Internal]
842  ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline()
843  ImGuiInputTextFlags_NoMarkEdited = 1 << 27, // For internal use by functions using InputText() before reformatting data
844  ImGuiInputTextFlags_MergedItem = 1 << 28, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match.
845 };
846 
847 // Extend ImGuiButtonFlags_
848 enum ImGuiButtonFlagsPrivate_
849 {
850  ImGuiButtonFlags_PressedOnClick = 1 << 4, // return true on click (mouse down event)
851  ImGuiButtonFlags_PressedOnClickRelease = 1 << 5, // [Default] return true on click + release on same item <-- this is what the majority of Button are using
852  ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item
853  ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release)
854  ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release)
855  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)
856  ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat
857  ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping
858  ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap()
859  ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED]
860  //ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled
861  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
862  ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held
863  ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
864  ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated (FIXME: this is essentially used everytime an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.InFlags)
865  ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item
866  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!)
867  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!)
868  ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold,
869  ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease,
870 };
871 
872 // Extend ImGuiComboFlags_
873 enum ImGuiComboFlagsPrivate_
874 {
875  ImGuiComboFlags_CustomPreview = 1 << 20, // enable BeginComboPreview()
876 };
877 
878 // Extend ImGuiSliderFlags_
879 enum ImGuiSliderFlagsPrivate_
880 {
881  ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically?
882  ImGuiSliderFlags_ReadOnly = 1 << 21,
883 };
884 
885 // Extend ImGuiSelectableFlags_
886 enum ImGuiSelectableFlagsPrivate_
887 {
888  // NB: need to be in sync with last value of ImGuiSelectableFlags_
889  ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20,
890  ImGuiSelectableFlags_SelectOnNav = 1 << 21, // (WIP) Auto-select when moved into. This is not exposed in public API as to handle multi-select and modifiers we will need user to explicitly control focus scope. May be replaced with a BeginSelection() API.
891  ImGuiSelectableFlags_SelectOnClick = 1 << 22, // Override button behavior to react on Click (default is Click+Release)
892  ImGuiSelectableFlags_SelectOnRelease = 1 << 23, // Override button behavior to react on Release (default is Click+Release)
893  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)
894  ImGuiSelectableFlags_SetNavIdOnHover = 1 << 25, // Set Nav/Focus ID on mouse hover (used by MenuItem)
895  ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 26, // Disable padding each side with ItemSpacing * 0.5f
896  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!)
897 };
898 
899 // Extend ImGuiTreeNodeFlags_
900 enum ImGuiTreeNodeFlagsPrivate_
901 {
902  ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20,
903 };
904 
905 enum ImGuiSeparatorFlags_
906 {
907  ImGuiSeparatorFlags_None = 0,
908  ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
909  ImGuiSeparatorFlags_Vertical = 1 << 1,
910  ImGuiSeparatorFlags_SpanAllColumns = 1 << 2,
911 };
912 
913 enum ImGuiTextFlags_
914 {
915  ImGuiTextFlags_None = 0,
916  ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0,
917 };
918 
919 enum ImGuiTooltipFlags_
920 {
921  ImGuiTooltipFlags_None = 0,
922  ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0, // Override will clear/ignore previously submitted tooltip (defaults to append)
923 };
924 
925 // FIXME: this is in development, not exposed/functional as a generic feature yet.
926 // Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2
927 enum ImGuiLayoutType_
928 {
929  ImGuiLayoutType_Horizontal = 0,
930  ImGuiLayoutType_Vertical = 1
931 };
932 
933 enum ImGuiLogType
934 {
935  ImGuiLogType_None = 0,
936  ImGuiLogType_TTY,
937  ImGuiLogType_File,
938  ImGuiLogType_Buffer,
939  ImGuiLogType_Clipboard,
940 };
941 
942 // X/Y enums are fixed to 0/1 so they may be used to index ImVec2
943 enum ImGuiAxis
944 {
945  ImGuiAxis_None = -1,
946  ImGuiAxis_X = 0,
947  ImGuiAxis_Y = 1
948 };
949 
950 enum ImGuiPlotType
951 {
952  ImGuiPlotType_Lines,
953  ImGuiPlotType_Histogram,
954 };
955 
956 enum ImGuiPopupPositionPolicy
957 {
958  ImGuiPopupPositionPolicy_Default,
959  ImGuiPopupPositionPolicy_ComboBox,
960  ImGuiPopupPositionPolicy_Tooltip,
961 };
962 
964 {
965  ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT
966 };
967 
968 // Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().
970 {
971  size_t Size; // Size in bytes
972  const char* Name; // Short descriptive name for the type, for debugging
973  const char* PrintFmt; // Default printf format for the type
974  const char* ScanFmt; // Default scanf format for the type
975 };
976 
977 // Extend ImGuiDataType_
978 enum ImGuiDataTypePrivate_
979 {
980  ImGuiDataType_String = ImGuiDataType_COUNT + 1,
981  ImGuiDataType_Pointer,
982  ImGuiDataType_ID,
983 };
984 
985 // Stacked color modifier, backup of modified data so we can restore it
987 {
988  ImGuiCol Col;
989  ImVec4 BackupValue;
990 };
991 
992 // Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.
994 {
995  ImGuiStyleVar VarIdx;
996  union { int BackupInt[2]; float BackupFloat[2]; };
997  ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; }
998  ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; }
999  ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
1000 };
1001 
1002 // Storage data for BeginComboPreview()/EndComboPreview()
1003 struct IMGUI_API ImGuiComboPreviewData
1004 {
1005  ImRect PreviewRect;
1006  ImVec2 BackupCursorPos;
1007  ImVec2 BackupCursorMaxPos;
1008  ImVec2 BackupCursorPosPrevLine;
1009  float BackupPrevLineTextBaseOffset;
1010  ImGuiLayoutType BackupLayout;
1011 
1012  ImGuiComboPreviewData() { memset(this, 0, sizeof(*this)); }
1013 };
1014 
1015 // Stacked storage data for BeginGroup()/EndGroup()
1016 struct IMGUI_API ImGuiGroupData
1017 {
1018  ImGuiID WindowID;
1019  ImVec2 BackupCursorPos;
1020  ImVec2 BackupCursorMaxPos;
1021  ImVec1 BackupIndent;
1022  ImVec1 BackupGroupOffset;
1023  ImVec2 BackupCurrLineSize;
1024  float BackupCurrLineTextBaseOffset;
1025  ImGuiID BackupActiveIdIsAlive;
1026  bool BackupActiveIdPreviousFrameIsAlive;
1027  bool BackupHoveredIdIsAlive;
1028  bool EmitItem;
1029 };
1030 
1031 // Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper.
1032 struct IMGUI_API ImGuiMenuColumns
1033 {
1034  ImU32 TotalWidth;
1035  ImU32 NextTotalWidth;
1036  ImU16 Spacing;
1037  ImU16 OffsetIcon; // Always zero for now
1038  ImU16 OffsetLabel; // Offsets are locked in Update()
1039  ImU16 OffsetShortcut;
1040  ImU16 OffsetMark;
1041  ImU16 Widths[4]; // Width of: Icon, Label, Shortcut, Mark (accumulators for current frame)
1042 
1043  ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); }
1044  void Update(float spacing, bool window_reappearing);
1045  float DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark);
1046  void CalcNextTotalWidth(bool update_offsets);
1047 };
1048 
1049 // Internal state of the currently focused/edited text input box
1050 // For a given item ID, access with ImGui::GetInputTextState()
1051 struct IMGUI_API ImGuiInputTextState
1052 {
1053  ImGuiContext* Ctx; // parent dear imgui context
1054  ImGuiID ID; // widget id owning the text state
1055  int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not.
1056  ImVector<ImWchar> TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.
1057  ImVector<char> TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity.
1058  ImVector<char> InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered)
1059  bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument)
1060  int BufCapacityA; // end-user buffer capacity
1061  float ScrollX; // horizontal scrolling/offset
1062  ImStb::STB_TexteditState Stb; // state for stb_textedit.h
1063  float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately
1064  bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!)
1065  bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection
1066  bool Edited; // edited this frame
1067  ImGuiInputTextFlags Flags; // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set.
1068 
1069  ImGuiInputTextState(ImGuiContext* ctx) { memset(this, 0, sizeof(*this)); Ctx = ctx;}
1070  void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); }
1071  void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); }
1072  int GetUndoAvailCount() const { return Stb.undostate.undo_point; }
1073  int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; }
1074  void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation
1075 
1076  // Cursor & Selection
1077  void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking
1078  void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); }
1079  bool HasSelection() const { return Stb.select_start != Stb.select_end; }
1080  void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; }
1081  int GetCursorPos() const { return Stb.cursor; }
1082  int GetSelectionStart() const { return Stb.select_start; }
1083  int GetSelectionEnd() const { return Stb.select_end; }
1084  void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; }
1085 };
1086 
1087 // Storage for current popup stack
1089 {
1090  ImGuiID PopupId; // Set on OpenPopup()
1091  ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
1092  ImGuiWindow* BackupNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close
1093  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
1094  int OpenFrameCount; // Set on OpenPopup()
1095  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)
1096  ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
1097  ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup
1098 
1099  ImGuiPopupData() { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; }
1100 };
1101 
1102 enum ImGuiNextWindowDataFlags_
1103 {
1104  ImGuiNextWindowDataFlags_None = 0,
1105  ImGuiNextWindowDataFlags_HasPos = 1 << 0,
1106  ImGuiNextWindowDataFlags_HasSize = 1 << 1,
1107  ImGuiNextWindowDataFlags_HasContentSize = 1 << 2,
1108  ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3,
1109  ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4,
1110  ImGuiNextWindowDataFlags_HasFocus = 1 << 5,
1111  ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6,
1112  ImGuiNextWindowDataFlags_HasScroll = 1 << 7,
1113 };
1114 
1115 // Storage for SetNexWindow** functions
1117 {
1118  ImGuiNextWindowDataFlags Flags;
1119  ImGuiCond PosCond;
1120  ImGuiCond SizeCond;
1121  ImGuiCond CollapsedCond;
1122  ImVec2 PosVal;
1123  ImVec2 PosPivotVal;
1124  ImVec2 SizeVal;
1125  ImVec2 ContentSizeVal;
1126  ImVec2 ScrollVal;
1127  bool CollapsedVal;
1128  ImRect SizeConstraintRect;
1129  ImGuiSizeCallback SizeCallback;
1130  void* SizeCallbackUserData;
1131  float BgAlphaVal; // Override background alpha
1132  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?)
1133 
1134  ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); }
1135  inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; }
1136 };
1137 
1138 enum ImGuiNextItemDataFlags_
1139 {
1140  ImGuiNextItemDataFlags_None = 0,
1141  ImGuiNextItemDataFlags_HasWidth = 1 << 0,
1142  ImGuiNextItemDataFlags_HasOpen = 1 << 1,
1143 };
1144 
1146 {
1147  ImGuiNextItemDataFlags Flags;
1148  float Width; // Set by SetNextItemWidth()
1149  ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging)
1150  ImGuiCond OpenCond;
1151  bool OpenVal; // Set by SetNextItemOpen()
1152 
1153  ImGuiNextItemData() { memset(this, 0, sizeof(*this)); }
1154  inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()!
1155 };
1156 
1157 // Status storage for the last submitted item
1159 {
1160  ImGuiID ID;
1161  ImGuiItemFlags InFlags; // See ImGuiItemFlags_
1162  ImGuiItemStatusFlags StatusFlags; // See ImGuiItemStatusFlags_
1163  ImRect Rect; // Full rectangle
1164  ImRect NavRect; // Navigation scoring rectangle (not displayed)
1165  ImRect DisplayRect; // Display rectangle (only if ImGuiItemStatusFlags_HasDisplayRect is set)
1166 
1167  ImGuiLastItemData() { memset(this, 0, sizeof(*this)); }
1168 };
1169 
1170 struct IMGUI_API ImGuiStackSizes
1171 {
1172  short SizeOfIDStack;
1173  short SizeOfColorStack;
1174  short SizeOfStyleVarStack;
1175  short SizeOfFontStack;
1176  short SizeOfFocusScopeStack;
1177  short SizeOfGroupStack;
1178  short SizeOfItemFlagsStack;
1179  short SizeOfBeginPopupStack;
1180  short SizeOfDisabledStack;
1181 
1182  ImGuiStackSizes() { memset(this, 0, sizeof(*this)); }
1183  void SetToCurrentState();
1184  void CompareWithCurrentState();
1185 };
1186 
1187 // Data saved for each window pushed into the stack
1189 {
1190  ImGuiWindow* Window;
1191  ImGuiLastItemData ParentLastItemDataBackup;
1192  ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting
1193 };
1194 
1196 {
1197  int Index;
1198  float Width;
1199  float InitialWidth;
1200 };
1201 
1203 {
1204  void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool.
1205  int Index; // Usually index in a main pool.
1206 
1207  ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; }
1208  ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; }
1209 };
1210 
1211 //-----------------------------------------------------------------------------
1212 // [SECTION] Inputs support
1213 //-----------------------------------------------------------------------------
1214 
1215 typedef ImBitArray<ImGuiKey_NamedKey_COUNT, -ImGuiKey_NamedKey_BEGIN> ImBitArrayForNamedKeys;
1216 
1217 // [Internal] Key ranges
1218 #define ImGuiKey_LegacyNativeKey_BEGIN 0
1219 #define ImGuiKey_LegacyNativeKey_END 512
1220 #define ImGuiKey_Keyboard_BEGIN (ImGuiKey_NamedKey_BEGIN)
1221 #define ImGuiKey_Keyboard_END (ImGuiKey_GamepadStart)
1222 #define ImGuiKey_Gamepad_BEGIN (ImGuiKey_GamepadStart)
1223 #define ImGuiKey_Gamepad_END (ImGuiKey_GamepadRStickDown + 1)
1224 #define ImGuiKey_Mouse_BEGIN (ImGuiKey_MouseLeft)
1225 #define ImGuiKey_Mouse_END (ImGuiKey_MouseWheelY + 1)
1226 #define ImGuiKey_Aliases_BEGIN (ImGuiKey_Mouse_BEGIN)
1227 #define ImGuiKey_Aliases_END (ImGuiKey_Mouse_END)
1228 
1229 // [Internal] Named shortcuts for Navigation
1230 #define ImGuiKey_NavKeyboardTweakSlow ImGuiMod_Ctrl
1231 #define ImGuiKey_NavKeyboardTweakFast ImGuiMod_Shift
1232 #define ImGuiKey_NavGamepadTweakSlow ImGuiKey_GamepadL1
1233 #define ImGuiKey_NavGamepadTweakFast ImGuiKey_GamepadR1
1234 #define ImGuiKey_NavGamepadActivate ImGuiKey_GamepadFaceDown
1235 #define ImGuiKey_NavGamepadCancel ImGuiKey_GamepadFaceRight
1236 #define ImGuiKey_NavGamepadMenu ImGuiKey_GamepadFaceLeft
1237 #define ImGuiKey_NavGamepadInput ImGuiKey_GamepadFaceUp
1238 
1239 enum ImGuiInputEventType
1240 {
1241  ImGuiInputEventType_None = 0,
1242  ImGuiInputEventType_MousePos,
1243  ImGuiInputEventType_MouseWheel,
1244  ImGuiInputEventType_MouseButton,
1245  ImGuiInputEventType_Key,
1246  ImGuiInputEventType_Text,
1247  ImGuiInputEventType_Focus,
1248  ImGuiInputEventType_COUNT
1249 };
1250 
1251 enum ImGuiInputSource
1252 {
1253  ImGuiInputSource_None = 0,
1254  ImGuiInputSource_Mouse,
1255  ImGuiInputSource_Keyboard,
1256  ImGuiInputSource_Gamepad,
1257  ImGuiInputSource_Clipboard, // Currently only used by InputText()
1258  ImGuiInputSource_Nav, // Stored in g.ActiveIdSource only
1259  ImGuiInputSource_COUNT
1260 };
1261 
1262 // FIXME: Structures in the union below need to be declared as anonymous unions appears to be an extension?
1263 // Using ImVec2() would fail on Clang 'union member 'MousePos' has a non-trivial default constructor'
1264 struct ImGuiInputEventMousePos { float PosX, PosY; };
1265 struct ImGuiInputEventMouseWheel { float WheelX, WheelY; };
1266 struct ImGuiInputEventMouseButton { int Button; bool Down; };
1267 struct ImGuiInputEventKey { ImGuiKey Key; bool Down; float AnalogValue; };
1268 struct ImGuiInputEventText { unsigned int Char; };
1269 struct ImGuiInputEventAppFocused { bool Focused; };
1270 
1272 {
1273  ImGuiInputEventType Type;
1274  ImGuiInputSource Source;
1275  union
1276  {
1277  ImGuiInputEventMousePos MousePos; // if Type == ImGuiInputEventType_MousePos
1278  ImGuiInputEventMouseWheel MouseWheel; // if Type == ImGuiInputEventType_MouseWheel
1279  ImGuiInputEventMouseButton MouseButton; // if Type == ImGuiInputEventType_MouseButton
1280  ImGuiInputEventKey Key; // if Type == ImGuiInputEventType_Key
1281  ImGuiInputEventText Text; // if Type == ImGuiInputEventType_Text
1282  ImGuiInputEventAppFocused AppFocused; // if Type == ImGuiInputEventType_Focus
1283  };
1284  bool AddedByTestEngine;
1285 
1286  ImGuiInputEvent() { memset(this, 0, sizeof(*this)); }
1287 };
1288 
1289 // Input function taking an 'ImGuiID owner_id' argument defaults to (ImGuiKeyOwner_Any == 0) aka don't test ownership, which matches legacy behavior.
1290 #define ImGuiKeyOwner_Any ((ImGuiID)0) // Accept key that have an owner, UNLESS a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.
1291 #define ImGuiKeyOwner_None ((ImGuiID)-1) // Require key to have no owner.
1292 
1293 typedef ImS16 ImGuiKeyRoutingIndex;
1294 
1295 // Routing table entry (sizeof() == 16 bytes)
1297 {
1298  ImGuiKeyRoutingIndex NextEntryIndex;
1299  ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits. ImGuiMod_Shortcut is already translated to Ctrl/Super.
1300  ImU8 RoutingNextScore; // Lower is better (0: perfect score)
1301  ImGuiID RoutingCurr;
1302  ImGuiID RoutingNext;
1303 
1304  ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_None; }
1305 };
1306 
1307 // Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching.
1308 // Stored in main context (1 instance)
1310 {
1311  ImGuiKeyRoutingIndex Index[ImGuiKey_NamedKey_COUNT]; // Index of first entry in Entries[]
1313  ImVector<ImGuiKeyRoutingData> EntriesNext; // Double-buffer to avoid reallocation (could use a shared buffer)
1314 
1315  ImGuiKeyRoutingTable() { Clear(); }
1316  void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Index); n++) Index[n] = -1; Entries.clear(); EntriesNext.clear(); }
1317 };
1318 
1319 // This extends ImGuiKeyData but only for named keys (legacy keys don't support the new features)
1320 // Stored in main context (1 per named key). In the future it might be merged into ImGuiKeyData.
1322 {
1323  ImGuiID OwnerCurr;
1324  ImGuiID OwnerNext;
1325  bool LockThisFrame; // Reading this key requires explicit owner id (until end of frame). Set by ImGuiInputFlags_LockThisFrame.
1326  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.
1327 
1328  ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_None; LockThisFrame = LockUntilRelease = false; }
1329 };
1330 
1331 // Flags for extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner()
1332 // Don't mistake with ImGuiInputTextFlags! (for ImGui::InputText() function)
1333 enum ImGuiInputFlags_
1334 {
1335  // Flags for IsKeyPressed(), IsMouseClicked(), Shortcut()
1336  ImGuiInputFlags_None = 0,
1337  ImGuiInputFlags_Repeat = 1 << 0, // Return true on successive repeats. Default for legacy IsKeyPressed(). NOT Default for legacy IsMouseClicked(). MUST BE == 1.
1338  ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default)
1339  ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast
1340  ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster
1341  ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak,
1342 
1343  // Flags for SetItemKeyOwner()
1344  ImGuiInputFlags_CondHovered = 1 << 4, // Only set if item is hovered (default to both)
1345  ImGuiInputFlags_CondActive = 1 << 5, // Only set if item is active (default to both)
1346  ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
1347  ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive,
1348 
1349  // Flags for SetKeyOwner(), SetItemKeyOwner()
1350  ImGuiInputFlags_LockThisFrame = 1 << 6, // Access to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame. This is useful to make input-owner-aware code steal keys from non-input-owner-aware code.
1351  ImGuiInputFlags_LockUntilRelease = 1 << 7, // Access 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. This is useful to make input-owner-aware code steal keys from non-input-owner-aware code.
1352 
1353  // Routing policies for Shortcut() + low-level SetShortcutRouting()
1354  // - The general idea is that several callers register interest in a shortcut, and only one owner gets it.
1355  // - When a policy (other than _RouteAlways) is set, Shortcut() will register itself with SetShortcutRouting(),
1356  // allowing the system to decide where to route the input among other route-aware calls.
1357  // - Shortcut() uses ImGuiInputFlags_RouteFocused by default: meaning that a simple Shortcut() poll
1358  // will register a route and only succeed when parent window is in the focus stack and if no-one
1359  // with a higher priority is claiming the shortcut.
1360  // - Using ImGuiInputFlags_RouteAlways is roughly equivalent to doing e.g. IsKeyPressed(key) + testing mods.
1361  // - Priorities: GlobalHigh > Focused (when owner is active item) > Global > Focused (when focused window) > GlobalLow.
1362  // - Can select only 1 policy among all available.
1363  ImGuiInputFlags_RouteFocused = 1 << 8, // (Default) Register focused route: Accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window.
1364  ImGuiInputFlags_RouteGlobalLow = 1 << 9, // Register route globally (lowest priority: unless a focused window or active item registered the route) -> recommended Global priority.
1365  ImGuiInputFlags_RouteGlobal = 1 << 10, // Register route globally (medium priority: unless an active item registered the route, e.g. CTRL+A registered by InputText).
1366  ImGuiInputFlags_RouteGlobalHigh = 1 << 11, // Register route globally (highest priority: unlikely you need to use that: will interfere with every active items)
1367  ImGuiInputFlags_RouteMask_ = ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteGlobalLow | ImGuiInputFlags_RouteGlobalHigh, // _Always not part of this!
1368  ImGuiInputFlags_RouteAlways = 1 << 12, // Do not register route, poll keys directly.
1369  ImGuiInputFlags_RouteUnlessBgFocused= 1 << 13, // Global routes will not be applied if underlying background/void is focused (== no Dear ImGui windows are focused). Useful for overlay applications.
1370  ImGuiInputFlags_RouteExtraMask_ = ImGuiInputFlags_RouteAlways | ImGuiInputFlags_RouteUnlessBgFocused,
1371 
1372  // [Internal] Mask of which function support which flags
1373  ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_,
1374  ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RouteMask_ | ImGuiInputFlags_RouteExtraMask_,
1375  ImGuiInputFlags_SupportedBySetKeyOwner = ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease,
1376  ImGuiInputFlags_SupportedBySetItemKeyOwner = ImGuiInputFlags_SupportedBySetKeyOwner | ImGuiInputFlags_CondMask_,
1377 };
1378 
1379 //-----------------------------------------------------------------------------
1380 // [SECTION] Clipper support
1381 //-----------------------------------------------------------------------------
1382 
1384 {
1385  int Min;
1386  int Max;
1387  bool PosToIndexConvert; // Begin/End are absolute position (will be converted to indices later)
1388  ImS8 PosToIndexOffsetMin; // Add to Min after converting to indices
1389  ImS8 PosToIndexOffsetMax; // Add to Min after converting to indices
1390 
1391  static ImGuiListClipperRange FromIndices(int min, int max) { ImGuiListClipperRange r = { min, max, false, 0, 0 }; return r; }
1392  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; }
1393 };
1394 
1395 // Temporary clipper data, buffers shared/reused between instances
1397 {
1398  ImGuiListClipper* ListClipper;
1399  float LossynessOffset;
1400  int StepNo;
1401  int ItemsFrozen;
1403 
1404  ImGuiListClipperData() { memset(this, 0, sizeof(*this)); }
1405  void Reset(ImGuiListClipper* clipper) { ListClipper = clipper; StepNo = ItemsFrozen = 0; Ranges.resize(0); }
1406 };
1407 
1408 //-----------------------------------------------------------------------------
1409 // [SECTION] Navigation support
1410 //-----------------------------------------------------------------------------
1411 
1412 enum ImGuiActivateFlags_
1413 {
1414  ImGuiActivateFlags_None = 0,
1415  ImGuiActivateFlags_PreferInput = 1 << 0, // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default if keyboard is available.
1416  ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default if keyboard is not available.
1417  ImGuiActivateFlags_TryToPreserveState = 1 << 2, // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection)
1418 };
1419 
1420 // Early work-in-progress API for ScrollToItem()
1421 enum ImGuiScrollFlags_
1422 {
1423  ImGuiScrollFlags_None = 0,
1424  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]
1425  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]
1426  ImGuiScrollFlags_KeepVisibleCenterX = 1 << 2, // If item is not visible: scroll to make the item centered on X axis [rarely used]
1427  ImGuiScrollFlags_KeepVisibleCenterY = 1 << 3, // If item is not visible: scroll to make the item centered on Y axis
1428  ImGuiScrollFlags_AlwaysCenterX = 1 << 4, // Always center the result item on X axis [rarely used]
1429  ImGuiScrollFlags_AlwaysCenterY = 1 << 5, // Always center the result item on Y axis [default for Y axis for appearing window)
1430  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).
1431  ImGuiScrollFlags_MaskX_ = ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleCenterX | ImGuiScrollFlags_AlwaysCenterX,
1432  ImGuiScrollFlags_MaskY_ = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY,
1433 };
1434 
1435 enum ImGuiNavHighlightFlags_
1436 {
1437  ImGuiNavHighlightFlags_None = 0,
1438  ImGuiNavHighlightFlags_TypeDefault = 1 << 0,
1439  ImGuiNavHighlightFlags_TypeThin = 1 << 1,
1440  ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse.
1441  ImGuiNavHighlightFlags_NoRounding = 1 << 3,
1442 };
1443 
1444 enum ImGuiNavMoveFlags_
1445 {
1446  ImGuiNavMoveFlags_None = 0,
1447  ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side
1448  ImGuiNavMoveFlags_LoopY = 1 << 1,
1449  ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)
1450  ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful but provided for completeness
1451  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)
1452  ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown)
1453  ImGuiNavMoveFlags_ScrollToEdgeY = 1 << 6, // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword, probably unnecessary
1454  ImGuiNavMoveFlags_Forwarded = 1 << 7,
1455  ImGuiNavMoveFlags_DebugNoResult = 1 << 8, // Dummy scoring for debug purpose, don't apply result
1456  ImGuiNavMoveFlags_FocusApi = 1 << 9,
1457  ImGuiNavMoveFlags_Tabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight
1458  ImGuiNavMoveFlags_Activate = 1 << 11,
1459  ImGuiNavMoveFlags_DontSetNavHighlight = 1 << 12, // Do not alter the visible state of keyboard vs mouse nav highlight
1460 };
1461 
1462 enum ImGuiNavLayer
1463 {
1464  ImGuiNavLayer_Main = 0, // Main scrolling layer
1465  ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt)
1466  ImGuiNavLayer_COUNT
1467 };
1468 
1470 {
1471  ImGuiWindow* Window; // Init,Move // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window)
1472  ImGuiID ID; // Init,Move // Best candidate item ID
1473  ImGuiID FocusScopeId; // Init,Move // Best candidate focus scope ID
1474  ImRect RectRel; // Init,Move // Best candidate bounding box in window relative space
1475  ImGuiItemFlags InFlags; // ????,Move // Best candidate item flags
1476  float DistBox; // Move // Best candidate box distance to current NavId
1477  float DistCenter; // Move // Best candidate center distance to current NavId
1478  float DistAxial; // Move // Best candidate axial distance to current NavId
1479 
1480  ImGuiNavItemData() { Clear(); }
1481  void Clear() { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; DistBox = DistCenter = DistAxial = FLT_MAX; }
1482 };
1483 
1484 //-----------------------------------------------------------------------------
1485 // [SECTION] Columns support
1486 //-----------------------------------------------------------------------------
1487 
1488 // Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays!
1489 enum ImGuiOldColumnFlags_
1490 {
1491  ImGuiOldColumnFlags_None = 0,
1492  ImGuiOldColumnFlags_NoBorder = 1 << 0, // Disable column dividers
1493  ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers
1494  ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns
1495  ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window
1496  ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4, // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.
1497 
1498  // Obsolete names (will be removed)
1499 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
1500  ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None,
1501  ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder,
1502  ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize,
1503  ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths,
1504  ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow,
1505  ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize,
1506 #endif
1507 };
1508 
1510 {
1511  float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
1512  float OffsetNormBeforeResize;
1513  ImGuiOldColumnFlags Flags; // Not exposed
1514  ImRect ClipRect;
1515 
1516  ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); }
1517 };
1518 
1520 {
1521  ImGuiID ID;
1522  ImGuiOldColumnFlags Flags;
1523  bool IsFirstFrame;
1524  bool IsBeingResized;
1525  int Current;
1526  int Count;
1527  float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x
1528  float LineMinY, LineMaxY;
1529  float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns()
1530  float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns()
1531  ImRect HostInitialClipRect; // Backup of ClipRect at the time of BeginColumns()
1532  ImRect HostBackupClipRect; // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground()
1533  ImRect HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns()
1535  ImDrawListSplitter Splitter;
1536 
1537  ImGuiOldColumns() { memset(this, 0, sizeof(*this)); }
1538 };
1539 
1540 //-----------------------------------------------------------------------------
1541 // [SECTION] Multi-select support
1542 //-----------------------------------------------------------------------------
1543 
1544 #ifdef IMGUI_HAS_MULTI_SELECT
1545 // <this is filled in 'range_select' branch>
1546 #endif // #ifdef IMGUI_HAS_MULTI_SELECT
1547 
1548 //-----------------------------------------------------------------------------
1549 // [SECTION] Docking support
1550 //-----------------------------------------------------------------------------
1551 
1552 #ifdef IMGUI_HAS_DOCK
1553 // <this is filled in 'docking' branch>
1554 #endif // #ifdef IMGUI_HAS_DOCK
1555 
1556 //-----------------------------------------------------------------------------
1557 // [SECTION] Viewport support
1558 //-----------------------------------------------------------------------------
1559 
1560 // ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!)
1561 // Every instance of ImGuiViewport is in fact a ImGuiViewportP.
1563 {
1564  int DrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used
1565  ImDrawList* DrawLists[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.
1566  ImDrawData DrawDataP;
1567  ImDrawDataBuilder DrawDataBuilder;
1568 
1569  ImVec2 WorkOffsetMin; // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!)
1570  ImVec2 WorkOffsetMax; // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height).
1571  ImVec2 BuildWorkOffsetMin; // Work Area: Offset being built during current frame. Generally >= 0.0f.
1572  ImVec2 BuildWorkOffsetMax; // Work Area: Offset being built during current frame. Generally <= 0.0f.
1573 
1574  ImGuiViewportP() { DrawListsLastFrame[0] = DrawListsLastFrame[1] = -1; DrawLists[0] = DrawLists[1] = NULL; }
1575  ~ImGuiViewportP() { if (DrawLists[0]) IM_DELETE(DrawLists[0]); if (DrawLists[1]) IM_DELETE(DrawLists[1]); }
1576 
1577  // 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)
1578  ImVec2 CalcWorkRectPos(const ImVec2& off_min) const { return ImVec2(Pos.x + off_min.x, Pos.y + off_min.y); }
1579  ImVec2 CalcWorkRectSize(const ImVec2& off_min, const ImVec2& off_max) const { return ImVec2(ImMax(0.0f, Size.x - off_min.x + off_max.x), ImMax(0.0f, Size.y - off_min.y + off_max.y)); }
1580  void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkOffsetMin); WorkSize = CalcWorkRectSize(WorkOffsetMin, WorkOffsetMax); } // Update public fields
1581 
1582  // Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry)
1583  ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
1584  ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); }
1585  ImRect GetBuildWorkRect() const { ImVec2 pos = CalcWorkRectPos(BuildWorkOffsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkOffsetMin, BuildWorkOffsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); }
1586 };
1587 
1588 //-----------------------------------------------------------------------------
1589 // [SECTION] Settings support
1590 //-----------------------------------------------------------------------------
1591 
1592 // Windows data saved in imgui.ini file
1593 // Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily.
1594 // (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure)
1596 {
1597  ImGuiID ID;
1598  ImVec2ih Pos;
1599  ImVec2ih Size;
1600  bool Collapsed;
1601  bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
1602 
1603  ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); }
1604  char* GetName() { return (char*)(this + 1); }
1605 };
1606 
1608 {
1609  const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'
1610  ImGuiID TypeHash; // == ImHashStr(TypeName)
1611  void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data
1612  void (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called before reading (in registration order)
1613  void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]"
1614  void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry
1615  void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order)
1616  void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf'
1617  void* UserData;
1618 
1619  ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }
1620 };
1621 
1622 //-----------------------------------------------------------------------------
1623 // [SECTION] Localization support
1624 //-----------------------------------------------------------------------------
1625 
1626 // This is experimental and not officially supported, it'll probably fall short of features, if/when it does we may backtrack.
1627 enum ImGuiLocKey : int
1628 {
1629  ImGuiLocKey_TableSizeOne,
1630  ImGuiLocKey_TableSizeAllFit,
1631  ImGuiLocKey_TableSizeAllDefault,
1632  ImGuiLocKey_TableResetOrder,
1633  ImGuiLocKey_WindowingMainMenuBar,
1634  ImGuiLocKey_WindowingPopup,
1635  ImGuiLocKey_WindowingUntitled,
1636  ImGuiLocKey_COUNT
1637 };
1638 
1640 {
1641  ImGuiLocKey Key;
1642  const char* Text;
1643 };
1644 
1645 
1646 //-----------------------------------------------------------------------------
1647 // [SECTION] Metrics, Debug Tools
1648 //-----------------------------------------------------------------------------
1649 
1650 enum ImGuiDebugLogFlags_
1651 {
1652  // Event types
1653  ImGuiDebugLogFlags_None = 0,
1654  ImGuiDebugLogFlags_EventActiveId = 1 << 0,
1655  ImGuiDebugLogFlags_EventFocus = 1 << 1,
1656  ImGuiDebugLogFlags_EventPopup = 1 << 2,
1657  ImGuiDebugLogFlags_EventNav = 1 << 3,
1658  ImGuiDebugLogFlags_EventClipper = 1 << 4,
1659  ImGuiDebugLogFlags_EventIO = 1 << 5,
1660  ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventIO,
1661  ImGuiDebugLogFlags_OutputToTTY = 1 << 10, // Also send output to TTY
1662 };
1663 
1665 {
1666  bool ShowDebugLog;
1667  bool ShowStackTool;
1668  bool ShowWindowsRects;
1669  bool ShowWindowsBeginOrder;
1670  bool ShowTablesRects;
1671  bool ShowDrawCmdMesh;
1672  bool ShowDrawCmdBoundingBoxes;
1673  int ShowWindowsRectsType;
1674  int ShowTablesRectsType;
1675 
1677  {
1678  ShowDebugLog = ShowStackTool = ShowWindowsRects = ShowWindowsBeginOrder = ShowTablesRects = false;
1679  ShowDrawCmdMesh = true;
1680  ShowDrawCmdBoundingBoxes = true;
1681  ShowWindowsRectsType = ShowTablesRectsType = -1;
1682  }
1683 };
1684 
1686 {
1687  ImGuiID ID;
1688  ImS8 QueryFrameCount; // >= 1: Query in progress
1689  bool QuerySuccess; // Obtained result from DebugHookIdInfo()
1690  ImGuiDataType DataType : 8;
1691  char Desc[57]; // Arbitrarily sized buffer to hold a result (FIXME: could replace Results[] with a chunk stream?) FIXME: Now that we added CTRL+C this should be fixed.
1692 
1693  ImGuiStackLevelInfo() { memset(this, 0, sizeof(*this)); }
1694 };
1695 
1696 // State for Stack tool queries
1698 {
1699  int LastActiveFrame;
1700  int StackLevel; // -1: query stack and resize Results, >= 0: individual stack level
1701  ImGuiID QueryId; // ID to query details for
1703  bool CopyToClipboardOnCtrlC;
1704  float CopyToClipboardLastTime;
1705 
1706  ImGuiStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; }
1707 };
1708 
1709 //-----------------------------------------------------------------------------
1710 // [SECTION] Generic context hooks
1711 //-----------------------------------------------------------------------------
1712 
1713 typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook);
1714 enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ };
1715 
1717 {
1718  ImGuiID HookId; // A unique ID assigned by AddContextHook()
1719  ImGuiContextHookType Type;
1720  ImGuiID Owner;
1721  ImGuiContextHookCallback Callback;
1722  void* UserData;
1723 
1724  ImGuiContextHook() { memset(this, 0, sizeof(*this)); }
1725 };
1726 
1727 //-----------------------------------------------------------------------------
1728 // [SECTION] ImGuiContext (main Dear ImGui context)
1729 //-----------------------------------------------------------------------------
1730 
1732 {
1733  bool Initialized;
1734  bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it.
1735  ImGuiIO IO;
1736  ImVector<ImGuiInputEvent> InputEventsQueue; // Input events which will be tricked/written into IO structure.
1737  ImVector<ImGuiInputEvent> InputEventsTrail; // Past input events processed in NewFrame(). This is to allow domain-specific application to access e.g mouse/pen trail.
1738  ImGuiStyle Style;
1739  ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
1740  float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.
1741  float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.
1742  ImDrawListSharedData DrawListSharedData;
1743  double Time;
1744  int FrameCount;
1745  int FrameCountEnded;
1746  int FrameCountRendered;
1747  bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame()
1748  bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed
1749  bool WithinEndChild; // Set within EndChild()
1750  bool GcCompactAll; // Request full GC
1751  bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log()
1752  void* TestEngine; // Test engine user data
1753 
1754  // Windows state
1755  ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front
1756  ImVector<ImGuiWindow*> WindowsFocusOrder; // Root windows, sorted in focus order, back to front.
1757  ImVector<ImGuiWindow*> WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child
1758  ImVector<ImGuiWindowStackData> CurrentWindowStack;
1759  ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow*
1760  int WindowsActiveCount; // Number of unique windows submitted by frame
1761  ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING)
1762  ImGuiWindow* CurrentWindow; // Window being drawn into
1763  ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs.
1764  ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.
1765  ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow.
1766  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.
1767  ImVec2 WheelingWindowRefMousePos;
1768  int WheelingWindowStartFrame; // This may be set one frame before WheelingWindow is != NULL
1769  float WheelingWindowReleaseTimer;
1770  ImVec2 WheelingWindowWheelRemainder;
1771  ImVec2 WheelingAxisAvg;
1772 
1773  // Item/widgets state and tracking information
1774  ImGuiID DebugHookIdInfo; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line]
1775  ImGuiID HoveredId; // Hovered widget, filled during the frame
1776  ImGuiID HoveredIdPreviousFrame;
1777  bool HoveredIdAllowOverlap;
1778  bool HoveredIdDisabled; // 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.
1779  float HoveredIdTimer; // Measure contiguous hovering time
1780  float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active
1781  ImGuiID ActiveId; // Active widget
1782  ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)
1783  float ActiveIdTimer;
1784  bool ActiveIdIsJustActivated; // Set at the time of activation for one frame
1785  bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
1786  bool ActiveIdNoClearOnFocusLoss; // Disable losing active id if the active id window gets unfocused.
1787  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.
1788  bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state.
1789  bool ActiveIdHasBeenEditedThisFrame;
1790  ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
1791  ImGuiWindow* ActiveIdWindow;
1792  ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard)
1793  int ActiveIdMouseButton;
1794  ImGuiID ActiveIdPreviousFrame;
1795  bool ActiveIdPreviousFrameIsAlive;
1796  bool ActiveIdPreviousFrameHasBeenEditedBefore;
1797  ImGuiWindow* ActiveIdPreviousFrameWindow;
1798  ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.
1799  float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
1800 
1801  // [EXPERIMENTAL] Key/Input Ownership + Shortcut Routing system
1802  // - The idea is that instead of "eating" a given key, we can link to an owner.
1803  // - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_None (== -1) or a custom ID.
1804  // - Routing is requested ahead of time for a given chord (Key + Mods) and granted in NewFrame().
1805  ImGuiKeyOwnerData KeysOwnerData[ImGuiKey_NamedKey_COUNT];
1806  ImGuiKeyRoutingTable KeysRoutingTable;
1807  ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it)
1808  bool ActiveIdUsingAllKeyboardKeys; // Active widget will want to read all keyboard keys inputs. (FIXME: This is a shortcut for not taking ownership of 100+ keys but perhaps best to not have the inconsistency)
1809 #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
1810  ImU32 ActiveIdUsingNavInputMask; // If you used this. Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes 'SetKeyOwner(ImGuiKey_Escape, g.ActiveId) and/or SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId);'
1811 #endif
1812 
1813  // Next window/item data
1814  ImGuiID CurrentFocusScopeId; // == g.FocusScopeStack.back()
1815  ImGuiItemFlags CurrentItemFlags; // == g.ItemFlagsStack.back()
1816  ImGuiID DebugLocateId; // Storage for DebugLocateItemOnHover() feature: this is read by ItemAdd() so we keep it in a hot/cached location
1817  ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions
1818  ImGuiLastItemData LastItemData; // Storage for last submitted item (setup by ItemAdd)
1819  ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions
1820 
1821  // Shared stacks
1822  ImVector<ImGuiColorMod> ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin()
1823  ImVector<ImGuiStyleMod> StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin()
1824  ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont() - inherited by Begin()
1825  ImVector<ImGuiID> FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin()
1826  ImVector<ImGuiItemFlags>ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin()
1827  ImVector<ImGuiGroupData>GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin()
1828  ImVector<ImGuiPopupData>OpenPopupStack; // Which popups are open (persistent)
1829  ImVector<ImGuiPopupData>BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)
1830  int BeginMenuCount;
1831 
1832  // Viewports
1833  ImVector<ImGuiViewportP*> Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData.
1834 
1835  // Gamepad/keyboard Navigation
1836  ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow'
1837  ImGuiID NavId; // Focused item for navigation
1838  ImGuiID NavFocusScopeId; // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set)
1839  ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItem()
1840  ImGuiID NavActivateDownId; // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 0
1841  ImGuiID NavActivatePressedId; // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat)
1842  ImGuiID NavActivateInputId; // ~~ IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadInput) ? NavId : 0; ImGuiActivateFlags_PreferInput will be set and NavActivateId will be 0.
1843  ImGuiActivateFlags NavActivateFlags;
1844  ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest).
1845  ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest).
1846  ImGuiKeyChord NavJustMovedToKeyMods;
1847  ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame.
1848  ImGuiActivateFlags NavNextActivateFlags;
1849  ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard.
1850  ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later.
1851  bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid
1852  bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default)
1853  bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover)
1854  bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again.
1855 
1856  // Navigation: Init & Move Requests
1857  bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest this is to perform early out in ItemAdd()
1858  bool NavInitRequest; // Init request for appearing window to select first item
1859  bool NavInitRequestFromMove;
1860  ImGuiID NavInitResultId; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called)
1861  ImRect NavInitResultRectRel; // Init request result rectangle (relative to parent window)
1862  bool NavMoveSubmitted; // Move request submitted, will process result on next NewFrame()
1863  bool NavMoveScoringItems; // Move request submitted, still scoring incoming items
1864  bool NavMoveForwardToNextFrame;
1865  ImGuiNavMoveFlags NavMoveFlags;
1866  ImGuiScrollFlags NavMoveScrollFlags;
1867  ImGuiKeyChord NavMoveKeyMods;
1868  ImGuiDir NavMoveDir; // Direction of the move request (left/right/up/down)
1869  ImGuiDir NavMoveDirForDebug;
1870  ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename?
1871  ImRect NavScoringRect; // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring.
1872  ImRect NavScoringNoClipRect; // Some nav operations (such as PageUp/PageDown) enforce a region which clipper will attempt to always keep submitted
1873  int NavScoringDebugCount; // Metrics for debugging
1874  int NavTabbingDir; // Generally -1 or +1, 0 when tabbing without a nav id
1875  int NavTabbingCounter; // >0 when counting items for tabbing
1876  ImGuiNavItemData NavMoveResultLocal; // Best move request candidate within NavWindow
1877  ImGuiNavItemData NavMoveResultLocalVisible; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag)
1878  ImGuiNavItemData NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)
1879  ImGuiNavItemData NavTabbingResultFirst; // First tabbing request candidate within NavWindow and flattened hierarchy
1880 
1881  // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize)
1882  ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab, for reconfiguration (see #4828)
1883  ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab
1884  ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most!
1885  ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it.
1886  ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents
1887  float NavWindowingTimer;
1888  float NavWindowingHighlightAlpha;
1889  bool NavWindowingToggleLayer;
1890  ImVec2 NavWindowingAccumDeltaPos;
1891  ImVec2 NavWindowingAccumDeltaSize;
1892 
1893  // Render
1894  float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list)
1895  ImGuiMouseCursor MouseCursor;
1896 
1897  // Drag and Drop
1898  bool DragDropActive;
1899  bool DragDropWithinSource; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source.
1900  bool DragDropWithinTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target.
1901  ImGuiDragDropFlags DragDropSourceFlags;
1902  int DragDropSourceFrameCount;
1903  int DragDropMouseButton;
1904  ImGuiPayload DragDropPayload;
1905  ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping)
1906  ImGuiID DragDropTargetId;
1907  ImGuiDragDropFlags DragDropAcceptFlags;
1908  float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface)
1909  ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload)
1910  ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets)
1911  int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source
1912  ImGuiID DragDropHoldJustPressedId; // Set when holding a payload just made ButtonBehavior() return a press.
1913  ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size
1914  unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads
1915 
1916  // Clipper
1917  int ClipperTempDataStacked;
1918  ImVector<ImGuiListClipperData> ClipperTempData;
1919 
1920  // Tables
1921  ImGuiTable* CurrentTable;
1922  int TablesTempDataStacked; // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size)
1923  ImVector<ImGuiTableTempData> TablesTempData; // Temporary table data (buffers reused/shared across instances, support nesting)
1924  ImPool<ImGuiTable> Tables; // Persistent table data
1925  ImVector<float> TablesLastTimeActive; // Last used timestamp of each tables (SOA, for efficient GC)
1926  ImVector<ImDrawChannel> DrawChannelsTempMergeBuffer;
1927 
1928  // Tab bars
1929  ImGuiTabBar* CurrentTabBar;
1930  ImPool<ImGuiTabBar> TabBars;
1931  ImVector<ImGuiPtrOrIndex> CurrentTabBarStack;
1932  ImVector<ImGuiShrinkWidthItem> ShrinkWidthBuffer;
1933 
1934  // Hover Delay system
1935  ImGuiID HoverDelayId;
1936  ImGuiID HoverDelayIdPreviousFrame;
1937  float HoverDelayTimer; // Currently used IsItemHovered(), generally inferred from g.HoveredIdTimer but kept uncleared until clear timer elapse.
1938  float HoverDelayClearTimer; // Currently used IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared.
1939 
1940  // Widget state
1941  ImVec2 MouseLastValidPos;
1942  ImGuiInputTextState InputTextState;
1943  ImFont InputTextPasswordFont;
1944  ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc.
1945  ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
1946  float ColorEditLastHue; // Backup of last Hue associated to LastColor, so we can restore Hue in lossy RGB<>HSV round trips
1947  float ColorEditLastSat; // Backup of last Saturation associated to LastColor, so we can restore Saturation in lossy RGB<>HSV round trips
1948  ImU32 ColorEditLastColor; // RGB value with alpha set to 0.
1949  ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker.
1950  ImGuiComboPreviewData ComboPreviewData;
1951  float SliderGrabClickOffset;
1952  float SliderCurrentAccum; // Accumulated slider delta when using navigation controls.
1953  bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it?
1954  bool DragCurrentAccumDirty;
1955  float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
1956  float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
1957  float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
1958  float DisabledAlphaBackup; // Backup for style.Alpha for BeginDisabled()
1959  short DisabledStackSize;
1960  short TooltipOverrideCount;
1961  ImVector<char> ClipboardHandlerData; // If no custom clipboard handler is defined
1962  ImVector<ImGuiID> MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once
1963 
1964  // Platform support
1965  ImGuiPlatformImeData PlatformImeData; // Data updated by current frame
1966  ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data (when changing we will call io.SetPlatformImeDataFn
1967  char PlatformLocaleDecimalPoint; // '.' or *localeconv()->decimal_point
1968 
1969  // Settings
1970  bool SettingsLoaded;
1971  float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero
1972  ImGuiTextBuffer SettingsIniData; // In memory .ini settings
1973  ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers
1974  ImChunkStream<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries
1975  ImChunkStream<ImGuiTableSettings> SettingsTables; // ImGuiTable .ini settings entries
1976  ImVector<ImGuiContextHook> Hooks; // Hooks for extensions (e.g. test engine)
1977  ImGuiID HookIdNext; // Next available HookId
1978 
1979  // Localization
1980  const char* LocalizationTable[ImGuiLocKey_COUNT];
1981 
1982  // Capture/Logging
1983  bool LogEnabled; // Currently capturing
1984  ImGuiLogType LogType; // Capture target
1985  ImFileHandle LogFile; // If != NULL log to stdout/ file
1986  ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
1987  const char* LogNextPrefix;
1988  const char* LogNextSuffix;
1989  float LogLinePosY;
1990  bool LogLineFirstItem;
1991  int LogDepthRef;
1992  int LogDepthToExpand;
1993  int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call.
1994 
1995  // Debug Tools
1996  ImGuiDebugLogFlags DebugLogFlags;
1997  ImGuiTextBuffer DebugLogBuf;
1998  ImGuiTextIndex DebugLogIndex;
1999  ImU8 DebugLocateFrames; // For DebugLocateItemOnHover(). This is used together with DebugLocateId which is in a hot/cached spot above.
2000  bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker())
2001  ImU8 DebugItemPickerMouseButton;
2002  ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this ID
2003  ImGuiMetricsConfig DebugMetricsConfig;
2004  ImGuiStackTool DebugStackTool;
2005 
2006  // Misc
2007  float FramerateSecPerFrame[60]; // Calculate estimate of framerate for user over the last 60 frames..
2008  int FramerateSecPerFrameIdx;
2009  int FramerateSecPerFrameCount;
2010  float FramerateSecPerFrameAccum;
2011  int WantCaptureMouseNextFrame; // Explicit capture override via SetNextFrameWantCaptureMouse()/SetNextFrameWantCaptureKeyboard(). Default to -1.
2012  int WantCaptureKeyboardNextFrame; // "
2013  int WantTextInputNextFrame;
2014  ImVector<char> TempBuffer; // Temporary text buffer
2015 
2016  ImGuiContext(ImFontAtlas* shared_font_atlas)
2017  : InputTextState(this)
2018  {
2019  Initialized = false;
2020  FontAtlasOwnedByContext = shared_font_atlas ? false : true;
2021  Font = NULL;
2022  FontSize = FontBaseSize = 0.0f;
2023  IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)();
2024  Time = 0.0f;
2025  FrameCount = 0;
2026  FrameCountEnded = FrameCountRendered = -1;
2027  WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false;
2028  GcCompactAll = false;
2029  TestEngineHookItems = false;
2030  TestEngine = NULL;
2031 
2032  WindowsActiveCount = 0;
2033  CurrentWindow = NULL;
2034  HoveredWindow = NULL;
2035  HoveredWindowUnderMovingWindow = NULL;
2036  MovingWindow = NULL;
2037  WheelingWindow = NULL;
2038  WheelingWindowStartFrame = -1;
2039  WheelingWindowReleaseTimer = 0.0f;
2040 
2041  DebugHookIdInfo = 0;
2042  HoveredId = HoveredIdPreviousFrame = 0;
2043  HoveredIdAllowOverlap = false;
2044  HoveredIdDisabled = false;
2045  HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f;
2046  ActiveId = 0;
2047  ActiveIdIsAlive = 0;
2048  ActiveIdTimer = 0.0f;
2049  ActiveIdIsJustActivated = false;
2050  ActiveIdAllowOverlap = false;
2051  ActiveIdNoClearOnFocusLoss = false;
2052  ActiveIdHasBeenPressedBefore = false;
2053  ActiveIdHasBeenEditedBefore = false;
2054  ActiveIdHasBeenEditedThisFrame = false;
2055  ActiveIdClickOffset = ImVec2(-1, -1);
2056  ActiveIdWindow = NULL;
2057  ActiveIdSource = ImGuiInputSource_None;
2058  ActiveIdMouseButton = -1;
2059  ActiveIdPreviousFrame = 0;
2060  ActiveIdPreviousFrameIsAlive = false;
2061  ActiveIdPreviousFrameHasBeenEditedBefore = false;
2062  ActiveIdPreviousFrameWindow = NULL;
2063  LastActiveId = 0;
2064  LastActiveIdTimer = 0.0f;
2065 
2066  ActiveIdUsingNavDirMask = 0x00;
2067  ActiveIdUsingAllKeyboardKeys = false;
2068 #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
2069  ActiveIdUsingNavInputMask = 0x00;
2070 #endif
2071 
2072  CurrentFocusScopeId = 0;
2073  CurrentItemFlags = ImGuiItemFlags_None;
2074  BeginMenuCount = 0;
2075 
2076  NavWindow = NULL;
2077  NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavActivateInputId = 0;
2078  NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0;
2079  NavActivateFlags = NavNextActivateFlags = ImGuiActivateFlags_None;
2080  NavJustMovedToKeyMods = ImGuiMod_None;
2081  NavInputSource = ImGuiInputSource_None;
2082  NavLayer = ImGuiNavLayer_Main;
2083  NavIdIsAlive = false;
2084  NavMousePosDirty = false;
2085  NavDisableHighlight = true;
2086  NavDisableMouseHover = false;
2087  NavAnyRequest = false;
2088  NavInitRequest = false;
2089  NavInitRequestFromMove = false;
2090  NavInitResultId = 0;
2091  NavMoveSubmitted = false;
2092  NavMoveScoringItems = false;
2093  NavMoveForwardToNextFrame = false;
2094  NavMoveFlags = ImGuiNavMoveFlags_None;
2095  NavMoveScrollFlags = ImGuiScrollFlags_None;
2096  NavMoveKeyMods = ImGuiMod_None;
2097  NavMoveDir = NavMoveDirForDebug = NavMoveClipDir = ImGuiDir_None;
2098  NavScoringDebugCount = 0;
2099  NavTabbingDir = 0;
2100  NavTabbingCounter = 0;
2101 
2102  ConfigNavWindowingKeyNext = ImGuiMod_Ctrl | ImGuiKey_Tab;
2103  ConfigNavWindowingKeyPrev = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab;
2104  NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL;
2105  NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;
2106  NavWindowingToggleLayer = false;
2107 
2108  DimBgRatio = 0.0f;
2109  MouseCursor = ImGuiMouseCursor_Arrow;
2110 
2111  DragDropActive = DragDropWithinSource = DragDropWithinTarget = false;
2112  DragDropSourceFlags = ImGuiDragDropFlags_None;
2113  DragDropSourceFrameCount = -1;
2114  DragDropMouseButton = -1;
2115  DragDropTargetId = 0;
2116  DragDropAcceptFlags = ImGuiDragDropFlags_None;
2117  DragDropAcceptIdCurrRectSurface = 0.0f;
2118  DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0;
2119  DragDropAcceptFrameCount = -1;
2120  DragDropHoldJustPressedId = 0;
2121  memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal));
2122 
2123  ClipperTempDataStacked = 0;
2124 
2125  CurrentTable = NULL;
2126  TablesTempDataStacked = 0;
2127  CurrentTabBar = NULL;
2128 
2129  HoverDelayId = HoverDelayIdPreviousFrame = 0;
2130  HoverDelayTimer = HoverDelayClearTimer = 0.0f;
2131 
2132  TempInputId = 0;
2133  ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_;
2134  ColorEditLastHue = ColorEditLastSat = 0.0f;
2135  ColorEditLastColor = 0;
2136  SliderGrabClickOffset = 0.0f;
2137  SliderCurrentAccum = 0.0f;
2138  SliderCurrentAccumDirty = false;
2139  DragCurrentAccumDirty = false;
2140  DragCurrentAccum = 0.0f;
2141  DragSpeedDefaultRatio = 1.0f / 100.0f;
2142  ScrollbarClickDeltaToGrabCenter = 0.0f;
2143  DisabledAlphaBackup = 0.0f;
2144  DisabledStackSize = 0;
2145  TooltipOverrideCount = 0;
2146 
2147  PlatformImeData.InputPos = ImVec2(0.0f, 0.0f);
2148  PlatformImeDataPrev.InputPos = ImVec2(-1.0f, -1.0f); // Different to ensure initial submission
2149  PlatformLocaleDecimalPoint = '.';
2150 
2151  SettingsLoaded = false;
2152  SettingsDirtyTimer = 0.0f;
2153  HookIdNext = 0;
2154 
2155  memset(LocalizationTable, 0, sizeof(LocalizationTable));
2156 
2157  LogEnabled = false;
2158  LogType = ImGuiLogType_None;
2159  LogNextPrefix = LogNextSuffix = NULL;
2160  LogFile = NULL;
2161  LogLinePosY = FLT_MAX;
2162  LogLineFirstItem = false;
2163  LogDepthRef = 0;
2164  LogDepthToExpand = LogDepthToExpandDefault = 2;
2165 
2166  DebugLogFlags = ImGuiDebugLogFlags_OutputToTTY;
2167  DebugLocateId = 0;
2168  DebugLocateFrames = 0;
2169  DebugItemPickerActive = false;
2170  DebugItemPickerMouseButton = ImGuiMouseButton_Left;
2171  DebugItemPickerBreakId = 0;
2172 
2173  memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
2174  FramerateSecPerFrameIdx = FramerateSecPerFrameCount = 0;
2175  FramerateSecPerFrameAccum = 0.0f;
2176  WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1;
2177  }
2178 };
2179 
2180 //-----------------------------------------------------------------------------
2181 // [SECTION] ImGuiWindowTempData, ImGuiWindow
2182 //-----------------------------------------------------------------------------
2183 
2184 // Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.
2185 // (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..)
2186 // (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin)
2187 struct IMGUI_API ImGuiWindowTempData
2188 {
2189  // Layout
2190  ImVec2 CursorPos; // Current emitting position, in absolute coordinates.
2191  ImVec2 CursorPosPrevLine;
2192  ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding.
2193  ImVec2 CursorMaxPos; // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame.
2194  ImVec2 IdealMaxPos; // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame.
2195  ImVec2 CurrLineSize;
2196  ImVec2 PrevLineSize;
2197  float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added).
2198  float PrevLineTextBaseOffset;
2199  bool IsSameLine;
2200  bool IsSetPos;
2201  ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
2202  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.
2203  ImVec1 GroupOffset;
2204  ImVec2 CursorStartPosLossyness;// Record the loss of precision of CursorStartPos due to really large scrolling amount. This is used by clipper to compensentate and fix the most common use case of large scroll area.
2205 
2206  // Keyboard/Gamepad navigation
2207  ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1)
2208  short NavLayersActiveMask; // Which layers have been written to (result from previous frame)
2209  short NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame)
2210  bool NavHideHighlightOneFrame;
2211  bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f)
2212 
2213  // Miscellaneous
2214  bool MenuBarAppending; // FIXME: Remove this
2215  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.
2216  ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement
2217  int TreeDepth; // Current tree depth.
2218  ImU32 TreeJumpToParentOnPopMask; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary.
2219  ImVector<ImGuiWindow*> ChildWindows;
2220  ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state)
2221  ImGuiOldColumns* CurrentColumns; // Current columns set
2222  int CurrentTableIdx; // Current table index (into g.Tables)
2223  ImGuiLayoutType LayoutType;
2224  ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin()
2225 
2226  // Local parameters stacks
2227  // 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.
2228  float ItemWidth; // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window).
2229  float TextWrapPos; // Current text wrap pos.
2230  ImVector<float> ItemWidthStack; // Store item widths to restore (attention: .back() is not == ItemWidth)
2231  ImVector<float> TextWrapPosStack; // Store text wrap pos to restore (attention: .back() is not == TextWrapPos)
2232 };
2233 
2234 // Storage for one window
2235 struct IMGUI_API ImGuiWindow
2236 {
2237  char* Name; // Window name, owned by the window.
2238  ImGuiID ID; // == ImHashStr(Name)
2239  ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_
2240  ImGuiViewportP* Viewport; // Always set in Begin(). Inactive windows may have a NULL value here if their viewport was discarded.
2241  ImVec2 Pos; // Position (always rounded-up to nearest pixel)
2242  ImVec2 Size; // Current size (==SizeFull or collapsed title bar size)
2243  ImVec2 SizeFull; // Size when non collapsed
2244  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.
2245  ImVec2 ContentSizeIdeal;
2246  ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize().
2247  ImVec2 WindowPadding; // Window padding at the time of Begin().
2248  float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc.
2249  float WindowBorderSize; // Window border size at the time of Begin().
2250  float DecoOuterSizeX1, DecoOuterSizeY1; // Left/Up offsets. Sum of non-scrolling outer decorations (X1 generally == 0.0f. Y1 generally = TitleBarHeight + MenuBarHeight). Locked during Begin().
2251  float DecoOuterSizeX2, DecoOuterSizeY2; // Right/Down offsets (X2 generally == ScrollbarSize.x, Y2 == ScrollbarSizes.y).
2252  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).
2253  int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)!
2254  ImGuiID MoveId; // == window->GetID("#MOVE")
2255  ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window)
2256  ImVec2 Scroll;
2257  ImVec2 ScrollMax;
2258  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)
2259  ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
2260  ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold
2261  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.
2262  bool ScrollbarX, ScrollbarY; // Are scrollbars visible?
2263  bool Active; // Set to true on Begin(), unless Collapsed
2264  bool WasActive;
2265  bool WriteAccessed; // Set to true when any widget access the current window
2266  bool Collapsed; // Set when collapsing window to become only title-bar
2267  bool WantCollapseToggle;
2268  bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed)
2269  bool Appearing; // Set during the frame where the window is appearing (or re-appearing)
2270  bool Hidden; // Do not display (== HiddenFrames*** > 0)
2271  bool IsFallbackWindow; // Set on the "Debug##Default" window.
2272  bool IsExplicitChild; // Set when passed _ChildWindow, left to false by BeginDocked()
2273  bool HasCloseButton; // Set when the window has a close button (p_open != NULL)
2274  signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3)
2275  short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
2276  short BeginCountPreviousFrame; // Number of Begin() during the previous frame
2277  short BeginOrderWithinParent; // Begin() order within immediate parent window, if we are a child window. Otherwise 0.
2278  short BeginOrderWithinContext; // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues.
2279  short FocusOrder; // Order within WindowsFocusOrder[], altered when windows are focused.
2280  ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
2281  ImS8 AutoFitFramesX, AutoFitFramesY;
2282  ImS8 AutoFitChildAxises;
2283  bool AutoFitOnlyGrows;
2284  ImGuiDir AutoPosLastDirection;
2285  ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames
2286  ImS8 HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size
2287  ImS8 HiddenFramesForRenderOnly; // Hide the window until frame N at Render() time only
2288  ImS8 DisableInputsFrames; // Disable window interactions for N frames
2289  ImGuiCond SetWindowPosAllowFlags : 8; // store acceptable condition flags for SetNextWindowPos() use.
2290  ImGuiCond SetWindowSizeAllowFlags : 8; // store acceptable condition flags for SetNextWindowSize() use.
2291  ImGuiCond SetWindowCollapsedAllowFlags : 8; // store acceptable condition flags for SetNextWindowCollapsed() use.
2292  ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
2293  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.
2294 
2295  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)
2296  ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name.
2297 
2298  // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer.
2299  // The main 'OuterRect', omitted as a field, is window->Rect().
2300  ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window.
2301  ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar)
2302  ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect.
2303  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).
2304  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?
2305  ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back().
2306  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.
2307  ImVec2ih HitTestHoleSize; // Define an optional rectangular hole where mouse will pass-through the window.
2308  ImVec2ih HitTestHoleOffset;
2309 
2310  int LastFrameActive; // Last frame number the window was Active.
2311  float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there)
2312  float ItemWidthDefault;
2313  ImGuiStorage StateStorage;
2314  ImVector<ImGuiOldColumns> ColumnsStorage;
2315  float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale()
2316  int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back)
2317 
2318  ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)
2319  ImDrawList DrawListInst;
2320  ImGuiWindow* ParentWindow; // If we are a child _or_ popup _or_ docked window, this is pointing to our parent. Otherwise NULL.
2321  ImGuiWindow* ParentWindowInBeginStack;
2322  ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window. Doesn't cross through popups/dock nodes.
2323  ImGuiWindow* RootWindowPopupTree; // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child.
2324  ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active.
2325  ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag.
2326 
2327  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.)
2328  ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1)
2329  ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space
2330  ImGuiID NavRootFocusScopeId; // Focus Scope ID at the time of Begin()
2331 
2332  int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy
2333  int MemoryDrawListVtxCapacity;
2334  bool MemoryCompacted; // Set when window extraneous data have been garbage collected
2335 
2336 public:
2337  ImGuiWindow(ImGuiContext* context, const char* name);
2338  ~ImGuiWindow();
2339 
2340  ImGuiID GetID(const char* str, const char* str_end = NULL);
2341  ImGuiID GetID(const void* ptr);
2342  ImGuiID GetID(int n);
2343  ImGuiID GetIDFromRectangle(const ImRect& r_abs);
2344 
2345  // We don't use g.FontSize because the window may be != g.CurrentWindow.
2346  ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
2347  float CalcFontSize() const { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; }
2348  float TitleBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; }
2349  ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
2350  float MenuBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; }
2351  ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }
2352 };
2353 
2354 //-----------------------------------------------------------------------------
2355 // [SECTION] Tab bar, Tab item support
2356 //-----------------------------------------------------------------------------
2357 
2358 // Extend ImGuiTabBarFlags_
2359 enum ImGuiTabBarFlagsPrivate_
2360 {
2361  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]
2362  ImGuiTabBarFlags_IsFocused = 1 << 21,
2363  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
2364 };
2365 
2366 // Extend ImGuiTabItemFlags_
2367 enum ImGuiTabItemFlagsPrivate_
2368 {
2369  ImGuiTabItemFlags_SectionMask_ = ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing,
2370  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)
2371  ImGuiTabItemFlags_Button = 1 << 21, // Used by TabItemButton, change the tab item behavior to mimic a button
2372 };
2373 
2374 // Storage for one active tab item (sizeof() 40 bytes)
2376 {
2377  ImGuiID ID;
2378  ImGuiTabItemFlags Flags;
2379  int LastFrameVisible;
2380  int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance
2381  float Offset; // Position relative to beginning of tab
2382  float Width; // Width currently displayed
2383  float ContentWidth; // Width of label, stored during BeginTabItem() call
2384  float RequestedWidth; // Width optionally requested by caller, -1.0f is unused
2385  ImS32 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames
2386  ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable
2387  ImS16 IndexDuringLayout; // Index only used during TabBarLayout()
2388  bool WantClose; // Marked as closed by SetTabItemClosed()
2389 
2390  ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; RequestedWidth = -1.0f; NameOffset = -1; BeginOrder = IndexDuringLayout = -1; }
2391 };
2392 
2393 // Storage for a tab bar (sizeof() 152 bytes)
2394 struct IMGUI_API ImGuiTabBar
2395 {
2397  ImGuiTabBarFlags Flags;
2398  ImGuiID ID; // Zero for tab-bars used by docking
2399  ImGuiID SelectedTabId; // Selected tab/window
2400  ImGuiID NextSelectedTabId; // Next selected tab/window. Will also trigger a scrolling animation
2401  ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview)
2402  int CurrFrameVisible;
2403  int PrevFrameVisible;
2404  ImRect BarRect;
2405  float CurrTabsContentsHeight;
2406  float PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar
2407  float WidthAllTabs; // Actual width of all tabs (locked during layout)
2408  float WidthAllTabsIdeal; // Ideal width if all tabs were visible and not clipped
2409  float ScrollingAnim;
2410  float ScrollingTarget;
2411  float ScrollingTargetDistToVisibility;
2412  float ScrollingSpeed;
2413  float ScrollingRectMinX;
2414  float ScrollingRectMaxX;
2415  ImGuiID ReorderRequestTabId;
2416  ImS16 ReorderRequestOffset;
2417  ImS8 BeginCount;
2418  bool WantLayout;
2419  bool VisibleTabWasSubmitted;
2420  bool TabsAddedNew; // Set to true when a new tab item or button has been added to the tab bar during last frame
2421  ImS16 TabsActiveCount; // Number of tabs submitted this frame.
2422  ImS16 LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem()
2423  float ItemSpacingY;
2424  ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar()
2425  ImVec2 BackupCursorPos;
2426  ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer.
2427 
2428  ImGuiTabBar();
2429  int GetTabOrder(const ImGuiTabItem* tab) const { return Tabs.index_from_ptr(tab); }
2430  const char* GetTabName(const ImGuiTabItem* tab) const
2431  {
2432  IM_ASSERT(tab->NameOffset != -1 && tab->NameOffset < TabsNames.Buf.Size);
2433  return TabsNames.Buf.Data + tab->NameOffset;
2434  }
2435 };
2436 
2437 //-----------------------------------------------------------------------------
2438 // [SECTION] Table support
2439 //-----------------------------------------------------------------------------
2440 
2441 #define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color.
2442 #define IMGUI_TABLE_MAX_COLUMNS 64 // sizeof(ImU64) * 8. This is solely because we frequently encode columns set in a ImU64.
2443 #define IMGUI_TABLE_MAX_DRAW_CHANNELS (4 + 64 * 2) // See TableSetupDrawChannels()
2444 
2445 // Our current column maximum is 64 but we may raise that in the future.
2446 typedef ImS8 ImGuiTableColumnIdx;
2447 typedef ImU8 ImGuiTableDrawChannelIdx;
2448 
2449 // [Internal] sizeof() ~ 104
2450 // We use the terminology "Enabled" to refer to a column that is not Hidden by user/api.
2451 // We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping.
2452 // This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped".
2454 {
2455  ImGuiTableColumnFlags Flags; // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_
2456  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.
2457  float MinX; // Absolute positions
2458  float MaxX;
2459  float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout()
2460  float WidthAuto; // Automatic width
2461  float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially.
2462  float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_).
2463  ImRect ClipRect; // Clipping rectangle for the column
2464  ImGuiID UserID; // Optional, value passed to TableSetupColumn()
2465  float WorkMinX; // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column
2466  float WorkMaxX; // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2)
2467  float ItemWidth; // Current item width for the column, preserved across rows
2468  float ContentMaxXFrozen; // Contents maximum position for frozen rows (apart from headers), from which we can infer content width.
2469  float ContentMaxXUnfrozen;
2470  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
2471  float ContentMaxXHeadersIdeal;
2472  ImS16 NameOffset; // Offset into parent ColumnsNames[]
2473  ImGuiTableColumnIdx DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users)
2474  ImGuiTableColumnIdx IndexWithinEnabledSet; // Index within enabled/visible set (<= IndexToDisplayOrder)
2475  ImGuiTableColumnIdx PrevEnabledColumn; // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column
2476  ImGuiTableColumnIdx NextEnabledColumn; // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column
2477  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
2478  ImGuiTableDrawChannelIdx DrawChannelCurrent; // Index within DrawSplitter.Channels[]
2479  ImGuiTableDrawChannelIdx DrawChannelFrozen; // Draw channels for frozen rows (often headers)
2480  ImGuiTableDrawChannelIdx DrawChannelUnfrozen; // Draw channels for unfrozen rows
2481  bool IsEnabled; // IsUserEnabled && (Flags & ImGuiTableColumnFlags_Disabled) == 0
2482  bool IsUserEnabled; // Is the column not marked Hidden by the user? (unrelated to being off view, e.g. clipped by scrolling).
2483  bool IsUserEnabledNextFrame;
2484  bool IsVisibleX; // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled).
2485  bool IsVisibleY;
2486  bool IsRequestOutput; // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not.
2487  bool IsSkipItems; // Do we want item submissions to this column to be completely ignored (no layout will happen).
2488  bool IsPreserveWidthAuto;
2489  ImS8 NavLayerCurrent; // ImGuiNavLayer in 1 byte
2490  ImU8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit
2491  ImU8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem
2492  ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending
2493  ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3)
2494  ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each)
2495  ImU8 SortDirectionsAvailList; // Ordered of available sort directions (2-bits each)
2496 
2498  {
2499  memset(this, 0, sizeof(*this));
2500  StretchWeight = WidthRequest = -1.0f;
2501  NameOffset = -1;
2502  DisplayOrder = IndexWithinEnabledSet = -1;
2503  PrevEnabledColumn = NextEnabledColumn = -1;
2504  SortOrder = -1;
2505  SortDirection = ImGuiSortDirection_None;
2506  DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1;
2507  }
2508 };
2509 
2510 // Transient cell data stored per row.
2511 // sizeof() ~ 6
2513 {
2514  ImU32 BgColor; // Actual color
2515  ImGuiTableColumnIdx Column; // Column number
2516 };
2517 
2518 // Per-instance data that needs preserving across frames (seemingly most others do not need to be preserved aside from debug needs, does that needs they could be moved to ImGuiTableTempData ?)
2520 {
2521  float LastOuterHeight; // Outer height from last frame
2522  float LastFirstRowHeight; // Height of first row from last frame (FIXME: this is used as "header height" and may be reworked)
2523  float LastFrozenHeight; // Height of frozen section from last frame
2524 
2525  ImGuiTableInstanceData() { LastOuterHeight = LastFirstRowHeight = LastFrozenHeight = 0.0f; }
2526 };
2527 
2528 // FIXME-TABLE: more transient data could be stored in a stacked ImGuiTableTempData: e.g. SortSpecs, incoming RowData
2529 struct IMGUI_API ImGuiTable
2530 {
2531  ImGuiID ID;
2532  ImGuiTableFlags Flags;
2533  void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[] and RowCellData[]
2534  ImGuiTableTempData* TempData; // Transient data while table is active. Point within g.CurrentTableStack[]
2535  ImSpan<ImGuiTableColumn> Columns; // Point within RawData[]
2536  ImSpan<ImGuiTableColumnIdx> DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1)
2537  ImSpan<ImGuiTableCellData> RowCellData; // Point within RawData[]. Store cells background requests for current row.
2538  ImU64 EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map
2539  ImU64 EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data
2540  ImU64 VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect)
2541  ImU64 RequestOutputMaskByIndex; // Column Index -> IsVisible || AutoFit (== expect user to submit items)
2542  ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order)
2543  int SettingsOffset; // Offset in g.SettingsTables
2544  int LastFrameActive;
2545  int ColumnsCount; // Number of columns declared in BeginTable()
2546  int CurrentRow;
2547  int CurrentColumn;
2548  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 table with same ID look are multiple tables, they are just synched.
2549  ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with
2550  float RowPosY1;
2551  float RowPosY2;
2552  float RowMinHeight; // Height submitted to TableNextRow()
2553  float RowTextBaseline;
2554  float RowIndentOffsetX;
2555  ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_
2556  ImGuiTableRowFlags LastRowFlags : 16;
2557  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.
2558  ImU32 RowBgColor[2]; // Background color override for current row.
2559  ImU32 BorderColorStrong;
2560  ImU32 BorderColorLight;
2561  float BorderX1;
2562  float BorderX2;
2563  float HostIndentX;
2564  float MinColumnWidth;
2565  float OuterPaddingX;
2566  float CellPaddingX; // Padding from each borders
2567  float CellPaddingY;
2568  float CellSpacingX1; // Spacing between non-bordered cells
2569  float CellSpacingX2;
2570  float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details.
2571  float ColumnsGivenWidth; // Sum of current column width
2572  float ColumnsAutoFitWidth; // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window
2573  float ColumnsStretchSumWeights; // Sum of weight of all enabled stretching columns
2574  float ResizedColumnNextWidth;
2575  float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table.
2576  float RefScale; // Reference scale to be able to rescale columns on font/dpi changes.
2577  ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable().
2578  ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is
2579  ImRect WorkRect;
2580  ImRect InnerClipRect;
2581  ImRect BgClipRect; // We use this to cpu-clip cell background color fill, evolve during the frame as we cross frozen rows boundaries
2582  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
2583  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.
2584  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.
2585  ImRect HostBackupInnerClipRect; // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground()
2586  ImGuiWindow* OuterWindow; // Parent window for the table
2587  ImGuiWindow* InnerWindow; // Window holding the table data (== OuterWindow or a child window)
2588  ImGuiTextBuffer ColumnsNames; // Contiguous buffer holding columns names
2589  ImDrawListSplitter* DrawSplitter; // Shortcut to TempData->DrawSplitter while in table. Isolate draw commands per columns to avoid switching clip rect constantly
2590  ImGuiTableInstanceData InstanceDataFirst;
2591  ImVector<ImGuiTableInstanceData> InstanceDataExtra; // FIXME-OPT: Using a small-vector pattern would be good.
2592  ImGuiTableColumnSortSpecs SortSpecsSingle;
2593  ImVector<ImGuiTableColumnSortSpecs> SortSpecsMulti; // FIXME-OPT: Using a small-vector pattern would be good.
2594  ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs()
2595  ImGuiTableColumnIdx SortSpecsCount;
2596  ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount)
2597  ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns (<= ColumnsCount)
2598  ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn()
2599  ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column!
2600  ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing).
2601  ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit.
2602  ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0.
2603  ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame.
2604  ImGuiTableColumnIdx HeldHeaderColumn; // Index of column header being held.
2605  ImGuiTableColumnIdx ReorderColumn; // Index of column being reordered. (not cleared)
2606  ImGuiTableColumnIdx ReorderColumnDir; // -1 or +1
2607  ImGuiTableColumnIdx LeftMostEnabledColumn; // Index of left-most non-hidden column.
2608  ImGuiTableColumnIdx RightMostEnabledColumn; // Index of right-most non-hidden column.
2609  ImGuiTableColumnIdx LeftMostStretchedColumn; // Index of left-most stretched column.
2610  ImGuiTableColumnIdx RightMostStretchedColumn; // Index of right-most stretched column.
2611  ImGuiTableColumnIdx ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot
2612  ImGuiTableColumnIdx FreezeRowsRequest; // Requested frozen rows count
2613  ImGuiTableColumnIdx FreezeRowsCount; // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset)
2614  ImGuiTableColumnIdx FreezeColumnsRequest; // Requested frozen columns count
2615  ImGuiTableColumnIdx FreezeColumnsCount; // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset)
2616  ImGuiTableColumnIdx RowCellDataCurrent; // Index of current RowCellData[] entry in current row
2617  ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here.
2618  ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[]
2619  ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen;
2620  bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row.
2621  bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow().
2622  bool IsInitializing;
2623  bool IsSortSpecsDirty;
2624  bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag.
2625  bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted).
2626  bool IsSettingsRequestLoad;
2627  bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data.
2628  bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1)
2629  bool IsResetAllRequest;
2630  bool IsResetDisplayOrderRequest;
2631  bool IsUnfrozenRows; // Set when we got past the frozen row.
2632  bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable()
2633  bool HasScrollbarYCurr; // Whether ANY instance of this table had a vertical scrollbar during the current frame.
2634  bool HasScrollbarYPrev; // Whether ANY instance of this table had a vertical scrollbar during the previous.
2635  bool MemoryCompacted;
2636  bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis
2637 
2638  ImGuiTable() { memset(this, 0, sizeof(*this)); LastFrameActive = -1; }
2639  ~ImGuiTable() { IM_FREE(RawData); }
2640 };
2641 
2642 // Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table).
2643 // - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure.
2644 // - We also leave out of this structure data that tend to be particularly useful for debugging/metrics.
2645 struct IMGUI_API ImGuiTableTempData
2646 {
2647  int TableIndex; // Index in g.Tables.Buf[] pool
2648  float LastTimeActive; // Last timestamp this structure was used
2649 
2650  ImVec2 UserOuterSize; // outer_size.x passed to BeginTable()
2651  ImDrawListSplitter DrawSplitter;
2652 
2653  ImRect HostBackupWorkRect; // Backup of InnerWindow->WorkRect at the end of BeginTable()
2654  ImRect HostBackupParentWorkRect; // Backup of InnerWindow->ParentWorkRect at the end of BeginTable()
2655  ImVec2 HostBackupPrevLineSize; // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable()
2656  ImVec2 HostBackupCurrLineSize; // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable()
2657  ImVec2 HostBackupCursorMaxPos; // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable()
2658  ImVec1 HostBackupColumnsOffset; // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable()
2659  float HostBackupItemWidth; // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable()
2660  int HostBackupItemWidthStackSize;//Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable()
2661 
2662  ImGuiTableTempData() { memset(this, 0, sizeof(*this)); LastTimeActive = -1.0f; }
2663 };
2664 
2665 // sizeof() ~ 12
2667 {
2668  float WidthOrWeight;
2669  ImGuiID UserID;
2670  ImGuiTableColumnIdx Index;
2671  ImGuiTableColumnIdx DisplayOrder;
2672  ImGuiTableColumnIdx SortOrder;
2673  ImU8 SortDirection : 2;
2674  ImU8 IsEnabled : 1; // "Visible" in ini file
2675  ImU8 IsStretch : 1;
2676 
2678  {
2679  WidthOrWeight = 0.0f;
2680  UserID = 0;
2681  Index = -1;
2682  DisplayOrder = SortOrder = -1;
2683  SortDirection = ImGuiSortDirection_None;
2684  IsEnabled = 1;
2685  IsStretch = 0;
2686  }
2687 };
2688 
2689 // This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.)
2691 {
2692  ImGuiID ID; // Set to 0 to invalidate/delete the setting
2693  ImGuiTableFlags SaveFlags; // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..)
2694  float RefScale; // Reference scale to be able to rescale columns on font/dpi changes.
2695  ImGuiTableColumnIdx ColumnsCount;
2696  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
2697  bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
2698 
2699  ImGuiTableSettings() { memset(this, 0, sizeof(*this)); }
2700  ImGuiTableColumnSettings* GetColumnSettings() { return (ImGuiTableColumnSettings*)(this + 1); }
2701 };
2702 
2703 //-----------------------------------------------------------------------------
2704 // [SECTION] ImGui internal API
2705 // No guarantee of forward compatibility here!
2706 //-----------------------------------------------------------------------------
2707 
2708 namespace ImGui
2709 {
2710  // Windows
2711  // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
2712  // If this ever crash because g.CurrentWindow is NULL it means that either
2713  // - ImGui::NewFrame() has never been called, which is illegal.
2714  // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.
2715  inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
2716  inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }
2717  IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id);
2718  IMGUI_API ImGuiWindow* FindWindowByName(const char* name);
2719  IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
2720  IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window);
2721  IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy);
2722  IMGUI_API bool IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
2723  IMGUI_API bool IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below);
2724  IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window);
2725  IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0);
2726  IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0);
2727  IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0);
2728  IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size);
2729  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); }
2730  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); }
2731 
2732  // Windows: Display Order and Focus Order
2733  IMGUI_API void FocusWindow(ImGuiWindow* window);
2734  IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window);
2735  IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);
2736  IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window);
2737  IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window);
2738  IMGUI_API void BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* above_window);
2739  IMGUI_API int FindWindowDisplayIndex(ImGuiWindow* window);
2740  IMGUI_API ImGuiWindow* FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window);
2741 
2742  // Fonts, drawing
2743  IMGUI_API void SetCurrentFont(ImFont* font);
2744  inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; }
2745  inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches.
2746  IMGUI_API ImDrawList* GetBackgroundDrawList(ImGuiViewport* viewport); // get background draw list for the given viewport. this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents.
2747  IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents.
2748 
2749  // Init
2750  IMGUI_API void Initialize();
2751  IMGUI_API void Shutdown(); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext().
2752 
2753  // NewFrame
2754  IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs);
2755  IMGUI_API void UpdateHoveredWindowAndCaptureFlags();
2756  IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window);
2757  IMGUI_API void UpdateMouseMovingWindowNewFrame();
2758  IMGUI_API void UpdateMouseMovingWindowEndFrame();
2759 
2760  // Generic context hooks
2761  IMGUI_API ImGuiID AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook);
2762  IMGUI_API void RemoveContextHook(ImGuiContext* context, ImGuiID hook_to_remove);
2763  IMGUI_API void CallContextHooks(ImGuiContext* context, ImGuiContextHookType type);
2764 
2765  // Viewports
2766  IMGUI_API void SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport);
2767 
2768  // Settings
2769  IMGUI_API void MarkIniSettingsDirty();
2770  IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window);
2771  IMGUI_API void ClearIniSettings();
2772  IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);
2773  IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id);
2774  IMGUI_API ImGuiWindowSettings* FindOrCreateWindowSettings(const char* name);
2775  IMGUI_API void AddSettingsHandler(const ImGuiSettingsHandler* handler);
2776  IMGUI_API void RemoveSettingsHandler(const char* type_name);
2777  IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
2778 
2779  // Localization
2780  IMGUI_API void LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count);
2781  inline const char* LocalizeGetMsg(ImGuiLocKey key) { ImGuiContext& g = *GImGui; const char* msg = g.LocalizationTable[key]; return msg ? msg : "*Missing Text*"; }
2782 
2783  // Scrolling
2784  IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x);
2785  IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y);
2786  IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio);
2787  IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio);
2788 
2789  // Early work-in-progress API (ScrollToItem() will become public)
2790  IMGUI_API void ScrollToItem(ImGuiScrollFlags flags = 0);
2791  IMGUI_API void ScrollToRect(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);
2792  IMGUI_API ImVec2 ScrollToRectEx(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0);
2793 //#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
2794  inline void ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& rect) { ScrollToRect(window, rect, ImGuiScrollFlags_KeepVisibleEdgeY); }
2795 //#endif
2796 
2797  // Basic Accessors
2798  inline ImGuiItemStatusFlags GetItemStatusFlags(){ ImGuiContext& g = *GImGui; return g.LastItemData.StatusFlags; }
2799  inline ImGuiItemFlags GetItemFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.InFlags; }
2800  inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; }
2801  inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; }
2802  IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);
2803  IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window);
2804  IMGUI_API void ClearActiveID();
2805  IMGUI_API ImGuiID GetHoveredID();
2806  IMGUI_API void SetHoveredID(ImGuiID id);
2807  IMGUI_API void KeepAliveID(ImGuiID id);
2808  IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function.
2809  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)
2810  IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed);
2811 
2812  // Basic Helpers for widget code
2813  IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f);
2814  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.
2815  IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0);
2816  IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id);
2817  IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id);
2818  IMGUI_API void SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect);
2819  IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h);
2820  IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
2821  IMGUI_API void PushMultiItemsWidths(int components, float width_full);
2822  IMGUI_API bool IsItemToggledSelection(); // Was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly)
2823  IMGUI_API ImVec2 GetContentRegionMaxAbs();
2824  IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess);
2825 
2826  // Parameter stacks (shared)
2827  IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled);
2828  IMGUI_API void PopItemFlag();
2829 
2830  // Logging/Capture
2831  IMGUI_API void LogBegin(ImGuiLogType type, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name.
2832  IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer
2833  IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL);
2834  IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix);
2835 
2836  // Popups, Modals, Tooltips
2837  IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags);
2838  IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None);
2839  IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup);
2840  IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup);
2841  IMGUI_API void ClosePopupsExceptModals();
2842  IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags);
2843  IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);
2844  IMGUI_API void BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags);
2845  IMGUI_API ImRect GetPopupAllowedExtentRect(ImGuiWindow* window);
2846  IMGUI_API ImGuiWindow* GetTopMostPopupModal();
2847  IMGUI_API ImGuiWindow* GetTopMostAndVisiblePopupModal();
2848  IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window);
2849  IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy);
2850 
2851  // Menus
2852  IMGUI_API bool BeginViewportSideBar(const char* name, ImGuiViewport* viewport, ImGuiDir dir, float size, ImGuiWindowFlags window_flags);
2853  IMGUI_API bool BeginMenuEx(const char* label, const char* icon, bool enabled = true);
2854  IMGUI_API bool MenuItemEx(const char* label, const char* icon, const char* shortcut = NULL, bool selected = false, bool enabled = true);
2855 
2856  // Combos
2857  IMGUI_API bool BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags);
2858  IMGUI_API bool BeginComboPreview();
2859  IMGUI_API void EndComboPreview();
2860 
2861  // Gamepad/Keyboard Navigation
2862  IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit);
2863  IMGUI_API void NavInitRequestApplyResult();
2864  IMGUI_API bool NavMoveRequestButNoResultYet();
2865  IMGUI_API void NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
2866  IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags);
2867  IMGUI_API void NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result);
2868  IMGUI_API void NavMoveRequestCancel();
2869  IMGUI_API void NavMoveRequestApplyResult();
2870  IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);
2871  IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again.
2872  IMGUI_API void SetNavWindow(ImGuiWindow* window);
2873  IMGUI_API void SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel);
2874 
2875  // Inputs
2876  // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions.
2877  inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; }
2878  inline bool IsNamedKeyOrModKey(ImGuiKey key) { return (key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END) || key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super || key == ImGuiMod_Shortcut; }
2879  inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; }
2880  inline bool IsKeyboardKey(ImGuiKey key) { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; }
2881  inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; }
2882  inline bool IsMouseKey(ImGuiKey key) { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; }
2883  inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; }
2884  inline ImGuiKeyChord ConvertShortcutMod(ImGuiKeyChord key_chord) { ImGuiContext& g = *GImGui; IM_ASSERT_PARANOID(key_chord & ImGuiMod_Shortcut); return (key_chord & ~ImGuiMod_Shortcut) | (g.IO.ConfigMacOSXBehaviors ? ImGuiMod_Super : ImGuiMod_Ctrl); }
2885  inline ImGuiKey ConvertSingleModFlagToKey(ImGuiKey key)
2886  {
2887  ImGuiContext& g = *GImGui;
2888  if (key == ImGuiMod_Ctrl) return ImGuiKey_ReservedForModCtrl;
2889  if (key == ImGuiMod_Shift) return ImGuiKey_ReservedForModShift;
2890  if (key == ImGuiMod_Alt) return ImGuiKey_ReservedForModAlt;
2891  if (key == ImGuiMod_Super) return ImGuiKey_ReservedForModSuper;
2892  if (key == ImGuiMod_Shortcut) return (g.IO.ConfigMacOSXBehaviors ? ImGuiKey_ReservedForModSuper : ImGuiKey_ReservedForModCtrl);
2893  return key;
2894  }
2895 
2896  IMGUI_API ImGuiKeyData* GetKeyData(ImGuiKey key);
2897  IMGUI_API void GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size);
2898  inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); }
2899  IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);
2900  IMGUI_API ImVec2 GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down);
2901  IMGUI_API float GetNavTweakPressedAmount(ImGuiAxis axis);
2902  IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate);
2903  IMGUI_API void GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate);
2904  IMGUI_API void SetActiveIdUsingAllKeyboardKeys();
2905  inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; }
2906 
2907  // [EXPERIMENTAL] Low-Level: Key/Input Ownership
2908  // - The idea is that instead of "eating" a given input, we can link to an owner id.
2909  // - Ownership is most often claimed as a result of reacting to a press/down event (but occasionally may be claimed ahead).
2910  // - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_None (== -1) or a custom ID.
2911  // - Legacy input queries (without specifying an owner or _Any or _None) are equivalent to using ImGuiKeyOwner_Any (== 0).
2912  // - Input ownership is automatically released on the frame after a key is released. Therefore:
2913  // - for ownership registration happening as a result of a down/press event, the SetKeyOwner() call may be done once (common case).
2914  // - 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).
2915  // - 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.
2916  // - This is marked experimental because not all widgets are fully honoring the Set/Test idioms. We will need to move forward step by step.
2917  // Please open a GitHub Issue to submit your usage scenario or if there's a use case you need solved.
2918  IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key);
2919  IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0);
2920  IMGUI_API void SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags = 0); // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'.
2921  IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id'
2922  inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &GImGui->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; }
2923 
2924  // [EXPERIMENTAL] High-Level: Input Access functions w/ support for Key/Input Ownership
2925  // - Important: legacy IsKeyPressed(ImGuiKey, bool repeat=true) _DEFAULTS_ to repeat, new IsKeyPressed() requires _EXPLICIT_ ImGuiInputFlags_Repeat flag.
2926  // - Expected to be later promoted to public API, the prototypes are designed to replace existing ones (since owner_id can default to Any == 0)
2927  // - Specifying a value for 'ImGuiID owner' will test that EITHER the key is NOT owned (UNLESS locked), EITHER the key is owned by 'owner'.
2928  // Legacy functions use ImGuiKeyOwner_Any meaning that they typically ignore ownership, unless a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease.
2929  // - Binding generators may want to ignore those for now, or suffix them with Ex() until we decide if this gets moved into public API.
2930  IMGUI_API bool IsKeyDown(ImGuiKey key, ImGuiID owner_id);
2931  IMGUI_API bool IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requiress explicit ImGuiInputFlags_Repeat.
2932  IMGUI_API bool IsKeyReleased(ImGuiKey key, ImGuiID owner_id);
2933  IMGUI_API bool IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id);
2934  IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0);
2935  IMGUI_API bool IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id);
2936 
2937  // [EXPERIMENTAL] Shortcut Routing
2938  // - ImGuiKeyChord = a ImGuiKey optionally OR-red with ImGuiMod_Alt/ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Super.
2939  // ImGuiKey_C (accepted by functions taking ImGuiKey or ImGuiKeyChord)
2940  // ImGuiKey_C | ImGuiMod_Ctrl (accepted by functions taking ImGuiKeyChord)
2941  // ONLY ImGuiMod_XXX values are legal to 'OR' with an ImGuiKey. You CANNOT 'OR' two ImGuiKey values.
2942  // - When using one of the routing flags (e.g. ImGuiInputFlags_RouteFocused): routes requested ahead of time given a chord (key + modifiers) and a routing policy.
2943  // - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame.
2944  // - Route is granted to a single owner. When multiple requests are made we have policies to select the winning route.
2945  // - Multiple read sites may use the same owner id and will all get the granted route.
2946  // - For routing: when owner_id is 0 we use the current Focus Scope ID as a default owner in order to identify our location.
2947  IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0);
2948  IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0);
2949  IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id);
2950  IMGUI_API ImGuiKeyRoutingData* GetShortcutRoutingData(ImGuiKeyChord key_chord);
2951 
2952  // [EXPERIMENTAL] Focus Scope
2953  // This is generally used to identify a unique input location (for e.g. a selection set)
2954  // There is one per window (automatically set in Begin), but:
2955  // - Selection patterns generally need to react (e.g. clear a selection) when landing on one item of the set.
2956  // So in order to identify a set multiple lists in same window may each need a focus scope.
2957  // If you imagine an hypothetical BeginSelectionGroup()/EndSelectionGroup() api, it would likely call PushFocusScope()/EndFocusScope()
2958  // - Shortcut routing also use focus scope as a default location identifier if an owner is not provided.
2959  // We don't use the ID Stack for this as it is common to want them separate.
2960  IMGUI_API void PushFocusScope(ImGuiID id);
2961  IMGUI_API void PopFocusScope();
2962  inline ImGuiID GetCurrentFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentFocusScopeId; } // Focus scope we are outputting into, set by PushFocusScope()
2963 
2964  // Drag and Drop
2965  IMGUI_API bool IsDragDropActive();
2966  IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);
2967  IMGUI_API void ClearDragDrop();
2968  IMGUI_API bool IsDragDropPayloadBeingAccepted();
2969  IMGUI_API void RenderDragDropTargetRect(const ImRect& bb);
2970 
2971  // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API)
2972  IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect);
2973  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().
2974  IMGUI_API void EndColumns(); // close columns
2975  IMGUI_API void PushColumnClipRect(int column_index);
2976  IMGUI_API void PushColumnsBackground();
2977  IMGUI_API void PopColumnsBackground();
2978  IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count);
2979  IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id);
2980  IMGUI_API float GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm);
2981  IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset);
2982 
2983  // Tables: Candidates for public API
2984  IMGUI_API void TableOpenContextMenu(int column_n = -1);
2985  IMGUI_API void TableSetColumnWidth(int column_n, float width);
2986  IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs);
2987  IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered.
2988  IMGUI_API float TableGetHeaderRowHeight();
2989  IMGUI_API void TablePushBackgroundChannel();
2990  IMGUI_API void TablePopBackgroundChannel();
2991 
2992  // Tables: Internals
2993  inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; }
2994  IMGUI_API ImGuiTable* TableFindByID(ImGuiID id);
2995  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);
2996  IMGUI_API void TableBeginInitMemory(ImGuiTable* table, int columns_count);
2997  IMGUI_API void TableBeginApplyRequests(ImGuiTable* table);
2998  IMGUI_API void TableSetupDrawChannels(ImGuiTable* table);
2999  IMGUI_API void TableUpdateLayout(ImGuiTable* table);
3000  IMGUI_API void TableUpdateBorders(ImGuiTable* table);
3001  IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table);
3002  IMGUI_API void TableDrawBorders(ImGuiTable* table);
3003  IMGUI_API void TableDrawContextMenu(ImGuiTable* table);
3004  IMGUI_API bool TableBeginContextMenuPopup(ImGuiTable* table);
3005  IMGUI_API void TableMergeDrawChannels(ImGuiTable* table);
3006  inline ImGuiTableInstanceData* TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; }
3007  IMGUI_API void TableSortSpecsSanitize(ImGuiTable* table);
3008  IMGUI_API void TableSortSpecsBuild(ImGuiTable* table);
3009  IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column);
3010  IMGUI_API void TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column);
3011  IMGUI_API float TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column);
3012  IMGUI_API void TableBeginRow(ImGuiTable* table);
3013  IMGUI_API void TableEndRow(ImGuiTable* table);
3014  IMGUI_API void TableBeginCell(ImGuiTable* table, int column_n);
3015  IMGUI_API void TableEndCell(ImGuiTable* table);
3016  IMGUI_API ImRect TableGetCellBgRect(const ImGuiTable* table, int column_n);
3017  IMGUI_API const char* TableGetColumnName(const ImGuiTable* table, int column_n);
3018  IMGUI_API ImGuiID TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no = 0);
3019  IMGUI_API float TableGetMaxColumnWidth(const ImGuiTable* table, int column_n);
3020  IMGUI_API void TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n);
3021  IMGUI_API void TableSetColumnWidthAutoAll(ImGuiTable* table);
3022  IMGUI_API void TableRemove(ImGuiTable* table);
3023  IMGUI_API void TableGcCompactTransientBuffers(ImGuiTable* table);
3024  IMGUI_API void TableGcCompactTransientBuffers(ImGuiTableTempData* table);
3025  IMGUI_API void TableGcCompactSettings();
3026 
3027  // Tables: Settings
3028  IMGUI_API void TableLoadSettings(ImGuiTable* table);
3029  IMGUI_API void TableSaveSettings(ImGuiTable* table);
3030  IMGUI_API void TableResetSettings(ImGuiTable* table);
3031  IMGUI_API ImGuiTableSettings* TableGetBoundSettings(ImGuiTable* table);
3032  IMGUI_API void TableSettingsAddSettingsHandler();
3033  IMGUI_API ImGuiTableSettings* TableSettingsCreate(ImGuiID id, int columns_count);
3034  IMGUI_API ImGuiTableSettings* TableSettingsFindByID(ImGuiID id);
3035 
3036  // Tab Bars
3037  IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags);
3038  IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id);
3039  IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id);
3040  IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
3041  IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int offset);
3042  IMGUI_API void TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, ImVec2 mouse_pos);
3043  IMGUI_API bool TabBarProcessReorder(ImGuiTabBar* tab_bar);
3044  IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags, ImGuiWindow* docked_window);
3045  IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button_or_unsaved_marker);
3046  IMGUI_API ImVec2 TabItemCalcSize(ImGuiWindow* window);
3047  IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col);
3048  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);
3049 
3050  // Render helpers
3051  // 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.
3052  // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally)
3053  IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
3054  IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
3055  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);
3056  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);
3057  IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known);
3058  IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
3059  IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
3060  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);
3061  IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight
3062  IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
3063  IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
3064 
3065  // Render helpers (those functions don't access any ImGui state!)
3066  IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f);
3067  IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);
3068  IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz);
3069  IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);
3070  IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);
3071  IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding);
3072 
3073  // Widgets
3074  IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);
3075  IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0);
3076  IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);
3077  IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col);
3078  IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags);
3079  IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value);
3080  IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value);
3081 
3082  // Widgets: Window Decorations
3083  IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos);
3084  IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos);
3085  IMGUI_API void Scrollbar(ImGuiAxis axis);
3086  IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 avail_v, ImS64 contents_v, ImDrawFlags flags);
3087  IMGUI_API ImRect GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis);
3088  IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis);
3089  IMGUI_API ImGuiID GetWindowResizeCornerID(ImGuiWindow* window, int n); // 0..3: corners
3090  IMGUI_API ImGuiID GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir);
3091 
3092  // Widgets low-level behaviors
3093  IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
3094  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);
3095  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);
3096  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);
3097  IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);
3098  IMGUI_API void TreePushOverrideID(ImGuiID id);
3099  IMGUI_API void TreeNodeSetOpen(ImGuiID id, bool open);
3100  IMGUI_API bool TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags); // Return open state. Consume previous SetNextItemOpen() data, if any. May return true when logging.
3101 
3102  // Template functions are instantiated in imgui_widgets.cpp for a finite number of types.
3103  // 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).
3104  // e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); "
3105  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);
3106  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);
3107  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);
3108  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);
3109  template<typename T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);
3110  template<typename T> IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value);
3111 
3112  // Data type helpers
3113  IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type);
3114  IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format);
3115  IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2);
3116  IMGUI_API bool DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format);
3117  IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2);
3118  IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max);
3119 
3120  // InputText
3121  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);
3122  IMGUI_API bool TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags);
3123  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);
3124  inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); }
3125  inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active
3126 
3127  // Color
3128  IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
3129  IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags);
3130  IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags);
3131 
3132  // Plot
3133  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, ImVec2 frame_size);
3134 
3135  // Shade functions (write over already created vertices)
3136  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);
3137  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);
3138 
3139  // Garbage collection
3140  IMGUI_API void GcCompactTransientMiscBuffers();
3141  IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window);
3142  IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window);
3143 
3144  // Debug Log
3145  IMGUI_API void DebugLog(const char* fmt, ...) IM_FMTARGS(1);
3146  IMGUI_API void DebugLogV(const char* fmt, va_list args) IM_FMTLIST(1);
3147 
3148  // Debug Tools
3149  IMGUI_API void ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL);
3150  IMGUI_API void ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL);
3151  IMGUI_API void ErrorCheckUsingSetCursorPosToExtendParentBoundaries();
3152  IMGUI_API void DebugLocateItem(ImGuiID target_id); // Call sparingly: only 1 at the same time!
3153  IMGUI_API void DebugLocateItemOnHover(ImGuiID target_id); // Only call on reaction to a mouse Hover: because only 1 at the same time!
3154  IMGUI_API void DebugLocateItemResolveWithLastItem();
3155  inline void DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255)) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, col); }
3156  inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; }
3157  IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas);
3158  IMGUI_API void DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end);
3159  IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns);
3160  IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label);
3161  IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb);
3162  IMGUI_API void DebugNodeFont(ImFont* font);
3163  IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph);
3164  IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label);
3165  IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label);
3166  IMGUI_API void DebugNodeTable(ImGuiTable* table);
3167  IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings);
3168  IMGUI_API void DebugNodeInputTextState(ImGuiInputTextState* state);
3169  IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label);
3170  IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings);
3171  IMGUI_API void DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label);
3172  IMGUI_API void DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack);
3173  IMGUI_API void DebugNodeViewport(ImGuiViewportP* viewport);
3174  IMGUI_API void DebugRenderKeyboardPreview(ImDrawList* draw_list);
3175  IMGUI_API void DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb);
3176 
3177  // Obsolete functions
3178 #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
3179  inline void SetItemUsingMouseWheel() { SetItemKeyOwner(ImGuiKey_MouseWheelY); } // Changed in 1.89
3180  inline bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0) { return TreeNodeUpdateNextOpen(id, flags); } // Renamed in 1.89
3181 
3182  // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets that used FocusableItemRegister():
3183  // (Old) IMGUI_VERSION_NUM < 18209: using 'ItemAdd(....)' and 'bool tab_focused = FocusableItemRegister(...)'
3184  // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_Focused) != 0'
3185  // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_FocusedTabbing) != 0 || g.NavActivateInputId == id' (WIP)
3186  // Widget code are simplified as there's no need to call FocusableItemUnregister() while managing the transition from regular widget to TempInputText()
3187  inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) { IM_ASSERT(0); IM_UNUSED(window); IM_UNUSED(id); return false; } // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd()
3188  inline void FocusableItemUnregister(ImGuiWindow* window) { IM_ASSERT(0); IM_UNUSED(window); } // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem
3189 #endif
3190 #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
3191  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!
3192 #endif
3193 
3194 } // namespace ImGui
3195 
3196 
3197 //-----------------------------------------------------------------------------
3198 // [SECTION] ImFontAtlas internal API
3199 //-----------------------------------------------------------------------------
3200 
3201 // This structure is likely to evolve as we add support for incremental atlas updates
3203 {
3204  bool (*FontBuilder_Build)(ImFontAtlas* atlas);
3205 };
3206 
3207 // Helper for font builder
3208 #ifdef IMGUI_ENABLE_STB_TRUETYPE
3209 IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype();
3210 #endif
3211 IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas);
3212 IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent);
3213 IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque);
3214 IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas);
3215 IMGUI_API void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value);
3216 IMGUI_API void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value);
3217 IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
3218 IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
3219 
3220 //-----------------------------------------------------------------------------
3221 // [SECTION] Test Engine specific hooks (imgui_test_engine)
3222 //-----------------------------------------------------------------------------
3223 
3224 #ifdef IMGUI_ENABLE_TEST_ENGINE
3225 extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id);
3226 extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags);
3227 extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...);
3228 extern const char* ImGuiTestEngine_FindItemDebugLabel(ImGuiContext* ctx, ImGuiID id);
3229 
3230 #define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _BB, _ID) // Register item bounding box
3231 #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)
3232 #define IMGUI_TEST_ENGINE_LOG(_FMT,...) if (g.TestEngineHookItems) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log
3233 #else
3234 #define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) ((void)0)
3235 #define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) ((void)g)
3236 #endif
3237 
3238 //-----------------------------------------------------------------------------
3239 
3240 #if defined(__clang__)
3241 #pragma clang diagnostic pop
3242 #elif defined(__GNUC__)
3243 #pragma GCC diagnostic pop
3244 #endif
3245 
3246 #ifdef _MSC_VER
3247 #pragma warning (pop)
3248 #endif
3249 
3250 #endif // #ifndef IMGUI_DISABLE
Definition: imgui_internal.h:574
Definition: imgui_internal.h:589
Definition: imgui_internal.h:692
Definition: imgui.h:2394
Definition: imgui_internal.h:778
Definition: imgui.h:2627
Definition: imgui_internal.h:755
Definition: imgui.h:2444
Definition: imgui.h:2499
Definition: imgui.h:2743
Definition: imgui_internal.h:3203
Definition: imgui.h:2649
Definition: imgui.h:2678
Definition: imgui.h:2846
Definition: imgui_internal.h:987
Definition: imgui_internal.h:1004
Definition: imgui_internal.h:1717
Definition: imgui_internal.h:1732
Definition: imgui_internal.h:970
Definition: imgui_internal.h:964
Definition: imgui_internal.h:1017
Definition: imgui.h:1897
Definition: imgui_internal.h:1269
Definition: imgui_internal.h:1267
Definition: imgui_internal.h:1266
Definition: imgui_internal.h:1264
Definition: imgui_internal.h:1265
Definition: imgui_internal.h:1268
Definition: imgui_internal.h:1272
Definition: imgui_internal.h:1052
Definition: imgui.h:1889
Definition: imgui_internal.h:1322
Definition: imgui_internal.h:1297
Definition: imgui_internal.h:1310
Definition: imgui_internal.h:1159
Definition: imgui_internal.h:1397
Definition: imgui_internal.h:1384
Definition: imgui.h:2294
Definition: imgui_internal.h:1640
Definition: imgui_internal.h:1033
Definition: imgui_internal.h:1665
Definition: imgui_internal.h:1470
Definition: imgui_internal.h:1146
Definition: imgui_internal.h:1117
Definition: imgui_internal.h:1510
Definition: imgui_internal.h:1520
Definition: imgui.h:2110
Definition: imgui.h:2940
Definition: imgui_internal.h:1089
Definition: imgui_internal.h:1203
Definition: imgui_internal.h:1608
Definition: imgui_internal.h:1196
Definition: imgui_internal.h:1686
Definition: imgui_internal.h:1171
Definition: imgui_internal.h:1698
Definition: imgui.h:2231
Definition: imgui_internal.h:994
Definition: imgui.h:1832
Definition: imgui_internal.h:2395
Definition: imgui_internal.h:2376
Definition: imgui_internal.h:2513
Definition: imgui_internal.h:2667
Definition: imgui.h:2132
Definition: imgui_internal.h:2454
Definition: imgui_internal.h:2520
Definition: imgui_internal.h:2691
Definition: imgui.h:2146
Definition: imgui_internal.h:2646
Definition: imgui_internal.h:2530
Definition: imgui.h:2204
Definition: imgui_internal.h:712
Definition: imgui_internal.h:1563
Definition: imgui.h:2917
Definition: imgui_internal.h:1596
Definition: imgui_internal.h:1189
Definition: imgui_internal.h:2188
Definition: imgui_internal.h:2236
Definition: imgui_internal.h:655
Definition: imgui_internal.h:517
Definition: imgui_internal.h:632
Definition: imgui_internal.h:602
Definition: imgui_internal.h:499
Definition: imgui.h:254
Definition: imgui_internal.h:507
Definition: imgui.h:267