Repository navigation
whats_new.mp4
This is a big release, with 911 commits since v1.92.900: Dear ImGui 1.93, a Markdown library of its own, the node editor on its upstream version, and a renewed Bundle Explorer and playground.
Pictures and videos of the novelties: the release page.
Highlights
- Dear ImGui 1.93.0, with its reworked draw list: crisper shapes. See Dear ImGui 1.93.0.
- A renewed Bundle Explorer and playground: a welcome screen, a gallery of the demos, phones and tablets, light and dark. See The Bundle Explorer and the playground.
- An API reference, with live demos: the book's API pages in Python and C++, and an API tab in the ImGui Explorer. See The API reference.
- RichMd: the markdown renderer becomes a standalone library, with documents, selectable text, Mermaid diagrams and narrative programming. See RichMd, the markdown renderer.
- The node editor on thedmd's v0.9.4, with widgets that work inside nodes. See The node editor.
- Phones and tablets: Hello ImGui turns a finger into the gestures its user expects. See Hello ImGui.
- Wheels for Python 3.15. See Python.
Also new: Stack Layout v2.2 by thedmd (Stack Layout v2.2), and a guide for AI assistants (For AI assistants).
Ctrl+Tab switches windows on the Mac too (GLFW 3.5.1).
Breaking changes
Python and C++:
- The draw list (see Dear ImGui 1.93.0):
ImDrawFlags_.round_corners_xxxbecomeImDrawFlags_.round_xxxImDrawListFlags_is merged intoImDrawFlags_style.curve_tessellation_tolbecomesstyle.curve_tessellation_max_errorstyle.anti_aliased_lines_use_texis removedImFont.add_remap_char()becomesadd_remap_codepoint()
TextFilter:draw()lost its width,TextRangeandcount_grepare removed,draw_with_hint()is new.- Stack Layout: a negative size is relative to the far edge, and a layout scopes the IDs of its items (see Stack Layout v2.2).
- The mouse wheel: in a window that scrolled, a custom widget that reads
io.mouse_wheelno longer sees the wheel, until it claims it withset_item_key_owner(Key.mouse_wheel_y)(see Hello ImGui). - The internal API (
imgui.internal,imgui_internal.h):set/get_font_rasterizer_density()becomeset/get_pixel_density()im_round64()becomesim_round_positive64()orim_round_signed64()- the context hooks
begin_window/end_windoware removed: the node editor uses two window callbacks instead
Python:
- The C++ "text end" parameters leave the API (see Python).
imgui.set_drag_drop_payload(type, data, sz)is removed: useimgui.set_drag_drop_payload_py_id().slider_float2/4,input_float2/4,color_edit3/4andcolor_picker3/4return anImVec2/ImVec4when given one, instead of alist.- Some errors raise
ValueErrororIndexError, instead of aRuntimeError. - Some demos moved:
python -m imgui_bundle.demos_python.demos_immapp.demo_run_asyncand its likes change their path (see the demos).
C++:
ed::Config::SettingsFileis aconst char*again, and thestd::vectorversions ofGetSelectedNodes()and its likes left the fork (see The node editor).- RichMd: the renderer class
imgui_mdis internal: the compatibility header no longer names it (see RichMd). - ImmVision never links OpenCV (see ImmVision).
- The CMake package is named
imgui_bundle, instead ofimgui-bundle(see C++).
Libraries
Dear ImGui 1.93.0
Dear ImGui is updated to v1.93.0, and ImGui Test Engine to its latest version.
- The draw list is reworked: Dear ImGui's widgets look the same or crisper.
- Custom drawing can move by half a pixel. ocornut/imgui#9504 explains how to migrate.
StyleColorsDark()is refreshed: a greyer window background, without transparency.- A drag or a slider edit can be cancelled with a right click or Escape.
- On a touch screen, sliders and drags show their value in a tooltip above the finger (a patch of the bundle, proposed upstream as ocornut/imgui#9575).
Picture: Dear ImGui 1.93.0's release notes.
The draw list: the details
Custom drawing can move by half a pixel:
add_line()lost its half pixel offset.- Closed shapes (rectangles, circles...) are stroked inside by default.
On high density screens (Retina), anti-aliasing and the tessellation of curves follow the framebuffer scale.
New:
add_line_h()andadd_line_v(), for straight lines- stroke flags:
stroke_inside,stroke_center,stroke_outside,stroke_legacy,join_miter,cap_square... push_draw_flag()/pop_draw_flag(), for a scopeio.config_debug_draw_list_defaults_to_stroke_legacy: draws everything as before, to compare
Breaking:
ImDrawFlags_.round_corners_xxxbecomeImDrawFlags_.round_xxx.ImDrawListFlags_is merged intoImDrawFlags_(aa_lines,aa_fill,use_vtx_offset).TextFilter.draw()lost its width: callimgui.set_next_item_width()before it.style.anti_aliased_lines_use_texis removed.ImFont.add_remap_char()becomesadd_remap_codepoint().- In C++, the old names stay unless
IMGUI_DISABLE_OBSOLETE_FUNCTIONSis defined.
style.curve_tessellation_tol becomes style.curve_tessellation_max_error. The new field is in pixels (the old one was in squared pixels): curve_tessellation_max_error = sqrt(curve_tessellation_tol).
imgui.get_style().curve_tessellation_max_error = 1.12 # was: curve_tessellation_tol = 1.25Other changes
imgui.ItemFlags_.mixed_valueshows a mixed value in checkboxes, radio buttons, drags, sliders, inputs, color widgets and combos. See "Widgets / Mixed Values" in the demo.- Disabled color buttons keep their color.
- Test Engine:
TestContext.item_drag_to_pos(),TestContext.item_make_visible(),TestOpFlags_.no_wait_when_moving. Actions on a moving item wait for it to settle.
Stack Layout v2.2
begin_horizontal(), begin_vertical() and spring() follow thedmd's v2.2. It includes the fixes ImGui Bundle carried.
- A negative size is relative to the far edge, as for other widgets. It meant "automatic".
- A layout scopes the IDs of its items, like
push_id(). Settings saved under them (e.g. in imgui.ini) reset once. - A layout clips its content only on the axes given a fixed size.
- Widgets that call
same_line()(drag_float3(),input_int()...) no longer collapse in a horizontal layout.
Stack Layout: the details
- In a horizontal layout, items flow as in a menu bar:
separator()is vertical, andnew_line()starts a new row. ListClipperworks in a vertical layout, tables in a horizontal one.- Decorations at the edge of a layout (the focus rectangle, a selection highlight) are no longer cut.
- New:
imgui.set_next_layout_debug_flags()draws the springs or the items of the next layout. See "Layout & Scrolling / Stack Layout" in the demo. imgui.StyleVar_.layout_alignmoves to the end of the enum: the style vars after it have their stock Dear ImGui values again.- The book's page on Dear ImGui has a new section on these layouts: when to prefer them to
same_line(), their sizes, their IDs.
imgui.begin_horizontal("row", hello_imgui.em_to_vec2(12, 0)) # fixed width: 12 em
imgui.text("A long text which does not fit in 12 em") # now cut at 12 em
imgui.end_horizontal()RichMd, the markdown renderer
The markdown renderer is now imgui_rich_md, a standalone library that works with a stock Dear ImGui.
- Documents:
rich_md.document()shows a long text with a table of contents, a search (Ctrl+F or "/"), anchor links and foldable headings. - Selectable text: select with the mouse, copy with Ctrl+C / Cmd+C, a menu on right click.
- Mermaid diagrams (flowcharts, sequence and class diagrams), drawn natively.
- Widgets in the text:
register_fenced_block_renderer("lang", fn)draws a fenced block of that language. - Narrative programming: a source file carries its own narrative, which
rich_md.render_this_file("Name")renders.
Python code keeps working: imgui_bundle.imgui_md stays, as an alias of imgui_bundle.rich_md.
RichMd: the details
Names:
- Python: the module is
imgui_bundle.rich_md.imgui_bundle.imgui_mdis the same module. - C++: the API is
RichMd::inimgui_rich_md/rich_md.h. The former includeimgui_md_wrapper/imgui_md_wrapper.hand the namespacesImGuiMdandImGuiMicroTeXstay as aliases. - C++, breaking: code that used the renderer class
imgui_md(md4c's client) breaks: that class is internal now. - CMake:
IMGUI_BUNDLE_WITH_IMGUI_MDbecomesIMGUI_BUNDLE_WITH_IMGUI_RICH_MD. The former name still works, with a warning.
Rendering:
- Behavior change:
rich_md.render()removes the common indentation of the text, and resolves its transclusions.render_raw()renders the text as is.render_unindented()stays, as the former name. rich_md.render_folding(): a text folded to its first paragraph, or to<!--more-->.render_file(), andrender_mermaid()for a diagram alone.- Anchor links (
[text](#slug)) scroll to their heading. Wikilinks (on_wiki_link),<center>blocks,<br/>, hidden HTML comments. - A size pushed with
imgui.push_font(None, size)scales the markdown. - Inline formulas wrap like words. An invalid LaTeX formula shows its source in the error color, instead of ending the app.
- Code blocks:
markdownis highlighted as markdown, an unknown language as plain text. A wrap button shows when a line overflows. They follow the indent of quotes and lists, and scroll when long. - A gap between paragraphs.
Selectable text:
- A double click selects a word, a triple click a paragraph.
- The menu: Copy, Copy as Markdown, Select All, Copy Link.
- Links open on release. On a phone, a tap on a link opens it in a new tab.
MarkdownOptions.selectable_text,push_selectable_text()/pop_selectable_text()andset_selectable_text_default()turn it off.
Documents:
rich_md.document(), orbegin_document()/render_document().- With
hello_imgui.prefers_reduced_motion(), a document scrolls without animation.
Narrative programming:
::md Namesections in comments or strings, and transclusions (![[file#Name]]).rich_md.render_this_file("Name")(C++:RICHMD_RENDER_THIS_FILE) renders a section of the calling file, and follows the file when it changes.- The book has a section on it.
Python:
rich_md.set_download_function():MarkdownCallbacks.on_download_datais deprecated.- Contexts:
create_context(),destroy_context(),set_current_context(),get_current_context(). - ImmApp restores the markdown context that was current before
run(), instead of destroying it.
The node editor
The node editor follows thedmd's master (v0.9.4: about 110 fixes, and a test suite), instead of the old develop branch.
- Popups, combos, color pickers, tooltips and context menus work inside the editor without
suspend()/resume(), also between nodes. - Every editor follows the theme, light or dark.
- Zoomed out, links and node borders stay crisp with Dear ImGui 1.93.
- The fork contains nothing specific to ImGui Bundle anymore, and has its own documentation. It builds with a stock Dear ImGui; its popups need two small Dear ImGui patches, which the bundle carries.
The node editor: what changes for an application
get_action_context_nodes()andget_action_context_links()return what a shortcut acts on, betweenbegin_shortcut()andend_shortcut(). For the selection, useget_selected_nodes()andget_selected_links().end_create()may be called after everybegin_create(), or only when it returned true.- A right drag that starts on a widget of a node pans the view.
- Smooth zoom stays on by default.
Style.angled_links(default:True) turns off the routing of links around their nodes, which the bundle's fork already did.- Colors pushed with
ed.push_style_color()beforeed.begin()are now overwritten: push them after it. Config.settings_fileis anOptional[str]:Nonemeans "no settings file".get_selected_nodes(),get_selected_links()and their likes are no longer limited to 1000 elements.- New
ed.get_mouse_pos_on_canvas(): the mouse in canvas coordinates, also where the editor is suspended (e.g. to place a node at the end of a new link). - Python:
NodeId,LinkIdandPinIdare false when null (if ed.get_hovered_node():was always true). Each function has a docstring. - With
Config.force_window_content_width_to_node_width, a node that collapses to one character is reported, with the fix. - Markdown code blocks inside a node are rendered as inline code. Without ImmApp, set
imgui_md.MarkdownCallbacks.can_use_child_windowsyourself. - C++: new
ed::InputTextMultiline(),ImGuiEx::IsInsideCanvas(), anded::SetBeginHook()(called at each editor'sBegin()).
Breaking changes (C++)
ed::Config::SettingsFile is a const char* again, as upstream. The editor keeps the pointer: keep your string alive. Python is not concerned.
static std::string settingsFile = MySettingsFolder() + "/nodes.json"; // must outlive the editor
config.SettingsFile = settingsFile.c_str(); // was: config.SettingsFile = settingsFile;- The
std::vectorversions ofGetSelectedNodes(),GetSelectedLinks(),GetActionContextNodes(),GetActionContextLinks()andGetOrderedNodeIds()left the fork: use upstream's versions, with an array. - The hidden functions
Priv_ImGuiNodeEditor_EnterCanvas() / ExitCanvas() / IsInCanvas()were removed from Dear ImGui: useImGuiEx::IsInsideCanvas().
Hello ImGui
On a touch screen, Hello ImGui turns a finger into what its user expects, with nothing to write in the app:
- a swipe scrolls, with inertia
- a tap clicks, a long press is a right click
- two fingers pinch to scale, or drag together to pan
- a text field opens the phone's keyboard
Also:
- Idling without frozen animations:
hello_imgui.set_item_is_live()andrequest_refresh()keep the full frame rate while content changes by itself. The idle rate is now exactlyfps_idle. - Readable themes: the 17 themes were reviewed. Text cursors, slider grabs, selections, disabled text, borders and tabs read well in each of them.
- The mouse wheel: a wheel that started on a page keeps scrolling it when the mouse passes over a plot or an image.
Touch screens: the details
- A swipe scrolls the content of a window, with a bounce at the end, even when it starts on a button or a text.
- Two taps are a double click.
- A short hold, then a drag, goes to the widget under the finger (a slider, a text selection). A ring shows when the hold took effect.
- A finger still for half a second, then lifted, is a right click.
- The scroll bars are thin indicators. A hold on a bar hands its thumb over, as on iOS.
- Two fingers that move together are a right drag (the pan of a node editor, the box selection of a plot).
- The keyboard: an active text widget shows a keyboard button. The keyboard serves any widget that wants text (the code editor too), stays open when a tap moves the caret, and comes back after iPadOS or Android hid it.
hello_imgui.set_item_takes_touch_drags(): a plot, a canvas or a node editor takes a finger's drag at once, without the hold.hello_imgui.set_tap_opens_url(): in a browser, a tap opens a URL in a new tab.- ImPlot's drag tools get finger-sized grabs, ImmVision pans an image at once, the command palette fits a phone.
- The settings:
RunnerParams.touch_scroll_mode,touch_long_press_is_right_click,touch_pinch_mode,touch_pinch_interrupts_widgets,touch_thin_scrollbars. - The demo "Touch screens (phones, tablets)" shows every gesture. On a desktop, its "Simulate a touch source" checkbox plays the finger with the mouse.
Idling, themes, the mouse wheel: the details
- Idling: in a browser,
fps_idle = 30gave 20 or 30 frames per second; it gives 30. The book's page on Hello ImGui has a section on idling. - Themes: they start from Dear ImGui's dark or light colors. The light themes drew the text cursor white on white. A held slider's grab stands out. SoDark and BlackIsBlack dim the background of modals neutrally.
- The mouse wheel: a wheel that starts on the item is the item's.
RunnerParams.wheel_session(default:True) turns the behavior off. - The mouse wheel, behavior change: a custom widget that reads
io.mouse_wheelclaims it withimgui.set_item_key_owner(imgui.Key.mouse_wheel_y), as ImPlot and ImmVision do. Without the claim, in a page that scrolls, it never sees the wheel.
New functions, the web, SDL, Vulkan
hello_imgui.save_lasting_pref()/load_lasting_pref(): preferences kept outside the ini file, so that a reset of the layout keeps them (in the browser's local storage on the web).hello_imgui.prefers_reduced_motion(): the system's "reduce motion" setting, on macOS, iOS, Windows and the browser.hello_imgui.load_image_data_from_encoded_data(): decodes an image file's bytes, without OpenCV.- The web:
- In a browser on a Mac, Cmd acts as Ctrl in every widget (Cmd+C copies).
- The canvas follows Safari's page zoom.
- A demo opened in a popup window takes the app's window size.
- The page's icon is the app's icon.
- SDL (C++): the DPI scale comes from the display that holds the window, instead of the first display.
- Vulkan:
- a texture is destroyed only once the device is idle (an app could end with
VK_ERROR_DEVICE_LOST) fps_idling.vsync_to_monitorand screenshots are implemented- Vulkan errors raise an exception with the name of the
VkResult, instead of callingabort() - new CMake option
HELLOIMGUI_VULKAN_VALIDATION
- a texture is destroyed only once the device is idle (an app could end with
GLFW 3.5.1
The desktop Python wheels use GLFW 3.5.1 (was 3.4). C++ builds without a system GLFW download it too (was 3.3.8).
- On the Mac, Ctrl+Tab now reaches the app: Dear ImGui's window switcher works there too. Hold Ctrl and press Tab to go through the windows (Shift+Tab goes back), then release Ctrl to focus one. It already worked on Windows and Linux.
- Also: fixes for X11 and Wayland, and Windows XP and Vista are no longer supported. See GLFW's changelog.
ImmVision
- RGB is the default color order:
immvision.use_rgb_color_order()is no longer needed. BGR images (OpenCV) still needimmvision.use_bgr_color_order(). - A negative display size is the remaining space, as ImGui's item widths:
(-1, 0)takes the window's width, and the height from the aspect ratio. ImageParams.image_to_screen()andimage_screen_top_left: draw over a displayed image.- On a phone: a finger pans an image at once, and the inspector fits the screen.
Breaking change (C++): ImmVision never links OpenCV
- The
cv::Matconversions are header-only. - An application that passes
cv::MatdefinesIMMVISION_HAS_OPENCV, and links OpenCV itself. IMMVISION_FETCH_OPENCVonly provides a minimal OpenCV tofind_package(OpenCV). On Windows, it builds OpenCV from source: the precompiledopencv_worldpack is removed.
find_package(OpenCV REQUIRED)
target_compile_definitions(my_app PRIVATE IMMVISION_HAS_OPENCV)
target_link_libraries(my_app PRIVATE opencv_core)Other libraries
- ImGuiColorTextEdit, updated to upstream's
master: East Asian wide glyphs, custom line numbers, whole word search, squiggles. - ImAnim, updated to upstream's
main: grid stagger, delays, loop and pause callbacks, two tween policies. - ImPlot and ImPlot3D in ImmApp follow the DPI factor: on a screen at 150% or 200% (Windows, Linux), a plot of the default size scales like the widgets around it (#501). The line weights and marker sizes of the plotted items stay in pixels.
- immapp:
immapp.start_download()starts an HTTP request in the background, andimmapp.decode_image()decodes an image file's bytes without OpenCV. - imgui_toggle reads like a checkbox in every theme. ImGuizmo, imspinner and ImPlot3D are updated.
Other libraries: the details
ImGuiColorTextEdit:
- East Asian wide glyphs take two grid cells.
- New:
set_custom_line_number_renderer(),set_text()from a list of lines,find_word_start()/find_word_end(),is_mouse_pos_over_text_area(),doc_pos2_screen_pos(). - Squiggles:
add_squiggle(..., style=SquiggleStyle.background). set_find_replace_enabled(),set_show_current_line_highlight_enabled().- A
whole_wordoption onadd_next_occurrence()/select_all_occurrences().scroll_to_line()centers the line by default. - Smooth scrolling, off by default:
set_smooth_scrolling_enabled()/is_smooth_scrolling_enabled().scroll_to_line()then glides to its line. clear_change_callback()/clear_transaction_callback()deactivate a callback.- Fixes: a focused editor captures the keyboard again, the IME window sits at the cursor, a read-only editor no longer opens a phone's keyboard, the fold chevrons are whole without line numbers. Upstream: a crash on empty text, the double click word selection, the autocomplete window, more editing shortcuts.
ImAnim:
- grid stagger:
stagger_grid_opts,stagger_grid_delay() play_with_delay(),clip.set_stagger_ease(),clip.set_loop_delay()- the callbacks
clip.on_loop()andclip.on_pause() instance.restart()/reset()/refresh()- the tween policies
policy.additiveandpolicy.multiply
immapp:
immapp.start_download(url, method, json_body, timeout_s, headers): a thread on the desktop, a fetch in the browser. The GUI looks at the result'sdoneat each frame, then at itsstatus,dataanderror. See the book's page on async Python.immapp.download_url_bytes()anddownload_url_bytes_async()gaintimeout_s.immapp.decode_image(bytes, channels=3), also in Pyodide.with_im_animworks inmanual_render(Pyodide) and inimmapp.testing.run().immapp.testing.run()needs nogui_functionwhen givenrunner_params.capture_final_frame()takesadd_ons_params.
The others:
- imgui_toggle: without a palette, "on" takes the theme's check mark color, and the toggle draws the style's frame border (merged upstream).
- ImGuizmo: upstream fixes (
SetRect's maximum y, the tripod of multiple views). imspinner: updated. - ImPlot3D: its lines render right with Dear ImGui 1.93, without blur on Retina.
- imgui-command-palette: usable on a phone, its list above the keyboard.
- imgui_explorer:
set_imgui_explorer_libraries()picks the libraries an app shows.
Python
- Wheels for Python 3.15, on the same platforms as the other versions (#502). The wheels now cover Python 3.11 to 3.15.
imgui.begin_simple(name, flags):begin()for a window without a close button, which returns a bool.begin()returns two values, soif imgui.begin(...):was always true.- ImmVision, and ImPlot's
plot_heatmap()andadd_colormap(), accept read-only numpy arrays, such asnp.asarray()of a Pillow image ornp.frombuffer(). They raised "incompatible function arguments". slider_float2/4,input_float2/4,color_edit3/4andcolor_picker3/4return anImVec2/ImVec4when given one, as the stubs said.- The C++ "text end" parameters leave the API: a Python string passed there made C++ read from an unrelated address (#498).
Python: the details
color = imgui.ImVec4(1, 0, 0, 1)
changed, color = imgui.color_edit4("color", color) # color is still an ImVec4 (was a list)Lists and tuples still return a list.
The "text end" parameters removed:
text_endinimgui.text_unformatted(),imgui.calc_text_size(),ImDrawList.add_text(),ImFont.render_text(),ImFontGlyphRangesBuilder.add_text(),InputTextCallbackData.insert_chars(),TextFilter.pass_filter(),TextBuffer.append(), the test engine'sTestContext.item_info_handle_wildcard_search(), and the internal API- the two-string overloads of
push_id()andget_id() imgui.internal.separator_text_ex(): it shows the label up to its##, asseparator_text()does
A call that passed None as the end must drop it.
Arrays: empty and one-element arrays pass the buffer check, whatever their stride (about 60 functions, mostly ImPlot's). A fix of litgen, by Clay Dugo.
The stubs:
- a docstring for each module (what it is for, then the notes for Python users)
- the original C++ signatures in eleven more stubs
- their comments name the Python API (
imgui.push_id(),RunnerParams.callbacks.show_menus), instead of the C++ one imgui.begin(),menu_item()andbegin_tab_item()document their results, and point to their_simpleversions
The extras: [full] no longer installs PyGLM (the ImGuizmo demo does without it), and [pyglet] needs pyglet 2.0.10 or later.
Source builds work with nanobind 3.
The Pyodide wheel stays on Python 3.14.
Web: the explorers, the playground and the docs
The Bundle Explorer and the playground
The Bundle Explorer and the playground were reviewed from end to end, and look much nicer:
- One welcome screen for both: a carousel of eleven live slides (plots, a GPU shader, the Lorenz attractor, a neural network, images, a node editor, markdown...), then a button to the demos.
- A gallery of the demos, by category, with their pictures, a search box and a library filter. Each demo shows its code, and runs in place.
- Phones and tablets: one pane at a time (Demo or Code), and every demo checked on a phone.
- Light and dark: a theme switch in the header.
- New demos: a tiny neural network that learns two spirals, a WebAudio synthesizer, "Plotting with Python" (Matplotlib, Seaborn, Cartopy), and interactive manuals of Dear ImGui, ImPlot, ImPlot3D and ImAnim.
The Bundle Explorer and the playground: the details
- The same gallery in the Python and C++ explorers, and in the playground. It replaces the explorer's former tabs (Dear ImGui, Demo Apps, Visualization, Widgets, Tools).
- The browser's back and forward buttons move in the web explorer, and a link can open a demo.
- The explorers remember the choice of C++ or Python.
- The playground:
- besides light and dark, a "..." menu with Hello ImGui's 17 themes, and A- / A+ buttons for the font size
- the desktop-only demos are listed too, with a "Desktop only" tag: a click shows their code, their picture, and how to run them
- the error window shows the whole traceback, across the bottom of the page
- a demo runs from its own folder, so that it can import its sibling files
The test engine in the browser (Pyodide):
- The ImGui Test Engine runs in the browser, with the same Python API as on the desktop.
- It needs Chrome 137, Firefox 153 or Safari 27. In an older browser, the app runs without the engine, and says so.
- In the browser,
immapp.testing.run()returns at once, keeps the app open after the test, and prints the result. - The demo of scripted runs,
demo_testapp, is renameddemo_immapp_testing(desktop only).
The demos: new, moved, removed
New:
- "A tiny neural network learns two spirals": it trains live, and tells its story with narrative programming.
- Two apps:
- The rotor run-up monitor: a vibration-analysis dashboard, with live plots, knobs, and a node editor for the signal chain. Toggle a bearing defect, and watch it in the spectrum and the spectrogram.
- Health and wealth: the nations from 1800 to 2100 in animated bubbles, after Hans Rosling's Gapminder. The data is fetched live. On the way, cards tell the events behind the curves (the 1918 influenza pandemic, the eradication of smallpox...).
- They serve as examples of what can be obtained with AI assistance, from llms.txt.
- The WebAudio synthesizer (a piano, tunes, a scope) replaces the minimal beep.
- "Plotting with Python": a Matplotlib phase portrait, Seaborn, Cartopy.
- The node editor: a color mixer and an image pipeline, in Python and C++.
- RichMd: a document (
demo_imgui_md_document) and a markdown editor, in Python and C++. - C++ versions of "What is an Immediate GUI", the resizable panels and the dockable windows.
demo_powersave, redone: a live plot and the pace of the frames show what idling does.- Now in the browser too: ImGuizmo, docking, pydantic, Chinese fonts, async.
Moved and renamed:
- The Python-specific demos moved to
demos_python_specifics/(demo_run_async,demo_pydantic,demo_glfw_window_manip,demo_python_context_manager;demo_matplotlibtoplotting/). - A demo's function is
gui()in Python (wasdemo_gui()), andgui_<file name>()in C++.
Removed:
- the node editor's former demos (
demo_node_editor_basic,demo_romeo_and_juliet) and launcher - four ImmVision demos (contours, laplacian, the Mandelbrot inspector, no_opencv)
demo_implot(ImPlot's manual is in the explorer) anddemo_imgui_show_demo_window- in the playground: the "Full Demo" entries (now the interactive manuals),
immvision.py,implot3d_butterfly.py,landing_page.py: their old?demo=links no longer open
The API reference
- The book's API pages: the functions, structs and enums of all the bundle's libraries, with their Python and C++ signatures and their documentation. See the API reference.
- Live demos in the API pages: 450 entries of Dear ImGui, ImPlot and ImPlot3D show the demo that uses them: its picture, its code, and a link to run it.
- The ImGui Explorer's API tab: in the ImGui Explorer, the interactive manuals of Dear ImGui, ImPlot and ImPlot3D, click an identifier in the code. Its card shows its Python and C++ signatures, its doc, and the demo lines that use it.
The API reference, and the ImGui Explorer: the details
- The API pages are generated from the bundle's Python stubs, with a page per library, in Python and in C++.
- In the API pages, the demo's code is in the page's language.
- Each entry links to the demo section that shows it best (
input_text_multiline()to "Multi-line Text Input"). - The API tab: the card of an entry ("Go to declaration", links to its online pages, "In the demo"), API tooltips, and the list of all the entries, with a filter.
- The ImGui Explorer also gets an outline of the demo, a "Search the demos" field, and a breadcrumb above the code, with "Show demo".
- On a phone, it shows one pane at a time.
- A link opens a section of a manual (
?lib=implot&demo=Plots/Line Plots, and&lang=python), and "Copy link to this demo" gives it.
For AI assistants
Give your AI assistant the bundle's guide: it will know how to help you write apps with Dear ImGui Bundle, in Python or C++.
- The guide: llms.txt, also in the book ("For AI assistants").
- With it, an assistant can check its own work:
- with screenshots of the app
- by driving the GUI with the ImGui Test Engine (it has its own license)
- also in a headless Linux sandbox, with Xvfb
- The whole book, in plain text: llms-full.txt.
- The API in plain text, with the demos' code in Python and C++: llms/api. The demos and the explorers: llms/demos.txt, llms/explorers.txt.
- Two of the playground's new apps were built in a chat, from llms.txt alone: the rotor run-up monitor and "Health and wealth".
- The assistant checked its work with its own screenshots.
The book and the site
- A page of all the demos, by category, with their pictures and links to run them or read their code.
- New sections: idling, the stack layouts, RichMd's documents, narrative programming, asyncio in the browser, fonts and images in Python.
- "Examples and Gallery" becomes "Made with Dear ImGui Bundle": apps built with the bundle.
The book and the site: the details
- Links to the ImGui Explorer reuse one browser tab.
- The book no longer scrolls sideways on a phone.
- Link previews (the picture and the text a chat or a social network shows) for the playground and both explorers.
- The explorers' pages have a title and text while they load, and unknown addresses answer a 404 page.
C++
- The CMake package is named
imgui_bundle(wasimgui-bundle):find_package(imgui_bundle CONFIG REQUIRED), thenimgui_bundle_add_app(...). cmake --installproduces one relocatable package, with Hello ImGui and all the bundled libraries.
C++: the details
- After
find_package():imgui_bundle_add_app(...), ortarget_link_libraries(app PRIVATE imgui_bundle::imgui_bundle). - The package is in
lib/cmake/imgui_bundle/, with all the libraries under theimgui_bundle::namespace. A CMake preset,cpp_package, builds and installs it. - The app template (
imgui_bundle_template) builds against an installed package whenimgui_bundle_DIRis set. - Hello ImGui's package is now
hello_imgui(washello-imgui): the former name still works, through a deprecated shim. - plutovg and plutosvg are git submodules of Hello ImGui, no longer downloaded at configure time. They are in the
srcs-fullrelease archive. - When a needed submodule is missing, the configure step initializes it.
- Packagers (conda, vcpkg, distributions):
HELLOIMGUI_USE_SYSTEM_PLUTOSVG=ONlinks an installed plutosvg. It is on underCONDA_BUILD. The license texts ship beside the fonts. - On MSVC,
imgui_bundle_add_app()compiles the sources as UTF-8 (/utf-8). - Web apps (Emscripten):
HELLO_IMGUI_SHELL_HEADadds lines to the page's<head>(e.g. link previews), andHELLO_IMGUI_SHELL_LOADING_TEXTadds text under the loading spinner.
Fixes
The Python bindings
ImDrawData.cmd_lists_countis back, read-only. Its removal in v1.92.900 broke third party renderers, such as wgpu's.imgui.set_window_focus("window name")crashed.imgui.set_window_focus(None)removes the focus.imgui.color_picker4()accepts a list, and itsref_colis a list of 4 floats.ImColor.to_dict()returned the red component for all keys.ImColor.from_dict()returned anImVec4.imgui.internal.input_text_ex()rejected every call.imgui.get_clipboard_text()crashed with an empty clipboard and no backend. It returns""then.- An exception raised in a Python clipboard callback is reported, instead of unwinding through Dear ImGui.
ImFont.calc_word_wrap_position_python()returns an index in thestr, instead of an offset in the UTF-8 bytes.imgui.internal.get_current_window()raises an exception outside a frame, instead of crashing.- Stubs: the default of
formatarguments reads"%.3f"(it was cut to"%.3"). immapp.runnable_code_cell: its cells lost their results on Python 3.13 and later. A function result now runs as a live GUI.- The same
RunnerParamscan run twice (hello_imgui.run(),immapp.run(),immapp.manual_render()), e.g. when a notebook cell runs again. The second run measures the DPI factor again (e.g. on another screen). immapp.manual_render: the app's Python callbacks are released at the teardown. They stayed alive until the next setup.
The node editor
- On Dear ImGui 1.93, the hover and selection outlines show again, and the grid lines stay sharp.
- On Dear ImGui 1.93, zoomed out: links and node borders stay at least one point wide, with a softer edge. Thin links faded, and wavered from one row of pixels to the next.
- At 100% zoom, text and borders stay sharp on screens with one pixel per point (#497).
- A link's bounds no longer rely on undefined behavior, which an optimizing compiler could break (thedmd/imgui-node-editor#344).
Hello ImGui, ImmVision, and the others
- Hello ImGui:
- A malformed
hello_imgui.inino longer stops the app at every start: its malformed part is ignored. - A new app starts after an app whose setup failed. The next app failed with "Already initialized a platform backend!" (in the playground: every example, until a reload).
hello_imgui.load_user_pref()gives back the value saved bysave_user_pref(). It came back with a trailing newline from the second run on.hello_imgui.save_user_pref(): a value with lines that look like the file's own markers comes back intact (it came back cut). An empty name is refused.- The log window's level buttons are readable in dark and light themes. The "Error" filter was red on red.
- Window positions with negative coordinates (a monitor left of the main one) are restored (pthom/hello_imgui#168).
ImGuiTheme.apply_theme()works again withouthello_imgui.run(), andtheme_to_style()no longer changes the current style.- Screenshots with OpenGL swapped the two middle rows of an image of even height.
- The installed CMake package announced version 1.92.700.
- A malformed
- ImmVision:
- Its icon buttons were invisible in a light theme.
- The params JSON raises an error:
- on a zoom matrix that lacks a key (it read past the end)
- on an int field out of range
- NaN pixels (a depth map's holes, masked data) show as the scale's minimum. With a colormap, they read out of its bounds.
- The Inspector skips an empty image, instead of dividing by zero.
- On the web, RichMd and
ImmApp::BrowseToUrl()(C++) escape a link before opening it. Before:- a quote in a markdown link ran as JavaScript
- a link over about 460 characters was cut
immapp.show_python_code()follows the theme.- MicroTeX:
\sqrtor an argument without braces no longer aborts a web build (C++). - NanoVG in the browser: the font atlas lost the glyphs of later uploads.
- pyglet: blank rendering with pyglet 2 is fixed, and the system clipboard is used. The mouse wheel scrolled the wrong way, and the horizontal scroll was lost.
- pygame: copy, cut, paste, select all, undo and redo work, with the system clipboard, and double clicks are detected.
For contributors
AGENTS.mdgives the rules for AI coding agents working on the bundle, and.claude/skills/six skills for them (screenshots of a GUI or a web build, the bindings, the forks).
Thanks
This release owes a lot to:
- Omar Cornut (@ocornut), for Dear ImGui 1.93, and his feedback on Dear ImGui Explorer and the bundle in general.
- Mikko Mononen (@memononen), for the main work on Dear ImGui 1.93's new draw list.
- Michał Cichoń (@thedmd), for Stack Layout v2.2, and for imgui-node-editor v0.9.4, with its test suite.
- Breno Cunha Queiroz (@brenocq), for ImPlot3D's lines on Dear ImGui 1.93 (brenocq/implot3d#195).
- Clay Dugo (@claydugo), for the buffer check of empty and one-element arrays, in litgen (pthom/litgen#48).
- Johan Goossens (@goossens), cmd.wtf (@cmdwtf) and dalerank (@dalerank), who merged our changes into ImGuiColorTextEdit, imgui_toggle and imspinner.
- The users who reported issues: Diederick C. Niehorster (#501), Kushal Kolar (#491, who asked for API docs), Gabriel Tremeschin (#502), @drongh-bot (#497), Tal (#498), @meinradr (pthom/hello_imgui#168) and Diego Mateos (pthom/hello_imgui#169).
In return, the bundle sent 20 pull requests to the libraries it uses: 10 merged, 8 open, and 2 whose fixes thedmd folded into Stack Layout v2.2.
The pull requests sent upstream
- Dear ImGui:
- merged: ocornut/imgui#9582 and #9586 (the demo's markers)
- open: #9575 (the value of sliders and drags in a tooltip, on a touch screen), #9587 (the mouse wheel's lock), #9588 (window callbacks, for the node editor's popups)
- imgui-node-editor, open: thedmd/imgui-node-editor#343 (popups inside a canvas), #344 (undefined behavior in a link's bounds), #345 (a pan from a widget of a node)
- Stack Layout: thedmd/imgui#9 and #10, closed, their fixes in v2.2
- ImGuiColorTextEdit, merged: goossens/ImGuiColorTextEdit#92, #93, #94, #95
- imgui_toggle, merged: cmdwtf/imgui_toggle#24, #25
- imspinner, merged: dalerank/imspinner#37
- MicroTeX, open: NanoMichael/MicroTeX#195, #196
- wgpu-py's imgui backend, merged: pygfx/wgpu-py#837
