v9.6.0 Change Log
Summary of the changes of LVGL v9.6.0
v9.6.0 (16 September 2026)
LVGL v9.6.0 is the last release of the v9 series, and it is what we're considering a stability release. This release goes back
over the foundations: the software renderer blend paths were rewritten and are measurably faster on every target without a GPU, the public API
now lives in its own directory so internal refactors stop being breaking changes, the three ways of configuring LVGL were collapsed onto one source
of truth, the whole public API validates its arguments instead of dereferencing them, and LVGL builds, installs and links like any other
system library, including as an apt install on Ubuntu. Test coverage rose from 78.7% to 82.2% along the way.
Everything marked LV_DEPRECATED in this release is removed in v10.0. Old names still compile and emit a #warning, so v9.6 is the
release to upgrade to and clean up on. See the migration guide for the full list.
Main Features
- Faster software renderer: The blend and transform paths were rewritten to work a word at a time instead of a pixel at a time. No configuration change is needed. On the boards we measured, the average render time drops 25% on a Renesas RA8D2, 22% on an NXP i.MX RT700 and 20% on an NXP FRDM-MCXN947. Individual scenes go much further: alpha-blended images drop 76% on the RA8D2 and 60% on the RT700. The Espressif ESP32-P4 draws the rotated-ARGB scene 66% faster, taking it from 27 to a capped 60 FPS. Compositing follows, with an ESP32-S3-Korvo-1 rendering a frame with layered opacitity 14 ms faster. Learn more.
- Public and private api separation: The public API moved to
include/lvgl/.src/is now private by definition. Old include paths still compile with a#warning. Internal types remain reachable throughlvgl_private.horLV_USE_PRIVATE_API. Learn more. - Kconfig as the single source of truth:
lv_conf_template.h, the internal defaults header and theCONFIG_*bridge are now generated from one Kconfig tree, solv_conf.h, Kconfig and-Ddefines can no longer disagree. Hand-writtenlv_conf.hremains fully supported. Learn more. - Argument checking:
LV_CHECK_ARGreplaces scattered asserts and silent dereferences with one mechanism: roughly 2,900 checks across 168 source files covering the public API. Enabled by default; logging and assert-on-failure are opt-in. Learn more. - LVGL now fetches its own dependencies: Before v9.6 you installed SDL2, FreeType, GStreamer, libdrm and the rest yourself before LVGL would
configure. Now every dependency is resolved through
find_package, then pkg-config, and anything still missing is fetched and built from source. Learn more. - Install and link like a system library: An installed LVGL now ships
lvgl.pcandlvglConfig.cmakenaming every library it was compiled against, andconfigs/defconfigs/provides ready-made presets forsdl2,waylandanddrm. Ubuntu packages are published through a Launchpad PPA. Learn more about LVGL's cmake and ubuntu integration.
Rendering & Performance
- Faster software renderer: Software renderer is now faster, see above.
- Arm SVE2 Acceleration: Vector acceleration for the RGB888 blenders on Armv9-A cores. Enable with
LV_USE_DRAW_SW_ASMset toLV_DRAW_SW_ASM_SVE2. Joins NEON, Helium and RISC-V V. - SiFli EPIC Draw Unit: Initial hardware acceleration support for the EPIC 2D accelerator on SiFli SF32 parts, covering fills, blends, images, borders, labels and layers, with an OS adaptation layer. This is a first integration: it is not documented yet and does not match SiFli's out-of-tree draw unit on every scene. It is being carried into v10, where the documentation and the remaining performance work land.
- NanoVG: Blur and drop shadow on the GPU, plus image recolor and more style properties support.
- VG-Lite: Matrix transformation on images
- NemaGFX: Cache management, a command-end wait in non-OS builds, and a float literal fix that kept the matrix path off double-precision soft-float. Selecting the Nema libraries through Kconfig works again.
- DMA2D: Cache handling reworked onto
lv_draw_buf, ASYNC/INTERRUPT support on Zephyr, a warning when buffers are misaligned, and the image and fill paths de-duplicated. - Object style cache is now enabled by default, blur invalidation is expanded once per frame instead of per draw, arc invalidation skips hidden knobs and unchanged angles, and I1/I2/I4 image decoding got a fast path.
Drivers
- Wayland DMA-BUF Backend: LVGL now copies the rendered buffer into a DMA-BUF-backed buffer attached through
linux-dmabuf, with no texture upload and no GPU involvement. On a Renesas RZ/G2L at 1280×720 this takes the all-scenes average from 32 to 44 FPS and flush time from 19 ms to 12 ms, with render time unchanged. The driver also falls back between backends automatically when one is unavailable. Learn more. - Wayland: Buffered keyboard input so key presses are not dropped, better pointer and touch responsiveness, physical outputs identified by connector name and an API to read fullscreen and maximized state.
- DRM: A libdrm fallback for device probing.
- fbdev: L8 support.
- SDL: Runtime color format changes for the software backend.
- evdev: Raw keycodes can now be queried directly.
Testing & Quality
- Coverage went from 78.66% to 82.23% (+3.57 pp) over the release cycle. Covered lines rose by 9,265 as the codebase grew by 8,687 coverable lines. Branch coverage rose to 62.59% and function coverage to 83.7%.
Fonts and Text
- Text Leading Trim:
text_leading_trimtrims a font's line-box leading against cap height, x-height or the baseline, soLV_SIZE_CONTENTlabels and the buttons wrapping them size to the glyphs instead of the font's phantom space. Learn more. - Variable Font Weights: FreeType faces with a
wghtaxis can be instantiated at any weight on that axis, baked in when the face is opened and part of the font's cache key. Learn more. - Binary fonts now support dynamic glyph loading. Learn more
Widgets
- Shared glTF Models: A model can be loaded once and handed to any number of
lv_gltfviewers; parsing, textures, meshes and shaders are paid for once. Adds model add/remove APIs and direct control of animation position withlv_gltf_model_set_animation_time()andlv_gltf_model_set_animation_ratio(). - Dedicated State API:
lv_obj_set_checked(),lv_obj_is_pressed(),lv_obj_set_disabled()and friends replace the generic flag API, alongside newchecked/uncheckedand directional gesture events. lv_label_set_max_linescaps a label at a line countLV_IMAGE_ALIGN_CONTAIN_DOWNSCALEfits an image without ever scaling it up- Dropdown and Roller now have translation support
- The Chinese calendar gained the 24 solar terms
- GStreamer now integrates the WebRTC plugin
Deprecations
A lot of things have been deprecated in v9.6 and will be removed in v10.0. See our migration guide with the full list of changes.
Breaking Changes
- 5dc6522 - feat(drm)!: remove xf86drmMode.h from public header
- 757ed1b - feat!(svg): move svg structures to private header
- 3194979 - feat!(tree): move the tree module to the private API
- 21897d0 - feat!(event): move event list structure to private header
- 945c878 - feat!(array): move the array module to the private API
Architectural
- c329a2d - arch: move public headers to include folder
- 48a6a6a - arch(lvgl_private): add lvgl_private inc folder and add missing includes for private headers
- 90aeaca - arch(debian): add ubuntu integration via .deb packages
- d6767d2 - arch(typos): fix typos in the codebase
- 546a69f - arch(obj): replace lv_obj_flag... with dedicated API for each flag
- a73e59f - arch(config): split kconfig, add missing configs and generate lv_conf headers from it
- fb759bd - arch(file_explorer): deprecate and add a table-based file browser example
- 8ba75ca - arch(menu): deprecate and add a base-widget navigation example
- fbb5007 - arch(rlottie): deprecate in favor of the lv_lottie widget
- 06b3701 - arch(list): deprecate and add a flex-column list example
- dd5b0bf - arch(win): deprecate and add a flex-column window example
- 49587a4 - arch(draw/utils): rename draw_sw_utils module to draw_utils
- f90e371 - arch(config): introduce LV_COLOR_FORMAT_DEFAULT and deprecate LV_COLOR_DEPTH
New Features
- 9be768d - feat(vector): draw rectangle should support minus width/height
- 0c899bb - feat(dropdown): Support
LV_SIZE_CONTENTand fix layout nested invalidation - 6519229 - feat(gltf): allow sharing models across gltf objects
- 586a25e - feat(freertos): allow overriding idle percentage calculation
- da24713 - feat(gdb): add style inspection with LVStyle wrapper and info style command
- 2cf818f - feat(gdb): extract style constants to auto-generated lv_style_consts.py
- 1758765 - feat(bidi): prioritize RTL over LTR in base direction detection
- 1675469 - feat(theme): add focus outline to arc and calendar widgets
- 4170bcb - feat(display): add display sync cb for custom frame buffer synchronization logic (#9342)
- 37602de - feat(x11): handle return key in input buffer
- 5435384 - feat(gstreamer): integrate webrtc plugin
- 3ecfac6 - feat(tjpegd): add logs on errors
- 5100d33 - feat(scale): add observer binding functions for line and image needle…
- 6e8e9e1 - feat(g2d): remove rotate config
- 012c987 - feat(textarea): only send one event when updating text
- e113329 - feat(font): add font generic api callback
- 50c7a54 - feat(font): gracefully handle releasing null glyph descriptors and update docs
- 0de4a15 - feat(text/ap): add text_ap_strlen and text ap tests
- d3a12eb - feat(eve): allow disabling the draw unit by setting the global handler to NULL
- 22df6ae - feat(uefi): handle suspend scan code as enter
- 5ab59fc - feat(misc): add lv_check_arg macros
- 2531ef7 - feat(text): add text leading trim
- fc1136e - feat(sdl/egl): detect driver at runtime and explain x11 limitation
- 78f2b51 - feat: introduces LV_CHECK_ARG
- c41e958 - feat(image): add LV_IMAGE_ALIGN_CONTAIN_DOWNSCALE
- 9980215 - feat(wayland): improve pointer and touch responsiveness
- 963e704 - feat(deprecation): add lv_deprecated mactro
- 92708eb - feat(vg_lite_driver): add GCNanoUltraV options file
- 6ef84ca - feat(lvgl_private): include lvgl private api when config is set
- 5debd9f - feat(freetype): support variable weight fonts
- f306d45 - feat(obj): add delete_cb utility
- 95fa415 - feat(label): add lv_label_set_max_lines()
- 53ac1e1 - feat(types): add IAR support for compiler attributes
- fe76cc2 - feat(display): add get display flush cb
- 80fc7c4 - feat(dma2d): add warning if buffers are not well aligned
- 77b321d - feat(dma2d) avoid code duplication regarding image and fill handling
- 180adf9 - feat(dma2d): enable ASYNC/INTERRUPT with ZephyrOS
- f92d9d2 - feat(nanovg): add blur and dropshadow support
- cab748e - feat(lv_draw_sw): add color format to error message
- b2019f5 - feat(obj/property): add missing arg checks
- 21297be - feat(event): add arg checks to public functions
- b1e19ac - feat(draw/buf): poison draw buffers before freeing to detect UAF
- 9d09f64 - feat(obj/pos): add arg checks to public functions
- 0b1ea31 - feat(uefi): support building on loongarch64 and riscv64
- c0967f9 - feat(anim): add arg checks to public functions
- fc2ea9a - feat(dma2d): rework cache handling to use lv_draw_buf
- 6de7340 - feat(timer): add arg checks to public api functions
- 83d7e45 - feat(obj/event): add arg checks to public api functions
- 707b774 - feat(observer): add arg checks to public api functions
- 3dcd2ef - feat(obj/draw): add arg checks to public api functions
- abcd053 - feat(group): check for null object in lv_group_remove_obj
- ad37ef5 - feat(area): add arg checks to public API functions
- f246609 - feat(matrix): add arg checks to public api functions
- dc9e9de - feat(nema_gfx): add cache management
- 6fa9ace - feat(evdev): pass raw keycodes to user through event
- bbedf26 - feat(core): add lv_check_arg to public functions in lv_obj
- 83d5e44 - feat(draw/nanovg): add image recolor support
- 25ea20a - feat(style): add arg checks to public functions args
- c6cf99f - feat(anim_timeline): add arg checks to public functions
- 36b2ed0 - feat(obj/tree): add arg checks to public functions
- d1815aa - feat(obj): add lv_obj_set_ext_draw_size
- d1a593f - feat(deprecations): add log deprecated and mark deprecated symbols
- 5c71cd4 - feat(gif): make gif max width/height configurable
- a7794c2 - feat(examples): add draggable split-view layout example
- 62f343b - feat(font): increase allowed number of cmap tables
- 8c87c4e - feat(indev): add dedicated double click time
- 6c66435 - feat(sdl): add error message on window creation failure log
- f147c9a - feat(draw/ppa): support SoCs that expose no L2 cache line size
- 24bd5f2 - feat(wayland): add DMA-BUF software fast-path to the EGL backend
- 6404de3 - feat(wayland): support falling back between multiple backends
- 2418dcb - feat(wayland): add dmabuf backend
- 6e20aab - feat(sdl): add runtime color format change to SW SDL
- 6673cb3 - feat(observer): add lv_observer_set_user_data API
- 34d30b0 - feat(tlsf): decouple tlsf from the stdlib choice
- d82bb4f - feat(timer): function to get time of next timer
- f62f5e8 - feat(display/indev): add CCW rotation option for indev->pointers
- ef063f6 - feat(indev): make default constant values configurable
- 3ec42fc - feat(draw_buf): add api to check if x and y form a valid position
- 3208709 - feat(core): standardize arg checks
- 96aee6e - feat(debugging): standardize arg checks
- 72c69ec - feat(fs): standardize arg checks
- 651f4d2 - feat(display): deprecate calling public api with NULL display
- 7f25700 - feat(sysmon): deprecate calling public api with NULL display
- 4d6f9e3 - feat(refr): deprecate calling public api with NULL display
- 4749064 - feat(display): standardize api argument checks
- 576ed27 - feat(sysmon): standardize api argument checks
- a758ea0 - feat(draw/sw): add SVE2 acceleration
- 03c5821 - feat(draw/sw): add rotation support to argb8888 premultiplied
- 3cb45dc - feat(refr): assert that every layer is drawn at before flushing
- 329655b - feat(draw/layer): add deinit/delete API to match init/create
- dec721c - feat(draw): mark task not taken by any draw unit as failed
- 8faf63f - feat(draw): add trace logs for draw tasks
- 78f0a92 - feat(image): standardize arg checks
- f09d217 - feat(indev): standardize arg checks
- c56e1d7 - feat(font): standardize arg checks
- 62e35b0 - feat(3d): standardize arg checks
- 7a8d833 - feat(evdev): add arg checks
- e777c8e - feat(libinput): add arg checks
- b8aafb5 - feat(opengles): add arg checks
- cdf5266 - feat(glfw): add arg checks
- d56b93d - feat(sdl): standardize arg checks
- 920e2af - feat(wayland): standardize arg checks
- 335759e - feat(x11): add arg checks
- cb18cd1 - feat(mipi): standardize arg checks
- ad7558a - feat(ft81x): standardize arg checks
- ed6ebda - feat(display drivers): standardize arg checks
- 5877326 - feat(nuttx): standardize arg checks
- b8e1e8b - feat(drm): standardize arg checks
- b3fbc00 - feat(drivers/windows): standardize arg checks
- d63f346 - feat(drivers/uefi): standardize arg checks
- e850644 - feat(qnx): standardize arg checks
- daa6e59 - feat(msgbox): auto select label when msg box is enabled
- 39282d0 - feat(stdlib): standardize arg checks
- 2cc9ecf - feat(log): standardize arg checks
- 03aa76f - feat(flex): add arg checks
- 1fcf19d - feat(grid): add arg checks
- 1c71f15 - feat(layout): add arg checks
- 8fad524 - feat(event): add checked/unchecked and gesture_up/down/left/right events
- 3be31ac - feat(obj): add lv_obj_set/is_checked/pressed/disabled/etc
- fee343d - feat(draw/sw): attach a wait for finish cb in os mode
- f57962a - feat(binfont): support dynamic glyph loading
- ccdda91 - feat(widgets): standardize arg checks
- 274c7e6 - feat(obj): enable obj style cache by default
- 0c3b507 - feat(misc): standardize arg checks
- 0de1249 - feat(style): standardize arg checks
- dcce355 - feat(theme): standardize arg checks
- 01152c8 - feat(translation): standardize arg checks
- df12db1 - feat(draw): standardize public api arg checks
- 6339dcb - feat(assert): allow disabling assertions at build time
- 7276aeb - feat(scale): allow radial padding for scale arc
- 4f265fc - feat(egl): add pbuffer support
- 4c8afbf - feat(theme): add getter and setter for theme user_data
- e21695f - feat(subject): deprecate lv_obj_bind_flag/state and add lv_obj_bind_<type>
- 02aa53f - feat(draw): convert asserts to check_arg, add missing @nullable
- 5e59c27 - feat(gltf): add model remove API
- 5ef2ac0 - feat(gstreamer): use display's color format instead of LV_COLOR_DEPTH
- 0151fca - feat(opengl): use display cf instead of lv_color_depth
- f34162c - feat(observer): add subject create and deprecate subject init API
- ab57622 - feat(calendar): add the 24 solar terms to the Chinese calendar
- 9f4e962 - feat(drm): add libdrm fallback for drm device probe
- 8a73764 - feat(draw): add SiFli EPIC hardware acceleration support with multi-OS adaptation
- 1f0ec2a - feat(opengles): add argb8888 premultiplied support
- 2e51602 - feat(gltf): add animation time/ratio API
- 8e29d5f - feat(scale): calculate label and tick self size
- 29f7dfc - feat(wayland): buffer keyboard input events to avoid dropping key presses
- a0e5183 - feat(dropdown): add translation support
- 7d230fe - feat(wayland): add API to get fullscreen and maximized state
- 2110b9f - feat(wayland): identify physical outputs by their connector name
- fa2f860 - feat(fbdev): add L8 support
- 7f13790 - feat(roller): add translation support
- a001a3c - feat(obj_style): rename lv_obj_style_set_disabled (deprecated) to lv_obj_style_set_enabled
- 2f048b0 - feat(obj): add name property
- e120c31 - feat(event): log error when out of custom event IDs
- bb8ef34 - feat(vg_lite): support matrix transformation on images
- dbb9734 - feat(demo/benchmark): warn if check arg is enabled
- c54639b - feat(refr): warn if LV_COLOR_16_SWAP is defined and enabled
Fixes
- 4a9c734 - fix(draw/nanovg): use core_area for box shadow gradient
- ec053a0 - fix(draw/gles/sdl): add null checks to texture cache comparison
- 60a1b79 - fix(example/style): use font default define to avoid compilation error
- ca18403 - fix(draw_sw): ensure buf_h >= 1 to prevent zero-size alloc in rotated image transform
- 7d7985c - fix(os): use lowercase windows.h include
- 19c8f13 - fix(gltf): cast away void* to the correct type in models array
- 0e837b1 - fix(gdb): show decoded ptr and entry addr in image cache dump
- a034133 - fix(gltf): wrong variable names in info logs
- 11f1331 - fix(freertos): correctly account for all idle tasks on multicore MCUs
- ce112eb - fix(drm/egl): correctly set render mode for nanovg
- 1b7dda6 - fix(color): Explicit casting to prevent warnings
- 6d07a02 - fix(freertos): correctly include atomic.h on esp platforms
- 2faaf78 - fix(span): prevent false ellipsis when text fits within container width
- 6d3396a - fix(draw_sw_triangle): fixed bug that blend_dsc.src_stride is not init
- 1e334db - fix(buttonmatrix): fix sign promotion issue caused by type mismatch in calculation
- 199ac1b - fix(vg_lite): automatically select filters based on the matrix
- 1d6f92a - fix(tiny_ttf): stream position and file read race condition
- 5206728 - fix(wayland): remove extraneous timer_handler declaration
- 671bf0f - fix(chart): use style props for vector chart stroke
- d9f67e9 - fix(uefi): correct vertical resolution check in display flush callback
- 556bd62 - fix(freetype_image): add missing unlock mutex
- f9c0597 - fix(draw): resolve infinite loop and out-of-bounds access in circular mask cache calculation
- 0bf96cb - fix(grid): fix segfault when row/column screen descriptor is missing
- 64f09a2 - fix(indev): only send EVENT_KEY if key or state changed
- 65869ca - fix(indev): dont reset encoder key every frame
- 36da474 - fix(gltf): unused variable warning
- 6b05d6f - fix(wayland/shm): correctly support transparency with ARGB8888
- e234e49 - fix(draw): fix missing dsc_size in rect mask descriptor
- 388c97e - fix(drm/egl): choose compatible nanovg config when it's enabled
- eb01918 - fix(nanovg): support dynamic font engines
- 5b1b13c - fix(cache): align node size to avoid unaligned access runtime errors
- ebc9c1b - fix(draw/blend): log unsupported color format
- d8cde27 - fix(draw/helium): check config before defining and including other files
- ff65e70 - fix(lodepng): return error when 16 bit/channel images are used
- ec2e040 - fix(obj): add missing alloc check for children and spec_attr
- 0194f69 - fix(event): return event descriptor from indev/display add_event_cb
- 6324efb - fix(textarea): fix the issue of textarea placeholder
- 8dc2006 - fix(ppa): correct check for opa COVER in ppa image evaluate
- 5b6810a - fix(vg_lite): initialize matrix before vg_lite_update_linear_grad
- 7d376cc - fix(eve): fix incorrect rendering of transparent edges
- 11d8f51 - fix(indev): reset scroll direction per iteration in find_scroll_obj
- f5cfdeb - fix(tiny_ttf): kerning cache use after free
- b34a41f - fix(test): read indev events in lv_test_wait and lv_test_fast_forward
- 712156a - fix(refr): fix incorrect return value when object is outside clip area
- 4656762 - fix(x11): avoid transient artifacts while resizing window
- 3a47f28 - fix(theme): use correct display dpi
- 5209cd3 - fix(blend/helium): check for MVE before including other files
- 672e8f5 - fix(nema_gfx): restore blend state after rendering font placeholder
- fafdf49 - fix(observer): fix sizeof typo and add strdup NULL check
- 88480fa - fix(core): add NULL checks for unsafe realloc in style and transform
- 58182a5 - fix(gif): fix transparency and frame disposal regression
- fc14525 - fix(draw_buf): align allocated buffers to LV_DRAW_BUF_ALIGN
- 171196b - fix(flex): incorrect gap when the first item is hidden and the next has grow
- cfd60ce - fix(opengles): clear layer texture for transparent screen refresh
- cb7045d - fix(docs): update output paths in compile_docs workflow
- 14a1e1f - fix(blur): fix incorrect invalidation if part has blur or dropshadow
- 2f4e03f - fix(wayland/shm): correctly premultiply flush area
- a366629 - fix(scale): don't return early on main drawing when having 1 or less ticks
- ee436e8 - fix(obj): use clz instead of obj
- 079b87a - fix(svg): prevent overflow on signed/unsigned underflow
- aebad7c - fix(glad): fix compilation errors by using relative includes
- ee99967 - fix(devcontainer): replace broken Emscripten feature with Dockerfile-based emsdk install
- 9a92075 - fix(array): remove extraneous lv_array_private file
- 9daceec - fix(eve): fix path to lvgl.h
- d90aed3 - fix(conf_internal): fix lv_conf.h include path
- 41cc350 - fix(nuttx): guard declarations inside LV_USE_NUTTX
- 1219d2b - fix(sdl): remove extraneous function declarations
- e8f2a5c - fix(include): fix incorrect paths
- 1585ffe - fix(include): add missing header includes in lvgl.h
- 879e7b9 - fix(api_map): correctly map v8's display rotation types and defines to v9
- 75d166f - fix(obj): fix segfault when obj_remove_flag is called for screen
- d3d7d82 - fix(examples/stm32): fix deprecated path
- 18b5601 - fix(draw_buf): use lv_draw_buf_create_ex instead of lv_draw_buf_align
- b7bfbd7 - fix(buttonmatrix): remove unused txt_tot_i variable
- 8a32a7f - fix(label): fix invalidation after changing max_lines
- db3fd7b - fix(obj/event): allow null event_cb in remove_event
- 807a815 - fix(indev): check if indev obj act is not NULL before sending an event
- b48b348 - fix(dropdown): check if group exists before checking if it's editing
- feff637 - fix(obj): check if group exists before checking if it's editing
- f6754b3 - fix(lvgl_private): remove extern "C" section
- d7eec76 - fix(obj/pos): stop tranform point recursion after reaching screen
- 85b171d - fix(demo/gltf): remove reliance of private api
- bcfced2 - fix(draw/nanovg): support multi-point line draw tasks
- a09ab51 - fix(indev): check for NULL last and hovered objects before sending event
- 6415fd3 - fix(theme): check if grandparent is null before checking its type
- d8ed8bc - fix(theme): prevent reentrancy in resolution_change_event_cb
- 99df9b9 - fix(tjpgd): support other JPEG types such as EXIF images(#10084)
- 6e43017 - fix(dma2d): use macro instead of 256 for scale factor
- ac50d44 - fix(dma2d): fix the way end of dispatch is being handled
- 18760b7 - fix(dma2d): ensure to also enable LP DMA2D clock
- 6dfb02e - fix(group): avoid sending FOCUSED events to an already focused object
- 3f9b6f6 - fix(lodepng): fix alignment and oversized handling
- 320de1f - fix(thorvg): fix compiler error
-Werror=type-limits - 2b82ba7 - fix(calendar): correct incorrect Chinese calendar month lengths (1989, 2025, 2057, 2089, 2097)
- a07926a - fix(font): fix underflow in adv_w calculation
- 738f4e3 - fix(nema_gfx): fix compilation warning due to void * in arithmetic
- 40a64b3 - fix(draw/nema_gfx): ensure cmd end wait in !LV_USE_OS mode
- db738b1 - fix(freetype): calculate outline sizes before sending LV_EVENT_CREATE
- 48c2d75 - fix(demo/music): fix flickering issue when going to the next album
- 45e564e - fix(vg_lite): supplement pivot dsc for GLYPH IMAGE
- a80a3f4 - fix(config): disable obj class and validity checks by default
- f7a7246 - fix(wayland): fix memory leak
- 04d8f1d - fix(include): include api mapping headers after other includes
- e976cce - fix(obj/event): avoid unused variable when LV_CHECK_ARGS is disabled
- 263ae5e - fix(windows): pass thread handle, not pointer to handle
- 603d534 - fix(group): never get defocused event
- 90ac9dd - fix(gstreamer): add return expression to arg checks
- e97ca14 - fix(buttonmatrix): keep selection in place when the map changes
- d1fe35d - fix(kconfig): fix nema lib selection when using kconfig
- eaeed76 - fix(nema_gfx): use float literal to avoid double-precision soft-float
- feb64d1 - fix(osal): coalesce RT-Thread sync signals
- de0c90d - fix(dave2d): disable the command buffer as a temporary fix to rendering issues
- 782aa61 - fix(draw/image): use inclusive coordinates for pivot and transformed area
- 8274446 - fix(slider/bar): prevent int32 overflow in pixel-position or value (10308)
- 3ac4ea7 - fix(refr): fix rgb565 swap with direct render mode
- 4bce3b8 - fix(core): fix scrollbar position overflows for huge content sizes
- 1df2741 - fix(benchmark): prevent infinite loop in is_optimization_enabled on tickless simulators
- 3b85eef - fix(draw): prevent rounded image memory growth during screen transitions
- 9eef0bc - fix(bmp): reject truncated files in decoder_info
- 0edf6c5 - fix(circle_buf): add debug assertions for zero-capacity / empty-buffers
- f67415c - fix(examples): include bezier chart endpoint
- d1ea882 - fix(theme_mono): eliminate layout shift, fix spinner styling
- e3e6198 - fix(bin_decoder): check if area is inside image area before decoding
- f5726cd - fix(utils): fix implicit int conversion warning
- 3da5030 - fix(api_map): fix sign conversion warning
- 44526d4 - fix(lovyan_gfx): fix flush_cb for parallel screens
- 357cd58 - fix(draw): fix busy loop when layer draw buffer alloc fails
- 81a350f - fix(thorvg): free RLE span buffers on the rleRender() error path
- 9242b9f - fix(tlsf): reject size requests that overflow alignment and pools of exactly block_size_max
- 47ad59f - fix(obj): add malloc check to obj transitions buffer
- 06c5fb6 - fix(chart): fix maybe uninitialized variable warning
- f9a6285 - fix(gltf): omit surface normals from vertex data for unlit materials
- e9d81b3 - fix(arc): guard against negative inner radius in arc area calculation
- 6645af0 - fix(mem): guard against integer overflow in lv_calloc
- bcb94df - fix(draw/sw/vector): add missing draw_sw guard
- 066c8d9 - fix(demo/benchmark): reuse the first active screen across every scene
- 8fceb10 - fix(demo/benchmark): attach screen to summary so it can be displayed
- 940c86a - fix(lottie): use source animation duration
- 261683c - fix(arm2d): fix build issue when Helium is enabled
- a1e7a59 - fix(demo): update Sales and Costs labels in scale1 animation callbacks
- 023e690 - fix(snapshot): bound the draw dispatch loop to avoid livelock without an OS
- 045487a - fix(api_map): restore lv_disp_rotation_t removed from the v9.5 API
- 95421b2 - fix(slider): allow knob update while dragging even if scroll object is active
- 7cc13aa - fix(qrcode): apply color/size/quiet-zone changes regardless of call order
- 50693fc - fix(draw/label): add alloc check to glyph draw buf allocation
- 5098e29 - fix(draw/sw/mask): correctly check and propagate errors in mask_radius_init
- fbbc2cc - fix(draw/sw/arc): add missing malloc check for mask buf
- db3ebe5 - fix(draw/sw/arc): don't apply circle mask if it can't be initialized correctly
- 8783e15 - fix(draw/sw/bshadow): add missing malloc checks for shadow and mask buffers
- 01b1bca - fix(draw/label): supress and fix dangling reference to stack variables
- e7f438e - fix(libinput): add a helper function to clear the device cache
- bf52878 - fix(fs/arduino): correctly return NULL on open with unsupported mode
- ce07667 - fix(examples): check if group exists beforing adding an object
- 3fff791 - fix(refr): skip obj refr for zero scaled
- c306fdc - fix(refr): skip matrix rotation call if matrix transform isn't enabled
- be6dc70 - fix(calendar): parse pressed day correctly when lunar text follows
- ff2f96c - fix(spinbox): correctly bind float subject values
- fe65112 - fix(label): refresh text when set_text_static is called with NULL
- 8a711eb - fix(timeline): fix
startwith repeating anims, and add restart - 0cc8bdd - fix(draw): don't fail a layer task before its source layer drains
- 9657a70 - fix(draw): delete thread sync only after deleting draw units
- b174b14 - fix(wayland): don't assert on a configure that doesn't resize
- ec3b2d5 - fix(obj/pos): fix infinite layout calc loop and bound passes
- 42b2755 - fix(binfont): add missing malloc checks
- 2206723 - fix(event): return immediately if preprocess stops event processing
- 0043765 - fix(check_arg): make check_arg c99 compliant
- 4930ee2 - fix(draw_sdl): don't claim draw task types the SDL unit cannot render
- 7b0d569 - fix(bar): properly closing the #if
- b4fef6d - fix(lodepng): fix relying on integer promotion and prevent buffer over-read
- 33d917c - fix(libinput): fix memory leak
- 68aa844 - fix(buttonmatrix): skip buttons outside clip area in draw_main
- b53b081 - fix(display): fix unused variable warnings with assertions disabled
- 2fffec1 - fix(draw/utils): fix unused variable warnings with assertions disabled
- 55461c2 - fix(opengles): fix unused variable warnings with assertions disabled
- 9a6f7a1 - fix(wayland/egl): fix unused variable warnings with assertions disabled
- b6c853c - fix(svg): fix unused variable warnings with assertions disabled
- e367652 - fix(tiny_ttf): fix unused variable warnings with assertions disabled
- a26210d - fix(theme): missing clip corner in dropdown list
- d9bbb06 - fix(opengles): correctly handle shader creation failures
- 1295d1f - fix(text): prevent out-of-bounds access in lv_text_cut
- 1354500 - fix(sdl): add missing arg checks
- 9e732e2 - fix(observer): call external data free on subject deinit
- 229eae0 - fix(observer): unsubscribe group subjects from their elements on deinit
- 870a661 - fix(gstreamer): add invalid stream state to enum
- 9ee9cbe - fix(gstreamer): ensure frame is properly aligned
- de5992d - fix(gstreamer): drop old frames to fix memory usage increase
- 4520320 - fix(gltf): detach a deleted model from the viewers displaying it
- 48c372b - fix(fs): use uintptr format for buffer paths
- 10ed605 - fix(barcode): apply property and size changes regardless of call order
- 08119b5 - fix(opengl): correctly handle draw buf clears with opengl based units
- fccb46a - fix(evdev): handle touch release on Protocol-A multitouch devices
- 0ed00c0 - fix(tiny_ttf): handle missing glyphs without cache errors
- 9de4a95 - fix(windows): make the display usable from the first frame
- b84453f - fix(opengl): swap red-and-blue channel when rendering a texture
- c098e31 - fix(display): skip draw_buf_init call when 2nd buffer is NULL
- e395399 - fix(textarea): ensure pwd buffer is never NULL in pwd mode
- a33757e - fix(draw/g2d): fix build and draw thread synchronization
- 0dc87cf - fix(roller): fix single-option roller stuck in edit mode with encoder
- 732e545 - fix(array): add element size validation and overflow checks
- 63555dc - fix(dropdown): fix list position when screen base dir is RTL
- 3962a69 - fix(nanovg): erase only the corners in mask_rect
- 2efe79d - fix(draw): clip the mask rect draw area to the target layer buffer
- 8a8fdf2 - fix(draw/sw): preserve opaque x byte for xrgb8888 format
- 3346f50 - fix(g2d): correctly handle g2d_open failure
- e392ab2 - fix(text): exclude trailing white space from line width and decoration
- addf7d8 - fix(opengles): ensure variable is initialized
- 83b620f - fix(demo/widgets): explicitly pass display to theme init funcion
- 952ec5a - fix(draw/ppa): describe images by their stride, not by their width
- 73ba586 - fix(wayland): route input events to the focused window
- fb768a1 - fix(gridnav): check that group exists before getting its focused obj
- 1c4708e - fix(font): remove unused montserrat 12 subpx
- c230f5b - fix(draw): compare draw task area with layer area instead of display
- 607ce5a - fix(textarea): fix scroll behavior in one_line mode
- 9e61721 - fix(draw/nema_gfx): clip tasks by _real_area so transformed images are drawn
- 9eb6098 - fix(obj): ensure indev exists before getting its type or its scroll obj
- eaf8204 - fix(refr): ensure there's an active screen before updating its layout
- 2bba3c1 - fix(draw_buf): skip aligniment check when data is null
- cd7f1e5 - fix(gridnav): ensure indev exists before getting its type
- 991e067 - fix(indev): skip EVENT_PRESS_LOST if there's not active obj
- 9fc9a3f - fix(file_explorer): ensure indev exists before getting its type
- d5cc370 - fix(arc): ensure indev exists before getting its type
- 156e8a0 - fix(arc): ensure group exists before getting its state
- cdf4259 - fix(buttonmatrix): ensure indev exists before getting its type
- 8e58005 - fix(buttonmatrix): ensure group exists before getting its state
- 60b158d - fix(dropdown): ensure indev exists before getting its type
- 05eb515 - fix(roller): ensure indev exists before getting its type
- bd1faf9 - fix(roller): ensure group exists before getting its state
- 877a5ce - fix(slider): ensure indev exists before getting its type
- d4a1db1 - fix(slider): ensure group exists before getting its state
- 9a20b56 - fix(spinbox): ensure indev exists before getting its type
- 2fa4eab - fix(table): ensure indev exists before getting its type
- afba8ce - fix(draw/ppa): invalidate the draw buffer after the PPA writes it
- b6d1bb4 - fix(clib): cast away const in strchr
- c63ffe9 - fix(gltf/shader): limit shader lenght to 4095 to be ISO C99 compatible
- f9b0f1b - fix(demo/gltf): return early if model can't be loaded
- c51fecc - fix(fbdev): optionally wait for vsync to reduce tearing
- 764f0af - fix(example/gridnav): warn and return if default group is not set
- db53672 - fix(draw): remove five unused struct fields
- b74e377 - fix(style): fix invalidation and caching with transition styles
- 9cd25a3 - fix(jpeg): clobbered variable warning
- 1550769 - fix(draw/neon): unused variable warnings
- e3fa833 - fix(drm/egl): use native_window to avoid unused var warning
- 9e40f4b - fix(canvas): dispatch any sub layers created by dispatching main layer
- b25c188 - fix(config): remove undef breaking macro expansion
- 93f242b - fix(freetype): unused variable warning
- 4b77339 - fix(draw/g2d): unused functions warnings
- 4c5330f - fix(wayland/g2d): wait for wl_bufer.release before reusing a buffer
- 9fc85a2 - fix(wayland/g2d): limit bound dmabuf version to interface version
- 4395dd1 - fix(wayland/g2d): add missing statements
- 9291468 - fix(wayland): return early if wayland initialization fails
- f9f974f - fix(bidi): prevent heap overflow in rtl_reverse
- c900f8a - fix(config): move config guards to lv_conf_internal.h
- 9f9ad71 - fix(draw/image): skip transform with partially decoded images
- 0a60da6 - fix(gltf): clamp camera count to be consistent with docs
- 9b24da0 - fix(config): error out if any invalid CONFIG_XXX define is detected
- 508dfc7 - fix(fbdev): stride-based bpp, BGR auto-detect, buffer alignment, skip-unblank
- 3afdbd5 - fix(textarea): send value event change on unfiltered path
- 74622e5 - fix(config/display): allow disabling tiled rendering in config
- 734c9f2 - fix(obj): allow any animation and duration combination in screen events
- 4515eca - fix(fs/posix): protect POSIX API usage on Win32 build
- 3390441 - fix(draw): use compatible software mask callback types
- 1da53ea - fix(textarea): cancel a stale scroll animation when the label resizes
- 99c76d7 - fix(frogfs): do not typedef ssize_t when the libc has it
- ef2b72b - fix(shader): use C string literals in the GLSL shader sources
- 1093217 - fix(osal): do not build lv_linux.c when another back end owns the OS API
- b4468d9 - fix(config): add LV_ATTRIBUTE_FAST_MEM_USE_IRAM config back
- 140f322 - fix(wayland): implement the missing wl_pointer axis listeners
- cd587ba - fix(config): allow disabling ASSERT_HANDLER_INCLUDE warning when using kconfig
- 22a829d - fix(config): select DRAW_G2D/PXP with USE_G2D/PXP to keep backwards compatibility
- 3c25ac6 - fix(pxp): take source geometry and destination offset from the right area
- be72241 - fix(draw): fix compilation issues on helium and arm-2d
Performance
- df7acaf - perf(font): organize glyph_dsc_t attributes to avoid padding bytes
- d0b074c - perf(font): optimize padding bytes by modifying attributes ordering
- 215385f - perf(freetype): adding L1 cache improves access performance
- ac7892c - perf(opengles): avoid texture cache interaction for non-cacheable tasks
- 50e6097 - perf(bin_decoder): add i8 fast path
- 12ecafc - perf(vg_lite): pre-allocate outline path memory using sizes info
- b536add - perf(arc): optimize angle invalidation (esp. for spinner, or when invisible)
- 63f996e - perf(arc): skip knob invalidation when hidden
- 890cac0 - perf(obj): skip subtree refresh for scrollbar-only state changes
- 22c74b8 - perf(draw/sw): use byte-level memset for aligned I1 solid fills
- 3481e3f - perf(sw): optimize blending and transform functions
- bf1aa82 - perf(refr): defer blur invalidation expansion to once per frame
- e93fb88 - perf(bin_decoder): optimize I1/2/4 decode
Docs
- 77edacf - docs(readme): add missing lv_display_flush_ready call to example
- 1a0f959 - docs(gdb): update info style usage for new CLI interface
- ec02abe - docs(display): fix function name in color_format documentation
- 7dc7dcb - docs(xml): LVGL Pro best practices
- 05cc9aa - docs(windows): update repo for windows users
- af113e2 - docs(vector): add basic docs about vector drawing
- b913e21 - docs(style): update banner JSON URL to use static domain
- 652e270 - docs(ime_pinyin): refine pinyin dictionary instructions
- ea9b61c - docs(lv_st7735): add initialization notes and example
- a76707c - docs(draw): add a short description about each draw unit
- 493c517 - docs(example): remove lv_example_obj_3
- cf300e4 - docs: fix typos
- 595a68f - docs(redirects): fix redirects after target pages moved
- 670a057 - docs(examples): add @title/@brief doc tags to examples
- d76a346 - docs(examples): introduce summary and description to examples
- 4750fe0 - docs: modernize to .md/.mdx for new Fumadocs-based docs engine
- b3dc711 - docs: fix casing of 'API' to 'api' in meta.json
- b1e55ea - docs: add hero image
- a7b95c5 - docs(index): add <DirectoryIndex /> to section index pages
- 7f0fadc - docs(examples): remove index.rst files
- 63af2b5 - docs: replace extraneous .rst code-block directives
- 86135eb - docs(image_decoder): remove reference to line-scan decoding
- 9214520 - docs(lv_ll): add lv_ll documentation
- c163e41 - docs(display): mention correct event name to react to a rotation change
- 5468796 - docs(doxygen): fix INPUT path
- fc4c7ce - docs(linux): add overview page and update opengl overview
- 4a253d4 - docs(api): split public/private API pages
- dfc1200 - docs(cache): include unit in prompt
- 0241174 - docs(examples): add XML examples too covering specific features
- fe12120 - docs(examples): remove title, improve responsiveness, add widget names
- b9291be - docs(xml): flatten XML section into single redirect page to Pro Docs
- 829c7a2 - docs(links): fix broken internal links and migrate legacy docs.lvgl.io URLs
- 02814dd - docs(example): fine-tune examples and flatten directories
- 70145ea - docs(examples): regenerate C examples and minor docs fixes
- 5b8ae4b - docs(bidi): update lv_bidi_detect_base_dir comment to reflect RTL-priority logic
- f9d8832 - docs(lodepng): improve pixel-format documentation
- 62eea1f - docs(wayland): document setting up keyboard and encoder
- b5653fb - docs(doxygen): enable cplusplus stdlib and xkb
- a9383ca - docs(copilot): add argument checking contract
- e4673fb - docs(contributing): add deprecation guidelines
- 7748406 - docs(migration_guide): add start of v10 migration guide
- 97a99a8 - docs(contributing): add deprecations page to docs sidebar
- 093390f - docs(copilot): add usage of lv_assert for public api contract
- c279444 - docs(assertions): add lv_check_obj docs
- 247f898 - docs: review and improve the sections the users meet first
- b6ed933 - docs(api): add title to API meta.json
- 40fb6ba - docs(zephyr): update Zephyr integration guide for Zephyr 4.4.1
- 331ac10 - docs(examples): add get_started XML examples
- 237d069 - docs(readme): update the README
- f7ae316 - docs(cra): add SBOM for CRA complience
- 8ec5a94 - docs(lovyan_gfx): improve integration docs
- 10ad713 - docs(chip_vendor): review and fix all chip vendor pages
- 8cb8b1e - docs(ubuntu): add ubuntu integration docs
- af0f855 - docs(linux): standardize and update embedded linux docs
- b45c1ea - docs(doxygen): introduce @nullable alias
- 45d74f9 - docs(widgets): standardize doxygen parent param doc
- c9245ff - docs(layout): correctly mark lv_layout_create as deprecated
- 8cb52d8 - docs(api): mark user_data params as @nullable
- 1906077 - docs: remove "optional" from @nullable alias
- ceb213d - docs(api): mark delete/deinit/destroy pointer args as nullable
- c4da4c4 - docs: add Soldered Electronics manufacturer page
- 563824f - docs: add getting started section to soldered page
- ce2819c - docs: remove api docs from public API function definitions
- 9f5a792 - docs: add missing @nullable
- 6bc8de2 - docs(kconfig): shorten LV_USE_CHECK_OBJ_PARENT_LINK help text
- c838272 - docs(subjects): point out group subjects need to outlive inner subjects
- 5d48e76 - docs(imgfont): disable broken online example embed
- 30793ea - docs(rzg3l): add rzg3l documentation
- 123f870 - docs(ubuntu/rzg2l): add rzg2l + ubuntu pratical guide
- 9a348dd - docs(gltf): be stricter on the api docs wording
- 600a103 - docs(migration): add v9.6 migration doc
- 643b4cd - docs(api): add public API section to integration and migration
- 811646c - docs(check_arg): add check_arg user facing documentation
Build
- 68b4ea4 - build(cmake): support external dependency fetching
- 51b9a38 - build(deps): bump dawidd6/action-download-artifact from 16 to 19
- 1794f2b - build(deps): bump softprops/action-gh-release from 2 to 3
- 65ff21f - build(deps): bump mymindstorm/setup-emsdk from 14 to 16
- ac5e44d - build(deps): bump actions/github-script from 8 to 9
- d04ffbc - build(cmake): remove thorvg sources from main lib sources list
- 3dead50 - build(drm): link libdrm publicly since lvgl headers expose drm types
- 93bcda9 - build(cmake): fix installation when using private API
- e32a758 - build(kconfig): fix 3d texture dependency chain
- 2edcbd9 - build(cmake): don't override fetchcontent base dir if it's already defined by the user
- 789d453 - build(cmake): add pkg-config and cmake find_package support
- 455aea9 - build(cmake): link targets publicly when private api is set
- f432f99 - build(cmake): force enable private api if demos or examples are enabled
- 287a439 - build(gstreamer): fix pkg lib names
- f83a947 - build(cmake/kconfig): allow specifying path to .config
- 9c2e0f6 - build(cmake/sdl2): disable pipewire when fetching sdl2
- c4424b2 - build(cmake): skip lvgl's exported link interface for fetched libs
- 986b0d3 - build(nanovg): select opengl when draw nanovg is enabled
- 02c8fbf - build(cmake/kconfig): avoid overwriting user's .config
- 5e34562 - build(cmake): rerun cmake config when lvgl's config changes
- 209b03a - build(debian): update linux based defconfigs and update debian control/rules accordingly
- 8fd90bb - build(cmake): fix lv_conf.h installation path and defines
- 066d8db - build(cmake): remove python package dependencies for gcc/clang
- 94913bf - build(kconfig): overhaul help and prompt texts for kconfig
- 74e9505 - build(cmake): allow overriding root kconfig
- 37427fb - build(config): imply sysmon and perf monitor with benchmark demo
- 5d0e67b - build(widgets/image): remove label dependency
- 4ae3bf1 - build(cmake): handle pkg-config targets without include directories
- 1ebe58d - build(cmake): remove unused PUBLIC_HEADER property from lvgl_thorvg
- 0b5f7fa - build(cmake): allow skipping lv_conf.h/kconfig with
LV_CONF_SKIP - 3da98d9 - build(cmake): export compile commands for lsp clients
- 98a01bb - build(cmake): skip thorvg build when LV_USE_THORVG is disabled
- 07c9c9c - build(deps): bump dawidd6/action-download-artifact from 21 to 24
- 3f83029 - build(cmake): disable install rules when consumed via add_subdirectory
- 8ac018e - build(cmake/kconfig): keep defconfigs after first configure
- 154e0ae - build(conf_parser): allow system include directories
Refactoring
- a3ac634 - refactor(wayland): adhere to lvgl file name convention
- b6cb354 - refactor(lvgl_public): rename lv_public_api to lvgl_public
- c16e14a - refactor(system_includes): replace system includes with LV_XXX_INCLUDE macros
- 5699cf5 - refactor(external_includes): use angle brackets for external includes
- 022072e - refactor(include): pass through lvgl_public.h to include public api from src
- a04a3cd - refactor(tjpgd): move 4kb stack allocation to heap
- 1ca082b - refactor(theme): flatten theme directory structure
- b53e748 - refactor(debugging): split profiler and test files into their respective folders
- ba59aa5 - refactor(obj): deprecate lv assert obj
- f91b6bc - refactor(obj/scroll): use check_obj for obj param checks
- 2e1deda - refactor(draw/nanovg): remove color from image cache
- 48e01f4 - refactor(spinner): replace &lv_spinner_class with MY_CLASS
- f79dc2a - refactor(indev): add
staticmodifier to definition ofindev_read_core - 11bb2fa - refactor(indev): add
staticmodifier to definition ofindev_gesture - 6c910a1 - refactor(obj/style): rewrite loop to avoid realloc every iteration
- 516b581 - refactor(libjpeg): replace code relying on private api
- 46ea585 - refactor(obj): remove smaller size realloc never failing assumption
- 86a797e - refactor(svg): rename enum values to use enum naming conventions
- 326c353 - refactor(array): make lv_array_copy more robust
- 06ca93c - refactor(docs): treat doxygen warnings as errors and correctly match docs and fn args
- b25b172 - refactor(svg): rename private _lv_svg_parser_state_t in lv_svg_token.c to avoid collision
- d3fa0e9 - refactor(draw/sw/arc): skip drawing and log mask fails to be created
- 224c7dc - refactor(observer): rename _remove to _delete
- 52beb1b - refactor(display): explicitly pass default display to lv_display functions
- 1ccd9bc - refactor(sysmon): explicitly pass default display to lv_sysmon functions
- f171d79 - refactor(display): refactor duplicated code in set_buffers
- 1b81ef6 - refactor(display): remove layer_init/deinit dead code
- 857ffb6 - refactor(draw/sw): include assembly blend headers from lv_draw_sw_blend
- ae39ff9 - refactor(egl): move duplicated config selection logic to a single place
- 27b2cbf - refactor(obj): invert search order for lv_obj_is_valid, to reduce algorithmic complexity
- 1ca3d9a - refactor(opengles): share duplicated flush callback logic
- 027a3c9 - refactor(obj): add static inline set/has_state impl and add missing arg checks
- 3588809 - refactor(translation): remove static inline attribute from lv_tr
- 9d7fef4 - refactor(area): remove static inline attribute from area_copy
- 10a43c2 - refactor(theme): replace if check with LV_CHECK_ARG
- ea8c4ee - refactor(area): use = to copy areas
- a62d922 - refactor(gltf/shader): re-use calculated skin matrices in shader
- 6d7ea93 - refactor(qrcode): report render success instead of failure
- f35e139 - refactor(barcode): report render success instead of failure
- 8f52ded - refactor(obj_style): rename lv_obj_style_set_enabled to lv_obj_set_style_enabled
- c1387ca - refactor(subject): rename lv_subject_copy_string to lv_subject_set_string
Chores (Scripts & Others)
- 0712005 - chore: start v9.6.0 development
- c3c1fc2 - chore(codeowners): thank you @liamHowatt
- bc1ac06 - chore(gdb): bump version to 0.2.0
- 9be625b - chore(gdb): unify value init with Value.normalize and ValueInput type alias
- 0f8b361 - chore(gdb): support str input and auto-infer target_type in Value.normalize
- 7db70fc - chore(gdb): add cache sanity check with rb/ll cross-validation and check command
- fd843ba - chore(gdb): add draw task/unit wrappers with gen_draw_consts and PrettyTable output
- 87aed29 - chore(gdb): add LVArray dynamic array wrapper with typed iteration
- ded2b49 - chore(gdb): add event subsystem wrappers with LVEvent, LVEventDsc, LVEventList and gen_event_consts
- 372b39a - chore(gdb): add LVAnim wrapper with print_info, print_entries and dump anims command
- 9c77d49 - chore(gdb): add LVTimer wrapper with freq column and dump timers command
- 64c46e8 - chore(gdb): add LVFsDrv wrapper with driver name resolution and dump fs_drv command
- b93ef79 - chore(gdb): add LVImageDecoder complete fields and dump image_decoder command
- 435b8c7 - chore(gdb): add LVIndev wrapper with gen_indev_consts and dump indev command
- 79c626c - chore(gdb): add LVGroup wrapper with focus tracking and dump group command
- d803a26 - chore(gdb): add LVObjClass wrapper with class hierarchy and format_coord utility
- e27bba8 - chore(gdb): add LVSubject/LVObserver wrappers with gen_subject_consts and info subject command
- f5a61cc - chore(gdb): update docs and clean up command naming
- 7e784e9 - chore(gdb): bump version to 0.3.0
- 64e7804 - chore(gdb): fix coord type mask, cast safety and dedup parse_enum
- a23e230 - chore(gdb): refactor generators into shared enum_parser and unified generate_all entry
- 5642cc1 - chore(kconfig): fix typo in the condition evaluation for perf monitor align option
- 8fa1c29 - chore(gdb): add snapshot/data_utils/formatter layers with declarative _DISPLAY_SPEC
- 081a916 - chore(gdb): correct ARGB8888 channel order from BGRA to RGBA
- cd07338 - chore(gdb): add dump dashboard command with HTML renderer and data collector
- d1c936e - chore(codeowners): thank you @uLipe
- fca3999 - chore(gdb): improve resilience against memory corruption and older LVGL versions
- 9c12c95 - chore(gdb): add CorruptedValue sentinel and is_ok protocol for memory corruption resilience
- 743ad90 - chore(gdb): upgrade dashboard frontend to uinspy v0.4.6
- a5f6f21 - chore(gdb): add obj flag constants and expose flags in snapshot
- 16e21a5 - chore(gdb): add obj state/scroll/layout fields to snapshot
- 031bae6 - chore(gdb): add auto-generated widget wrappers with per-widget snapshot
- 6cff1b8 - chore(gdb): support pre-6d999331d class names without lv_ prefix in wrap_widget
- e748c63 - chore(gdb): regenerate textarea wrapper for placeholder_txt_size field
- 2899149 - chore(gdb): improve widget wrapper generator type handling
- aa86c0d - chore(gdb): fix safe_string corrupted markers, safe_color struct read, ptr_or_none null check, char** detection
- 9dbdb4e - chore(gdb): cast fallback, NULL string handling, order-independent widget discovery
- c9ba438 - chore(codeowners): welcome Akos!
- 1e12358 - chore(style_gen): update style gen script to generate .mdx
- 5b85d4d - chore(find_version): fix outdated path in script
- 5168e53 - chore(static_checks): add scripts to check include guidelines and lv_types
- 2621eaa - chore(commit_message): allow ! in commit message to indicate breaking change
- c92631c - chore: generate cmake variables for non-kconfig configs
- 13a6fe9 - chore(Kconfig): add missing Kconfig symbols
- 6416db4 - chore(gdb): add widget_specs JSON and spec-driven dashboard rendering
- 74ef8be - chore(gdb): update dashboard frontend with widget summary in detail panel
- 6e921a8 - chore(gdb): update dashboard frontend with Props toggle for 3D scene labels
- 58a2c71 - chore(gdb): regenerate widget_specs.json for char** pointer type fix
- d1727da - chore(gdb): fix spec type inference, remove dead code, fix docstring
- ca229d9 - chore(gdb): guard _collect_widget_specs against JSON read errors
- 62335dc - chore(gdb): fix ci break
- c32b97c - chore(codeowners): thank you @FASTSHIFT and @XuNeo
- 2556491 - chore(kconfig): improve build logs when using kconfig
- 128fff2 - chore(config_gen): don't gate configs with other non-visible configs
- 690fc4a - chore(ref_images): remove ref images from repo root
- b2bcdd3 - chore(ports_updater): register the EK-RA8D1 LLVM and EK-RA8D2 ports
- c65e112 - chore(ports_updater): correct the EK-RA8P1 port URL
- cc6ed43 - chore(style_api): fix broken links, add validation and add it to ci
- 60d9541 - chore(static_checks): add defconfigs checks
- 4fb08af - chore(config/empty): auto generate empty defconfig and add CI check
- a31afc2 - chore(env/debian): use lvgl ppa for fastgltf dependency
- c738d77 - chore(migration): add obj flags migration script
- 4f5f7b3 - chore(example/assets): remove unused assets
- c62871f - chore(config_gen): move config guards to a single translation unit
- 0ece6e7 - chore(gdb): fix several edge case
- b271b0f - chore(idf): pull optional libraries via conditional component deps
- af56a23 - chore(idf): lower conditional dependency gate to esp-idf 5.5
- 7e7d49a - chore: add lvgl_api python lib
- e086a85 - chore: add script to verify if public api fn args are checked
- 83644ff - chore(font): regen lv_font_montserrat_14
- 57c615f - chore(gen_json): preserve C integer suffixes in enum values
- ef21f94 - chore(image_converter): auto detect lvgl.h in generated images
- 231b46d - chore(gen_cmake_var): export LV_CHECK_ARG_ASSERT_ON_FAIL to cmake
- f0274e2 - chore(changelog): add mdx compatible changelog generator
- 54c115f - chore(port_updater): create release branches from main branch
- a43e8a3 - chore(branch_updater): support empty .gitmodules port repos
- 2b5c78e - chore(cmsis-pack): prepare for v9.6.0
- 53d93d1 - chore(version_updater): update file list
CI and tests
- b3c45b1 - ci(docs): skip workflow if docs don't change
- 188deba - ci(deps): bump dawidd6/action-download-artifact from 14 to 16
- 9e08caf - ci(deps): bump actions/upload-artifact from 6 to 7
- 8cbb234 - ci(gdb): add workflow to verify generated constants are up-to-date
- 2c888ec - ci(gdb): fix yaml syntax and ci check failed
- d61be49 - test: generate ref images again with lodepng
- d0bf428 - ci(docs): add docs lvgl config to the workflow trigger paths
- 623624b - test(rb): add red-black tree test cases
- bba8065 - ci(docs): fix syntax and add version list
- 46e6f20 - ci(docs): add missing \ to multiline bash command
- 75ae154 - ci(docs): add workflow file to path filter and remove version list
- 837a426 - ci(stalebot): remove stale bot
- 1225eca - ci(docs): allow manually triggering the workflow
- 95a4dea - ci(coverage): enforce 50% patch coverage gate for PRs
- 2611124 - ci(docs): add mdx linter and enable checks for PRs
- 9194dd7 - tests(dockerfile): resolve xargs failure caused by CRLF line endings
- 50e2852 - ci(review): add Copilot code review instructions
- 36ef696 - ci(review): add incremental cppcheck static analysis gate
- 4d74580 - ci(docs): use plain git commands in deploy stage
- f68c6bd - ci(cppcheck): add library config to suppress false nullPointerRedundantCheck
- 59a56ab - ci(deps): bump dawidd6/action-download-artifact from 19 to 21
- 7a06ac5 - ci(pr-title): add automated PR title format check
- 9240371 - ci(docs): fix doxymark api-private root and drop empty files
- 90f374e - ci(docs): allow deploying on workflow dispatch
- 406fe8c - ci(docs): deploy xml examples to docs in md files
- 82054e1 - ci(debian): bump docker/setup-buildx-action from 3 to 4
- ab618ba - ci(debian): bump docker/build-push-action from 5 to 7
- d82e31d - ci(debian): bump actions/upload-artifact from 4 to 7
- 873f4d1 - ci(deps): bump actions/checkout from 4 to 6
- 47ded65 - ci(perf): pin SO3 perf images to the 6.2.0 nested-layout digests
- d5f25cd - ci(deps): bump actions/cache from 5 to 6
- 7da9cae - ci(deps): bump arduino/arduino-lint-action from 2 to 3
- d1e005b - ci(deps): bump actions/checkout from 4 to 7
- 1b18cd0 - ci(docs): fix indentation in compile_docs.yml
- cf13e83 - test(nanovg): add headless EGL test infrastructure for NanoVG
- 65bc757 - test(nanovg): use sw rasterizer for determinism
- 33d45e3 - test(docker): add script to run tests in Docker container
- fda73cc - ci(stale_bot): add stale bot with no auto stale
- f1056e9 - ci(deps): bump actions/checkout from 6 to 7
- a75a381 - ci(deps): bump actions/setup-python from 6 to 7
- c90e997 - test(build): cleanup configs and build system
- d587c76 - test(mem): fix invalid preprocessor condition
- 6bba7d0 - test(nanovg): remove lsan suppressions file
- 4ae4048 - test(gltf): add glTF tests
- 01c6701 - test: rename test_libs to test_helpers
- c64ca9e - test(refr): add refr tests
- 8fae1f7 - test(build): add build test with checks and logs disabled
- 247d44c - test(font_loader): add corrupted kern table test
- 2e7067a - test(nanovg): correctly force software rasterizer
- b2a7658 - test(event): add display and indev specific event tests
- f45e3a3 - ci(pr): add automatic PR labeling
- 3f11750 - test(nanovg): add missing ref image
- 371b94c - ci(labeler): allow PR to run in mutliple PRs at the same time
- 6e7b977 - ci(file_templ_check): move template check next to the other static checks
- d047015 - ci(gdb): move gdb consts generation code to the code_generation workflow
- 8231694 - test(gstreamer): add gstreamer tests
- 5e418b8 - test(calendar): update calendar nanovg ref image
- 202a9c1 - ci(generators): add built_in_font generation to CI
- c167007 - test(obj/blur): update deprecated function call
- 01f5036 - ci(pr-report): standardize PR comment reports
- 78f6b2f - ci: rename build and tests workflow to avoid escaping its name
- 761c4f1 - ci(coverage): export overall coverage results in pr comment
- 3a72489 - test(memory_usage): add flash and ram usage tests
- 5379db5 - test(cmake): explictly select test cases folders
- 6447180 - test(libs): use allocation count to check for memory leaks
- b623509 - test(config): enable ext data in full config
- 420a25e - test(build): run configure step every run to avoid stale config issues
- d03fa68 - test(check_arg): move test cases to public api folder
- ca02c8b - tests(api): move test cases that break API contract to its own folder
- 3a89209 - test: enable assertions on check arg failure
- c251150 - test: skip behaviour tests when check arg assert on fail is disabled
- 73a7975 - test(gltf): remove invalid params tests
Last updated on