Merge branch 'master' into docking
# Conflicts:
# backends/imgui_impl_opengl3.cpp
# imgui.cpp
# imgui_internal.h
diff --git a/backends/imgui_impl_opengl3.cpp b/backends/imgui_impl_opengl3.cpp
index f93cda1..8be196d 100644
--- a/backends/imgui_impl_opengl3.cpp
+++ b/backends/imgui_impl_opengl3.cpp
@@ -24,7 +24,8 @@
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2023-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
-// 2023-11-08: OpenGL: Update GL3W based imgui_impl_opengl3_loader.h to load "libGL.so" instead of "libGL.so.1", accomodating for NetBSD systems having only "libGL.so.3" available. (#6983)
+// 2024-01-09: OpenGL: Update GL3W based imgui_impl_opengl3_loader.h to load "libGL.so" and variants, fixing regression on distros missing a symlink.
+// 2023-11-08: OpenGL: Update GL3W based imgui_impl_opengl3_loader.h to load "libGL.so" instead of "libGL.so.1", accommodating for NetBSD systems having only "libGL.so.3" available. (#6983)
// 2023-10-05: OpenGL: Rename symbols in our internal loader so that LTO compilation with another copy of gl3w is possible. (#6875, #6668, #4445)
// 2023-06-20: OpenGL: Fixed erroneous use glGetIntegerv(GL_CONTEXT_PROFILE_MASK) on contexts lower than 3.2. (#6539, #6333)
// 2023-05-09: OpenGL: Support for glBindSampler() backup/restore on ES3. (#6375)
diff --git a/backends/imgui_impl_opengl3_loader.h b/backends/imgui_impl_opengl3_loader.h
index 15ba44f..85c58c4 100644
--- a/backends/imgui_impl_opengl3_loader.h
+++ b/backends/imgui_impl_opengl3_loader.h
@@ -669,6 +669,10 @@
// While most systems use libGL.so.1, NetBSD seems to use that libGL.so.3. See https://github.com/ocornut/imgui/issues/6983
libgl = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL);
if (!libgl)
+ libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL);
+ if (!libgl)
+ libgl = dlopen("libGL.so.3", RTLD_LAZY | RTLD_LOCAL);
+ if (!libgl)
return GL3W_ERROR_LIBRARY_OPEN;
*(void **)(&glx_get_proc_address) = dlsym(libgl, "glXGetProcAddressARB");
return GL3W_OK;
diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt
index f9b48e1..07819b8 100644
--- a/docs/CHANGELOG.txt
+++ b/docs/CHANGELOG.txt
@@ -37,9 +37,11 @@
-----------------------------------------------------------------------
- VERSION 1.90.1 WIP (In Progress)
+ VERSION 1.90.1 (Released 2024-01-10)
-----------------------------------------------------------------------
+Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.90.1
+
Breaking changes:
- imgui_freetype: commented out ImGuiFreeType::BuildFontAtlas() obsoleted in 1.81.
@@ -52,39 +54,56 @@
Other changes:
-- Windows: BeginChild(): Fixed auto-resizing erroneously limiting size to host viewport
- minus padding. There are no limit to a child width/height. (#7063) [@Devyre]
-- Windows: BeginChild(): Resize borders rendered even when ImGuiWindowFlags_NoBackground
- is specified. (#1710, #7194)
-- Windows: Fixed some auto-resizing path using style.WindowMinSize.x (instead of x/y)
- for both axises since 1.90. (#7106) [@n0bodysec]
-- Scrolling: internal scrolling value is rounded instead of truncated, as a way to reduce
- speed asymetry when (incorrectly) attempting to scroll by non-integer amount. (#6677)
-- Nav, IO: SetNextFrameWantCaptureKeyboard(false) calls are not overrided back to true when
- navigation is enabled. SetNextFrameWantCaptureKeyboard() is always higher priority. (#6997)
-- Nav: Activation can also be performed with Keypad Enter. (#5606)
-- Drag and Drop: Fixed drop target highlight on items temporarily pushing a widened clip rect
- (namely Selectables and Treenodes using SpanAllColumn flag) so the highlight properly covers
- all columns. (#7049, #4281, #3272)
-- InputTextMultiline: Fixed Tab character input not repeating (1.89.4 regression).
-- InputTextMultiline: Tabbing through a multi-line text editor which allows Tab character inputs
- (using the ImGuiInputTextFlags_AllowTabInput flag) doesn't automatically activate it, in order
- to allow passing through multiple widgets easily. (#3092, #5759, #787)
-- DragScalarN, SliderScalarN, InputScalarN: Fixed incorrect pushes into ItemWidth
- stack when number of components is 1. [#7095] [@Nahor]
-- Drags, Sliders, Inputs: removed all attempts to filter non-numerical characters during text
- editing. Invalid inputs not applied to value, visibly reverted after validation. (#6810, #7096)
-- Drags, Sliders, Inputs: removal of filter means that "nan" and "inf" values may be input. (#7096)
-- DragScalarN, SliderScalarN, InputScalarN, PushMultiItemsWidths: improve multi-components
- width computation to better distribute the error. (#7120, #7121) [@Nahor]
-- ColorEdit: Layout tweaks for very small sizes. (#7120, #7121)
-- ColorPicker: Fixed saturation/value cursor radius not scaling properly.
-- Menus: Tweaked hover slack logic, adding a timer to avoid situations where a slow vertical
- movements toward another parent BeginMenu() can keep the wrong child menu open. (#6671, #6926)
+- Windows:
+ - BeginChild(): Fixed auto-resizing erroneously limiting size to host viewport
+ minus padding. There are no limit to a child width/height. (#7063) [@Devyre]
+ - BeginChild(): Resize borders rendered even when ImGuiWindowFlags_NoBackground
+ is specified. (#1710, #7194)
+ - Fixed some auto-resizing path using style.WindowMinSize.x (instead of x/y)
+ for both axises since 1.90. (#7106) [@n0bodysec]
+ - Scrolling: internal scrolling value is rounded instead of truncated, as a way to reduce
+ speed asymmetry when (incorrectly) attempting to scroll by non-integer amount. (#6677)
+- Navigation (Keyboard/gamepad):
+ - Nav, IO: SetNextFrameWantCaptureKeyboard(false) calls are not overridden back to true when
+ navigation is enabled. SetNextFrameWantCaptureKeyboard() is always higher priority. (#6997)
+ - Nav: Activation can also be performed with Keypad Enter. (#5606)
+- Drag and Drop:
+ - Fixed drop target highlight on items temporarily pushing a widened clip rect
+ (namely Selectables and Treenodes using SpanAllColumn flag) so the highlight properly covers
+ all columns. (#7049, #4281, #3272)
+- InputText:
+ - InputTextMultiline: Fixed Tab character input not repeating (1.89.4 regression).
+ - InputTextMultiline: Tabbing through a multi-line text editor which allows Tab character inputs
+ (using the ImGuiInputTextFlags_AllowTabInput flag) doesn't automatically activate it, in order
+ to allow passing through multiple widgets easily. (#3092, #5759, #787)
+- Drags, Sliders, Inputs:
+ - DragScalarN, SliderScalarN, InputScalarN: Fixed incorrect pushes into ItemWidth
+ stack when number of components is 1. [#7095] [@Nahor]
+ - Drags, Sliders, Inputs: removed all attempts to filter non-numerical characters during text
+ editing. Invalid inputs not applied to value, visibly reverted after validation. (#6810, #7096)
+ - Drags, Sliders, Inputs: removal of filter means that "nan" and "inf" values may be input. (#7096)
+ - DragScalarN, SliderScalarN, InputScalarN, PushMultiItemsWidths: improve multi-components
+ width computation to better distribute the error. (#7120, #7121) [@Nahor]
+- Menus:
+ - Tweaked hover slack logic, adding an extra timeout to avoid situations where a slow vertical
+ movements toward another parent BeginMenu() can keep the wrong child menu open. (#6671, #6926)
+- Color Editors:
+ - ColorEdit: Layout tweaks for very small sizes. (#7120, #7121)
+ - ColorPicker: Fixed saturation/value cursor radius not scaling properly.
+- Debug Tools:
+ - Added io.ConfigDebugIsDebuggerPresent option. When enabled, this adds buttons in various
+ locations of Metrics/Debugger to manually request a debugger break:
+ - Request a debug break in a Begin() call.
+ - Request a debug break in a ItemAdd() call via debug log and hovering 0xXXXXXX identifiers.
+ - Request a debug break in a BeginTable() call.
+ - Request a debug break in a SetShortcutRouting()/Shortcut() call. [Internal]
+ - Metrics: Reorganize Tools menu.
+ - Added DebugFlashStyleColor() to identify a style color. Added to Style Editor.
+ - Debug Log: Hide its own clipper log to reduce noise in the output. (#5855)
+ - Debug Log: Clicking any filter with SHIFT held enables it for 2 frames only,
+ making it easier when dealing with spammy logs. (#5855)
- Settings: Fixed an issue marking settings as dirty when merely clicking on a border or resize
grip without moving it.
-- Debug Tools: Added DebugFlashStyleColor() to identify a style color. Added to Style Editor.
-- Debug Tools: Debug Log: Hide its own clipper log to reduce noise in the output.
- Misc: Added IMGUI_USER_H_FILENAME to change the path included when using
IMGUI_INCLUDE_IMGUI_USER_H. (#7039) [@bryceberger]
- Misc: Rework debug display of texture id in Metrics window to avoid compile-error when
@@ -96,21 +115,26 @@
on a codebase where another copy of the library is used.
- Misc: During shutdown, check that io.BackendPlatformUserData and io.BackendRendererUserData are NULL
in order to catch cases where backend was not shut down. (#7175)
-- Misc: Reworked Issue Template to with a shinier and better form. (#5927) [@Panquesito7, @PathogenDavid, @ocornut]
-- Backends: GLFW, Emscripten: Added ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback() to
- register canvas selector and auto-resize GLFW window. (#6751) [@Traveller23, @ypujante]
-- Backends: GLFW: Fixed Windows specific hooks to use Unicode version of WndProc even when
- compiling in MBCS mode. (#7174) [@kimidaisuki22]
-- Backends: Vulkan: Fixed mismatching allocator passed to vkCreateCommandPool() vs
- vkDestroyCommandPool(). (#7075) [@FoonTheRaccoon]
-- Backends: Vulkan: Added MinAllocationSize field in ImGui_ImplVulkan_InitInfo to workaround zealous
- "best practice" validation layer. (#7189, #4238) [@philae-ael]
-- Backends: Vulkan: Stopped creating command pools with VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
- as we don't reset them.
-- Backends: WebGPU: Fixed wgpuRenderPassEncoderSetScissorRect() crash when rendering modal
- window's dimming layer, which has an unclipped value in ImDrawCmd::ClipRect. (#7191) [@aparis69]
-- Examples: GLFW+Emscripten: Fixed examples not consistently resizing according to host canvas.
- (#6751) [@Traveller23, @ypujante]
+- Misc: Reworked Issue Template to a shinier and better form. (#5927) [@Panquesito7, @PathogenDavid, @ocornut]
+- Backends:
+ - GLFW, Emscripten: Added ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback() to
+ register canvas selector and auto-resize GLFW window. (#6751) [@Traveller23, @ypujante]
+ - GLFW: Fixed Windows specific hooks to use Unicode version of WndProc even when
+ compiling in MBCS mode. (#7174) [@kimidaisuki22]
+ - OpenGL3: Update GL3W based imgui_impl_opengl3_loader.h to load libGL.so variants in
+ case of missing symlink. Fix 1.90 regression for some distros. (#6983)
+ - Vulkan: Fixed mismatching allocator passed to vkCreateCommandPool() vs
+ vkDestroyCommandPool(). (#7075) [@FoonTheRaccoon]
+ - Vulkan: Added MinAllocationSize field in ImGui_ImplVulkan_InitInfo to workaround zealous
+ "best practice" validation layer. (#7189, #4238) [@philae-ael]
+ - Vulkan: Stopped creating command pools with VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
+ as we don't reset them.
+ - WebGPU: Fixed wgpuRenderPassEncoderSetScissorRect() crash when rendering modal window's
+ dimming layer, which has an unclipped value in ImDrawCmd::ClipRect. (#7191) [@aparis69]
+- Examples:
+ - Examples: GLFW+Emscripten: Fixed examples not consistently resizing according to host canvas.
+ (#6751) [@Traveller23, @ypujante]
+ - Examples: SDL3: Minor fixes following recent SDL3 in-progress development.
Docking+Viewports Branch:
@@ -119,13 +143,15 @@
queued frames aren't synchronized with platform window resizes. (#7152, #7153) [@SuperWangKai]
- Backends: OSX: Fixed monitor and window position by correctly transforming Y origin on multi-viewports
multi-monitor setups. (#7028, #7101, #6009, #6432) [@dmirty-kuzmenko, @734vin]
-- Backends: OSX: Fixed IME position in multi-monitor multi-viewports setups. (#7028) [@734vin]
+- Backends: OSX: Fixed IME position in multi-monitor multi-viewports setups. (#7028) [@734vin]
-----------------------------------------------------------------------
VERSION 1.90.0 (Released 2023-11-15)
-----------------------------------------------------------------------
+Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.90
+
Breaking changes:
- BeginChild(): Upgraded 'bool border = false' parameter to 'ImGuiChildFlags flags = 0'.
diff --git a/imgui.cpp b/imgui.cpp
index 0edf67a..f4a1d85 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -1,4 +1,4 @@
-// dear imgui, v1.90.1 WIP
+// dear imgui, v1.90.1
// (main code and documentation)
// Help:
@@ -4983,11 +4983,15 @@
UpdateDebugToolStackQueries();
UpdateDebugToolFlashStyleColor();
if (g.DebugLocateFrames > 0 && --g.DebugLocateFrames == 0)
- g.DebugLocateId = 0;
- if (g.DebugLogClipperAutoDisableFrames > 0 && --g.DebugLogClipperAutoDisableFrames == 0)
{
- DebugLog("(Debug Log: Auto-disabled ImGuiDebugLogFlags_EventClipper after 2 frames)\n");
- g.DebugLogFlags &= ~ImGuiDebugLogFlags_EventClipper;
+ g.DebugLocateId = 0;
+ g.DebugBreakInLocateId = false;
+ }
+ if (g.DebugLogAutoDisableFrames > 0 && --g.DebugLogAutoDisableFrames == 0)
+ {
+ DebugLog("(Debug Log: Auto-disabled some ImGuiDebugLogFlags after 2 frames)\n");
+ g.DebugLogFlags &= ~g.DebugLogAutoDisableFlags;
+ g.DebugLogAutoDisableFlags = ImGuiDebugLogFlags_None;
}
// Create implicit/fallback window - which we will only render it if the user has added something to it.
@@ -6742,6 +6746,10 @@
if (window_just_created)
window = CreateNewWindow(name, flags);
+ // [DEBUG] Debug break requested by user
+ if (g.DebugBreakInWindow == window->ID)
+ IM_DEBUG_BREAK();
+
// Automatically disable manual moving/resizing when NoInputs is set
if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs)
flags |= ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize;
@@ -8751,7 +8759,7 @@
}
// ImGuiMod_Shortcut is translated to either Ctrl or Super.
-void ImGui::GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size)
+const char* ImGui::GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size)
{
ImGuiContext& g = *GImGui;
if (key_chord & ImGuiMod_Shortcut)
@@ -8762,6 +8770,7 @@
(key_chord & ImGuiMod_Alt) ? "Alt+" : "",
(key_chord & ImGuiMod_Super) ? (g.IO.ConfigMacOSXBehaviors ? "Cmd+" : "Super+") : "",
GetKeyName((ImGuiKey)(key_chord & ~ImGuiMod_Mask_)));
+ return out_buf;
}
// t0 = previous time (e.g.: g.Time - g.IO.DeltaTime)
@@ -8836,11 +8845,15 @@
rt->EntriesNext.push_back(*routing_entry); // Write alive ones into new buffer
// Apply routing to owner if there's no owner already (RoutingCurr == None at this point)
+ // This is the result of previous frame's SetShortcutRouting() call.
if (routing_entry->Mods == g.IO.KeyMods)
{
ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key);
if (owner_data->OwnerCurr == ImGuiKeyOwner_None)
+ {
owner_data->OwnerCurr = routing_entry->RoutingCurr;
+ //IMGUI_DEBUG_LOG("SetKeyOwner(%s, owner_id=0x%08X) via Routing\n", GetKeyName(key), routing_entry->RoutingCurr);
+ }
}
}
@@ -8962,9 +8975,14 @@
else
IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiInputFlags_RouteMask_)); // Check that only 1 routing flag is used
+ // [DEBUG] Debug break requested by user
+ if (g.DebugBreakInShortcutRouting == key_chord)
+ IM_DEBUG_BREAK();
+
if (flags & ImGuiInputFlags_RouteUnlessBgFocused)
if (g.NavWindow == NULL)
return false;
+ // Note how ImGuiInputFlags_RouteAlways won't set routing and thus won't set owner. May want to rework this?
if (flags & ImGuiInputFlags_RouteAlways)
return true;
@@ -9876,10 +9894,11 @@
// - SetKeyOwner(..., Any or None, Lock) : set lock
void ImGui::SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags)
{
+ ImGuiContext& g = *GImGui;
IM_ASSERT(IsNamedKeyOrModKey(key) && (owner_id != ImGuiKeyOwner_Any || (flags & (ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease)))); // Can only use _Any with _LockXXX flags (to eat a key away without an ID to retrieve it)
IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetKeyOwner) == 0); // Passing flags not supported by this function!
+ //IMGUI_DEBUG_LOG("SetKeyOwner(%s, owner_id=0x%08X, flags=%08X)\n", GetKeyName(key), owner_id, flags);
- ImGuiContext& g = *GImGui;
ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key);
owner_data->OwnerCurr = owner_data->OwnerNext = owner_id;
@@ -9948,6 +9967,9 @@
bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags)
{
+ //ImGuiContext& g = *GImGui;
+ //IMGUI_DEBUG_LOG("Shortcut(%s, owner_id=0x%08X, flags=%X)\n", GetKeyChordName(key_chord, g.TempBuffer.Data, g.TempBuffer.Size), owner_id, flags);
+
// When using (owner_id == 0/Any): SetShortcutRouting() will use CurrentFocusScopeId and filter with this, so IsKeyPressed() is fine with he 0/Any.
if ((flags & ImGuiInputFlags_RouteMask_) == 0)
flags |= ImGuiInputFlags_RouteFocused;
@@ -13037,6 +13059,7 @@
}
// Start CTRL+Tab or Square+L/R window selection
+ // (g.ConfigNavWindowingKeyNext/g.ConfigNavWindowingKeyPrev defaults are ImGuiMod_Ctrl|ImGuiKey_Tab and ImGuiMod_Ctrl|ImGuiMod_Shift|ImGuiKey_Tab)
const ImGuiID owner_id = ImHashStr("###NavUpdateWindowing");
const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0;
const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0;
@@ -19432,14 +19455,15 @@
// Draw an arbitrary US keyboard layout to visualize translated keys
void ImGui::DebugRenderKeyboardPreview(ImDrawList* draw_list)
{
- const ImVec2 key_size = ImVec2(35.0f, 35.0f);
- const float key_rounding = 3.0f;
- const ImVec2 key_face_size = ImVec2(25.0f, 25.0f);
- const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f);
- const float key_face_rounding = 2.0f;
- const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f);
+ const float scale = ImGui::GetFontSize() / 13.0f;
+ const ImVec2 key_size = ImVec2(35.0f, 35.0f) * scale;
+ const float key_rounding = 3.0f * scale;
+ const ImVec2 key_face_size = ImVec2(25.0f, 25.0f) * scale;
+ const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f) * scale;
+ const float key_face_rounding = 2.0f * scale;
+ const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f) * scale;
const ImVec2 key_step = ImVec2(key_size.x - 1.0f, key_size.y - 1.0f);
- const float key_row_offset = 9.0f;
+ const float key_row_offset = 9.0f * scale;
ImVec2 board_min = GetCursorScreenPos();
ImVec2 board_max = ImVec2(board_min.x + 3 * key_step.x + 2 * key_row_offset + 10.0f, board_min.y + 3 * key_step.y + 10.0f);
@@ -19593,6 +19617,9 @@
return;
}
+ // [DEBUG] Clear debug breaks hooks after exactly one cycle.
+ DebugBreakClearData();
+
// Basic info
Text("Dear ImGui %s", GetVersion());
Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
@@ -19652,24 +19679,16 @@
// Tools
if (TreeNode("Tools"))
{
- bool show_encoding_viewer = TreeNode("UTF-8 Encoding viewer");
- SameLine();
- MetricsHelpMarker("You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct.");
- if (show_encoding_viewer)
- {
- static char buf[100] = "";
- SetNextItemWidth(-FLT_MIN);
- InputText("##Text", buf, IM_ARRAYSIZE(buf));
- if (buf[0] != 0)
- DebugTextEncoding(buf);
- TreePop();
- }
-
+ // Debug Break features
// The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted.
- if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive)
- DebugStartItemPicker();
+ SeparatorTextEx(0, "Debug breaks", NULL, CalcTextSize("(?)").x + g.Style.SeparatorTextPadding.x);
SameLine();
MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash.");
+ if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive)
+ DebugStartItemPicker();
+ Checkbox("Show \"Debug Break\" buttons in other sections", &g.IO.ConfigDebugIsDebuggerPresent);
+
+ SeparatorText("Visualize");
Checkbox("Show Debug Log", &cfg->ShowDebugLog);
SameLine();
@@ -19742,10 +19761,24 @@
}
Checkbox("Show groups rectangles", &g.DebugShowGroupRects); // Storing in context as this is used by group code and prefers to be in hot-data
+ SeparatorText("Validate");
+
Checkbox("Debug Begin/BeginChild return value", &io.ConfigDebugBeginReturnValueLoop);
SameLine();
MetricsHelpMarker("Some calls to Begin()/BeginChild() will return false.\n\nWill cycle through window depths then repeat. Windows should be flickering while running.");
+ Checkbox("UTF-8 Encoding viewer", &cfg->ShowTextEncodingViewer);
+ SameLine();
+ MetricsHelpMarker("You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct.");
+ if (cfg->ShowTextEncodingViewer)
+ {
+ static char buf[64] = "";
+ SetNextItemWidth(-FLT_MIN);
+ InputText("##DebugTextEncodingBuf", buf, IM_ARRAYSIZE(buf));
+ if (buf[0] != 0)
+ DebugTextEncoding(buf);
+ }
+
TreePop();
}
@@ -20054,7 +20087,7 @@
Text("KEY OWNERS");
{
Indent();
- if (BeginChild("##owners", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 6), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY, ImGuiWindowFlags_NoSavedSettings))
+ if (BeginChild("##owners", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 8), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY, ImGuiWindowFlags_NoSavedSettings))
for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1))
{
ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key);
@@ -20068,9 +20101,11 @@
Unindent();
}
Text("SHORTCUT ROUTING");
+ SameLine();
+ MetricsHelpMarker("Declared shortcut routes automatically set key owner when mods matches.");
{
Indent();
- if (BeginChild("##routes", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 6), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY, ImGuiWindowFlags_NoSavedSettings))
+ if (BeginChild("##routes", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 8), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY, ImGuiWindowFlags_NoSavedSettings))
for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1))
{
ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable;
@@ -20078,9 +20113,15 @@
{
char key_chord_name[64];
ImGuiKeyRoutingData* routing_data = &rt->Entries[idx];
- GetKeyChordName(key | routing_data->Mods, key_chord_name, IM_ARRAYSIZE(key_chord_name));
- Text("%s: 0x%08X", key_chord_name, routing_data->RoutingCurr);
+ ImGuiKeyChord key_chord = key | routing_data->Mods;
+ Text("%s: 0x%08X", GetKeyChordName(key_chord, key_chord_name, IM_ARRAYSIZE(key_chord_name)), routing_data->RoutingCurr);
DebugLocateItemOnHover(routing_data->RoutingCurr);
+ if (g.IO.ConfigDebugIsDebuggerPresent)
+ {
+ SameLine();
+ if (DebugBreakButton("**DebugBreak**", "in SetShortcutRouting() for this KeyChord"))
+ g.DebugBreakInShortcutRouting = key_chord;
+ }
idx = routing_data->NextEntryIndex;
}
}
@@ -20207,6 +20248,64 @@
End();
}
+void ImGui::DebugBreakClearData()
+{
+ // Those fields are scattered in their respective subsystem to stay in hot-data locations
+ ImGuiContext& g = *GImGui;
+ g.DebugBreakInWindow = 0;
+ g.DebugBreakInTable = 0;
+ g.DebugBreakInShortcutRouting = ImGuiKey_None;
+}
+
+void ImGui::DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location)
+{
+ if (!BeginItemTooltip())
+ return;
+ Text("To call IM_DEBUG_BREAK() %s:", description_of_location);
+ Separator();
+ TextUnformatted(keyboard_only ? "- Press 'Pause/Break' on keyboard." : "- Press 'Pause/Break' on keyboard.\n- or Click (may alter focus/active id).\n- or navigate using keyboard and press space.");
+ Separator();
+ TextUnformatted("Choose one way that doesn't interfere with what you are trying to debug!\nYou need a debugger attached or this will crash!");
+ EndTooltip();
+}
+
+// Special button that doesn't take focus, doesn't take input owner, and can be activated without a click etc.
+// In order to reduce interferences with the contents we are trying to debug into.
+bool ImGui::DebugBreakButton(const char* label, const char* description_of_location)
+{
+ ImGuiWindow* window = GetCurrentWindow();
+ if (window->SkipItems)
+ return false;
+
+ ImGuiContext& g = *GImGui;
+ const ImGuiID id = window->GetID(label);
+ const ImVec2 label_size = CalcTextSize(label, NULL, true);
+ ImVec2 pos = window->DC.CursorPos + ImVec2(0.0f, window->DC.CurrLineTextBaseOffset);
+ ImVec2 size = ImVec2(label_size.x + g.Style.FramePadding.x * 2.0f, label_size.y);
+
+ const ImRect bb(pos, pos + size);
+ ItemSize(size, 0.0f);
+ if (!ItemAdd(bb, id))
+ return false;
+
+ // WE DO NOT USE ButtonEx() or ButtonBehavior() in order to reduce our side-effects.
+ bool hovered = ItemHoverable(bb, id, g.CurrentItemFlags);
+ bool pressed = hovered && (IsKeyChordPressed(g.DebugBreakKeyChord) || IsMouseClicked(0) || g.NavActivateId == id);
+ DebugBreakButtonTooltip(false, description_of_location);
+
+ ImVec4 col4f = GetStyleColorVec4(hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
+ ImVec4 hsv;
+ ColorConvertRGBtoHSV(col4f.x, col4f.y, col4f.z, hsv.x, hsv.y, hsv.z);
+ ColorConvertHSVtoRGB(hsv.x + 0.20f, hsv.y, hsv.z, col4f.x, col4f.y, col4f.z);
+
+ RenderNavHighlight(bb, id);
+ RenderFrame(bb.Min, bb.Max, GetColorU32(col4f), true, g.Style.FrameRounding);
+ RenderTextClipped(bb.Min, bb.Max, label, NULL, &label_size, g.Style.ButtonTextAlign, &bb);
+
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags);
+ return pressed;
+}
+
// [DEBUG] Display contents of Columns
void ImGui::DebugNodeColumns(ImGuiOldColumns* columns)
{
@@ -20644,6 +20743,9 @@
if (window->MemoryCompacted)
TextDisabled("Note: some memory buffers have been compacted/freed.");
+ if (g.IO.ConfigDebugIsDebuggerPresent && DebugBreakButton("**DebugBreak**", "in Begin()"))
+ g.DebugBreakInWindow = window->ID;
+
ImGuiWindowFlags flags = window->Flags;
DebugNodeDrawList(window, window->Viewport, window->DrawList, "DrawList");
BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), ContentSize (%.1f,%.1f) Ideal (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->ContentSize.x, window->ContentSize.y, window->ContentSizeIdeal.x, window->ContentSizeIdeal.y);
@@ -20757,6 +20859,29 @@
#endif
}
+// FIXME-LAYOUT: To be done automatically via layout mode once we rework ItemSize/ItemAdd into ItemLayout.
+static void SameLineOrWrap(const ImVec2& size)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ ImVec2 pos(window->DC.CursorPosPrevLine.x + g.Style.ItemSpacing.x, window->DC.CursorPosPrevLine.y);
+ if (window->ClipRect.Contains(ImRect(pos, pos + size)))
+ ImGui::SameLine();
+}
+
+static void ShowDebugLogFlag(const char* name, ImGuiDebugLogFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImVec2 size(ImGui::GetFrameHeight() + g.Style.ItemInnerSpacing.x + ImGui::CalcTextSize(name).x, ImGui::GetFrameHeight());
+ SameLineOrWrap(size); // FIXME-LAYOUT: To be done automatically once we rework ItemSize/ItemAdd into ItemLayout.
+ if (ImGui::CheckboxFlags(name, &g.DebugLogFlags, flags) && g.IO.KeyShift && (g.DebugLogFlags & flags) != 0)
+ {
+ g.DebugLogAutoDisableFrames = 2;
+ g.DebugLogAutoDisableFlags |= flags;
+ }
+ ImGui::SetItemTooltip("Hold SHIFT when clicking to enable for 2 frames only (useful for spammy log entries)");
+}
+
void ImGui::ShowDebugLogWindow(bool* p_open)
{
ImGuiContext& g = *GImGui;
@@ -20769,15 +20894,15 @@
}
CheckboxFlags("All", &g.DebugLogFlags, ImGuiDebugLogFlags_EventMask_);
- SameLine(); CheckboxFlags("ActiveId", &g.DebugLogFlags, ImGuiDebugLogFlags_EventActiveId);
- SameLine(); CheckboxFlags("Focus", &g.DebugLogFlags, ImGuiDebugLogFlags_EventFocus);
- SameLine(); CheckboxFlags("Popup", &g.DebugLogFlags, ImGuiDebugLogFlags_EventPopup);
- SameLine(); CheckboxFlags("Nav", &g.DebugLogFlags, ImGuiDebugLogFlags_EventNav);
- SameLine(); if (CheckboxFlags("Clipper", &g.DebugLogFlags, ImGuiDebugLogFlags_EventClipper)) { g.DebugLogClipperAutoDisableFrames = 2; } if (IsItemHovered()) SetTooltip("Clipper log auto-disabled after 2 frames");
- //SameLine(); CheckboxFlags("Selection", &g.DebugLogFlags, ImGuiDebugLogFlags_EventSelection);
- SameLine(); CheckboxFlags("IO", &g.DebugLogFlags, ImGuiDebugLogFlags_EventIO);
- SameLine(); CheckboxFlags("Docking", &g.DebugLogFlags, ImGuiDebugLogFlags_EventDocking);
- SameLine(); CheckboxFlags("Viewport", &g.DebugLogFlags, ImGuiDebugLogFlags_EventViewport);
+ ShowDebugLogFlag("ActiveId", ImGuiDebugLogFlags_EventActiveId);
+ ShowDebugLogFlag("Clipper", ImGuiDebugLogFlags_EventClipper);
+ ShowDebugLogFlag("Focus", ImGuiDebugLogFlags_EventFocus);
+ ShowDebugLogFlag("IO", ImGuiDebugLogFlags_EventIO);
+ ShowDebugLogFlag("Nav", ImGuiDebugLogFlags_EventNav);
+ ShowDebugLogFlag("Popup", ImGuiDebugLogFlags_EventPopup);
+ //ShowDebugLogFlag("Selection", ImGuiDebugLogFlags_EventSelection);
+ ShowDebugLogFlag("Docking", ImGuiDebugLogFlags_EventDocking);
+ ShowDebugLogFlag("Viewport", ImGuiDebugLogFlags_EventViewport);
if (SmallButton("Clear"))
{
@@ -20866,6 +20991,7 @@
ImGuiContext& g = *GImGui;
g.DebugLocateId = target_id;
g.DebugLocateFrames = 2;
+ g.DebugBreakInLocateId = false;
}
void ImGui::DebugLocateItemOnHover(ImGuiID target_id)
@@ -20875,11 +21001,24 @@
ImGuiContext& g = *GImGui;
DebugLocateItem(target_id);
GetForegroundDrawList(g.CurrentWindow)->AddRect(g.LastItemData.Rect.Min - ImVec2(3.0f, 3.0f), g.LastItemData.Rect.Max + ImVec2(3.0f, 3.0f), DEBUG_LOCATE_ITEM_COLOR);
+
+ // Can't easily use a context menu here because it will mess with focus, active id etc.
+ if (g.IO.ConfigDebugIsDebuggerPresent && g.MouseStationaryTimer > 1.0f)
+ {
+ DebugBreakButtonTooltip(false, "in ItemAdd()");
+ if (IsKeyChordPressed(g.DebugBreakKeyChord))
+ g.DebugBreakInLocateId = true;
+ }
}
void ImGui::DebugLocateItemResolveWithLastItem()
{
ImGuiContext& g = *GImGui;
+
+ // [DEBUG] Debug break requested by user
+ if (g.DebugBreakInLocateId)
+ IM_DEBUG_BREAK();
+
ImGuiLastItemData item_data = g.LastItemData;
g.DebugLocateId = 0;
ImDrawList* draw_list = GetForegroundDrawList(g.CurrentWindow);
diff --git a/imgui.h b/imgui.h
index 96fa523..95487dc 100644
--- a/imgui.h
+++ b/imgui.h
@@ -1,4 +1,4 @@
-// dear imgui, v1.90.1 WIP
+// dear imgui, v1.90.1
// (headers)
// Help:
@@ -23,8 +23,8 @@
// Library Version
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
-#define IMGUI_VERSION "1.90.1 WIP"
-#define IMGUI_VERSION_NUM 19003
+#define IMGUI_VERSION "1.90.1"
+#define IMGUI_VERSION_NUM 19010
#define IMGUI_HAS_TABLE
#define IMGUI_HAS_VIEWPORT // Viewport WIP branch
#define IMGUI_HAS_DOCK // Docking WIP branch
@@ -262,6 +262,7 @@
// ImVec2: 2D vector used to store positions, sizes etc. [Compile-time configurable type]
// This is a frequently used type in the API. Consider using IM_VEC2_CLASS_EXTRA to create implicit cast from/to our preferred type.
+// Add '#define IMGUI_DEFINE_MATH_OPERATORS' in your imconfig.h file to benefit from courtesy maths operators for those types.
IM_MSVC_RUNTIME_CHECKS_OFF
struct ImVec2
{
@@ -2183,16 +2184,22 @@
// Debug options
//------------------------------------------------------------------
+ // Option to enable various debug tools showing buttons that will call the IM_DEBUG_BREAK() macro.
+ // - The Item Picker tool will be available regardless of this being enabled, in order to maximize its discoverability.
+ // - Requires a debugger being attached, otherwise IM_DEBUG_BREAK() options will appear to crash your application.
+ // e.g. io.ConfigDebugIsDebuggerPresent = ::IsDebuggerPresent() on Win32, or refer to ImOsIsDebuggerPresent() imgui_test_engine/imgui_te_utils.cpp for a Unix compatible version).
+ bool ConfigDebugIsDebuggerPresent; // = false // Enable various tools calling IM_DEBUG_BREAK().
+
// Tools to test correct Begin/End and BeginChild/EndChild behaviors.
- // Presently Begin()/End() and BeginChild()/EndChild() needs to ALWAYS be called in tandem, regardless of return value of BeginXXX()
- // This is inconsistent with other BeginXXX functions and create confusion for many users.
- // We expect to update the API eventually. In the meanwhile we provide tools to facilitate checking user-code behavior.
+ // - Presently Begin()/End() and BeginChild()/EndChild() needs to ALWAYS be called in tandem, regardless of return value of BeginXXX()
+ // - This is inconsistent with other BeginXXX functions and create confusion for many users.
+ // - We expect to update the API eventually. In the meanwhile we provide tools to facilitate checking user-code behavior.
bool ConfigDebugBeginReturnValueOnce;// = false // First-time calls to Begin()/BeginChild() will return false. NEEDS TO BE SET AT APPLICATION BOOT TIME if you don't want to miss windows.
bool ConfigDebugBeginReturnValueLoop;// = false // Some calls to Begin()/BeginChild() will return false. Will cycle through window depths then repeat. Suggested use: add "io.ConfigDebugBeginReturnValue = io.KeyShift" in your main loop then occasionally press SHIFT. Windows should be flickering while running.
- // Option to deactivate io.AddFocusEvent(false) handling. May facilitate interactions with a debugger when focus loss leads to clearing inputs data.
- // Backends may have other side-effects on focus loss, so this will reduce side-effects but not necessary remove all of them.
- // Consider using e.g. Win32's IsDebuggerPresent() as an additional filter (or see ImOsIsDebuggerPresent() in imgui_test_engine/imgui_te_utils.cpp for a Unix compatible version).
+ // Option to deactivate io.AddFocusEvent(false) handling.
+ // - May facilitate interactions with a debugger when focus loss leads to clearing inputs data.
+ // - Backends may have other side-effects on focus loss, so this will reduce side-effects but not necessary remove all of them.
bool ConfigDebugIgnoreFocusLoss; // = false // Ignore io.AddFocusEvent(false), consequently not calling io.ClearInputKeys() in input processing.
// Option to audit .ini data
diff --git a/imgui_demo.cpp b/imgui_demo.cpp
index 1c5e8d8..f0f6780 100644
--- a/imgui_demo.cpp
+++ b/imgui_demo.cpp
@@ -1,4 +1,4 @@
-// dear imgui, v1.90.1 WIP
+// dear imgui, v1.90.1
// (demo code)
// Help:
@@ -532,10 +532,12 @@
ImGui::Text("Also see Style->Rendering for rendering options.");
ImGui::SeparatorText("Debug");
+ ImGui::Checkbox("io.ConfigDebugIsDebuggerPresent", &io.ConfigDebugIsDebuggerPresent);
+ ImGui::SameLine(); HelpMarker("Enable various tools calling IM_DEBUG_BREAK().\n\nRequires a debugger being attached, otherwise IM_DEBUG_BREAK() options will appear to crash your application.");
ImGui::BeginDisabled();
ImGui::Checkbox("io.ConfigDebugBeginReturnValueOnce", &io.ConfigDebugBeginReturnValueOnce); // .
ImGui::EndDisabled();
- ImGui::SameLine(); HelpMarker("First calls to Begin()/BeginChild() will return false.\n\nTHIS OPTION IS DISABLED because it needs to be set at application boot-time to make sense. Showing the disabled option is a way to make this feature easier to discover");
+ ImGui::SameLine(); HelpMarker("First calls to Begin()/BeginChild() will return false.\n\nTHIS OPTION IS DISABLED because it needs to be set at application boot-time to make sense. Showing the disabled option is a way to make this feature easier to discover.");
ImGui::Checkbox("io.ConfigDebugBeginReturnValueLoop", &io.ConfigDebugBeginReturnValueLoop);
ImGui::SameLine(); HelpMarker("Some calls to Begin()/BeginChild() will return false.\n\nWill cycle through window depths then repeat. Windows should be flickering while running.");
ImGui::Checkbox("io.ConfigDebugIgnoreFocusLoss", &io.ConfigDebugIgnoreFocusLoss);
@@ -6783,10 +6785,12 @@
if (!filter.PassFilter(name))
continue;
ImGui::PushID(i);
+#ifndef IMGUI_DISABLE_DEBUG_TOOLS
if (ImGui::Button("?"))
ImGui::DebugFlashStyleColor((ImGuiCol)i);
ImGui::SetItemTooltip("Flash given color to identify places where it is used.");
ImGui::SameLine();
+#endif
ImGui::ColorEdit4("##color", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags);
if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0)
{
diff --git a/imgui_draw.cpp b/imgui_draw.cpp
index 1934720..d7992e2 100644
--- a/imgui_draw.cpp
+++ b/imgui_draw.cpp
@@ -1,4 +1,4 @@
-// dear imgui, v1.90.1 WIP
+// dear imgui, v1.90.1
// (drawing and font code)
/*
diff --git a/imgui_internal.h b/imgui_internal.h
index 2fecdaa..99a09f9 100644
--- a/imgui_internal.h
+++ b/imgui_internal.h
@@ -1,4 +1,4 @@
-// dear imgui, v1.90.1 WIP
+// dear imgui, v1.90.1
// (internal structures/api)
// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
@@ -235,15 +235,15 @@
#else
#define IMGUI_DEBUG_LOG(...) ((void)0)
#endif
-#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_DOCKING(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventDocking) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
-#define IMGUI_DEBUG_LOG_VIEWPORT(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventViewport) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_DOCKING(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventDocking) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
+#define IMGUI_DEBUG_LOG_VIEWPORT(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventViewport) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
// Static Asserts
#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "")
@@ -1963,19 +1963,20 @@
enum ImGuiDebugLogFlags_
{
// Event types
- ImGuiDebugLogFlags_None = 0,
- ImGuiDebugLogFlags_EventActiveId = 1 << 0,
- ImGuiDebugLogFlags_EventFocus = 1 << 1,
- ImGuiDebugLogFlags_EventPopup = 1 << 2,
- ImGuiDebugLogFlags_EventNav = 1 << 3,
- ImGuiDebugLogFlags_EventClipper = 1 << 4,
- ImGuiDebugLogFlags_EventSelection = 1 << 5,
- ImGuiDebugLogFlags_EventIO = 1 << 6,
- ImGuiDebugLogFlags_EventDocking = 1 << 7,
- ImGuiDebugLogFlags_EventViewport = 1 << 8,
- ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventDocking | ImGuiDebugLogFlags_EventViewport,
- ImGuiDebugLogFlags_OutputToTTY = 1 << 10, // Also send output to TTY
- ImGuiDebugLogFlags_OutputToTestEngine = 1 << 11,// Also send output to Test Engine
+ ImGuiDebugLogFlags_None = 0,
+ ImGuiDebugLogFlags_EventActiveId = 1 << 0,
+ ImGuiDebugLogFlags_EventFocus = 1 << 1,
+ ImGuiDebugLogFlags_EventPopup = 1 << 2,
+ ImGuiDebugLogFlags_EventNav = 1 << 3,
+ ImGuiDebugLogFlags_EventClipper = 1 << 4,
+ ImGuiDebugLogFlags_EventSelection = 1 << 5,
+ ImGuiDebugLogFlags_EventIO = 1 << 6,
+ ImGuiDebugLogFlags_EventDocking = 1 << 7,
+ ImGuiDebugLogFlags_EventViewport = 1 << 8,
+
+ ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventDocking | ImGuiDebugLogFlags_EventViewport,
+ ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY
+ ImGuiDebugLogFlags_OutputToTestEngine = 1 << 21, // Also send output to Test Engine
};
struct ImGuiDebugAllocEntry
@@ -2004,6 +2005,7 @@
bool ShowTablesRects = false;
bool ShowDrawCmdMesh = true;
bool ShowDrawCmdBoundingBoxes = true;
+ bool ShowTextEncodingViewer = false;
bool ShowAtlasTintedWithTextColor = false;
bool ShowDockingNodes = false;
int ShowWindowsRectsType = -1;
@@ -2095,6 +2097,7 @@
ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow*
int WindowsActiveCount; // Number of unique windows submitted by frame
ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING)
+ ImGuiID DebugBreakInWindow; // Set to break in Begin() call.
ImGuiWindow* CurrentWindow; // Window being drawn into
ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs.
ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set.
@@ -2146,6 +2149,7 @@
ImGuiKeyRoutingTable KeysRoutingTable;
ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it)
bool ActiveIdUsingAllKeyboardKeys; // Active widget will want to read all keyboard keys inputs. (FIXME: This is a shortcut for not taking ownership of 100+ keys but perhaps best to not have the inconsistency)
+ ImGuiKeyChord DebugBreakInShortcutRouting; // Set to break in SetShortcutRouting()/Shortcut() calls.
#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO
ImU32 ActiveIdUsingNavInputMask; // If you used this. Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes 'SetKeyOwner(ImGuiKey_Escape, g.ActiveId) and/or SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId);'
#endif
@@ -2271,6 +2275,7 @@
// Tables
ImGuiTable* CurrentTable;
+ ImGuiID DebugBreakInTable; // Set to break in BeginTable() call.
int TablesTempDataStacked; // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size)
ImVector<ImGuiTableTempData> TablesTempData; // Temporary table data (buffers reused/shared across instances, support nesting)
ImPool<ImGuiTable> Tables; // Persistent table data
@@ -2366,8 +2371,11 @@
ImGuiDebugLogFlags DebugLogFlags;
ImGuiTextBuffer DebugLogBuf;
ImGuiTextIndex DebugLogIndex;
- ImU8 DebugLogClipperAutoDisableFrames;
+ ImGuiDebugLogFlags DebugLogAutoDisableFlags;
+ ImU8 DebugLogAutoDisableFrames;
ImU8 DebugLocateFrames; // For DebugLocateItemOnHover(). This is used together with DebugLocateId which is in a hot/cached spot above.
+ bool DebugBreakInLocateId; // Debug break in ItemAdd() call for g.DebugLocateId.
+ ImGuiKeyChord DebugBreakKeyChord; // = ImGuiKey_Pause
ImS8 DebugBeginReturnValueCullDepth; // Cycle between 0..9 then wrap around.
bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker())
ImU8 DebugItemPickerMouseButton;
@@ -2564,7 +2572,8 @@
DebugLogFlags = ImGuiDebugLogFlags_OutputToTTY;
DebugLocateId = 0;
- DebugLogClipperAutoDisableFrames = 0;
+ DebugLogAutoDisableFlags = ImGuiDebugLogFlags_None;
+ DebugLogAutoDisableFrames = 0;
DebugLocateFrames = 0;
DebugBeginReturnValueCullDepth = -1;
DebugItemPickerActive = false;
@@ -2574,6 +2583,13 @@
DebugFlashStyleColorIdx = ImGuiCol_COUNT;
DebugHoveredDockNode = NULL;
+ // Same as DebugBreakClearData(). Those fields are scattered in their respective subsystem to stay in hot-data locations
+ DebugBreakInWindow = 0;
+ DebugBreakInTable = 0;
+ DebugBreakInLocateId = false;
+ DebugBreakKeyChord = ImGuiKey_Pause;
+ DebugBreakInShortcutRouting = ImGuiKey_None;
+
memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
FramerateSecPerFrameIdx = FramerateSecPerFrameCount = 0;
FramerateSecPerFrameAccum = 0.0f;
@@ -3361,7 +3377,7 @@
IMGUI_API ImGuiKeyData* GetKeyData(ImGuiContext* ctx, ImGuiKey key);
inline ImGuiKeyData* GetKeyData(ImGuiKey key) { ImGuiContext& g = *GImGui; return GetKeyData(&g, key); }
- IMGUI_API void GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size);
+ IMGUI_API const char* GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size);
inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); }
IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);
IMGUI_API ImVec2 GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down);
@@ -3709,6 +3725,9 @@
IMGUI_API void DebugLocateItem(ImGuiID target_id); // Call sparingly: only 1 at the same time!
IMGUI_API void DebugLocateItemOnHover(ImGuiID target_id); // Only call on reaction to a mouse Hover: because only 1 at the same time!
IMGUI_API void DebugLocateItemResolveWithLastItem();
+ IMGUI_API void DebugBreakClearData();
+ IMGUI_API bool DebugBreakButton(const char* label, const char* description_of_location);
+ IMGUI_API void DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location);
inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; }
IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas);
IMGUI_API void DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end);
diff --git a/imgui_tables.cpp b/imgui_tables.cpp
index 13e0211..eab542d 100644
--- a/imgui_tables.cpp
+++ b/imgui_tables.cpp
@@ -1,4 +1,4 @@
-// dear imgui, v1.90.1 WIP
+// dear imgui, v1.90.1
// (tables and columns code)
/*
@@ -329,6 +329,10 @@
return false;
}
+ // [DEBUG] Debug break requested by user
+ if (g.DebugBreakInTable == id)
+ IM_DEBUG_BREAK();
+
// Acquire storage for the table
ImGuiTable* table = g.Tables.GetOrAddByKey(id);
const ImGuiTableFlags table_last_flags = table->Flags;
@@ -3802,7 +3806,8 @@
void ImGui::DebugNodeTable(ImGuiTable* table)
{
- const bool is_active = (table->LastFrameActive >= GetFrameCount() - 2); // Note that fully clipped early out scrolling tables will appear as inactive here.
+ ImGuiContext& g = *GImGui;
+ const bool is_active = (table->LastFrameActive >= g.FrameCount - 2); // Note that fully clipped early out scrolling tables will appear as inactive here.
if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); }
bool open = TreeNode(table, "Table 0x%08X (%d columns, in '%s')%s", table->ID, table->ColumnsCount, table->OuterWindow->Name, is_active ? "" : " *Inactive*");
if (!is_active) { PopStyleColor(); }
@@ -3814,6 +3819,13 @@
return;
if (table->InstanceCurrent > 0)
Text("** %d instances of same table! Some data below will refer to last instance.", table->InstanceCurrent + 1);
+ if (g.IO.ConfigDebugIsDebuggerPresent)
+ {
+ if (DebugBreakButton("**DebugBreak**", "in BeginTable()"))
+ g.DebugBreakInTable = table->ID;
+ SameLine();
+ }
+
bool clear_settings = SmallButton("Clear settings");
BulletText("OuterRect: Pos: (%.1f,%.1f) Size: (%.1f,%.1f) Sizing: '%s'", table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.GetWidth(), table->OuterRect.GetHeight(), DebugNodeTableGetSizingPolicyDesc(table->Flags));
BulletText("ColumnsGivenWidth: %.1f, ColumnsAutoFitWidth: %.1f, InnerWidth: %.1f%s", table->ColumnsGivenWidth, table->ColumnsAutoFitWidth, table->InnerWidth, table->InnerWidth == 0.0f ? " (auto)" : "");
diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp
index 287a4a8..1400c71 100644
--- a/imgui_widgets.cpp
+++ b/imgui_widgets.cpp
@@ -1,4 +1,4 @@
-// dear imgui, v1.90.1 WIP
+// dear imgui, v1.90.1
// (widgets code)
/*
@@ -5037,7 +5037,7 @@
Text("CurLenW: %d, CurLenA: %d, Cursor: %d, Selection: %d..%d", state->CurLenW, state->CurLenA, stb_state->cursor, stb_state->select_start, stb_state->select_end);
Text("has_preferred_x: %d (%.2f)", stb_state->has_preferred_x, stb_state->preferred_x);
Text("undo_point: %d, redo_point: %d, undo_char_point: %d, redo_char_point: %d", undo_state->undo_point, undo_state->redo_point, undo_state->undo_char_point, undo_state->redo_char_point);
- if (BeginChild("undopoints", ImVec2(0.0f, GetTextLineHeight() * 15), ImGuiChildFlags_Border)) // Visualize undo state
+ if (BeginChild("undopoints", ImVec2(0.0f, GetTextLineHeight() * 10), ImGuiChildFlags_Border | ImGuiChildFlags_ResizeY)) // Visualize undo state
{
PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
for (int n = 0; n < IMSTB_TEXTEDIT_UNDOSTATECOUNT; n++)