github ocornut/imgui v1.89

latest releases: v1.91.2-docking, v1.91.2, v1.91.1-docking...
22 months ago

1.89: Autumn release!

Reading the changelog is a good way to keep up to date with the things Dear ImGui has to offer, and maybe will give you ideas of some features that you've been ignoring until now!


Homepage: https://github.com/ocornut/imgui
Release notes: https://github.com/ocornut/imgui/releases
Wiki: https://github.com/ocornut/imgui/wiki for bindings, extensions, links, etc.
FAQ: https://www.dearimgui.org/faq/
Issues: https://github.com/ocornut/imgui/issues

Did you know? We have a Wiki!
It has sections such as this Useful Extensions Gallery! 👌

📢 Updating from <1.86 and got visual glitches with custom/old backend when using CTRL+Tab or Modal Windows? See 1.86 release note.

Thank you! ❤️

Special thanks to @rokups for their continued work on stuff that are still not visible e.g. regression tests.
Special thanks to @PathogenDavid for their continued contributions and helping with github answers.
Special thanks to @thedmd for their code reviews and continued exchanges of ideas.

Ongoing work on Dear ImGui is currently financially supported by:

Huge thank you to all past and present supporters!
Also thanks to PVS Studio (great static analyzer) for providing us with a license for this project.

Dear ImGui is funded by your contributions and needs them right now.
If your company uses Dear ImGui, consider reaching out. See Sponsors page for details.

TL;DR;

Some arbitrary highlights among the 90+ changes:

  • Debug Tools: Hovering 0xXXXXXXX ids in Debug Log and Metrics can now visually locate the item. (#5855)
  • Popups & Modals: fixed nested Begin() inside a popup being erroneously input-inhibited.
  • IO: Mitigate scrolling issues on system sending dual-axis wheel data simultaneously (more fixes coming later).
  • IsItemHovered: added ImGuiHoveredFlags_DelayNormal and ImGuiHoveredFlags_DelayShort for delayed hover test (work on items that have no persistent identifier e.g. Text items).
  • InputText: added ImGuiInputTextFlags_EscapeClearsAll and io.ConfigInputTextEnterKeepActive. Added Shift+Click style selection. Improvements for numerical inputs for IME mode sending full-width characters. Other fixes.
  • Menus: various fixes for menu item inside non-popup root windows. Fixes for keyboard/gamepad navigations.
  • TabBar: fixes occasional freezes when feeding non-rounded tab widths.
  • Backends: Many fixes: freezing IME on Win32, fix for SDL 2.0.22 auto-capture and drag and drop issues with multi-viewports, fixes corruptions issues with OpenGL and multi-viewports on buggy Intel GPU drivers, OSX support for C++ apps etc.
  • Obsoleted variety of old symbols, with backward-compatible redirection for newly obsoleted stuff.
  • Internals: added wip internal APIs to allow handling input/shorting routing and key ownership. Things will be moved into public APIs over time, including a Shortcut() function that magically handle input routing.
  • And many more things...

See Wiki Page: Debug Tools

Breaking Changes

(Suggestion: once in a while, add #define IMGUI_DISABLE_OBSOLETE_FUNCTIONS in your imconfig.h file to make sure you are not using to-be-obsoleted symbols.)

  • Layout: Obsoleted using SetCursorPos() / SetCursorScreenPos() to extend parent window/cell boundaries. (#5548)
    This relates to when moving the cursor position beyond current boundaries WITHOUT submitting an item.
    • Previously this would make the window content size ~200x200:
      Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + End()
    • Instead, please submit an item:
      Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + Dummy(ImVec2(0,0)) + End()
    • Or simpler alternative:
      Begin(...) + Dummy(ImVec2(200,200)) + End();
    • Content size is now only extended when submitting an item.
      • With #define IMGUI_DISABLE_OBSOLETE_FUNCTIONS this will now be detected and assert.
      • Without #define IMGUI_DISABLE_OBSOLETE_FUNCTIONS this will silently be fixed until we obsolete it.
      • This incorrect pattern has been mentioned or suggested in: #4510, #3355, #1760, #1490, #4152, #150, threads have been amended to refer to this issue.
  • Renamed and merged keyboard modifiers key enums and flags into a same set: (#4921, #456)
    • ImGuiKey_ModCtrl and ImGuiModFlags_Ctrl -> ImGuiMod_Ctrl
    • ImGuiKey_ModShift and ImGuiModFlags_Shift -> ImGuiMod_Shift
    • ImGuiKey_ModAlt and ImGuiModFlags_Alt -> ImGuiMod_Alt
    • ImGuiKey_ModSuper and ImGuiModFlags_Super -> ImGuiMod_Super
      Kept inline redirection enums (will obsolete). This change simplifies a few things, reduces confusion, and will facilitate upcoming shortcut/input ownership apis.
    • (The ImGuiKey_ModXXX were introduced in 1.87 and mostly used by backends. The ImGuiModFlags_XXX have been exposed in imgui.h but not really used by any public api, only by third-party extensions. They were however subject to a recent rename ImGuiKeyModFlags_XXX -> ImGuiModFlags_XXX and we are exceptionally commenting out the older ImGuiKeyModFlags_XXX names ahead of obsolescence schedule to reduce confusion and because they were not meant to be used anyway.)
  • Removed io.NavInputs[] and ImGuiNavInput enum that were used to feed gamepad inputs. Basically 1.87 already obsoleted them from the backend's point of view, but internally our navigation code still used this array and enum, so they were still present. Not anymore! (#4921, #4858, #787, #1599, #323)
    Transition guide:
    • Official backends from 1.87:
      • no issue.
    • Official backends from 1.60 to 1.86:
      • will compile and convert legacy gamepad inputs, unless IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Need updating!
    • Custom backends not writing to io.NavInputs[] (no gamepad support)
      • no issue.
    • Custom backends writing to io.NavInputs[]:
      • will compile and convert legacy gamepad inputs, unless IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Need fixing!
    • TL;DR: Backends should call io.AddKeyEvent() / io.AddKeyAnalogEvent() with ImGuiKey_GamepadXXX values instead of filling io.NavInput[]. The ImGuiNavInput enum was essentially 1.60's attempt to combine keyboard and gamepad inputs with named semantic, but the additional indirection and copy added complexity and got in the way of other incoming work. User's code (other than backends) should not be affected, unless you have custom widgets intercepting navigation events via the named enums (in which case you can upgrade your code).
  • DragInt(), SliderInt(): Removed runtime patching of invalid "%f"/"%.0f" types of format strings. This was obsoleted in 1.61 (May 2018). See 1.61 changelog for details.
  • Changed signature of ImageButton() function: (#5533, #4471, #2464, #1390)
    • Added const char* str_id parameter + removed int frame_padding = -1 parameter.
    • Old signature: bool ImageButton(ImTextureID tex_id, ImVec2 size, ImVec2 uv0 = ImVec2(0,0), ImVec2 uv1 = ImVec2(1,1), int frame_padding = -1, ImVec4 bg_col = ImVec4(0,0,0,0), ImVec4 tint_col = ImVec4(1,1,1,1));
      • used the ImTextureID value to create an ID. This was inconsistent with other functions, led to ID conflicts, and caused problems with engines using transient ImTextureID values.
      • had a FramePadding override which was inconsistent with other functions and made the already-long signature even longer.
    • New signature: bool ImageButton(const char* str_id, ImTextureID tex_id, ImVec2 size, ImVec2 uv0 = ImVec2(0,0), ImVec2 uv1 = ImVec2(1,1), ImVec4 bg_col = ImVec4(0,0,0,0), ImVec4 tint_col = ImVec4(1,1,1,1));
      • requires an explicit identifier. You may still use e.g. PushID() calls and then pass an empty identifier.
      • always uses style.FramePadding for padding, to be consistent with other buttons. You may use PushStyleVar() to alter this.
    • As always we are keeping a redirection function available (will obsolete later).
  • Removed the bizarre legacy default argument for TreePush(const void* ptr = NULL). Must always pass a pointer value explicitly, NULL/nullptr is ok but require cast, e.g. TreePush((void*)nullptr); If you used TreePush() replace with TreePush((void*)NULL); (#1057)
  • Commented out redirecting functions/enums names that were marked obsolete in 1.77 and 1.79 (August 2020): (#3361)
    • DragScalar(), DragScalarN(), DragFloat(), DragFloat2(), DragFloat3(), DragFloat4()
    • SliderScalar(), SliderScalarN(), SliderFloat(), SliderFloat2(), SliderFloat3(), SliderFloat4()
      • For old signatures ending with (..., const char* format, float power = 1.0f) -> use (..., format ImGuiSliderFlags_Logarithmic) if power != 1.0f.
    • BeginPopupContextWindow(const char*, ImGuiMouseButton, bool) -> use BeginPopupContextWindow(const char*, ImGuiPopupFlags)
    • OpenPopupContextItem() (briefly existed from 1.77 to 1.79) -> use OpenPopupOnItemClick()
  • Removed support for 1.42-era IMGUI_DISABLE_INCLUDE_IMCONFIG_H / IMGUI_INCLUDE_IMCONFIG_H. They only made sense before we could use IMGUI_USER_CONFIG. (#255)

Other Changes

  • Popups & Modals: fixed nested Begin() inside a popup being erroneously input-inhibited. While it is unusual, you can nest a Begin() inside a popup or modal, it is occasionally useful to achieve certain things (e.g. some ways to implement suggestion popups #718, #4461).
  • Inputs: Standard widgets now claim for key/button ownership and test for them.
    • Fixes scenario where e.g. a Popup with a Selectable() reacting on mouse down (e.g. double click) closes, and behind it is another window with an item reacting on mouse up. Previously this would lead to both items reacting, now the item in the window behind won't react on the mouse up since the mouse button ownership has already been claimed earlier.
    • Internals: There are MANY more aspects to this changes. Added experimental/internal APIs to allow handling input/shorting routing and key ownership. Things will be moved into public APIs over time. For now this release is a way to test the solidity of underlying systems while letting early adopters adopters toy with internals. (#456, #2637, #2620, #2891, #3370, #3724, #4828, #5108, #5242, #5641)
  • Scrolling: Tweak mouse-wheel locked window timer so it is shorter but also gets reset whenever scrolling again. Modulate for small (sub-pixel) amounts. (#2604)
  • Scrolling: Mitigated issue where multi-axis mouse-wheel inputs (usually from touch pad events) are incorrectly locking scrolling in a parent window. (#4559, #3795, #2604)
  • Scrolling: Exposed SetNextWindowScroll() in public API. Useful to remove a scrolling delay in some situations where e.g. windows need to be synched. (#1526)
  • InputText: added experimental io.ConfigInputTextEnterKeepActive feature to make pressing Enter keep the input active and select all text.
  • InputText: numerical fields automatically accept full-width characters (U+FF01..U+FF5E) by converting them to half-width (U+0021..U+007E).
  • InputText: added ImGuiInputTextFlags_EscapeClearsAll flag: first press on Escape clears text if any, second press deactivate the InputText(). (#5688, #2620)
  • InputText: added support for shift+click style selection. (#5619) [@procedural]
  • InputText: clarified that callbacks cannot modify buffer when using the ImGuiInputTextFlags_ReadOnly flag.
  • InputText: fixed minor one-frame selection glitch when reverting with Escape.
  • ColorEdit3: fixed id collision leading to an assertion. (#5707)
  • IsItemHovered: Added ImGuiHoveredFlags_DelayNormal and ImGuiHoveredFlags_DelayShort flags, allowing to introduce a shared delay for tooltip idioms. The delays are respectively io.HoverDelayNormal (default to 0.30f) and io.HoverDelayFast (default to 0.10f). (#1485)
  • IsItemHovered: Added ImGuiHoveredFlags_NoSharedDelay to disable sharing delays between items, so moving from one item to a nearby one will requires delay to elapse again. (#1485)
  • Tables: activating an ID (e.g. clicking button inside) column doesn't prevent columns output flags from having ImGuiTableColumnFlags_IsHovered set. (#2957)
  • Tables,Columns: fixed a layout issue where SameLine() prior to a row change would set the next row in such state where subsequent SameLine() would move back to previous row.
  • Tabs: Fixed a crash when closing multiple windows (possible with docking only) with an appended TabItemButton(). (#5515, #3291) [@rokups]
  • Tabs: Fixed shrinking policy leading to infinite loops when fed unrounded tab widths. (#5652)
  • Tabs: Fixed shrinking policy sometimes erroneously making right-most tabs stray a little out bar boundaries (bug in 1.88). (#5652).
  • Tabs: Enforcing minimum size of 1.0f, fixed asserting on zero-tab widths. (#5572)
  • Window: Fixed a potential crash when appending to a child window. (#5515, #3496, #4797) [@rokups]
  • Window: Fixed an issue where uncollapsed a window would show a scrollbar for a frame.
  • Window: Auto-fit size takes account of work rectangle (menu bars eating from viewport). (#5843)
  • Window: Fixed position not being clamped while auto-resizing (fixes appearing windows without .ini data from moving for a frame when using io.ConfigWindowsMoveFromTitleBarOnly). (#5843)
  • IO: Added ImGuiMod_Shortcut which is ImGuiMod_Super on Mac and ImGuiMod_Ctrl otherwise. (#456)
  • IO: Added ImGuiKey_MouseXXX aliases for mouse buttons/wheel so all operations done on ImGuiKey can apply to mouse data as well. (#4921)
  • IO: Filter duplicate input events during the AddXXX() calls. (#5599, #4921)
  • IO: Fixed AddFocusEvent(false) to also clear MouseDown[] state. (#4921)
  • Menus: Fixed incorrect sub-menu parent association when opening a menu by closing another. Among other things, it would accidentally break part of the closing heuristic logic when moving towards a sub-menu. (#2517, #5614). [@rokups]
  • Menus: Fixed gaps in closing logic which would make child-menu erroneously close when crossing the gap between a menu item inside a window and a child-menu in a secondary viewport. (#5614)
  • Menus: Fixed using IsItemHovered() / IsItemClicked() on BeginMenu(). (#5775)
  • Menus, Popups: Experimental fix for issue where clicking on an open BeginMenu() item called from a window which is neither a popup neither a menu used to incorrectly close and reopen the menu (the fix may have side-effect and is labelled as experimental as we may need to revert). (#5775)
  • Menus, Nav: Fixed keyboard/gamepad navigation occasionally erroneously landing on menu-item in parent window when the parent is not a popup. (#5730)
  • Menus, Nav: Fixed not being able to close a menu with Left arrow when parent is not a popup. (#5730)
  • Menus, Nav: Fixed using left/right navigation when appending to an existing menu (multiple BeginMenu() call with same names). (#1207)
  • Menus: Fixed a one-frame issue where SetNextWindowXXX data are not consumed by a BeginMenu() returning false.
  • Nav: Fixed moving/resizing window with gamepad or keyboard when running at very high framerate.
  • Nav: Pressing Space/GamepadFaceDown on a repeating button uses the same repeating rate as a mouse hold.
  • Nav: Fixed an issue opening a menu with Right key from a non-menu window.
  • Text: Fixed wrapped-text not doing a fast-forward on lines above the clipping region, which would result in an abnormal number of vertices created (was slower and more likely to asserts with 16-bits ImDrawVtx). (#5720)
  • Fonts: Added GetGlyphRangesGreek() helper for Greek & Coptic glyph range. (#5676, #5727) [@azonenberg]
  • ImDrawList: Not using alloca(), anymore, lift single polygon size limits. (#5704, #1811)
  • Platform IME: [Windows] Removed call to ImmAssociateContextEx() leading to freeze on some setups. (#2589, #5535, #5264, #4972)
  • Misc: ImGuiKey is now a typed enum, allowing ImGuiKey_XXX symbols to be named in debuggers. (#4921)
  • Misc: better error reporting for PopStyleColor() / PopStyleVar() + easier to recover. (#1651)
  • Misc: io.Framerate moving average now converge in 60 frames instead of 120. (#5236, #4138)
  • Debug Tools: Debug Log: Visually locate items when hovering a 0xXXXXXXXX value. (#5855)
  • Debug Tools: Debug Log: Added IO and Clipper events logging. (#5855)
  • Debug Tools: Metrics: Visually locate items when hovering a 0xXXXXXXXX value (in most places).
  • Debug Tools: Item Picker: Mouse button can be changed by holding Ctrl+Shift, making it easier to use the Item Picker in e.g. menus. (#2673)
  • Docs: Fixed various typos in comments and documentations. (#5649, #5675, #5679) [@tocic, @lessigsx]
  • Demo: Improved "Constrained-resizing window" example, more clearly showcase aspect-ratio. (#5627)
  • Demo: Added more explicit "Center window" mode to "Overlay example". (#5618)
  • Demo: Fixed Log & Console from losing scrolling position with Auto-Scroll when child is clipped. (#5721)
  • Examples: Added all SDL examples to default VS solution.
  • Examples: Win32: Always use RegisterClassW() to ensure windows are Unicode. (#5725)
  • Examples: Android: Enable .ini file loading/saving into application internal data folder. (#5836) [@Rewtio]
  • Backends: GLFW: Honor GLFW_CURSOR_DISABLED by not setting mouse position. (#5625) [@scorpion-26]
  • Backends: GLFW: Add glfwGetError() call on GLFW 3.3 to inhibit missing mouse cursor errors. (#5785) [@mitchellh]
  • Backends: SDL: Disable SDL 2.0.22 new "auto capture" which prevents drag and drop across windows (e.g. for multi-viewport support) and don't capture mouse when drag and dropping. (#5710)
  • Backends: Win32: Convert WM_CHAR values with MultiByteToWideChar() when window class was registered as MBCS (not Unicode). (#5725, #1807, #471, #2815, #1060) [@or75, @ocornut]
  • Backends: OSX: Fixed mouse inputs on flipped views. (#5756) [@Nemirtingas]
  • Backends: OSX: Fixed mouse coordinate before clicking on the host window. (#5842) [@maezawa-akira]
  • Backends: OSX: Fixes to support full app creation in C++. (#5403) [@stack]
  • Backends: OpenGL3: Reverted use of glBufferSubData(), too many corruptions issues were reported, and old leaks issues seemingly can't be reproed with Intel drivers nowadays (revert earlier changes). (#4468, #4504, #3381, #2981, #4825, #4832, #5127).
  • Backends: Metal: Use __bridge for ARC based systems. (#5403) [@stack]
  • Backends: Metal: Add dispatch synchronization. (#5447) [@luigifcruz]
  • Backends: Metal: Update deprecated property sampleCount -> rasterSampleCount. (#5603) [@dcvz]
  • Backends: Vulkan: Added experimental ImGui_ImplVulkan_RemoveTexture() for api symetry. (#914, #5738).
  • Backends: WebGPU: fixed rendering when a depth buffer is enabled. (#5869) [@brainlag]

Other branches & Beta features!

The Docking and Multi-viewports features are available in the docking branch, they are in beta but actively maintained and being used by many teams already. Your continuous feedback is always appreciated.

Some of changes from 1.88 to 1.89 related to the docking branch (multi-viewport and docking features) include:

  • Docking: Fixed incorrect focus highlight on docking node when focusing a menu. (#5702)
  • Docking, Nav: Fixed using gamepad/keyboard navigation not being able enter menu layer when it only contained the standard Collapse/Close buttons and no actual menu. (#5463, #4792)
  • Docking: Fixed regression introduced in v1.87 when docked window content not rendered while switching between with CTRL+Tab. [@rokups]
  • Docking: Fixed amending into an existing tab bar from rendering invisible items. (#5515)
  • Docking: Made spacing between dock nodes not a dropping gap. When hovering it only outer-docking drop markers are visible.
  • Docking+Viewports: Fixed undocking window node causing parent viewports to become unresponsive in certain situation (e.g. hidden tab bar). (#5503) [@rokups]
  • Backends: SDL: Fixed building backend under non-OSX Apple targets (e.g. iPhone). (#5665)
  • Backends: SDL: Fixed drag and drop crossing a viewport border losing mouse coordinates. (#5710, #5012)
  • Backends: GLFW: Fixed leftover static variable preventing from changing or re-initializing backend while application is running. (#4616, #5434) [@rtoumazet]

There's a CMake branch/PR (#1713) if you prefer a traditional CMake integration over registering sources files in your own project. There's a premake5 branch if you prefer Visual Studio projects generated by premake.

Gallery

Below a selection of screenshots from Gallery threads...

Tooll 3 - A realtime animation toolkit
https://github.com/still-scene/t3/
tooll-screenshot

Here's a fancy animated UI that's built with an animation library I've been working on. Although it looks complex and hard to implement, the library handles most of the work. @thedemons
image

an IDE, Assembler and Emulator for the CPU Intel 8085
https://github.com/FanisDeligiannis/8085_emulator
8085_emulator

Erhe by @tksuoran
https://github.com/tksuoran/erhe
Erhe

Castle-Engine by @benanil
Castle Engine terrain with grass

imspinner: Set of nice spinners by @dalerank (#5421)
https://github.com/dalerank/imspinner
imspinner

ImExplorer by @immortalx74: "WIP Windows tabbed file explorer replacement. Uses the voidtools Everything SDK for searching and navigating."
imexplorer

Unknown software by @keycccc
008

Fragmenter - animated loop machine by @keszegh
A real-time animation app, using ImGui via the Gideros ImGui plugin:
https://longtitle-productions.itch.io/fragmenter
Fragmenter

Hazel Engine by @TheCherno
https://github.com/TheCherno/Hazel
Hazelnut

Earthblade game editor (upcoming game by the makers of Celeste and Towerfall)
Earthblade Editor

Harfang 3D Engine
https://github.com/harfang3d/harfang3d
harfang-studio-cyber-city

Xpano by @krupkat "I made a tool for stitching photos:"
https://github.com/krupkat/xpano
Main Xpano gui

B.A.M. by @berkayylmao
"a mod/live editor for older Need for Speed games. It uses Dear ImGui with a simple beautifier layer."
https://github.com/berkayylmao/BerkaysAssortedMods
BAM

INO3D by @everaldojunior98
"a 3D environment for circuits simulation."
https://github.com/everaldojunior98/INO3D
INO3D

"Hello friends. Our team who is making a game engine in Com2us uses and loves ImGui. It's really helpful to use ImGui to implement various tools as shown in gallery threads of the other engines. we are really appreciated ImGui. thanks!"
unnamed

Syntacts by @epezent
https://www.syntacts.org/
syntacts_gui

Raytracing off vs. on.
All in software, no RTX:p
And ImGui for everything UI of course!

Engine by @gboisse
5DB3447D-E7FE-4D27-BCDB-561B0C37E834

Torch R&D Prototype at Ubisoft La Forge
https://twitter.com/Ubisoft/status/1582017652557377537
Ubisoft La Forge - Torch mp4_snapshot_00 03_ 2022 10 19_14 01 09

Raven by @jminor
"a user interface for viewing OpenTimelineIO video/audio timelines."
https://github.com/jminor/raven
Raven

And many more in Gallery Threads


PS: Dear ImGui is funded by your contributions and needs them right now.
If your company uses Dear ImGui, consider reaching out today to say hi! See Sponsors page for details.

PS.2: Scroll back up and read that changelog, it is useful!

Don't miss a new imgui release

NewReleases is sending notifications on new releases.