duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

imgui_internal.h (271363B)


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