Releases: pthom/imgui_bundle
Release list
v1.92.900
Updated Dear ImGui to v1.92.9b
See release info for v1.92.9 and v1.92.9b
(includes the post-release fix for ImDrawData::CmdListsCount).
Behavior change: keyboard edits of scalar widgets apply on validation
Typing a value into InputInt, InputFloat, DragXXX or SliderXXX no longer writes intermediate values to the backing variable at each keystroke: typing "123" now yields a single change to 123 on Enter / tab-out / deactivation, instead of 1, then 12, then 123. In Python:
changed, value = imgui.input_int("int", value) # changed becomes True on validation onlyText inputs keep the previous behavior. Both are configurable via the new imgui.ItemFlags_.live_edit_on_input_scalar / live_edit_on_input_text with imgui.push_item_flag(); see "Widgets/Live Edit Flags" in the demo.
Breaking changes
imgui.set_color_edit_options(flags)was removed: writeimgui.get_io().config_color_edit_flags = flagsinstead.imgui.DragDropFlags_.source_auto_expire_payload(obsoleted in 2024) was removed: usepayload_auto_expire.
Other additions
imgui.open_popup()andimgui.open_popup_on_item_click()now return a bool (True when the popup was just opened).imgui.get_item_clicked_count_with_single_click_delay()andio.mouse_single_click_delay: disambiguate single-click from double-click.imgui.ColorEditFlags_.picker_no_rotate: fix the S/V triangle in the hue-wheel picker.- Settings aging: ini entries record their last-used date;
io.config_ini_settings_auto_discard_monthscan discard stale ones (see alsoio.config_ini_settings_save_last_used_date).
New: terminal emulator widget for Python (imgui_bundle.imgui_terminal)
A pyte-based terminal emulator widget, usable in any ImGui Bundle app:
TerminalViewrenders a VT100 screen and handles keyboard and mouse input: word/line selection, right-click paste, Alt as Meta, and correct handling of modified keys (Shift-Tab, Ctrl-Space, modified arrows).- A transport feeds bytes to the view:
LocalShellTransportruns a local shell behind a pty (POSIX); the demos add SSH and websocket transports implementing the same two-methodTerminalTransportprotocol. - Requires the
pytepackage:pip install "imgui-bundle[terminal]". - See
demo_terminal.pyin the demo launcher (tab bar with multiple sessions, confirm-exit dialog), anddemos_python/demos_terminal/for the local shell, SSH and websocket variants.
New: context managers for ImPlot (imgui_bundle.implot_ctx)
Python-only, in the same spirit as imgui_ctx: implot_ctx wraps the begin/end and push/pop pairs of ImPlot, so the matching end_*()/pop_*() is called automatically.
from imgui_bundle import implot, implot_ctx
with implot_ctx.begin_plot("My Plot") as plot:
if plot: # the plot may be collapsed or clipped
implot.plot_line("cos", x, y)
with implot_ctx.push_colormap(implot.Colormap_.cool):
... # no need to test the value of the push_* context managersAvailable for create_context, begin_plot, begin_subplots, push_style_color, push_style_var, push_colormap and
push_plot_clip_rect.
See demo_python_context_manager in the demo launcher. Contributed by @zaicruvoir1rominet (#473).
Updated bundled libraries
-
ImGuiColorTextEdit:
- followed upstream's merge of its
futurebranch. - Breaking:
render()lost itsborder: boolparameter, replaced bychild_flags: ImGuiChildFlagsandwindow_flags: ImGuiWindowFlags(a formerrender(id, size, False)call becomesrender(id, size)). - Also adds configurable left margins (
set_line_number_left_margin,set_decoration_left_margin,set_text_left_margin) - improved minimap rendering (width is now automatic, tunable via
set_mini_map_columns).
- followed upstream's merge of its
-
imgui-node-editor:
- configurable background grid size via
StyleVar.grid_size(#470) - fixed incomplete rendering of popups.
- Via the bundled ImGui patch, multiline text inputs inside the editor now render a preview box with a resizable edit popup.
- configurable background grid size via
-
Hello ImGui:
- new
runner_params.callbacks.confirm_exit(return False to cancel an exit request). - HighDPI font scaling now goes through
style.font_scale_dpiinstead of multiplying font sizes at load time (finalizes the ImGui 1.92 transition). asset_file_full_pathalso searches the current folder.- added BeforeSwap callback.
- new
-
imspinner: updated to the 2026 version, with many new spinners (#483).
-
ImGuizmo: upstream bug fixes (gizmo jitter, multi-view,
is_overfor SCALEU, disappearing translation axis). -
ImPlot3D: legend scrolling.
-
imgui_toggle: build fix against recent ImGui merged upstream (our fork now carries no patches).
-
ImGui Test Engine: updated (test-suite amendments for the LiveEdit change).
-
ImmVision: added ImageInterpolationMode setting
Python API: behavior changes and fixes
-
ImPlot / ImPlot3D:
- mismatched dtypes now raise.** Plot functions that take several numeric arrays (e.g.
implot.plot_scatter(xs, ys)) now raise a clear error when the arrays have different dtypes, instead of silently reinterpreting one array's bytes (an int64 index plotted against float64 values used to collapse to x=0). The error names both dtypes and suggests.astype(...)(#467). - ImPlotSpec / ImPlot3DSpec array fields fixed (#484): the
line_colors,fill_colorsandmarker_*setters stored only a raw pointer, so a temporary array could be garbage-collected before rendering (wrong colors or crash), and the getter returned a pointer address instead of the array. Arrays are now kept alive for the Spec's lifetime, and the getter returns the ndarray.
- mismatched dtypes now raise.** Plot functions that take several numeric arrays (e.g.
-
ImPlot:
imgui_ctx.push_font: thefont_size_base_unscaledparameter is now mandatory, in line withimgui.push_fontsince ImGui 1.92.
-
immapp.testing.run: test engine failures (e.g. "Unable to locate item") now raise aRuntimeErrorcarrying the engine log, instead of being silently swallowed (newraise_on_error=Trueparameter); engine errors are also
printed live to the terminal. -
imgui_fig(matplotlib figures): works with any matplotlib backend (no need to callmatplotlib.use("Agg")anymore), fixes a crash with animated figures on matplotlib 3.11, and captures HiDPI/retina figures at the correct size.
Alpine linux wheels (musllinux): fixed ImportError
- musllinux (Alpine) wheels could not be imported at all (
Error relocating ...: glPopAttrib: symbol not found): musl's loader resolves all symbols at import time, and the wheel was missing its libGL link. musllinux wheels are now built without the legacy OpenGL2 python backend (ImGui_ImplOpenGL2_*bindings), removing the link-time OpenGL dependency; the OpenGL3 backend is unaffected.
Pyodide: switched to Pyodide 314 (Python 3.14); wheels now published on PyPI
- The Pyodide wheel now targets Pyodide 314.x: Python 3.14, Emscripten 5.0.3, wheel tag
cp314-cp314-pyemscripten_2026_0_wasm32. - Thanks to PEP 783, Pyodide wheels are now published on PyPI (starting with v1.92.801): in a Pyodide 314+ environment,
micropip.install("imgui-bundle")installs imgui_bundle directly from PyPI. - The playground and the minimal sample were updated accordingly.
Demos
demo_chinese_font(Python + C++): how to display non-Latin text (Chinese glyphs, font loading).demo_glfw_window_manip(Python): manipulate the native GLFW window of an immapp application (maximize, center, opacity, request attention).
New Contributors
Full Changelog: v1.92.801...v1.92.900
v1.92.801
v1.92.800
v1.92.800
Updated Dear ImGui to v1.92.8
Breaking changes: add_rect, add_polyline, path_stroke argument order
Dear ImGui v1.92.8 swapped the last two arguments of three ImDrawList
drawing functions so that thickness (which is set explicitly far more
often than flags) comes first. The bindings track this change.
For Python users — the affected methods on imgui.ImDrawList:
| Method | Old signature | New signature |
|---|---|---|
add_rect |
(p_min, p_max, col, rounding, flags, thickness) |
(p_min, p_max, col, rounding, thickness, flags) |
add_polyline |
(points, col, flags, thickness) |
(points, col, thickness, flags) |
path_stroke |
(col, flags, thickness) |
(col, thickness, flags) |
If you use only positional arguments and pass 5+ of them, swap the last two:
# Before
draw_list.add_rect(p0, p1, col, rounding, imgui.ImDrawFlags_.none.value, 1.5)
draw_list.path_stroke(col, imgui.ImDrawFlags_.closed.value, thickness)
# After
draw_list.add_rect(p0, p1, col, rounding, 1.5, imgui.ImDrawFlags_.none.value)
draw_list.path_stroke(col, thickness, imgui.ImDrawFlags_.closed.value)Old-order calls will not silently misrender — they are caught by one of three
mechanisms:
- Static type-check (recommended). Running
mypyorpyrightonce
after upgrading flags every call that passes a float literal where the
new signature expectsflags: int:Argument of type "float" cannot be assigned to parameter "flags" of type "ImDrawFlags" in function "add_rect" - Runtime, float thickness. pybind11 refuses to convert
float→int,
soadd_rect(..., flags=ALL, thickness=2.0)written in the old order
raisesTypeErrorimmediately. - Runtime, int thickness. When both arguments are ints (e.g.
thickness=2), the swapped value lands inflagsand trips ImGui's own
guard(flags & ImDrawFlags_InvalidMask_) == 0, raising:The mask reserves bits 0-3 specifically to catch this swap: any smallRuntimeError: IM_ASSERT(... "Incorrect parameter. Did you swapped 'thickness' and 'flags'?")
integer thickness ends up with bits 0-3 set, while every valid flag uses
only bits 4-9.
In practice this covers every realistic old-order call site, so no extra
detection layer is added on the Python side.
For C++ users — same swap on ImDrawList::AddRect, ImDrawList::AddPolyline
and ImDrawList::PathStroke. See the upstream ImGui v1.92.8 changelog for
the full rationale; the short version is that the typical call site changes
from:
// Before
draw_list->AddRect(p_min, p_max, col, rounding, ImDrawFlags_None, border_size);
// After
draw_list->AddRect(p_min, p_max, col, rounding, border_size);When IMGUI_DISABLE_OBSOLETE_FUNCTIONS is off (the default), ImGui keeps an
inline redirection so old call sites still compile; with it on (as in the
ImGui Bundle Python build), the old overloads are =delete, surfacing
mistakes at compile time.
Updated ImGuiColorTextEdit (architecture refactor)
ImGuiColorTextEdit was rebased on its upstream future branch, which
introduces a layered architecture (Document / TypeSetter / Colorizer /
Bracketeer / LineFold / MiniMap / AutoComplete overlays) and lays the
groundwork for word wrap, line folding, and a VSCode-style minimap.
The public C++ API changed in ways that propagate to the Python bindings.
All cursor/selection coordinates now go through dedicated structs instead
of (line, column) integer pairs, and column is renamed to index in
the document-coordinate struct (rows differ from lines once word-wrap is
enabled).
Breaking changes: TextEditor API
For Python users — the most common call sites:
| Before | After |
|---|---|
editor.get_main_cursor_position().column |
editor.get_main_cursor_position().index |
editor.set_cursor(line, col) |
editor.set_cursor(TextEditor.DocPos(line, col)) |
editor.select_region(sl, sc, el, ec) |
editor.select_region(TextEditor.DocPos(sl, sc), TextEditor.DocPos(el, ec)) |
editor.get_word_at_screen_pos(pos) |
editor.get_word_at_mouse_pos(pos) |
editor.grow_selections_to_curly_brackets() |
editor.grow_selections() |
editor.shrink_selections_to_curly_brackets() |
editor.shrink_selections() |
editor.get_first_visible_line() / get_last_visible_line() |
editor.get_first_visible_row() / get_last_visible_row() |
Context-menu and hover callbacks now receive a PopupData object instead
of (line, column) integers:
# Before
def text_context_menu(line: int, column: int):
...
editor.set_text_context_menu_callback(text_context_menu)
def line_number_context_menu(line: int):
...
editor.set_line_number_context_menu_callback(line_number_context_menu)
# After
def text_context_menu(data: TextEditor.PopupData):
line, column = data.pos.line, data.pos.index
...
def line_number_context_menu(data: TextEditor.PopupData):
line = data.pos.line
...For C++ users — same shape, with TextEditor::DocPos{line, index} and
TextEditor::PopupData& data. Line/column counters are now size_t (use
%zu in printf-style format strings).
Test Engine: safer Python integration
- Catch Python exceptions in
test_func/gui_func/teardown_func. Previously a
Python exception in one of these callbacks propagated asnanobind::python_error
on the engine's coroutine thread, hitstd::terminate, and killed the process
(taking remaining queued tests with it). Exceptions are now printed as a
traceback, reported viaImGuiTestEngine_Error(test marked asTestStatus.error),
and swallowed so the engine continues. imgui_test_engineCrashHandler: installSA_RESETHANDon *nix to avoid
abort() reentry spam.- Fix
imgui_bundle.imgui.<submodule>imports (e.g.imgui.test_engine).
imgui-node-editor
- Suppress hover/active for widgets inside a node that is covered by another
node. - Fix popup position for
ComboandColorEditinside the node editor canvas
(three coords needed canvas→screen translation; the right guard is
NextWindowData.HasFlags, notWindowFlags). - Link color now automatic, based on light vs dark theme.
UpdateNodeEditorColorsFromImguiColors(): improve colors, especially
selection colors.- README: documented keyboard/mouse interactions; added doc in the header.
ImmVision
- Clamp images so their texture does not bleed when dragged completely
outside the viewport. - Improved resize: widget size, contrast, and behavior in a zoomed node
editor.
ImGui (StackLayout patch)
- StackLayout: don't inflate
measured_sizewhen the layout has no springs
(fixes fractional-height alignment drift in some layouts).
Pyodide / Playground
- Switched to pyodide 0.29.4.
- New WebGL binding for Pyodide:
webgl.register_texture/
webgl.unregister_texture. Use it inside HelloImGui'scustom_background
to upload textures produced from JS-sideWebGL2RenderingContext.
Seepyodide_projects/projects/playground/examplesfor documented examples. - Playground: added documented WebGL examples, source link on the minimal
example, and restore the landing page on browser back-to-root. - Added
implot_demo,implot3d_demo, andimgui_demoto the playground. - New "WebAudio minimal beep" example demonstrating browser audio from Python.
- Save Python code to a file before running it (for nicer tracebacks).
- Per-file deployment of demo source into the Emscripten FS
(imgui_bundle_add_demo.cmake). - Non-blocking loading banner over the canvas, with explanatory text,
smooth time-based progress, rotating tips, and a lazy pendulum video. - Smooth progress bar for per-demo wheel installs; snap back to 0 when the
banner reopens. - Pyodide + LaTeX: fix issues on consecutive runs.
min_pyodide_app: log errors to the JS console.
Python backends
- Fix SDL python backends on Wayland (#463).
- Move the PyOpenGL Wayland workaround out of
imgui_bundle/__init__.py
(#321, #463): applied only by the affected backends.
Full Changelog: v1.92.700...v1.92.800
v1.92.700
Updated Dear ImGui to v1.92.7
imgui-bundle.pages.dev
The docs and demos were relocated to a new and faster server, with new URL addresses. The new URL are also much easier to remember.
- Home: https://imgui-bundle.pages.dev/
- Documentation: https://imgui-bundle.pages.dev/doc
- ImGui Bundle Explorer: https://imgui-bundle.pages.dev/explorer/
- Playground: https://imgui-bundle.pages.dev/playground/
(Note: all previous url will now automatically redirect to the new urls)
Markdown Renderer Improvements
Added LaTeX math rendering
LaTeX math is now supported in the Markdown renderer, using the new imgui_microtex library (native rendering via MicroTeX + FreeType). Enable it with AddOnsParams.with_latex = True.
- Inline
$...$and display$$...$$math in Markdown - Python bindings for
imgui_microtex - Pyodide: lazy-download LaTeX fonts via jsdelivr
- Frame-generation cache eviction (default 60 frames)
Markdown: HTML and CommonMark extensions
- Task lists:
- [ ]/- [x] - GitHub-style admonitions:
> [!NOTE],> [!WARNING],> [!TIP], etc. - Permissive autolinks (bare URLs become links; opt-out available)
- Inline HTML spans:
<sub>,<sup>,<kbd>,<mark>, plus anOnHtmlSpancallback for custom spans <details>/<summary>collapsibles<pre>blocks<img>tags with width/height, async download (desktop via libcurl, Pyodide via JS fetch)
Other Markdown improvements
- Fix word wrapping issues around transitions between bold/italic and normal
- Make spacing between blocks, headers and paragraphs more coherent
- Adaptive code snippet colors: new
SnippetTheme::Autopicks dark or light based on current ImGui theme - TextEdit no longer shows a caret in coded blocks.
Pyodide / Playground
- Improved online playground
- Clipboard support (SDL2 + Emscripten)
immapp.download_url_bytes/immapp.download_url_bytes_async- Pin pyodide-build version to pyodide version
- Lazy import for pydantic types
- numpy is now optional (no runtime dependency)
ImPlot v1.0 - Per-index color/size support
- Updated ImPlot to v1.0
ImPlotSpec: numpy array support for per-index color/size fields (fill_colors,line_colors,marker_fill_colors,marker_line_colors,marker_sizes)
ImPlot3D v0.4 - Per-index color/size support
- Updated ImPlot3D to v0.4
ImPlot3DSpec: same numpy array fields as ImPlot- New Python demo: Per-Index Colors (colorful lines, scatter, triangles, quads, Gouraud-shaded duck)
- Refactored Custom Per-Point Style demo to use batched per-index arrays
ImGuiColorTextEdit: switched to goossens rewrite (breaking API changes)
Replaced the santaclose-based ImGuiColorTextEdit with the complete rewrite by Johan A. Goossens. This brings a cleaner architecture, proper UTF-8 support, C++17, no regex/boost dependency, and many new features.
New features
- Find/replace UI with keyboard shortcuts
- Text markers (colored line highlights with tooltips)
- Bracket matching with visual indicators
- Line decorators (custom gutter content per line)
- Context menu callbacks (separate for line numbers and text area)
- Change and transaction callbacks
- Filter selections/lines (transform text via callbacks)
- Autocomplete framework
- TextDiff widget (combined and side-by-side diff view)
- Many more languages (C#, JSON, Markdown, AngelScript)
Breaking API changes (Python)
| Old | New |
|---|---|
TextEditor.PaletteId.dark |
TextEditor.get_dark_palette() |
TextEditor.PaletteId.light |
TextEditor.get_light_palette() |
TextEditor.PaletteId.retro_blue |
(removed) |
TextEditor.PaletteId.mariana |
(removed) |
TextEditor.LanguageDefinitionId.cpp |
TextEditor.Language.cpp() |
set_language_definition(id) |
set_language(Language.cpp()) |
set_cursor_position(line, col) |
set_cursor(line, col) |
set_view_at_line(line, mode) |
scroll_to_line(line, alignment) |
get_selected_text(cursor) |
get_cursor_text(cursor) |
get_cursor_position() -> TextPosition |
get_main_cursor_position() -> CursorPosition |
render(title, border, size) -> bool |
render(title, size, border) -> None |
undo(steps) / redo(steps) |
undo() / redo() (no steps) |
SnippetTheme.retro_blue / .mariana |
(removed) |
To detect text changes, use set_change_callback(callback, delay_ms) instead of the old render() return value.
See the breaking changes note at the top of imgui_color_text_edit.pyi for a quick summary.
Breaking API changes (C++)
Same renames as Python (CamelCase). Additionally:
Render()parameter order changed:(title, size, border)instead of(title, border, size)Render()returnsvoidinstead ofbool
hello_imgui
- Add
emscriptenAllowBrowserZoomShortcutspreference: forward browser zoom shortcuts (Ctrl+/Ctrl-) to the browser, true by default - Add
ImageAndSizeFromEncodedDataandLoadImageDataFromEncodedDatafor loading images from in-memory encoded data IniFolderLocationon Emscripten: return""forCurrentFolder,"/"for othersLoadDefaultFont_WithFontAwesomeIcons: log a message if the icon font file is not found (instead of silently failing)- Skip
TearDownif it already ran at exit (e.g. if it threw an exception itself) - Suppress GCC false positive
-Wstringop-overflowin stb_image - Document theming API
Test Engine: interaction and screenshot tooling
New helpers for driving an ImGui app from Python (or C++) and capturing screenshots, useful for visual self-validation and automated testing.
- New
immapp.testingmodule: high-level helpers to interact with widgets and capture screenshots - Bind
imgui_capture_tool.hfor Python; addCaptureSetFilename HelloImGui::OpenglScreenshotRgb: report an explicit error if capture fails
ImmVision
- Fix colormap rendering for single-channel images
- Improve draw pixel values: better text contrast against background
- Fix zoom synchronization between linked views
- Polish overall look
- Add license file
Other library updates
- Updated ImCoolBar, ImGuizmo, ImAnim, nanovg, ImFileDialog, imgui_tex_inspect, md4c
Build & CI
- MSVC: add
/bigobjfor implot (fixes Windows ARM64 wheel build) - CMake: refuse in-source builds
- CI: add win64 wheels, bump cibuildwheel/pypi-publish/deploy-pages/upload-pages-artifact
- Fix ImGui StackLayout fractional-height alignment drift
Python bindings & API fixes
- Expose
TextFilter.input_bufproperty (#451) imgui_explorer: showim_anim.pyiin Python (#406)- Fix
get_style_color_vec4/color_convert_rgb_to_hsvbindings register_demos_assets_folder()helper- async runners: fix an issue where immapp.run_async could use 100% CPU (cf #460)
Documentation
- Developer docs: fork management, justfile workflows, bindings, Pyodide
- FAQ review, Nuitka compatibility docs
- Interactive explorable demos
Full Changelog: v1.92.601...v1.92.700
v1.92.601
ImmVision: OpenCV is now optional / use GPU rendering pipeline
ImmVision no longer requires OpenCV: this way the compilation and installation of the library is much faster, and the resulting binaries are smaller.
All image processing (color conversion, statistics, alpha blending, drawing annotations, zoom/pan transform, image saving) has been reimplemented without OpenCV dependencies.
- New core types:
ImageBuffer,Point,Point2d,Size,Matrix33dreplacecv::Matand OpenCV geometric types in all public APIs - Zero-copy interop: When OpenCV is available (
IMMVISION_HAS_OPENCV),cv::Matconverts seamlessly to/fromImageBuffervia implicit constructors - Python: No change for Python users — ImmVision continues to use numpy arrays (the
cvnp_nanobridge has been removed) - Drawing primitives: Custom bitmap font and Bresenham drawing replace OpenCV's
putText,line,ellipse,rectangle - Image saving: Uses
stb_image_write(PNG/JPG/BMP/TGA/HDR) instead ofcv::imwrite - Zoom/pan: Custom implementation with nearest, bilinear, and area-based downscaling
- ImmDebug API change:
ImmDebug()now assumes RGB (the common default); useImmDebugBgr()for OpenCV BGR images. Fixed per-image color order handling in the viewer. - Smaller wheels: ~16% size reduction across all platforms (45 MB total savings)
- Faster CI builds: 5–8 minutes faster per platform (no more OpenCV compilation)
- New features: colormap support for single-channel integer images, multithreaded pixel drawing/resize, fixed watched pixel delete button visibility
The ImmVision rendering pipeline has been rewritten to use GPU texture sampling and ImGui DrawList:
- GPU zoom/pan: Image uploaded to GPU texture once (with mipmaps); pan/zoom handled via UV coordinates — no more per-frame CPU warp
- Mipmap filtering:
GL_NEARESTat high zoom (pixel-perfect),GL_LINEARfor moderate zoom,GL_LINEAR_MIPMAP_LINEARfor downsampling (high-quality anti-aliasing) - DrawList annotations: Grid lines, pixel values, and watched pixel markers drawn via ImGui DrawList in screen space (TrueType font replaces bitmap font)
- DrawList backgrounds: School paper and alpha checkerboard rendered via DrawList (no longer composited into texture)
- Inspector redesign: Horizontal filmstrip with scrolling and adjustable thumbnail size replaces the old vertical listbox
- Other fixes: "Export colormap image" now available for uint8 images with colormap; save dialog remembers last directory
demo_imgui_bundle (aka "Dear ImGui Bundle Explorer")
- Display version and compilation time at startup (C++, emscripten and Python versions)
- Python demo code is also shown in the python version (when installed from Pypi)
hello_imgui
- Fix potential memory error in font handling (
_LoadFontImpl: pass font buffer allocated withIM_ALLOC) - Add
HelloImGui::LoadImageDataFromAsset()— decode an image from assets into CPU memory (C++ only) - Compile
imgui_impl_metal.mmandMetalNanoVGwith-fobjc-arc(fixes ARC bridge cast warnings) - Workaround plutovg
file(RELATIVE_PATH)error with relativeCMAKE_INSTALL_PREFIX(scikit-build-core)
Build & warnings cleanup
We are now at zero-warnings, on all CI / platforms and configs.
- CMake: fetch freetype & plutovg with
EXCLUDE_FROM_ALL - CMake: fix ImAnim exclusion when
IMGUI_BUNDLE_WITH_IMANIM_FULL_DEMOSis off - CMake:
ibd_add_this_folder_as_demos_librarynow linksdemo_utils(fixes GCC linker error) - CMake: suppress Apple ld duplicate library warnings
- CMake: suppress third-party warnings (ImAnim:
-Wno-unused-result,-Wno-nontrivial-memaccess; plutosvg:-Wno-deprecated-declarations) - CMake: normalize install path (
./lib/→lib) to fix CMP0177 warning - Fix
ImFileDialogu8pathdeprecation warning (C++20 compatibility) - Fix GCC
-Wformat-truncationwarning indemo_imgui_bundle_intro.cpp
Contributors
Full Changelog: v1.92.600...v1.92.601
V1.92.600
v1.92.600
Based on ImGui v1.92.6 & hello_imgui v1.92.6.
Dear ImGui Explorer
Dear ImGui Explorer (formerly "imgui_manual") has been rewritten from scratch and integrated into the Dear ImGui Bundle repository. It was previously a standalone project; Dear ImGui Bundle is now its parent repository.
It provides interactive manuals for ImGui, ImPlot, ImPlot3D, and ImAnim — with side-by-side C++/Python code, syntax highlighting, and search in API reference files (headers, Python stubs).
- Follow source: click on any demo widget to jump to its source code
- Search across API files with Ctrl+Shift+F
- Lazy-load demo code files (desktop and Emscripten)
- Deployed at pthom.github.io/imgui_explorer
Dear ImGui Bundle Explorer (formerly "ImGui Bundle Interactive Manual")
The interactive manual has been renamed to Dear ImGui Bundle Explorer and significantly enhanced:
- New intro tab with a carousel of 7 interactive slides showcasing the ecosystem
- Deployed at traineq.org/imgui_bundle_explorer
New library: ImAnim
Added ImAnim, a tweening and animation library for ImGui.
- Available via
immapp.run(..., with_im_anim=True)/ImmApp::AddOnParams::withImAnim - Python API adapted for
get_float,get_vec2,get_color, etc.
Updates to libraries
- Update imgui to v1.92.6-docking
- Update hello_imgui to v1.92.6
- Update implot to latest version (breaking change: added
ImPlotSpec, removed plot item styling) - Update implot3d to latest version (breaking change: added
ImPlot3DSpec) - Update ImGuiColorTextEdit: line numbers always visible in separate gutter, improved selection colors
- Update imgui_knobs: added
SetKnobColors,UnsetKnobColors, default color adapts to light/dark theme - Update imgui_md: render tables using ImGui tables (resizable columns), delay before showing link hrefs
Python: Async run and notebook support
- Added
hello_imgui.run_async()/immapp.run_async()for async/await support (with maximal performance). See doc for async - Added
immapp.nbmodule for non-blocking Jupyter notebook execution (nb.start(),nb.stop(),nb.is_running()). See doc for notebook - Added
hello_imgui.nbconvenience module
Pyodide (web) support
- Added Docker build system for Pyodide wheels
run()is fire-and-forget in Pyodide; userun_async()for awaitable behavior- CI workflow for Pyodide builds
- Pyodide wheels now exclude demo code to reduce size
Python bindings
- Added
em_size()andem_to_vec2()at root ofimgui_bundlefor DPI-independent sizing - Added
__getitem__/__setitem__(subscript[]) for ImVec2 and ImVec4 - Configurable wheel builds with selective module inclusion
- Fix: accept read-only numpy arrays (e.g. from pandas) in nanobind bindings
hello_imgui improvements
- Added
AddAssetsSearchPath()/ClearAssetsSearchPaths()/GetAssetsSearchPaths()for multi-folder asset resolution at runtime - Added
topMostwindow attribute - Added
iniDisableandiniClearPreviousSettingsparams - Added
FpsIdling::vsyncToMonitorandFpsIdling::fpsMaxsettings - Added
theme_changedcallback - Fix: ManualRender RunnerParams lifetime management
Build & CI
- Added ARM Linux (aarch64) wheel builds using native
ubuntu-24.04-armrunners - Reduced Emscripten .data sizes: demos only bundle the assets they actually need
- Deduplicated demo assets (removed ~1.1M of files duplicated between
assets/anddemos_assets/) - Emscripten: use GLFW3 backend by default instead of SDL2
- Fix: shell injection in BrowseToUrl (replaced
system()withfork+execlp)
Documentation
- Complete documentation overhaul using Jupyter Book, available as PDF
- Added developer documentation (building, bindings, repo structure)
Full Changelog: v1.92.5...v1.92.600
v1.92.5
This version is based on ImGui v1.92.5 & hello_imgui v1.92.5.
Updates to libraries
- Updates imgui to v1.92.5-docking
- Update imgui_test_engine to v1.92.5
- update hello_imgui to v1.92.5
- update implot to latest version
- update implot3d to latest version
- update ImGuizmo to latest version
- update ImCoolbar to latest version
Python bindings
- most pip dependencies are now optional: only numpy is required. Pydantic, PyOpenGL, glfw, Pillow, matplotlib, and opencv-python are optional (if you use features that require them)
- Vec2Protocol and Vec4Protocol are iterable / unpackable
- import immapp_notebook.run_nb only if IPython is installed
- option IMGUI_BUNDLE_PYTHON_DISABLE_OPENGL2 (Off by default): can disable Python backend support for OpenGL2
- Update wgpu example to use wgpu latest API (compatible with v1.92)
- Implot & ImPlot3d: fix bindings for setup_axis_ticks
Tooling
- Fix pyodide build (force build sdl2 and libthtml5 with -fPIC)
Full Changelog: v1.92.4...v1.92.5
v1.92.4
v1.92.4
This version is based on ImGui v1.92.3, and brings some small fixes.
- InputTextMultiline: when inside imgui-node-editor, improve handling of single preview
- imgui-node-editor: solve clipping issue which occur when a popup is open inside a node
New Contributors: @XenoAmess made their first contribution in #393 (Fallback for __file__ in Pyodide demo)
Full Changelog: v1.92.3...v1.92.4
v1.92.3
Updates to libraries
ImGui:
- Updates imgui and imgui_test_engine to v1.92.3
hello_imgui:
- update to v1.92.3
- add SetLoadAssetFileDataFunction (and python binding): a way to customize asset loading
imgui_md:
imgui-knobs, ImGuizmo, imgui_toggle:
- update to latest version
ImGuiColorTextEdit:
- update to latest version (from santaclose fork)
Python bindings:
ImGui bindings:
- ImGui Enums now use 'enum.IntFlag'
(This impacts only the typing checks, not the runtime behavior)
This means that you may replace code like:
imgui.WindowFlags_.no_collapse.value | imgui.WindowFlags_.no_decoration.valuewith:
imgui.WindowFlags_.no_collapse | imgui.WindowFlags_.no_decoration- imgui.push_font (accepts optional font)
- Improve typing for ImVec2 and ImVec4 (use different protocols. Thanks to @joegnis)
Pure Python Backends
Pure Python Backends
- Fix pygame backend (thanks Dom Ormsby)
- Fix issue when pasting with glfw backend (thanks to @sunsigil)
Other
- ImGuizmo:handle deltaMatrix / document Manipulate API
What's Changed
- Update PygameRenderer by @d-orm in #372
- Uses different protocols for Python binding class ImVec2 and ImVec4 by @joegnis in #374
New Contributors
- @d-orm made their first contribution in #372
- @joegnis made their first contribution in #374
- @sunsigil made their first contribution in #388
Full Changelog: v1.92.0...v1.92.3
v1.92.0
Starting with v1.92.0, version numbers are now synced between "Dear ImGui", "Hello ImGui" and "Dear ImGui Bundle"
ImGui
Use ImGui v1.92.0: Scaling fonts & many more (big release)
This is a big release for ImGui.
TLDR: Fonts may be rendered at any size. Glyphs are loaded and rasterized dynamically. No need to specify ranges, prebake etc. GetTexDataAsRGBA32() is now obsolete.
- Many Font related changes: this release brings many changes on the ImGui side : do read the ImGui release notes
Python bindings
- Potentially breaking change for extern pure Python backends:
font_atlas_get_tex_data_as_rgba32was removed (read the advice below) - Font-related changes, following ImGui v1.92.0
- Fix ImPlot stubs (thanks @tlambert03)
- Fix imgui_ctx and imgui_node_ctx
- pure python backends: split opengl implems, implement texture update in python pure opengl backends
- imgui bindings => publish texture related infos
Advice for extern pure Python Backends (wgpu, etc.)
Since v1.92, font_atlas_get_tex_data_as_rgba32 was removed. Backends will need to be adapted by implementing support for dynamic fonts (preferred)
Extract from ImGui doc:
ImGui Version 1.92.0 (June 2025), added texture support in Rendering Backends, which is the backbone for supporting dynamic font scaling among other things. In order to move forward and take advantage of all new features, support for ImGuiBackendFlags_RendererHasTextures will likely be REQUIRED for all backends before June 2026.
- Read ImGui backend doc: flag
ImGuiBackendFlags_RendererHasTextures(1.92+) (read the part "Rendering: Adding support for ImGuiBackendFlags_RendererHasTextures (1.92+)"). - For inspiration, also look at opengl_base_backend implementation of _update_texture().
Pyodide
- Added support for Pyodide
Contributions
- fix: exclude
MkTimefrom implot_internal stubs by @tlambert03 in #349 - Add imgui_ctx.tree_node_ex (flags are missing in imgui_ctx.tree_node) by @zaicruvoir1rominet in #353
- test: add test to ensure that stub files are valid by @tlambert03 in #351
Full Changelog: v1.6.3...v1.92.0