- Implement a Cocoa drag source on NSDraggingSession for SDL2 and SDL3.
- Use the offered snapshot as the drag image, or each file's Finder icon,
with AppKit's own count badge and copy cursor.
- Offer Generic alongside Copy only within the application, so SDL2's
Cocoa windows accept drops while other apps still see a copy-only offer.
- Report cancellation immediately and refuse the drop, since AppKit cannot
abort a running session.
- Fix macOS SDL3 builds: use pkg-config instead of the removed sdl3-config
and keep EE_SDL3_FROM_ROOTPATH for framework builds only.
- Build the native drag tests on macOS, add the Android drag sources, and
avoid the windows.h max macro in the Win32 source.
- Document macOS behavior and platform support.
- Introduce DragAndDrop with capability queries, copy-only file offers,
image previews, cancellation, and completion callbacks.
- Implement XDND and OLE sources with safe input recovery and window teardown.
- Keep SDL2 and SDL3 presentation and input handling in their own backends.
- Load X11 dynamically without adding a link dependency.
- Reuse Image, URI, and timing APIs; fix Image::fillWithColor().
- Add a manual playground, integration tests, and consumer documentation.
- Migrate SDK builds and packaging to SDL3 and fix bundled runtime lookup.
- Use the native AX navigation-order attribute name on older AppKit SDKs
- Supply missing UIA declarations with compatible COM signatures and UUID
- Generate missing x86/x64 UIAutomationCore import libraries for older MinGW
- Keep fallback library paths consistent across Premake 4 and 5
- Add native navigation-order and UIA event-advice ABI regression coverage
- 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.
CI fixes for the previous commit:
- Windows: announce one BoundsChanged on the window root when the scene
resizes, so UIA raises LayoutInvalidated again. Widgets still do not
report their own bounds changes.
- macOS: collapse identical pending notifications per element within one
update, so one text selection change posts a single
AXSelectedTextChanged. Created/Destroyed keep every occurrence, in order.
- MinGW: link the UIA test harness with -municode and uuid, which fixes
the nightly MinGW build.
Backends:
- Split the AT-SPI backend into a private header plus connection, events,
tree/marshalling and method files. Break the 600-line D-Bus dispatcher
into one handler per interface.
- Split the UIA backend into a private header plus core, element provider
and text range files.
- Share hasState/hasAction in accessibilitybackend.hpp instead of three
per-backend copies.
CI and docs:
- Run test_atspi.py --multi-window on Linux: closing a secondary window
while an AT-SPI client stays connected.
- Add docs/articles/uiaccessibilityarchitecture.md (layer map, files,
invariants, per-backend layout, common tasks, test matrix) and link it
from the articles index and the accessibility guide.
- Add a unit test for the single layout notification on scene resize.
Publish the base process snapshot without waiting for PSS collection.
Leave Family Memory blank until startup accounting completes.
- Derive PSS policy from saved column visibility before startup.
- Collect Linux startup PSS with four temporary workers and seed the cache.
- Apply completed samples only to matching process identities without
advancing performance history or aging ended processes.
- Preserve live cache entries while memory columns are hidden and
invalidate entries on PID reuse.
- Share table-state parsing and validation; remove unused migrations.
- Add next-tab and previous-tab commands with Mod+Tab and Mod+Shift+Tab.
- Remember and restore each tab's last focused widget.
- Add coverage for startup collection, cache lifetime, saved visibility,
and asynchronous family-memory updates.
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
- 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.
Implement chart axes, line series, data sources, pixel-bucket reduction,
tooltips, and pan, zoom, fit, and live-follow interactions. Register Chart
as a default UI widget and expose the new APIs through ui.hpp.
Add a responsive four-chart example, benchmarks, and unit tests. Reuse
rendering buffers and fix ring-buffer rendering and hover tooltip behavior.
Use KERN_PROC_PROC so eproc shows one row per process instead of one
row per thread.
Select clang by default in Premake 4 and 5, add the required FreeBSD
library paths and links, and remove redundant CI compiler overrides.
Fix the Premake 4 BSD SONAME rule so eproc can find libeepp.so when
launched from the repository root.
- Collect process and system metrics on macOS and FreeBSD.
- Resolve macOS app icons and share the XDG icon resolver between Linux and FreeBSD.
- Hide unavailable columns, label resident memory “Real Mem” on macOS, and scale row height with pixel density.
- Fix Premake filters and add macOS collector tests.
Add process columns, GPU metrics, tree mode, multi-process actions,
GUI and tray detection, and persistent filter and table settings.
Add optional column header reordering to eepp table and tree views.
Keep dragged headers in place during refresh and draw them above other
headers. Preserve row selection when sorting and when opening context
menus, and support application items in header context menus.
Refresh eepp and tool icons and add the icon generation script.
Add tests for the process views, icon decoding, and GUI table behavior.
Compute document line changes asynchronously against the repository
baseline and render added, modified, and removed markers in the editor
gutter and minimap.
Keep diff indicators disabled by default to avoid unexpected background
work. Add settings for enabling them and configuring the debounce delay,
with translations for all supported locales.
Handle fully added files, stale asynchronous results, document lifetime,
repository changes, and unsaved edits. Add focused Git diff and document
serialization regression coverage.
Vendor a reduced simdutf build and use it to accelerate String UTF-8 and
UTF-32 conversion and codepoint counting. Preserve efficient scalar and
cached-ASCII paths while reusing output storage for document snapshots.
Add simdutf to the Premake 4, Premake 5, and Android builds.
Fix UIConsole wheel and keyboard scrolling, and repair its text cache by
hashing log entries before moving their strings. Initialize cache hashes
and add regression coverage for scrolling and moved log entries.
Preserve debugger response data when notifying multiple listeners by
copying for all but the final listener. Remove an evaluation-order hazard
when capturing and submitting URIs for asynchronous document loading.
Refs SpartanJ/ecode#955.
- Centralized .gitignore, .prjallowed, and .prjdisallowed filtering in src/tools/ecode/projectdirectorytree.cpp:392.
- Live directories now require an already-admitted parent and use (parentDirectory, filename) matching before insertion.
- Live file additions use the same shared filtering.
- Newly admitted directories still load their own nested .gitignore before recursive scanning.
- Added eight direct regression tests in src/tests/unit_tests/projectdirectorytree_tests.cpp:84.
- Added the required ecode sources to both Premake unit-test targets.
- No FileSystemListener changes; directory moves remain outside this Add-focused patch.
- Context menu issue cause was terminal focus reporting: Codex enables focus events, and opening the popup sent ESC [ O through the ordinary input path, which scrolls to the bottom. Focus reports now use the non-scrolling protocol-write path while still reaching the application correctly.
- Add the eproc process-monitoring application and persistent window/table state
- Implement Linux process, network, GPU, icon, and GUI-window collection
- Add optional process columns, styling, i18n-ready strings, and command copying
- Retain exited processes for one update and color them as ended
- Extend table sizing and header behavior for persisted column layouts
- Organize Linux-specific sources under platform/linux
- Keep unsupported platforms buildable with a startup WIP warning
Add an EE::System::FileAssociation abstraction with XDG, Windows,
and macOS implementations.
Expose extensions from syntax predefinitions and add custom widget
support to UISettingsPanel. Add an ecode settings page for selecting
file associations and installing an XDG desktop entry.
Apply changes asynchronously with lifecycle-safe UI handling, disable
controls while applying, and avoid redundant XDG database updates.
Add translations and coverage for the new functionality.
Implements SpartanJ/ecode#192
- expose per-HWND fragment roots with safe WM_GETOBJECT subclassing
- marshal UIA queries and actions onto the owning UI thread
- stabilize provider identity, cache lifetime, and stale-node handling
- implement selection, value, range, expand, scroll, and text patterns
- add UTF-16 text ranges and native accessibility event delivery
- add a Windows UIA validation harness and CI coverage
- document lifecycle, performance, and compatibility results
Introduce UIScrollController to provide frame-rate-independent wheel
interpolation, touch dragging, and momentum for code editors, terminals,
scroll views, and scrollable widgets while preserving the legacy instant
scrolling path.
Add a UISceneNode-level smooth-scrolling policy. Embedded scenes inherit
the root scene setting, new widgets snapshot it during construction, and
setSmoothScrollEnabled() can optionally apply changes to existing widgets
across the complete embedded-scene hierarchy.
Move native macOS scrolling and title-bar helpers into PlatformHelper,
enable native momentum from UIApplication, and explicitly enable it in
ecode. Preserve precise SDL2 and SDL3 wheel deltas for fractional momentum
events without changing normal integer wheel steps.
Replace the separate editor and terminal preferences in ecode and eterm
with one global smooth-scrolling setting, including legacy configuration
migration, live updates, and localized settings text.
Improve UITouchDraggableWidget momentum handling and add regression tests
for scrolling interpolation, pixel-aligned editor positions, scene
inheritance, widget overrides, and immediate policy application.
- expose eepp windows and widgets through Cocoa NSAccessibility
- add lazy, stable native wrappers with safe lifecycle invalidation
- support hierarchy, focus, geometry, actions, values, and UTF-16 text APIs
- deliver coalesced native notifications for UI and model changes
- preserve surviving secondary windows when the primary closes
- add macOS semantic, notification, lifecycle, and performance harnesses
- add native unit coverage and accessibility example scenarios
- keep dormant accessibility overhead negligible
Decouple GL object sharing between native windows from auxiliary worker-thread context support. Platforms without threaded GL contexts, such as Haiku, must still share textures and other GL resources between their window contexts.
Always configure SDL_GL_SHARE_WITH_CURRENT_CONTEXT according to the requested context settings, while continuing to create the auxiliary thread context only on supported platforms. Explicitly reset the SDL attribute for non-shared contexts to avoid leaking state into subsequent window creation.
Apply the fix to both SDL2 and SDL3 backends. Also link the Haiku unit test executable against libbsd and libnetwork to resolve its PTY and socket dependencies.
- let UIApplication create, manage, render, and destroy multiple native windows
- add scoped scene and GL window-context switching
- route input events to the scene belonging to each native window
- share application fonts, themes, icons, styles, and graphics resources safely
- add NewInApplicationWindow factories for UIWindow, UIFileDialog, and UIMessageBox
- support native parent relationships, modality, minimum sizes, and optional positioning
- close child windows when the primary application window closes
- defer native context destruction until the end of the application tick
- fall back to in-scene windows for Emscripten and terminal rendering
- reapply renderer state caches when switching OpenGL contexts
- fix SDL2/SDL3 display bounds and multi-window lifecycle handling
- add a native file-dialog and message-box multi-window example
- add integration coverage for context switching, input, resources, modality, and closing
Build:
- Link eterm with CoreFoundation and CoreServices on macOS
- Satisfy the framework dependencies required by efsw's FSEvents backend
Applications:
- Move eterm settings operations into a dedicated SettingsActions class
- Centralize settings window lifecycle and font configuration actions
- Route settings panel font-size updates through SettingsActions
- persist keybindings in keybindings.cfg with configurable primary and secondary modifiers
- hot-reload bindings and merge newly introduced defaults
- open keybindings.cfg in a terminal-font-sized code editor tab
- indicate unsaved keybinding changes using the modified-tab marker
- share tab and split commands between terminals and the keybindings editor
- add bindings for terminal actions, tab navigation, numbered tabs, splits, renaming, and tab movement
- expose keybindings through terminal and tab context menus
- add tab split and move-left/right context menu actions
- centralize widget semantics and actions in the accessibility resolver
- cover text edits, combos, tabs, menus, range controls, and selection states
- emit value, state, selection, bounds, and description notifications
- improve AT-SPI and UI Automation event mappings
- expose UIA value and expand/collapse patterns
- add a live model-backed Accessibility inspector tab
- add a native accessibility example application
- expand semantic and action unit-test coverage
- add --with-lto support to Premake 4 and 5 release builds
- use ThinLTO with Clang, automatic LTO with GCC, and LTCG with MSVC
- exclude Emscripten builds from LTO configuration
- retry SDL2 clipboard writes on Windows when the clipboard is temporarily unavailable
- make the UIMergeView copy regression test independent of the system clipboard
Mirror UIMenuBar hierarchies into AppKit while keeping eepp menus as the
source of truth.
Add semantic item activation and menu lifecycle hooks so native actions,
lazy menus, checkboxes, radio buttons, visibility, enabled state, and
submenus preserve existing eepp behavior. Support shortcuts and standard
About, Preferences, Quit, Window, Help, and Services menu integration.
Keep the platform adapter private to the UI implementation and support
safe installation, synchronization, and removal of the native menu.
Migrate ecode away from its hand-written Cocoa menu, assign semantic menu
roles, and populate the UI Language submenu synchronously so it is ready
on its first opening.
Add unit tests covering activation, menu lifecycle, roles, and submenu
preparation.
Refs: SpartanJ/ecode#823
Introduce observable and computed values, typed widget bindings, validation groups, UI properties, commands, and UI-thread delivery.
Add observable vector and list model support for incrementally updated collections, with filtering and source-row mapping.
Modernize the Flight Booker and CRUD examples and add focused data handling and collection examples demonstrating the new APIs.
Organize the UI binding headers under ui/databinding, expand test coverage for notification and lifetime semantics, and document API selection, validation, ownership, threading, and performance behavior.
SDL2 prevents the default action for Ctrl/Cmd key events on Emscripten,
which stops browsers from emitting the native paste event.
Intercept Ctrl/Cmd+V before SDL2 consumes it, allow the browser paste
event to update the internal clipboard, and replay the keydown so the
application executes its normal paste command.
Also refresh the clipboard through the asynchronous Clipboard API when
opening a context menu, enabling paste actions triggered without a
keyboard shortcut.
Export Emscripten's ccall runtime method so the browser clipboard helper
can reliably invoke its C++ callbacks in optimized builds, and disable
clang-format for the header containing embedded JavaScript.