Skip to content

This release includes 2 breaking changes for platform teams planning a safe upgrade.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

c++ creative-coding imgui immediate-gui jupyter-notebook python
+1 more
research-and-development

ReleasePort's take

Light signal
editorial:auto 13d

In v1.92.800, three ImDrawList drawing functions now expect thickness before flags, and ImGuiColorTextEdit's TextEditor API renames column to index while introducing a DocPos struct for cursor/selection.

Why it matters: Update all calls to `add_rect`, `add_polyline`, and `path_stroke` with the new argument order; modify code that uses ImGuiColorTextEdit’s TextEditor API to reference `index` instead of `column` and adopt the DocPos struct before upgrading. Failure to adjust will cause compile‑time errors.

Summary

AI summary

Argument order swapped for three ImDrawList drawing functions and TextEditor API cursor/selection structs renamed.

Changes in this release

Breaking Medium

`add_rect`, `add_polyline`, `path_stroke` argument order swapped; thickness first, flags last.

`add_rect`, `add_polyline`, `path_stroke` argument order swapped; thickness first, flags last.

Source: llm_adapter@2026-05-21

Confidence: high

Breaking Medium

`TextEditor` API changed: column renamed to index, new DocPos struct used for cursor/selection.

`TextEditor` API changed: column renamed to index, new DocPos struct used for cursor/selection.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

`ImGuiColorTextEdit` rebased on upstream future branch with layered architecture and new overlays.

`ImGuiColorTextEdit` rebased on upstream future branch with layered architecture and new overlays.

Source: llm_adapter@2026-05-21

Confidence: low

Feature Medium

Pyodide upgraded to version 0.29.4 with new WebGL bindings (`webgl.register_texture`, `webgl.unregister_texture`).

Pyodide upgraded to version 0.29.4 with new WebGL bindings (`webgl.register_texture`, `webgl.unregister_texture`).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

`imgui-node-editor` suppresses hover/active for widgets inside covered nodes and fixes popup positioning.

`imgui-node-editor` suppresses hover/active for widgets inside covered nodes and fixes popup positioning.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

`imgui-node-editor` link color now automatic based on light/dark theme; improved selection colors via `UpdateNodeEditorColorsFromImguiColors()`.

`imgui-node-editor` link color now automatic based on light/dark theme; improved selection colors via `UpdateNodeEditorColorsFromImguiColors()`.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Low

Playground added ImPlot demos, WebAudio minimal beep example, and improved loading UI (non-blocking banner, progress bar).

Playground added ImPlot demos, WebAudio minimal beep example, and improved loading UI (non-blocking banner, progress bar).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Medium

StackLayout now avoids inflating measured_size when no springs, fixing fractional-height alignment drift.

StackLayout now avoids inflating measured_size when no springs, fixing fractional-height alignment drift.

Source: llm_adapter@2026-05-21

Confidence: low

Bugfix Medium

Test Engine now catches Python exceptions in callbacks, reporting them as errors and continuing execution.

Test Engine now catches Python exceptions in callbacks, reporting them as errors and continuing execution.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Medium

Fixed `imgui_bundle.imgui.<submodule>` import issues (e.g., imgui.test_engine).

Fixed `imgui_bundle.imgui.<submodule>` import issues (e.g., imgui.test_engine).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Medium

Fixed SDL Python backends on Wayland (#463) and moved PyOpenGL Wayland workaround out of `imgui_bundle/__init__.py`.

Fixed SDL Python backends on Wayland (#463) and moved PyOpenGL Wayland workaround out of `imgui_bundle/__init__.py`.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Low

`imgui_test_engine` CrashHandler installs SA_RESETHAND on Unix to avoid abort() reentry spam.

`imgui_test_engine` CrashHandler installs SA_RESETHAND on Unix to avoid abort() reentry spam.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Bugfix Low

ImmVision clamps images to prevent texture bleeding when dragged outside viewport and improves resize behavior in zoomed node editor.

ImmVision clamps images to prevent texture bleeding when dragged outside viewport and improves resize behavior in zoomed node editor.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Full changelog

v1.92.800

Updated Dear ImGui to v1.92.8

See release info for 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:

  1. Static type-check (recommended). Running mypy or pyright once
    after upgrading flags every call that passes a float literal where the
    new signature expects flags: int:
    Argument of type "float" cannot be assigned to parameter "flags" of type
    "ImDrawFlags" in function "add_rect"
    
  2. Runtime, float thickness. pybind11 refuses to convert float→int,
    so add_rect(..., flags=ALL, thickness=2.0) written in the old order
    raises TypeError immediately.
  3. Runtime, int thickness. When both arguments are ints (e.g.
    thickness=2), the swapped value lands in flags and trips ImGui's own
    guard (flags & ImDrawFlags_InvalidMask_) == 0, raising:
    RuntimeError: IM_ASSERT(... "Incorrect parameter. Did you swapped
    'thickness' and 'flags'?")
    
    The mask reserves bits 0-3 specifically to catch this swap: any small
    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 as nanobind::python_error
    on the engine's coroutine thread, hit std::terminate, and killed the process
    (taking remaining queued tests with it). Exceptions are now printed as a
    traceback, reported via ImGuiTestEngine_Error (test marked as TestStatus.error),
    and swallowed so the engine continues.
  • imgui_test_engine CrashHandler: install SA_RESETHAND on *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 Combo and ColorEdit inside the node editor canvas
    (three coords needed canvas→screen translation; the right guard is
    NextWindowData.HasFlags, not WindowFlags).
  • 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_size when 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's custom_background
    to upload textures produced from JS-side WebGL2RenderingContext.
    See pyodide_projects/projects/playground/examples for 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, and imgui_demo to 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.

Breaking Changes

  • Swapped last two arguments of `add_rect`, `add_polyline`, and `path_stroke` methods on `imgui.ImDrawList` (thickness now precedes flags).
  • Renamed `column` to `index` in cursor/selection structs; replaced integer line/column pairs with `TextEditor.DocPos(line, index)` objects for all position-related TextEditor calls.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track Full Python GUI apps in the browser

Get notified when new releases ship.

Sign up free

About Full Python GUI apps in the browser

All releases →

Related context

Beta — feedback welcome: [email protected]