update dear imgui from 1.91.9b to 1.92.2b

This commit is contained in:
Sven Balzer
2025-08-28 05:58:03 +02:00
parent ad651462df
commit 883e13cdf5
107 changed files with 10690 additions and 4643 deletions
+669 -2
View File
@@ -35,6 +35,672 @@ HOW TO UPDATE?
and API updates have been a little more frequent lately. They are documented below and in imgui.cpp and should not affect all users.
- Please report any issue!
-----------------------------------------------------------------------
VERSION 1.92.2b (Released 2025-08-13)
-----------------------------------------------------------------------
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.92.2b
Changes:
- Fixed IsItemHovered() failing on disabled items and items that have no
identifier (e.g. Text() calls) when holding mouse button. (#8877, #8883)
[Regression in 1.92.2].
- Made IsItemHovered() on holding mouse button down on disabled items not
leak between items when the window cannot be moved.
- Backends: Allegro5: Fixed texture format setup which didn't work on all
setups/drivers. (#8770, #8465)
- Backends: Allegro5: Added ImGui_ImplAllegro5_SetDisplay() function to
change current ALLEGRO_DISPLAY, as Allegro applications often need to do that.
- Backends: Allegro5: Fixed missing support for ImGuiKey_PrintScreen
under Windows, as raw Allegro 5 does not receive it.
-----------------------------------------------------------------------
VERSION 1.92.2 (Released 2025-08-11)
-----------------------------------------------------------------------
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.92.2
Breaking Changes:
- Tabs: Renamed ImGuiTabBarFlags_FittingPolicyResizeDown to ImGuiTabBarFlags_FittingPolicyShrink.
Kept inline redirection enum (will obsolete). (#261, #351)
- Backends: SDL_GPU3: changed ImTextureID type from SDL_GPUTextureSamplerBinding* to SDL_GPUTexture*,
which is more natural and easier for user to manage. If you need to change the current sampler,
you can access the ImGui_ImplSDLGPU3_RenderState struct. (#8866, #8163, #7998, #7988)
Other Changes:
- Fixed an old inconsistency between IsItemHovered() and internal hovering check,
where IsItemHovered() would return true to mouse was first clicked on the
background of a non-moveable window then moved over the item or button.
Note that while it is consistent with other logic, there is a possibility
that some third-party code may accidentally relied on this. One can always use
ImGuiHoveredFlags_AllowWhenBlockedByActiveItem to bypass the active id check.
(#8877) [@achabense, @ocornut]
- Fonts: fixed an issue when a font using MergeMode has a reference size
specified but the target font doesn't. Usually either all fonts should
have a reference size (only required when specifying e.g. GlyphOffset),
or none should have a reference size.
- Fonts: fixed a crash when changing texture format when using a legacy
backend. Most commonly would happen when calling GetTexDataAsRGBA32()
then immediately calling GetTexDataAsAlpha8(). (#8824)
- Windows: fixed an issue where resizable child windows would emit border
logic when hidden/non-visible (e.g. when in a docked window that is not
selected), impacting code not checking for BeginChild() return value. (#8815)
- Textures: Fixed support for `#define ImTextureID_Invalid` to non-zero value:
ImFontAtlas() was incorrectly cleared with zeroes. (#8860, #8745) [@cfillion]
- Tables: fixed TableGetRowIndex() which never correctly worked when using
a clipper (it exists for consistency but is almost never used, as it is
often more convenient to use index in caller-code, whereas TableGetRowIndex()
includes header rows).
- Tables: fixed imgui_internal.h's TableGetHoveredRow() the same way. (#7350, #6588, #6250)
- Tabs: added new fitting policy ImGuiTabBarFlags_FittingPolicyMixed
and made it the default. This policy shrink tab width down to a given amount,
and then beyond that it enable scrolling buttons. (#3421, #8800)
- Tabs: added style.TabMinWidthShrink, ImGuiStyleVar_TabMinWidthShrink to
control the width to shrink to in ImGuiTabBarFlags_FittingPolicyMixed mode.
(#3421, #8800).
- Tabs: when scrolling is enabled, track selected tabs when resizing down
parent container. This does not prevent to horizontally scroll it out of
view during normal operations. (#3421, #8800)
- Tabs: added style.TabMinWidthBase, ImGuiStyleVar_TabMinWidthBase to control
the base minimum width of a tab (default to 1.0f). This is the size before
any potential shrinking is applied.
- Tabs: fixed tab bar underline not drawing below scroll buttons, when
they are enabled (minor regression from 1.90). (#6820, #4859, #5022, #5239)
- Tabs: made scrolling buttons never keyboard/gamepad navigation candidates.
- Nav, Tables: fixed navigation within scrolling tables when item boundaries
goes beyond columns limits. The fix done in 1.89.6 didn't work correctly
on scrolling windows. (#8816, #2221)
- Nav: fixed a bug where ImGuiKey_NavGamepadMenu (==ImGuiKey_GamepadFaceLeft)
button couldn't toggle between main and menu layers while navigating a Modal
window. (#8834)
- Error Handling: minor improvements to error handling for TableGetSortSpecs()
and TableSetBgColor() calls. (#1651, #8499)
- Misc: fixed building with IMGUI_DISABLE_DEBUG_TOOLS only. (#8796)
- Misc: fixed building with IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION. (#8794)
- Misc: removed more redundant inline static linkage from imgui_internal.h to
facilitate using in C++ modules. (#8813, #8682, #8358) [@stripe2933]
- Misc: ImVector: skip memcpy in operator= if `Data` isn't initialized in order
to play nice with -fsanitize=undefined. (#8874) [@i25e]
- CI: Added SDL3 builds to MacOS and Windows. (#8819, #8778) [@scribam]
- CI: Updated Windows CI to use a more recent SDL2. (#8819, #8778) [@scribam]
- Examples: SDL3+Metal: added SDL3+Metal example. (#8827, #8825) [@shi-yan]
- Examples: SDL3+SDL_GPU: use SDL_WaitAndAcquireGPUSwapchainTexture() instead
of SDL_AcquireGPUSwapchainTexture(). (#8830) [@itsdanott]
- Examples: SDL3+SDL_GPU: use SDL_GPU_PRESENTMODE_VSYNC present mode.
- Backends: OpenGL3: add and call embedded loader shutdown in ImGui_ImplOpenGL3_Shutdown()
to facilitate multiple init/shutdown cycles in same process. (#8792) [@tim-rex]
- Backends: OpenGL2, OpenGL3: set GL_UNPACK_ALIGNMENT to 1 before updating
textures. (#8802) [@Daandelange]
- Backends: SDL_GPU3: expose current SDL_GPUSampler* in the ImGui_ImplSDLGPU3_RenderState
struct. (#8866, #8163, #7998, #7988)
- Backends: Vulkan: Fixed texture update corruption introduced in 1.92.0,
affecting some drivers/setups. (#8801, #8755, #8840) [@Retro52, @Miolith]
- Backends: Vulkan: Avoid calling vkCmdBindDescriptorSets() when texture
has not changed. (#8666) [@micb25]
Docking+Viewports Branch:
- Windows, Viewport: fixed an issue where interrupting a viewport move with
e.g. a ClearActiveID() call would leave the dragged viewport with the
normally temporary ImGuiViewportFlags_NoInputs flag, preventing further
interactions with the viewport. (#5324) (thanks @mdelaharpe)
- Viewports: added io.ConfigViewportPlatformFocusSetsImGuiFocus to opt-out
of focusing imgui windows When a platform window is focused (e.g. using Alt+Tab,
clicking Platform Title Bar). In principle this is better enabled but we
provide an opt-out because some Linux window managers tend to eagerly focus
windows (on e.g. mouse hover, or even on a simple window pos/size change).
(#6299, #6462)
-----------------------------------------------------------------------
VERSION 1.92.1 (Released 2025-07-09)
-----------------------------------------------------------------------
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.92.1
Changes:
- Fonts: added ImFontAtlas::SetFontLoader() to dynamically change font
loader at runtime without using internal API. (#8752, #8465)
- Fonts: fixed a bug where dynamically changing font loader would lose
the Fallback and Ellipsis glyphs under some circumstance. (#8763)
- Fonts: for large size fonts, layout/size calculation only load glyphs metrics.
Actual glyphs are renderer+packed when used by drawing functions. (#8758, #8465)
- Fonts: set a maximum font size of 512.0f at ImGui:: API level to reduce
edge cases (e.g. out of memory errors). ImDrawList:: API doesn't have the
constraint. (#8758)
- Fonts: Restore ImFontConfig::FontNo being a 32-bits value as this is needed
to pass full range of information into e.g. FreeType's face_index, as higher
bits are used from FreeType 2.6.1. (#8775) [@Valakor]
(the field has been erroneously reduced from 32-bits to 8-bit in 1.92.0)
- Fonts, Tables: fixed PushFont() having no effect when called after submitting
a hidden column. (#8865)
- Textures: Fixed support for `#define ImTextureID_Invalid` to non-zero value:
ImTextureData() was incorrectly cleared with zeroes. (#8745) [@rachit7645]
- Demo: Added "Text -> Font Size" demo section. (#8738) [@Demonese]
- CI: Fixed dllimport/dllexport tests. (#8757) [@AidanSun05]
- CI: Updated to use latest Windows image + VS2022.
- Debug Tools: added IMGUI_DEBUG_HIGHLIGHT_ALL_ID_CONFLICTS to detect
id conflicts _before_ hovering. This is very slow and should only be used
temporarily. (#8651, #7961, #7669)
- Examples: GLFW+OpenGL3, GLFW+WGPU: Emscripten Makefiles uses GLFW port
'contrib.glfw3' which offers better HiDPI support. (#8742) [@pthom]
- Backends: GLFW, SDL2 made ImGui_ImplGLFW_GetContentScaleXXX() and
ImGui_ImplSDL2_GetContentScaleXXXX() helpers return 1.0f on Emscripten
and Android platforms, matching macOS logic. (#8742, #8733) [@pthom]
- Backends: SDL3: avoid calling SDL_StartTextInput() again if already active.
(fixes e.g.: an issue on iOS where the keyboard animation will popup every
time the user types a key + probably other things) (#8727) [@morrazzzz]
- Backends: OSX: added ImGuiMouseCursor_Wait and ImGuiMouseCursor_Progress
mouse cursor support. (#8739) [@cfillion]
- Backends: Allegro5: fixed texture update broken on some platforms where
ALLEGRO_LOCK_WRITEONLY needed all texels to be rewritten. (#8770)
- Backends: Vulkan: use nonCoherentAtomSize to align upload_size, fixing
validation error on some setups. (#8743, #8744) [@tquante]
- Backends: Vulkan: fixed texture synchronization issue introduced in 1.92.0,
leading to validation layers reacting. (#8772) [@Majora320]
Docking+Viewports Branch:
- Backends: OSX: Fixed multi-viewport handling broken in 1.92.0. (#8644, #8777) [@cfillion]
-----------------------------------------------------------------------
VERSION 1.92.0 (Released 2025-06-25)
-----------------------------------------------------------------------
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.92.0
THIS VERSION CONTAINS THE LARGEST AMOUNT OF BREAKING CHANGES SINCE 2015!
I TRIED REALLY HARD TO KEEP THEM TO A MINIMUM, REDUCE THE AMOUNT OF INTERFERENCE,
BUT INEVITABLY SOME USERS OR THIRD-PARTY EXTENSIONS WILL BE AFFECTED.
For instructions to upgrade your custom backend:
--> See https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md
IN ORDER TO HELP US IMPROVE THE TRANSITION PROCESS, INCL. DOCUMENTATION AND COMMENTS,
PLEASE REPORT **ANY** DOUBT, CONFUSION, QUESTIONS, FEEDBACK TO:
https://github.com/ocornut/imgui/issues/
If you are using custom widgets, internals or third-party extension that are somehow
breaking and aren't obvious how to solve, please post in Issues so we can gather
data and share solutions that may help others.
As part of the plan to reduce impact of API breaking changes, several unfinished
changes/features/refactors related to font and text systems and scaling will be
part of subsequent releases (1.92.1+).
If you are updating from an old version, and expecting a massive or difficult update,
consider first updating to 1.91.9 to reduce the amount of changes.
Breaking changes:
- Fonts: **IMPORTANT**: if your app was solving the OSX/iOS Retina screen specific
logical vs display scale problem by setting io.DisplayFramebufferScale (e.g. to 2.0f)
+ setting io.FontGlobalScale (e.g. to 1.0f/2.0f) + loading fonts at scaled sizes (e.g. size X * 2.0f):
- This WILL NOT map correctly to the new system! Because font will rasterize as requested size.
- With a legacy backend (< 1.92):
- Instead of setting io.FontGlobalScale = 1.0f/N -> set ImFontCfg::RasterizerDensity = N.
- This already worked before, but is now pretty much required.
- With a new backend (1.92+),
- This should be all automatic.
- FramebufferScale is automatically used to set current font RasterizerDensity.
- FramebufferScale is a per-viewport property provided by backend through the
Platform_GetWindowFramebufferScale() handler in 'docking' branch.
- Fonts: **IMPORTANT** on Font Sizing:
- Before 1.92, fonts were of a single size. They can now be dynamically sized.
- PushFont() API now has a REQUIRED size parameter.
void PushFont(ImFont* font) --> void PushFont(ImFont* font, float size);
- PushFont(font, 0.0f) // Change font and keep current size
- PushFont(NULL, 20.0f) // Keep font and change current size
- PushFont(font, 20.0f) // Change font and set size to 20.0f
- PushFont(font, style.FontSizeBase * 2.0f) // Change font and set size to be twice bigger than current size.
- PushFont(font, font->LegacySize) // Change font and set size to size passed to AddFontXXX() function. Same as pre-1.92 behavior, for fixed size fonts.
- To use old behavior use 'ImGui::PushFont(font, font->LegacySize)' at call site.
We intentionally didn't add a default parameter because it would make the long-term
transition more difficult.
- Kept inline redirection font. Will obsolete.
- Global scale factors may be applied over the provided size.
This is why it is called 'FontSizeBase' in the style structure.
- Global scale factors are: 'style.FontScaleMain', 'style.FontScaleDpi' and maybe more.
- ImFont::FontSize was removed and does not make sense anymore.
- ImFont::LegacySize is the size passed to AddFont().
- Removed support for old PushFont(NULL) which was a shortcut for "revert to default font".
`PushFont(NULL, some_size)` now keeps current change and changes size.
- Renamed/moved 'io.FontGlobalScale' to 'style.FontScaleMain'.
- Fonts: **IMPORTANT** on Font Merging:
- When searching for a glyph in multiple merged fonts: we search for the FIRST font source
which contains the desired glyph. Because the user doesn't need to provide glyph ranges
any more, it is possible that a glyph that you expected to fetch from a secondary/merged
icon font may be erroneously fetched from the primary font.
- We added `ImFontConfig::GlyphExcludeRanges[]` to specify ranges to exclude from a given font source:
// Add Font Source 1 but ignore ICON_MIN_FA..ICON_MAX_FA range
static ImWchar exclude_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };
ImFontConfig cfg1;
cfg1.GlyphExcludeRanges = exclude_ranges;
io.Fonts->AddFontFromFileTTF("segoeui.ttf", 0.0f, &cfg1);
// Add Font Source 2, which expects to use the range above
ImFontConfig cfg2;
cfg2.MergeMode = true;
io.Fonts->AddFontFromFileTTF("FontAwesome4.ttf", 0.0f, &cfg2);
- You can use `Metrics/Debugger->Fonts->Font->Input Glyphs Overlap Detection Tool` to
see list of glyphs available in multiple font sources. This can facilitate understanding
which font input is providing which glyph.
- Fonts: **IMPORTANT** on Thread Safety:
- A few functions such as font->CalcTextSizeA() were by sheer luck (== accidentally)
thread-safe even thou we had never provided that guarantee before. They are
definitively not thread-safe anymore as new glyphs may be loaded.
- Textures:
- All API functions taking a 'ImTextureID' parameter are now taking a 'ImTextureRef':
- ImTextureRef ais small composite structure which may be constructed from a ImTextureID.
(or constructed from a ImTextureData* which represent a texture which will generally
be ready by the time of rendering).
- Affected functions are:
- ImGui::Image(), ImGui::ImageWithBg(), ImGui::ImageButton(),
- ImDrawList::AddImage(), ImDrawList::AddImageQuad(), ImDrawList::AddImageRounded().
- We suggest that C users and any higher-level language bindings generators may
facilitate converting this in some way, aka emulating the trivial C++ constructor.
- Fonts: obsoleted ImFontAtlas::GetTexDataAsRGBA32(), GetTexDataAsAlpha8(), Build(), SetTexID()
and IsBuilt() functions. The new protocol for backends to handle textures doesn't need them.
Kept redirection functions (will obsolete).
- A majority of old backends should still work with new code (behaving like they did before).
- For instructions to upgrade your custom backend:
https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md
- Calling ImFontAtlas::Build() before initializing new backends will erroneously trigger
preloading all glyphs. Will be detected with an assertion after the backend is initialized.
- Fonts: ImFontConfig::OversampleH/OversampleV default to automatic (== 0)
since v1.91.8. It is quite important you keep it automatic until we decide if we want
to provide a way to express finer policy, otherwise you will likely waste texture space
when using large glyphs. Note that the imgui_freetype backend doesn't use and does not
need oversampling.
- Fonts: specifying glyph ranges is now unnecessary.
- The value of ImFontConfig::GlyphRanges[] is only useful for legacy backends.
- All GetGlyphRangesXXXX() functions are now marked obsolete:
- GetGlyphRangesDefault(), GetGlyphRangesGreek(), GetGlyphRangesKorean(),
GetGlyphRangesJapanese(), GetGlyphRangesChineseSimplifiedCommon(),
GetGlyphRangesChineseFull(), GetGlyphRangesCyrillic(),
GetGlyphRangesThai(), GetGlyphRangesVietnamese().
- Fonts: removed ImFontAtlas::TexDesiredWidth to enforce a texture width. (#327)
(it vaguely made sense with the old system as if unspecified textures width maxed up
to 4096 but that limit isn't necessary anymore, and Renderer_TextureMaxWidth covers this)
However you may set TexMinWidth = TexMaxWidth for the same effect.
- Fonts: if you create and manage ImFontAtlas instances yourself (instead of relying on
ImGuiContext to create one, you'll need to call ImFontAtlasUpdateNewFrame() yourself.
An assert will trigger if you don't.
- Fonts: obsoleted ImGui::SetWindowFontScale() which is not useful anymore. Prefer using
PushFont(NULL, style.FontSizeBase * factor) or to manipulate other scaling factors.
- Fonts: obsoleted ImFont::Scale which is not useful anymore.
- Fonts: changed ImFont::CalcWordWrapPositionA() to ImFont::CalcWordWrapPosition():
- old: const char* CalcWordWrapPositionA(float scale, const char* text, ....);
- new: const char* CalcWordWrapPosition (float size, const char* text, ....);
The leading 'float scale' parameters was changed to 'float size'.
This was necessary as 'scale' is assuming a unique font size.
Kept inline redirection function assuming using font->LegacySize.
- Fonts: generally reworked Internals of ImFontAtlas and ImFont.
While in theory a vast majority of users shouldn't be affected, some use cases or
extensions might be. Among other things:
- ImDrawCmd::TextureId has been changed to ImDrawCmd::TexRef.
- ImFontAtlas::TexID has been changed to ImFontAtlas::TexRef.
- ImFontAtlas::ConfigData[] has been renamed to ImFontAtlas::Sources[].
- ImFont::ConfigData[], ConfigDataCount has been renamed to Sources[], SourceCount.
- Each ImFont has a number of ImFontBaked instances corresponding to actively used
sizes. ImFont::GetFontBaked(size) retrieves the one for a given size.
- Fields moved from ImFont to ImFontBaked:
- ImFont::IndexAdvanceX[] -> ImFontBaked::IndexAdvanceX[]
- ImFont::Glyphs[] -> ImFontBaked::Glyphs[]
- ImFont::Ascent, Descent -> ImFontBaked::Ascent, Descent
- ImFont::FindGlyph() -> ImFontBaked::FindGlyph()
- ImFont::FindGlyphNoFallback() -> ImFontBaked::FindGlyphNoFallback()
- ImFont::GetCharAdvance() -> ImFontBaked::GetCharAdvance()
- Widget code may use ImGui::GetFontBaked() instead of ImGui::GetFont() to
access font data for current font at current font size.
(and you may use font->GetFontBaked(size) to access it for any other size.)
g.Font == ImGui::GetFont()
g.FontSize == ImGui::GetFontSize()
g.FontBaked == ImGui::GetFontBaked() == ImGui::GetFont()->GetFontBaked(ImGui::GetFontSize())
- Fields moved from ImFontAtlas to ImTextureData
- ImFontAtlas->TexWidth -> ImFontAtlas->TexData->Width
- ImFontAtlas->TexHeight -> ImFontAtlas->TexData->Height
- ImFontAtlas->TexPixelsAlpha8 -> ImFontAtlas->TexData->GetPixels() (when ImFontAtlas::TexDesiredFormat == ImTextureFormat_Alpha8)
- ImFontAtlas->TexPixelsRGBA32 -> ImFontAtlas->TexData->GetPixels() (when ImFontAtlas::TexDesiredFormat == ImTextureFormat_RGBA32)
Please report if you are affected!
- Fonts: (users of imgui_freetype)
- renamed ImFontAtlas::FontBuilderFlags to ImFontAtlas::FontLoaderFlags.
- renamed ImFontConfig::FontBuilderFlags to ImFontConfig::FontLoaderFlags.
- renamed ImGuiFreeTypeBuilderFlags to ImGuiFreeTypeLoaderFlags.
- if you used runtime imgui_freetype selection rather than the default compile-time
option provided by IMGUI_ENABLE_FREETYPE:
- renamed/reworked ImFontBuilderIO into ImFontLoader,
- renamed ImGuiFreeType::GetBuilderForFreeType() to ImGuiFreeType::GetFontLoader()
- old: io.Fonts->FontBuilderIO = ImGuiFreeType::GetBuilderForFreeType()
- new: io.Fonts->FontLoader = ImGuiFreeType::GetFontLoader()
- DrawList: Renamed ImDrawList::PushTextureID()/PopTextureID() to PushTexture()/PopTexture().
- Fonts: (users of custom rectangles)
- Renamed AddCustomRectRegular() to AddCustomRect(). (#8466)
- Added GetCustomRect() as a replacement for GetCustomRectByIndex() + CalcCustomRectUV(). (#8466)
- The output type of GetCustomRect() is now ImFontAtlasRect, which include UV coordinates.
- ImFontAtlasCustomRect::X --> ImFontAtlasRect::x
- ImFontAtlasCustomRect::Y --> ImFontAtlasRect::y
- ImFontAtlasCustomRect::Width --> ImFontAtlasRect::w
- ImFontAtlasCustomRect::Height --> ImFontAtlasRect::h
Before:
const ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(custom_rect_id);
ImVec2 uv0, uv1;
atlas->GetCustomRectUV(r, &uv0, &uv1);
ImGui::Image(atlas->TexRef, ImVec2(r->w, r->h), uv0, uv1);
After:
ImFontAtlasRect r;
atlas->GetCustomRect(custom_rect_id, &r);
ImGui::Image(atlas->TexRef, ImVec2(r.w, r.h), r.uv0, r.uv1);
We added a redirecting typedef but haven't attempted to magically redirect
the field names, as this API is rarely used and the fix is simple.
- Obsoleted AddCustomRectFontGlyph() as the API does not make sense for scalable fonts:
- Kept existing function which uses the font "default size" (Sources[0]->LegacySize).
- Added a helper AddCustomRectFontGlyphForSize() which is immediately marked obsolete,
but can facilitate transitioning old code.
- Prefer adding a font source (ImFontConfig) using a custom/procedural loader.
- Backends: removed ImGui_ImplXXXX_CreateFontsTexture()/ImGui_ImplXXXX_DestroyFontsTexture()
for all backends that had them. They should not be necessary any more.
- removed ImGui_ImplMetal_CreateFontsTexture(), ImGui_ImplMetal_DestroyFontsTexture().
- removed ImGui_ImplOpenGL2_CreateFontsTexture(), ImGui_ImplOpenGL2_DestroyFontsTexture().
- removed ImGui_ImplOpenGL3_CreateFontsTexture(), ImGui_ImplOpenGL3_DestroyFontsTexture().
- removed ImGui_ImplSDLGPU3_CreateFontsTexture(), ImGui_ImplSDLGPU3_DestroyFontsTexture().
- removed ImGui_ImplSDLRenderer2_CreateFontsTexture(), ImGui_ImplSDLRenderer2_DestroyFontsTexture().
- removed ImGui_ImplSDLRenderer3_CreateFontsTexture(), ImGui_ImplSDLRenderer3_DestroyFontsTexture().
- removed ImGui_ImplVulkan_CreateFontsTexture(), ImGui_ImplVulkan_DestroyFontsTexture().
- Layout: commented out legacy ErrorCheckUsingSetCursorPosToExtendParentBoundaries() fallback
obsoleted in 1.89 (August 2022) which allowed a SetCursorPos()/SetCursorScreenPos() call WITHOUT AN ITEM
to extend parent window/cell boundaries. Replaced with assert/tooltip that would already happens if
previously using IMGUI_DISABLE_OBSOLETE_FUNCTIONS. (#5548, #4510, #3355, #1760, #1490, #4152, #150)
- Incorrect way to make a window content size 200x200:
Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + End();
- Correct ways to make a window content size 200x200:
Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + Dummy(ImVec2(0,0)) + End();
Begin(...) + Dummy(ImVec2(200,200)) + End();
- TL;DR; if the assert triggers, you can add a Dummy({0,0}) call to validate extending parent boundaries.
- TreeNode: renamed ImGuiTreeNodeFlags_NavLeftJumpsBackHere to ImGuiTreeNodeFlags_NavLeftJumpsToParent
for clarity. Kept inline redirection enum (will obsolete). (#1079, #8639)
- Commented out PushAllowKeyboardFocus()/PopAllowKeyboardFocus() which was obsoleted
in 1.89.4 (March 2023). (#3092)
- PushAllowKeyboardFocus(bool tab_stop) --> PushItemFlag(ImGuiItemFlags_NoTabStop, !tab_stop);
- PopAllowKeyboardFocus() --> PopItemFlag().
- Commented out ImGuiListClipper::ForceDisplayRangeByIndices() which was obsoleted
in 1.89.6 (June 2023).
- ForceDisplayRangeByIndices() --> IncludeItemsByIndex()
- Backends: SDL3: Fixed casing typo in function name: (#8509, #8163, #7998, #7988) [@puugz]
- Imgui_ImplSDLGPU3_PrepareDrawData() --> ImGui_ImplSDLGPU3_PrepareDrawData()
- Internals: RenderTextEllipsis() function removed the 'float clip_max_x' parameter directly
preceding 'float ellipsis_max_x'. Values were identical for a vast majority of users. (#8387)
- [Docking] renamed/moved ImGuiConfigFlags_DpiEnableScaleFonts -> bool io.ConfigDpiScaleFonts.
- [Docking] renamed/moved ImGuiConfigFlags_DpiEnableScaleViewports -> bool io.ConfigDpiScaleViewports.
**Neither of those flags are very useful in current code. They will be useful once we merge font changes.**
Non-breaking Fonts/Textures related changes:
- Textures: added partial texture update protocol. (#8465, #3761)
- The Renderer Backend needs to set io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures
and handle texture updates requests.
- New structs: ImTextureData, ImTextureRect.
- New enums: ImTextureStatus, ImTextureFormat.
- During its ImGui_ImplXXXX_RenderDrawData() call, the backend can now access a texture list
in ImDrawData::Textures[]. Textures may have four distinct states:
- ImTextureStatus_WantCreate: requesting backend to create a texture.
- ImTextureStatus_WantUpdates: requesting backend to copy given blocks from the CPU side
copy of the texture to your graphics pipeline.
A 'tex->Updates[]' list of update is provided as well as a single 'tex->UpdatesRect' bounding box.
- ImTextureStatus_WantDestroy: requesting backend to destroy the texture.
- A 'int UnusedFrames' value is provided to conveniently defer destroying.
- Backend is generally free to destroy textures whenever they like.
- ImTextureStatus_OK: nothing to do.
- Almost all standard backends have been updated to support this.
- Backends have allowed to destroy textures at any time if they desire so.
A list is available in platform_io.Textures[] for this purpose and for backend shutdown.
- Both stb_truetype and FreeType backends have been updated to work with the new
system, and they now share more code than before.
- Added '#define IMGUI_HAS_TEXTURES' to facilitate compile-time checks for third-party
extensions until this is merged with a definitive version number to check.
- Fonts: font backend/loader may easily be changed dynamically, allowing users to compare
rasterizers outputs and features. imgui_freetype is generally beneficial.
- Fonts: ImFontAtlas::AddFontXXX() functions may be called at any time during the frame.
- Fonts: ImFontAtlas::AddFontXXX() can fail more gracefully if error handling is configured
to not assert (this will be better exposed via future font flags).
- Fonts: added style.FontScaleBase scaling factor (previously called io.FontGlobalScale).
- Fonts: added style.FontScaleDpi scaling factor. This is designed to be be changed on
per-monitor/per-viewport basis, which `io.ConfigDpiScaleFonts` does automatically.
(which is why it is separate from FontScaleBase).
- Fonts: added optional font_size parameter to ImGui::PushFont() function.
- Fonts: added ImFontAtlas::RemoveFont() function.
- Fonts: added ImFontAtlas::CompactCache() function.
- Fonts: added ImFontAtlas::TexDesiredFormat field (default to ImTextureFormat_RGBA32,
can be changed to ImTextureFormat_Alpha8).
- Fonts: added ImFontAtlas::TexMinWidth, TexMinHeight, TexMaxWidth, TexMaxHeight fields.
- Fonts: added ImFontConfig::PixelSnapV to align scaled GlyphOffset.y to pixel boundaries.
- Fonts: added ImFontConfig::GlyphExcludeRanges[], which behave similarly to
ImFontConfig::GlyphRanges[], but has the opposite meaning. It is tailored to situations
where merged fonts have overlapping characters.
- Fonts: added "Input Glyphs Overlap Detection Tool" which dumps a list of glyphs
provided by merged sources, which may help setting up a GlyphExcludeRanges[] filter.
- Fonts: added ImFontAtlas::FontBackendName (which is surfaced in the "About Dear ImGui"
window and other locations).
- Fonts: added ImFontFlags (currently needs to be passed through ImFontConfig until
we revamp font loading API):
- ImFontFlags_NoLoadError: disable erroring/assert when calling AddFontXXX()
with missing file/data. Calling code is expected to check AddFontXXX() return value.
- ImFontFlags_NoLoadGlyphs: disable loading new glyphs.
- ImFontFlags_LockBakedSizes: disable loading new baked sizes, disable garbage
collecting current ones. e.g. if you want to lock a font to a single size.
- Fonts: the general design has changed toward meaning that a ImFont doesn't have
have a specific size: it may be bound and drawn with any size.
- We store ImFontBaked structures internally, which are a cache of information
for a given size being drawn. You should not need to deal with ImFontBaked directly.
- ImFontBaked structures may be cleaned up between frames when unused, pointers
to them are only valid for the current frame.
- Added ImFontBaked::IsGlyphLoaded() function.
- Fonts: Custom Rect packing has generally been reworked. (#8107, #7962, #1282)
- ImFontAtlas::AddCustomRect() (previously AddCustomRectRegular()/AddCustomRectFontGlyph())
functions will immediately return a packed rectangle identifier, and you can write your
pixels immediately - previously had to wait for Build() to be called.
This is also the case when using a legacy backend.
- Custom packed rectangles may be moved during a texture change, aka practically anytime.
Always refer to latest uvs/position returned by GetCustomRect().
- AddCustomRect() returns ImFontAtlasRectId_Invalid on failure.
- Added ImFontAtlas::RemoveCustomRect() function.
- GetCustomRect() can safely return false and not crash when passed an invalid or removed id.
- Fonts: texture is now stored in a single format CPU side (save ~25% when using RGBA).
- Fonts: changing current font to one from a different atlas is supported. (#8080)
- Fonts: automatic baking of an "..." ellipsis works better with monospace fonts.
- Fonts: each ImFontConfig font source may provide a custom backend/loader.
- Fonts: added platform_io.Renderer_TextureMaxWidth/Renderer_TextureMaxHeight fields
for Renderer Backend to specify if there is a maximum accepted texture size (not yet used).
- Fonts: added compile-time overridable '#define ImTextureID_Invalid 0' if you need 0
to be a valid low-level texture identifier.
- Fonts: reworked text ellipsis logic to ensure a "..." is always displayed instead
of a single character. (#7024)
- Fonts: word-wrapping code handle ideographic comma & full stop (U+3001, U+3002). (#8540)
- Fonts: fixed CalcWordWrapPosition() fallback when width is too small to wrap:
would use a +1 offset instead of advancing to the next UTF-8 codepoint. (#8540)
- Debug Tools: Fonts section: add font preview, add "Remove" button, add "Load all glyphs"
button, add selection to change font backend when both are compiled in.
- Renderer Backends:
- Backends: DX9/DX10/DX11/DX12, Vulkan, OpenGL2/3, Metal, SDLGPU3, SDLRenderer2/3, WebGPU, Allegro5:
- Added ImGuiBackendFlags_RendererHasTextures support for all backends. (#8465, #3761, #3471)
[@ocornut, @ShironekoBen, @thedmd]
- Added ImGui_ImplXXXX_UpdateTexture(ImTextureData* tex) functions for all backends.
Available if you want to start uploading textures right after ImGui::Render() and without
waiting for the call to ImGui_ImplXXXX_RenderDrawData(). Also useful if you use a staged or
multi-threaded rendering schemes, where you might want to set ImDrawData::Textures = NULL. (#8597, #1860)
- Special thanks for fonts/texture related feedback to: @thedmd, @ShironekoBen, @rodrigorc,
@pathogendavid, @itamago, @rokups, @DucaRii, @Aarkham, @cyfewlp.
Other Changes:
- IO: variations in analog-only components of gamepad events do not interfere
with trickling of mouse position events (#4921, #8508)
- Windows: fixed SetNextWindowCollapsed()/SetWindowCollapsed() bypassing the
codepath that preserve last contents size when collapsed, resulting in
programmatically uncollapsing auto-sizing windows having them flicker size
for a frame. (#7691) [@achabense]
- Windows: clicking on a window close button doesn't claim focus and bring to front. (#8683)
- Windows: loosened code to allow hovering of resize grips, borders, and table
borders while hovering a sibling child window, so that the code in master matches
one in docking (they accidentally diverged). (#8554)
- Windows: BeginChild(): fixed being unable to combine manual resize on one axis
and automatic resize on the other axis. (#8690)
e.g. neither ImGuiChildFlags_ResizeX | ImGuiChildFlags_AutoResizeY
or ImGuiChildFlags_ResizeY | ImGuiChildFlags_AutoResizeX worked before.
- TreeNode: added experimental flags to draw tree hierarchy outlines linking
parent and tree nodes: (#2920)
- ImGuiTreeNodeFlags_DrawLinesNone: No lines drawn (default value in style.TreeLinesFlags).
- ImGuiTreeNodeFlags_DrawLinesFull: Horizontal lines to child nodes. Vertical line drawn down to TreePop() position: cover full contents.
- ImGuiTreeNodeFlags_DrawLinesToNodes: Horizontal lines to child nodes. Vertical line drawn down to bottom-most child node.
- Added style.TreeLinesFlags which stores the default setting,
which may be overridden in individual TreeNode() calls.
- Added style.TreeLinesSize (default to 1.0f).
- Added style.TreeLinesRadius (default to 0.0f).
- Added ImGuiCol_TreeLines (in default styles this is the same as ImGuiCol_Border).
- Caveats:
- Tree nodes may be used in many creative ways (manually positioning openable
nodes in unusual ways, using indent to create tree-looking structures, etc.)
and the feature may not accurately represent them in every cases.
- The feature adds a little cost as extra data needs to be stored.
(ImGuiTreeNodeFlags_DrawLinesToNodes is slower than ImGuiTreeNodeFlags_DrawLinesFull
which may be meaningful on very large trees, as it needs to record bottom-most
Y position even for clipped nodes).
- The feature is unlikely to ever work properly when using a coarse clipper
such as ImGuiListClipper.
- TreeNode: fixed incorrect clipping of arrow/bullet when using ImGuiTreeNodeFlags_SpanAllColumns.
- InputText: fixed cursor positioning issue using up/down keys near end of lines while
editing non-ASCII text. (Regression from 1.91.2) (#8635, #7925)
- InputText: fixed a buffer overrun that could happen when using dynamically resizing
buffers (e.g. imgui_stdlib.cpp for std::string, or ImGuiInputTextFlags_CallbackRezize)
and programmatically making an insertion. (#8689) [@ocornut, @m9710797]
- Tables: fixed TableHeader() eager vertical clipping of text which may be noticeable
with FramePadding.y was too small. (#6236)
- Tables: fixed an assert when combining Tables, Frozen Rows, Clipper and BeginMultiSelect()
in a certain order. (#8595, #8250)
- Tabs: fixes small issues with how "..." ellipsis moved depending on visibility
of Close Button or Unsaved Document marker. (#8387)
- Tooltips: tooltips have a maximum size corresponding to host display/monitor size,
which mitigates edge case issues in multi-viewport scenarios where abnormally large
windows (e.g. determined programmatically) can lead to renderer backend trying to
create abnormally large framebuffers.
- TextLinkOpenURL(): added bool return value on click. (#8645, #8451, #7660)
- Scroll: fixed contents size, scrollbar visibility and scrolling resetting issues
with abnormally large contents ranges. (#3609, #8215)
- Clipper: some mitigation/improvements for abnormally large contents ranges. (#3609, #8215)
- Nav: fixed assertion when holding gamepad FaceLeft/West button to open
CTRL+Tab windowing + pressing a keyboard key. (#8525)
- Nav: fixed scroll fallback (when there are no interactive widgets to jump to) not
being enabled on windows with menu or title bar.
- Nav: fixed an issue handling PageUp/PageDown on windows with abnormally large contents
range which could lead to clipper requesting very large ranges.
- Error Handling: added better error report and recovery for extraneous
EndPopup() call. (#1651, #8499)
- Error Handling: added better error report and recovery when calling EndFrame()
or Render() without NewFrame(). Was previously only an assert.
- Style, InputText: added ImGuiCol_InputTextCursor to configure color of
the InputText cursor/caret. (#7031)
- Platform IME: added ImGuiPlatformImeData::ViewportId info (backported from Docking branch).
- Platform IME: added ImGuiPlatformImeData::WantTextInput which might set independently
of WantVisible. This is set in the same structure because activating text input generally
requires providing a window to the backend. (#8584, #6341)
- DrawList: Fixed a regression from 1.91.1 where a Begin()/PushFont()/AddImage() sequence
would not restore the correct atlas Texture Identifier when the PushFont() call used
a font from a different atlas. (#8694, caused by #3224, #3875, #6398, #7903)
- Misc: added extra operators to ImVec4 in IMGUI_DEFINE_MATH_OPERATORS block. (#8510) [@gan74]
- Misc: removed static linkage from operators to facilitate using in C++ modules. (#8682, #8358) [@johmani]
- Demo: changed default framed item width to use Min(GetFontSize() * 12, GetContentRegionAvail().x * 0.40f).
- Renderer Backends:
- Backends: SDLGPU3: Fixed creating atlas texture earlier than other backends, preventing
to load fonts between the Init and NewFrames calls.
- Backends: SDLGPU3: Made ImGui_ImplSDLGPU3_PrepareDrawData() reuse GPU Transfer Buffers which
were unusually slow to recreate every frame. Much faster now. (#8534) [@ocornut, @TheMode]
- Backends: SDLGPU3: added support for ImDrawCallback_ResetRenderState. (#8599)
- Backends: OpenGL3: made GLES 3.20 contexts not access GL_CONTEXT_PROFILE_MASK nor
GL_PRIMITIVE_RESTART. (#8664) [@DyXel]
- Backends: DirectX12: Fixed build on MinGW. (#8702, #4594) [@playday3008]
- Backends: DirectX10, DirectX11, DirectX12: Honor FramebufferScale to allow for custom
platform backends and experiments using it (consistently with other renderer backends,
even though in normal condition it is not set under Windows). (#8412) [@WSSDude]
- Backends: Vulkan: Deep-copy ImGui_ImplVulkan_InitInfo::PipelineRenderingCreateInfo's
pColorAttachmentFormats buffer when set, in order to reduce common user-error of
specifying a pointer to data that gets out of scope. (#8282)
- Backends: Vulkan: Load dynamic rendering functions using vkGetDeviceProcAddr()
+ try both non-KHR and KHR versions. (#8600, #8326, #8365) [@ChrisTom-94]
- Backends: Vulkan: fixed validation errors in window create/resize helpers used by examples
and by multi-viewports implementation, which would typically trigger errors while detaching
secondary viewports. (#8600, #8176) [@ChrisTom-94]
- Platform Backends:
- Backends: GLFW: added ImGui_ImplGlfw_GetContentScaleForMonitor(), ImGui_ImplGlfw_GetContentScaleForWindow()
helpers. They are wrappers to glfwGetMonitorContentScale()/glfwGetWindowContentScale(), with compile-time
GLFW version checks + returning 1.0f on Apple platform.
- Backends: GLFW: Added support for multiple Dear ImGui contexts. (#8676, #8239, #8069)
- Backends: SDL2: added ImGui_ImplSDL2_GetDpiScaleForDisplay() and ImGui_ImplSDL2_GetContentScaleForWindow()
helpers. They are wrappers to SDL_GetDisplayDPI(), with compile-time SDL version checks + returning 1.0f
on Apple platforms. SDL3 already does this by default.
- Backends: Win32: Fixed an issue where externally losing mouse capture (due to e.g. focus loss)
would fail to claim it again the next subsequent click. (#8594)
- Backends: SDL2, SDL3, OSX: Fill gamepad inputs and set ImGuiBackendFlags_HasGamepad
regardless of ImGuiConfigFlags_NavEnableGamepad being set. (#8508)
- Backends: SDL2, SDL3: don't attempt to call SDL_CaptureMouse() on drivers where we don't
call SDL_GetGlobalMouseState(). This is specifically for Wayland but we currently use
the same white-list as SDL_GetGlobalMouseState(). (#8561) [@vs49688]
- Backends: GLFW, SDL2, SDL3: include GLFW/SDL version number in io.BackendPlatformName.
- Backends: SDL3: Update for SDL3 api changes: revert SDL_GetClipboardText()
memory ownership change. (#8530, #7801) [@Green-Sky]
- Backends: SDL3: honor ImGuiPlatformImeData::WantTextInput as an alternative
way to call SDL_StartTextInput(), without IME being necessarily visible. (#8584)
- Backends: SDL3: fixed pulling SDL_PROP_WINDOW_COCOA_WINDOW_POINTER into
viewport->PlatformHandleRaw. (#8725, #8726) [@eertbleyen]
- Backends: OSX: ImGui_ImplOSX_HandleEvent() only process event for window containing
our view. (#8644) [@BingoXuan]
- Examples:
- Examples: Made many examples DPI aware by default.
The single-viewport is basically:
- Query monitor DPI scale. Helpers are provided in some backends.
- Call style.ScaleAllSizes() and set style.FontScaleDpi with this factor.
Multi-viewport applications may set both of those flags:
- io.ConfigDpiScaleFonts = true;
- io.ConfigDpiScaleViewports = true;
Which will scale fonts but NOT style padding/spacings/thicknesses yet.
- Examples: Apple+Metal, Apple+OpenGL: add Makefile (CLion opens them nicely). (#8637) [@pthom]
- Examples: DirectX12+Win32: also test for IsIconic() for sleeping since we don't seem to
get a DXGI_STATUS_OCCLUDED signal when minimized. (#8603) [@dooann]
Docking+Viewports Branch:
- Viewports: added per-viewport FramebufferScale for Retina display multi-monitor support.
Backend must provide platform_io.platform_io.Platform_GetWindowFramebufferScale handler.
This effectively fixes clipping/rendering on multi-monitors with varying Retina scale.
(#1065, #1542, #1676, #1786, #2826, #3757, #5081, #5580, #5592, #6465, #7273, #7779 etc.)
- Viewports: fixed handling of simultaneous move + resize (e.g. toggling maximized)
when ImGuiConfigFlags_DpiEnableScaleViewports is enabled.
- Backends: Win32: Viewports: fixed an issue when closing a window from
the OS close button (with io.ConfigViewportsNoDecoration=false) while
user code is discarding the 'bool *p_open=false output' from Begin().
Because we allowed the Win32 window to close early, Windows destroyed
it and our imgui window became not visible even though user code was
still submitting it. (#8670)
- Backends: Win32: Viewports: handle WM_DPICHANGED in backend when
ImGuiConfigFlags_DpiEnableScaleViewports is enabled.
- Backends: GLFW, SDL2, SDL3, Apple: provide Platform_GetWindowFramebufferScale handler,
(#1065, #1542, #1676, #1786, #2826, #3757, #5081, #5580, #5592, #6465, #7273, #7779 etc.)
- Backends: SDLGPU3 for SDL3: added multi-viewport support. (#8573) [@Lekoopapaul]
- Backends: SDL2, SDL3: revert updating monitors and work areas info every
frame. Only do it on Windows to detect task-bar resize until we get an
adequate event for it. (#8415, #8558)
- Backends: SDL3: macOS: Fixed secondary-viewports not appearing on a different
monitor than the main viewport. Because SDL_SetWindowParent() seems to restrict it.
- Backends: GLFW: Disable multi-viewports under Wayland (require GLFW 3.4). (#8587)
- Backends: GLFW: Fixed an issue where Win32 specific WndProc hook was not installed
for all GLFW version, preventing mouse vs touch detection from working on
secondary viewports.
-----------------------------------------------------------------------
VERSION 1.91.9b (Released 2025-03-17)
-----------------------------------------------------------------------
@@ -139,6 +805,7 @@ Other changes:
- Debug Tools: Added io.ConfigDebugHighlightIdConflictsShowItemPicker (defaults to true)
to allow disabled Item Picker suggestion in user facing builds. (#7961, #7669)
- Debug Tools: Tweaked layout of ID Stack Tool and always display full path. (#4631)
- imgui_freetype: update lunasvg API to support v3.0+. (#8656, #6842, #6591) [@moretromain]
- Misc: Various zealous warning fixes for newer version of Clang.
- Misc: Added ImGuiMouseCursor_Wait and ImGuiMouseCursor_Progress mouse cursors
(busy/wait/hourglass shape, with or without an arrow cursor).
@@ -542,7 +1209,7 @@ Other changes:
- Set io.ConfigNavCursorVisibleAuto = true (default) to enable automatic toggling
of cursor visibility (mouse click hide the cursor, arrow keys makes it visible).
- Set io.ConfigNavCursorVisibleAlways to keep cursor always visible.
- Nav: added NavSetCursorVisible(bool visible) function to manipulate visibility of
- Nav: added SetNavCursorVisible(bool visible) function to manipulate visibility of
navigation cursor (e.g. set default state, or after some actions). (#1074, #2048, #7237, #8059)
- Nav: added io.ConfigNavEscapeClearFocusItem and io.ConfigNavEscapeClearFocusWindow to change
how pressing Escape affects navigation. (#8059, #2048, #1074, #3200)
@@ -671,7 +1338,7 @@ Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v
Breaking changes:
- Internals: using multiple overlayed ButtonBehavior() with same ID will now have the
- Internals: using multiple overlaid ButtonBehavior() with same ID will now have the
io.ConfigDebugHighlightIdConflicts=true feature emit a warning. (#8030)
It was one of the rare case where using same ID is legal. Workarounds:
- use single ButtonBehavior() call with multiple _MouseButton flags