- Make UIWidget accessibility queries and actions virtual while retaining
centralized resolver defaults for built-in widgets.
- Honor custom semantics in hierarchy, focus, auditing, action validation,
and relation names while preserving one-hop relation resolution.
- Remove obsolete parent-change forwarding methods and test notifications
through actual scene operations.
- Restrict SceneNode's hierarchy observer to the internal accessibility bridge.
- Add custom-widget and dormant-construction regression tests and update docs.
- Add a protected UINode rebinding hook with a no-op default.
- Move widget identity invalidation into the UIWidget override.
- Remove the UINode self-downcast and AccessibilityManager dependency.
- Preserve child-first cleanup before updating the local scene pointer.
- Extend regression coverage to verify rebinding and invalidation order
- Report semantic subtree removals and arrivals through plain nodes,
preserving identities and avoiding duplicate embedded-scene notifications.
- Add regression coverage for direction changes, reparenting, focus,
selection, event ordering and mirrored-layout hit testing.
- Extend macOS password-mode tests to verify retained element identity,
protected text access and native transition notifications.
- Qualify the event-loop wake-up call to resolve MSVC's Window ambiguity.
- Document accessibility notifications for plain-node subtree moves.
- Cache effective direction and skip unchanged subtree propagation.
- Add logical alignment, box edges, and relative positioning.
- Mirror layouts and controls while preserving logical node order.
- Apply inherited base direction to UI text and editing.
- Keep logical-edge storage lazy and compact.
- Add regression tests, an isolated WebView demo, and RTL documentation.
- Document RichText bidi limitations and plan paragraph-level support.
- Replace full editor values with bounded 1024-code-point previews.
- Reuse previews when document identity and revision are unchanged.
- Use proportional column widths and borrowed model strings.
- Add explicit full-value copying with loading-state safeguards.
- Safely defer worker-originated refreshes to the main thread.
- Add regression tests and Inspector allocation benchmarks.
- Document preview behavior and text revision assumptions.
- Build text indexes using a bulk line-length read under one lock scope,
reusing storage and returning the document revision.
- Avoid requesting unused text offsets in the Accessibility Inspector.
- Add cold first-edit/focus benchmarks and regression tests for unqueried
edits, Inspector updates, Unicode lengths, and buffer reuse.
- Document the remaining O(lines) initialization cost and measurements.
Reduce million-line cold edits from ~29.2 ms to ~5.7 ms without changing
allocation counts, class sizes, or dormant-path work.
- Replace global line caches with lazy, per-manager document indexes
- Update affected line lengths without allocations on ordinary edits
- Preserve indexes across muted edits and recover ambiguous nested changes
- Count semantic children without materializing node identities
- Add a 2 ms AT-SPI dispatch budget while preserving backlog wakeups
- Add opt-in AT-SPI/UIA profiling and active performance benchmarks
- Cover shared documents, lifecycle, Unicode and nested-edit regressions
- Document measurements, scalability limits and native-host follow-ups
Text sized its per-vertex color array with getTotalVertices(), which
assumed one quad per non-space character. Shaped text does not follow
that rule (clusters, ligatures, marks, zero-sized glyphs and fallback
fonts change the glyph count), so the color array could be shorter than
the geometry. The draw then read past the end of the array for the last,
visually rightmost glyphs: they disappeared or showed up as stray glyphs
in mixed Latin/Hebrew/Arabic strings.
- Size fill and outline colors from the generated geometry and rebuild
them whenever the vertex counts change. Remove getTotalVertices().
- Never read past the color array in draw(), and draw the outline pass
with its own vertex count instead of the fill count.
- Share one shaped glyph walker (forEachShapedGlyphQuad) between both
setFillColor() overloads and keep it in sync with
ensureGeometryUpdate(): same layout parameters and the same fill
visibility test. The per-character overload advanced its vertex index
only when a color was present, which misaligned the remaining colors.
TextLayout snapped complex-script glyph positions to whole pixels, but
simple-script glyphs used the pen position as-is. After a Hebrew or
Arabic run the pen is fractional (HarfBuzz 26.6 advances), so the Latin
glyphs that followed were drawn at sub-pixel positions and blurred. Round
simple-script positions as well. Pure Latin text is unchanged.
Caret mapping:
- Text::findCharacterPos() and findCharacterFromPos() now use the text's
own base direction instead of TextDirection::Unspecified, so caret
positions and hit testing agree with rendering.
- In a right-to-left paragraph, place the end-of-text caret at the left
end of the last line instead of after the rightmost glyph.
Add TextLayout::getFirstStrongDirection(), which returns the direction of
the first strong bidi character (UAX #9 P2/P3), for upcoming
right-to-left layout support.
Update the textedit Arabic and Hebrew reference images: only punctuation
that follows RTL runs moves, now aligned to whole pixels.
Text:
- Ranged text access in code points (length, range, line bounds) that
never copies more than requested, plus a text revision (document UUID
and modification) so UIA and macOS cache their UTF-16 copies.
- Report document edits as exact change records, up to four per widget
and frame, then collapse to one whole-text change. Resets, loads and
document swaps report a whole-text change.
- The removed text is available only while an edit is being notified
(TextDocument::getNotifiedRemovedText()); DocumentContentChange stays
{ range, text }, so queued records (LSP) copy nothing extra.
- Suppressed text changes are keyed by node ref, so a document shared
with another window still reports its edits.
- UITextView reports NameChanged; UITextInput overrides onTextChanged()
to report ValueChanged.
Relations, live regions and shortcuts:
- aria-labelledby, aria-describedby and aria-live (API and CSS). Ids a
client has read are remembered; renaming, adding or removing their
widgets notifies the dependents. setId() copies the old id only when
it is remembered.
- Live regions and UISceneNode::announceForAccessibility(). A newer
change from the same widget replaces its pending announcement, and
hidden sources are dropped.
- Menu item shortcuts (std::string text and key) exposed as AT-SPI key
bindings, the UIA accelerator key and macOS command characters.
- ScrollTo for anything inside a scroll view
(UIScrollView::scrollIntoView()). Icon-only buttons are named from
their tooltip.
Dormant path (no client attached):
- Widget notifications are inline: one relaxed atomic load of a
process-wide count of active root scenes, no call.
- Scene destruction and scene or host changes never create a manager.
Without a client, notify() queues nothing and widget deletion does
not register parents to announce it. While only the root has an
identity, deletion skips the ancestor walk unless a remembered
relation target may be affected.
- When the last client disconnects, model-view sources release their
queried rows. Persistent handles count their registrations, so
handles held elsewhere survive (PersistentModelIndex::release()).
- Spin boxes no longer hide their input explicitly, and
AccessibilityProperties shrinks from 144 to 136 bytes.
Backends:
- AT-SPI: object:announcement, word and line granularity, ranged
reads, SetTextContents reported as its minimal diff. Watch
disconnects per client (NameOwnerChanged arg0 plus a non-blocking
NameHasOwner check) instead of for every bus name. Without a scene
thread pool, initialize on a detached thread that shares ownership,
so teardown never waits on D-Bus timeouts.
- UIA: notification events (resolved at runtime, Windows 10 1709+),
text ranges served from the revision cache, and a per-frame provider
drain that skips the lock when nothing is queued.
- macOS: announcements, a UTF-16 text cache per revision, and command
key attributes.
- EEPP_ACCESSIBILITY_TRACE=1 logs client activity transitions.
Fixes:
- UICodeEditor::isType() no longer dispatches to a subclass's
getType(), so a UITextEdit is a code editor again.
- ecode: dropped files open only in document editors, not in other
code editors such as a commit message box.
Tools, tests and docs:
- Widget inspector: role names, shortcut, relation and live rows, and
an accessibility audit (unnamed controls, broken relations).
- Accessibility example: live status, an icon-only button, and edit and
reset actions that test_atspi.py checks end to end.
- Regression tests for text records, relations, live regions,
disconnect and reconnect, scene lifecycle and id changes.
- Add the AccessibilityDormant benchmark (C++ new/new[] counted on the
measuring thread) and benchmark_accessibility_dormant.py, which fails
on missing measurements and compares against other builds with
--compare LABEL=PATH.
- Document the dormant-path rules, what survives a disconnection, and
the remaining platform limitations.
macOS:
- Check each notification against a hash set of (event, element,
related element) instead of scanning the whole pending queue. The
ordered queue still drives delivery, so a burst of distinct events
(e.g. 10,000 label changes) stays linear. Created/Destroyed are never
de-duplicated.
- Track the pending focus change by its index instead of scanning for it.
Core:
- SceneManager::update: also bound the loop by the live scene count, so
a scene removed during the pass can't cause an out-of-range read.
- Accessibility setters (role, label, description, hidden) return early
on unchanged values. Re-applying CSS no longer allocates the
properties block or notifies clients.
API cleanup:
- Remove AccessibilityRelation, AccessibilityRelationInfo and
AccessibilityNodeInfo::relations. Nothing populated them. Remove the
inspector row and the macOS linked-elements attribute that read them.
AT-SPI GetRelationSet still answers with an empty set.
- Drop unused includes in uiroot.cpp and accessibility.hpp.
Docs:
- Architecture guide: UIA and macOS queue events until update(); AT-SPI
emits right away except for per-frame text diffs. Describe each
backend's per-frame batching, including the macOS de-dup.
Tests:
- Add UnchangedAccessibilityPropertiesStaySilent.
Teardown and identity:
- Detach native backends before scene children are destroyed and clear
mRoot afterwards, fixing a use-after-free when an AT-SPI client is
connected while a window closes.
- Invalidate a deleted widget's subtree once, top-down, before OnClose
handlers run (NODE_FLAG_DESTROYING). Descendants never walk into
destroyed parents, and deleted identities cannot be re-registered.
- Closing scenes expose no accessibility manager through either accessor.
- Deleting widgets no client has seen allocates no identity and emits no
events.
- Ignore events from widgets not yet attached to a scene.
Events:
- Keep the order of state and structural events; coalesce only adjacent
query-again hints.
- Stop emitting per-widget BoundsChanged; bounds are queried on demand.
- Report the Focused state and keyboard focus only on the projected focus
owner, through a shared helper used by both paths.
Model views:
- Lazy child count and child queries, cached sibling indexes, selection
and hit testing without enumerating rows.
- Row identities follow inserted and removed rows; removed rows are
pruned from native wrapper caches.
- Expose the active cell editor as the child of the row or cell it edits.
AT-SPI:
- Correct state bits (EXPANDABLE/EXPANDED, SENSITIVE, CHECKABLE,
SELECTABLE, READ_ONLY, SINGLE/MULTI_LINE, SELECTABLE_TEXT) and the
password-text and panel roles.
- Emit text-changed insert/delete, caret-moved and selection-changed
events, diffed once per frame. Support line granularity,
SetCaretOffset and selection editing.
- Track clients by bus name so the active flag clears on disconnect.
- Fix the I/O thread busy-spin and stranded dispatch backlog, flush
queued signals, and type-check Properties.Set values.
UIA:
- Raise focus only for the focused element.
- Defer UiaDisconnectProvider out of widget destruction.
- Keep providers alive for in-flight cross-thread requests.
- Reject unknown interfaces without a UI-thread round trip.
- Require window-specific client activity.
macOS:
- Avoid repeated full node info builds.
- Use sibling indexes and lazy child access.
- Fix label/value deduplication for list items.
Tests and docs:
- Add regression tests for focus ownership, teardown, event ordering,
lazy model identities, nested scenes and cell editors.
- Extend the AT-SPI validation scripts and document the current
performance characteristics and limitations.
- Prevent dense-map iterator invalidation during widget deletion.
- Invalidate widget and model references when scene ownership changes.
- Expose nested-scene controls through the host accessibility manager.
- Preserve identities when reparenting within the same host.
- Synchronize AT-SPI state access with asynchronous initialization.
- Wake the shared SDL event loop without retaining window-owned Input pointers.
- Add lifecycle regression tests and hidden multi-window AT-SPI validation.
- Ensure test-bus failures cannot skip child-process cleanup.
- Reimplement previews using nested UISceneNodes with isolated styles
and resources.
- Preserve live XML/CSS editing, unsaved buffer previews, external file
watching, and project resource loading.
- Use UIApplication for initialization, font resolution, and offscreen
rendering support.
- Enable Breeze by default, add a menu toggle, and replace
--use-app-theme with --disable-app-theme.
- Automatically preserve declared project viewport dimensions, with
an optional override to use the preview split size.
- Support embedded HTML documents inside WebView XML elements.
- Fix fading window shadows and shutdown with visible modal dialogs.
- Update documentation and add regression coverage.
SocketSelector used fd_set + select() on every platform. On POSIX,
descriptors >= FD_SETSIZE (1024) were rejected and only logged, so a
UI inspector listener or client opened that high was never serviced.
On Windows, the selector held at most 64 sockets (Winsock's default
FD_SETSIZE).
SocketSelector:
- Use a shared pollfd implementation on every platform: poll() on
POSIX and WSAPoll() on Windows. This removes both FD_SETSIZE limits.
Store descriptors in a SmallVector<pollfd, 16>, which covers the
inspector's peak without heap allocations.
- Report POLLIN | POLLERR | POLLHUP as ready to match select()'s read
readiness, so a peer disconnect still triggers the receive() that
discovers it. Windows reports a graceful shutdown as POLLHUP.
- Treat negative timeouts as an immediate check instead of an infinite
wait.
- Clear revents when poll() fails, so isReady() never reports readiness
left over from an earlier wait.
- An empty selector sleeps for a finite timeout and returns false;
with an infinite timeout it returns immediately. WSAPoll() rejects
empty sets, and nothing could ever become ready anyway.
- Remove sockets by swapping with the last entry instead of shifting.
- Raise the Winsock target to Vista (0x0600), the minimum for WSAPoll().
UI inspector:
- Stop watching the listener while the 16-client limit is reached. A
pending connection kept it readable, so every wait() returned
immediately and the network thread spun.
Tests:
- Add SocketSelector tests for listener and data readiness, removal,
duplicate adds, disconnect readiness, negative timeouts and empty
selectors, plus a POSIX run with every descriptor above FD_SETSIZE.
- Add HighFileDescriptorReservation, shared with
Http.tcpConnectTimeoutHandlesFdAboveFdSetSize. It raises the soft
RLIMIT_NOFILE when needed, so the high-fd tests run under common
defaults (1024 on Linux, 256 on macOS) instead of being skipped.
- Fix UIHTML.AttributeSelectorsMatchWidgetIds on Windows: it compared
c_str() of a temporary that was destroyed before the check.
- Fix UIHTML.StylesheetsDoNotPaintRawTextNodes on Windows: read the
frame before display(), because Windows drivers don't preserve the
back buffer after a buffer swap.
Selector matching (Selectors Level 4 §17.3):
- Retry other candidates for descendant and general-sibling combinators
instead of rejecting after the first failed path. Checkpoints use a
fixed array of one entry per checkpoint-saving rule (16 on the stack,
32/64 in out-of-line helpers, heap beyond), with failure pruning so
exhausted searches stop early.
- Handle <html> as a style-sheet parent boundary whose siblings stay
visible: failed parent steps at an <html> with element siblings retry
instead of rejecting, and a ~ candidate that is such an <html> resumes
its search without a checkpoint.
- Reject the subject before sizing storage for long selectors.
Style dependencies:
- getRelatedElements() now returns the union of tracked elements over
every matching path, so state changes on any eligible ancestor or
sibling restyle the subject. Strategies are chosen per selector:
immediate exit, fixed-prefix walk, single candidate scan (with a
shared suffix for ~ candidates), an ancestor-path DP, and a memoized
collector. All are linear and allocation-free for common selectors.
Other fixes:
- Exclude raw text nodes from matched author styles; their widget
backgrounds painted over glyphs drawn by the parent rich text.
- Report widget ids from getPropertyString() so [id=...] selectors match.
- Add StyleSheetSelectorRule::hasAnyPseudoClasses() and
UIStyle::getRelatedWidgets() (inline, ABI-compatible additions).
Build:
- Link libeepp with -Wl,-Bsymbolic-functions on Linux, BSD and Haiku so
internal calls skip the PLT (11,314 -> 619 PLT entries). Measured:
Markdown load -25%, selector matching -11%, attribute matching -14%.
Tests and benchmarks:
- Regression tests for backtracking, <html> boundaries, subscription
union and cleanup, operation-count bounds, long selectors and id
attribute selectors, plus a differential test against an exhaustive
reference matcher.
- Add Benchmark.CSSSelectorCombinators and Benchmark.CSSStateDependencies
and create all benchmark windows hidden.
- Add CalendarDate, TimeOfDay, LocalDateTime and DateRange with Gregorian
arithmetic, locale-aware formatting/parsing, ISO serialization and Unix
timestamp conversions with explicit UTC offsets.
- Add UIDateTimeEdit, UIDatePicker, UITimePicker, UIDateTimePicker and
standalone UICalendar, with XML/CSS registration and data binding.
- Support segmented keyboard editing, numeric entry, ISO paste, configurable
steps, bounds, empty values and independent seconds/milliseconds display.
Default time display to hours and minutes while preserving stored precision.
- Add day/month/year calendar navigation and a combined date-time popup with
time steppers, live configuration updates and scoped event connections.
- Add Breeze and fallback theme styles with CSS-defined SVG icons, dp sizing,
font-aware calendar dimensions and muted read-only/disabled controls.
- Map HTML date, time and datetime-local inputs to native controls with strict
value sanitization, min/max/step/required/readonly/disabled handling,
constraint validation and normalized form serialization.
- Provide private light HTML control defaults and intrinsic temporal sizing;
prevent author CSS from styling anonymous implementation parts.
- Share popup placement and visibility helpers across pickers, dropdowns and
trigger/cursor menus while retaining cascading-menu placement rules.
- Fix fractional grid wrapping and input cursor bubbling over child buttons;
notify and refresh styles when editing permission changes.
- Reduce CSS registration allocations with string_view parameters and
heterogeneous name lookup; inline frequently used node and CSS getters.
- Align CodeEditor default font sizing with text widgets without overriding
application preferences.
- Add HTML form margin defaults and update the affected rendering baseline.
- Upgrade Windows ecode nightly builds to Ubuntu 24.04 and newer MinGW.
- Add picker documentation, an example and regression coverage for date math,
locales, editing, popup placement/lifetime, HTML controls and pixel density
- Compensate for the difference between font ascent used by RichText layout
and the character-size baseline used by Text rendering. Cache the natural
baseline in each text span while preserving background and selection boxes.
- Add pixel-level coverage for proportional and monospace fonts at matching
and different sizes, with default and explicit line heights. Refresh the
affected rendering reference images.
- Keep diff view select buttons last in the child list so lazily created
image viewers cannot intercept their clicks.
- Display source images and generated diffs at native pixel dimensions,
independent of UI density, scaling down only to fit the viewport. Avoid
rounding twice at fractional densities.
- Add regression coverage for mode switching and sizing at densities
1, 1.5, and 2. Use portable temporary paths.
- Follow local Markdown links relative to each document, including
relative file:// paths, with configurable handling and async loading.
- Add validated subtree navigation interceptors and custom link flows.
- Introduce UIScrollableMarkdownView with XML support and scroll reset
after successful navigation.
- Add opt-in Back/Forward history, localized context menu actions, and
mod+[ / mod+] shortcuts; enable history in ecode previews.
- Restore preview tabs between sessions and preserve live editor binding
and unsaved source content when navigating back.
- Refresh the README around eepp's GUI framework and document the new APIs.
- Remove the fixed Markdown code font size and add regression coverage
- Clamp selection coordinates independently so horizontal dragging preserves
the selected row. Use the mouse event's Y coordinate against the terminal's
vertical bounds, including padding, and retain unclamped coordinates during
periodic updates outside the window.
Track when the formatting owner assigns fragment bounds and suppress
layout feedback from text-node and inline-span size changes. Preserve
size events and invalidation from callback-driven text or style changes.
Add regression coverage for content reuse and table sizing after size
callbacks. Preserve class sizes and existing member offsets.
Adjust browser toolbar padding and remove the URL bar's right margin.
- Reuse unchanged inline content and fragment lookups.
- Share plain-text min/max intrinsic measurements without copying
existing shaped layout state.
- Preserve content invalidation during active measurements.
- Default URL bar and CLI addresses to HTTPS while preserving
explicit URLs and local file paths.
- Fix Windows header macro conflicts and eproc signal declarations.
- Add regression coverage for reuse, rewrapping, and invalidation
Correct checkbox and radio autosizing, submenu padding, scrollbar skin
sizing, and nested menu-bar popup coordinates.
Preserve resolved stroke widths through CSS serialization and transitions,
including HTML's special px scaling.
Add high-density regressions for these fixes and the preceding DPI cleanup
commits, covering padding and margin setters, widget defaults, dialog
dimensions, table padding, editor spacing, and diff gutters.
Preserve the viewport when restoring a pane's selection on mouse focus,
so click hit testing uses the visible text. Keep scrolling to the restored
cursor for keyboard and programmatic focus changes.
Refs SpartanJ/ecode#958
- Translate SDL2 and SDL3 clipboard updates into ClipboardChanged events.
- Expose Unknown, Self, and External clipboard ownership metadata.
- Add regression tests for event dispatch and ownership defaults.
- Add a persisted eterm setting controlling tab bars in split panes.
- Fixed both scrolling tests. SDL2 starts text input automatically on desktop, so the first Space waited for a text event the key-only test never sent.
eepp framework:
- Add shared cookie jars to UISceneNode and UIWebView, plus versioned
CookieManager persistence, domain clearing, and locking in hasCookie().
- Follow HTTP 303 redirects and merge same-host redirect cookies as
name/value pairs without forwarding Set-Cookie attributes.
- Include Cookie headers in document cache keys while preserving static
resource reuse as cookies change.
- Submit HTML forms with an empty action to the current document URL.
- Extend NavigationRequest with source, mouse buttons, modifiers, and
navigation target; anchors forward this context to the scene.
- Emit OnLinkOpenRequested for middle-click, platform-modifier click,
and explicit new-tab requests, with current-view fallback if unhandled.
- Install the WebView navigation interceptor during construction.
- Dispatch middle clicks to the hovered node without moving keyboard focus.
- Add the clicked target to ContextMenuEvent so applications can extend
context menus through existing events.
- Parse HTML titles, emit TitleEvent, and fix onTitleChanged's payload cast.
- Load declared favicons through the shared image cache, emit
OnFaviconChanged, and ignore responses from superseded navigation.
- Add optional UITabWidgetSplitter tab-bar visibility while split;
keep it disabled by default and respect explicitly hidden tab bars.
- Add Space/Shift+Space scrolling and viewport-sized Page Up/Down steps
to UIScrollView, shared by WebView and Markdown content.
- Implement setEnableDefaultKeybindings() and preserve text-input
priority through normal bubbling without control-type checks.
- Report inserted UICodeEditor text as handled.
- Add UITextView::onFontColorChanged() and synchronize password-mask color.
- Support validated left, middle, and right clicks in the inspector
server and Python client.
ui_html example:
- Use UITabWidgetSplitter for tabs and user-controlled splits.
- Share cookies and the resource cache across tabs; persist cookies
between sessions and open new tabs blank.
- Add Inspect, Clear Domain Cookies, Clear All Cookies, and contextual
Open Link in New Tab actions through menu event subscriptions.
- Open requested links in background tabs and synchronize navigation UI.
- Use document titles and 16dp favicons for tabs, cap width at 200dp,
and truncate long titles with ellipsis.
- Enable tab-bar visibility across split panes.
- Fixed: the selection rectangle now uses the visible password symbols instead of the original text.
Update HTML compatibility and inspector documentation and add regression
coverage for persistence, redirects, cache isolation, navigation, menus,
titles, favicons, password colors, split visibility, and scrolling.
Store native and inherited fallback values outside local styles, then restore them when state rules stop matching. Handle indexed properties across overlapping states and retain a serialized value when an inherited source disappears. Add rollback regression tests and update the CSS documentation
Focus and select the first process row when pressing Down in the search input. Pressing Up from the first row returns focus to search in both table and tree views.
Generate size-aware macOS icons and separate runtime Dock PNGs for ee,
ecode, eterm, eeiv, and eproc. Keep shared PNGs sized for small Linux
icons, and package ecode's macOS runtime icon.
Bump eepp to 5.0.0 (Kittima-attā) and ecode to 0.9.0 (Yanta-lekhā).
Add guides for native UI authoring, layouts, application CSS, and HTML
compatibility. Update the CSS reference, rename article files consistently,
and point README links to the local guides.
Add Copy Link for HTML and Markdown anchors when no text is selected.
Resolve relative links against the document URI before copying, and cover
Markdown and WebView behavior with tests.
Fix layout width policy serialization to use the widget's width.
- Token generation (src/eepp/ui/tools/uiinspectorserver.cpp:67) now uses `BCryptGenRandom` on Windows, including for screenshot filenames.
- Split basic HTML defaults from document and form styles
- Load only structural defaults for Markdown views, leaving document colors and form-control styles to full HTML documents. Add Breeze styling for Markdown horizontal rules and HTML textareas.
`UIInspector` owns move-only event connections. Explicitly delete its copy constructor and assignment operator so MSVC does not instantiate invalid copies of the handle maps. Restore the dense map implementation
Add an opt-in TCP/NDJSON inspector for running eepp applications. It
provides authenticated, UI-thread-safe access to windows, scenes, and
widgets, including nested WebView documents. The v1 protocol supports
queries, trees, properties, focus, input actions, watches, screenshots,
and composed batches with result references and deferred execution.
Add a standard-library Python CLI, protocol documentation, build
entries, and integration tests. The listener remains disabled unless
explicitly enabled.
Fix HTML compatibility issues found while debugging NewsBlur:
- Let explicit flex minimums, including min-width: 0, replace the
automatic content minimum.
- Measure flex lines against the container content box when padding
and explicit dimensions are present.
- Keep promoted positioned descendants of hidden ancestors out of
the paint list.
Allow each LineSeries to fill down to the plot’s bottom edge, using a translucent version of its line color by default or a custom fill color. Render overlapping fills beneath the strokes, document the new API, and demonstrate it in the charts example. Add coverage for blending, data gaps, and toggling fills.
Introduce UITextSelectionController to coordinate selection across independent
RichText owners while retaining RichText hit testing and painting. Support
forward and reverse dragging, nested content, gap hit testing, autoscroll,
plain-text copy, select-all, and context menus.
Enable UIRichText and UITextSpan selection by default. Add CSS user-select
semantics and the -webkit-user-select alias, while preserving the separate
text-selection capability flag.
Clear selection safely when owners or documents are destroyed, suppress link
activation after a selection drag, and add regression tests, documentation,
and an updated rich-text example.
- Add persistent eproc settings for refresh interval, appearance, fonts,
and renderer options, with a settings button in the main window.
- Collect per-core CPU usage on macOS and FreeBSD for Performance charts.
- Keep the settings search focused in eproc and eterm, and wrap long
setting names.
- Share macOS theme-colored titlebar handling across ecode, eproc,
and eterm.
- Stabilize fixed-size UI tests on Retina displays and prevent macOS
build scripts from starting unlimited jobs when sysctl fails.
Use Breeze theme colors for eproc's process table and Performance charts,
while preserving the translucent Username colors. Keep process icons
visible in the light theme with a white tint.
Add eproc CLI options for font hinting, font antialiasing, and color scheme.
Add -c/--prefers-color-scheme to eterm and retain close-on-exit through
its long options.
Support EEPP_FONT_HINTING, EEPP_FONT_ANTIALIASING, and EEPP_COLOR_SCHEME
across eepp UI apps, with valid environment values taking precedence
over application settings. Document and test the overrides.
- Add CPU, memory, GPU, and network charts with ten-minute history,
a 60-second view, clickable cards, and overall or per-core CPU views.
- Add Family Memory and Family Memory % to both process views. Use
proportional memory on Linux, count zero-memory zombies correctly,
and collect the data after the first frame without delaying it.
- Add column tooltips, rename Total Memory to Resident Memory, keep
Command last by default, and migrate saved column layouts.
- Enable sorting within each tree level and preserve selection.
- Improve eepp chart margins and sorting behavior, and document UIChart.
- Add configurable vertical and horizontal grids with axis tick, data,
and screen spacing modes.
- Add monotone cubic line smoothing and angled X-axis tick labels.
- Return references for chart APIs that always have a result, and document
model ownership and borrowed references.
- Prevent empty tooltips and refresh chart hover when live data changes
under a stationary cursor.
- Update the charts example and add rendering and tooltip regression tests.