4946 Commits
Author SHA1 Message Date
Martín Lucas Golini 64c75f101c Fix flaky test.
The test assumed one worker guaranteed one connection, but queued requests can reserve additional sockets.

Fixed the test (src/tests/unit_tests/uiwebview_tests.cpp:3845) by explicitly limiting its pool to one connection. The strict reuse assertions remain unchanged.
nightly
2026-10-17 02:30:11 -03:00
Martín Lucas Golini 8afc62557f Fix headless GL context lifecycle in SDL2 and SDL3
- Give offscreen worker contexts a separate EGL surface.
- Reset and configure GL attributes before creating windows.
- Retain EGL for process lifetime to prevent reload crashes on Linux.
- Keep the initializing window current during framebuffer creation.
- Avoid recreating the batch renderer during framebuffer teardown.
- Test shared texture uploads and worker exit after Engine shutdown.
2026-10-17 02:20:25 -03:00
Martín Lucas Golini c1b609ed42 Add eeiv settings and fix font preferences across applications
- Add eeiv's searchable settings panel, welcome-screen button, and Ctrl/Cmd+, shortcut.
- Persist image filtering and info visibility in state.cfg.
- Backport eterm's font fixes and add matching font controls to eproc.
- Apply font changes to existing widgets and handle UI density correctly.
- Fix rejected-font cleanup to prevent font-picker crashes.
2026-10-17 01:42:18 -03:00
Martín Lucas Golini 726aeaa254 Ups. 2026-10-16 12:57:56 -03:00
Martín Lucas Golini 6639101262 eproc: stabilize the first frame and speed up startup collection
- Restore saved columns and sorting before publishing process data.
- Apply final cell styles before their first paint, avoiding redundant reloads.
- Publish ready startup snapshots on the next UI update.
- Overlap initial Linux process and socket-ownership scans.
- Skip DRM descriptor scans on NVIDIA-only systems, preserving mixed-GPU
  and unknown-driver handling.
2026-10-16 12:57:41 -03:00
Martín Lucas Golini 379dbd26ba Fix macOS build. 2026-10-16 10:42:54 -03:00
Martín Lucas Golini bec24db054 Fix flaky HTTP socket-budget wakeup regression test
Replace the 50 ms sleep and 200 ms deadline with a synchronized
condition-wait handshake and a generous transfer deadline.

Add a scoped budget-wait hook to keep fallback polling beyond the test
deadline. Use the budget change counter as the wait predicate so spurious
wakeups cannot hide a missing notification.

Confirmed the test fails when the idle-socket notification is removed.
2026-10-15 16:00:08 -03:00
Martín Lucas Golini f0065b65ea Merge branch 'develop' of github.com:SpartanJ/eepp into develop 2026-10-15 13:51:36 -03:00
Martín Lucas Golini f80b44a778 Merge branch 'feature/dragndrop' into develop 2026-10-15 13:48:05 -03:00
Martín Lucas Golini b33c0ec7f9 Run native drag-and-drop integration tests in Linux CI
- Run X11 and Weston tests at 1x and 2x scale.
- Accept both libwayland object ID log formats.
- Preserve test failures through logging pipelines.
- Add shell32 to Windows dependencies in both Premake scripts.
- Update SDK platform support and linking documentation.
2026-10-15 12:54:27 -03:00
Martín Lucas Golini ee8f560bde Add native Wayland file dragging for SDL2 and SDL3
- Load Wayland APIs dynamically and track genuine pointer press serials.
- Serve file URI lists on a dedicated queue and transfer thread.
- Render native drag icons with Copy, rejected and pending feedback.
- Use memfd_create on Linux with a portable temporary-file fallback.
- Suppress synthetic gesture releases and clean up on cancellation,
  window destruction and process exit.
- Add isolated Weston integration tests and document API requirements.
2026-10-15 10:58:58 -03:00
Martín Lucas Golini f0a21c3f9f Added backward to all eepp tools in both Premake configurations, including eterm, eproc, eeiv, and the editors/texture packer. Optional Linux libdw support now lives in the shared helper. 2026-10-15 01:37:19 -03:00
Martín Lucas Golini 00999e26c3 Queue HTTP connection waits, add a socket budget and cancel on shutdown
Requests that hit a connection limit used to wait inside their worker,
polling every 10 ms, and an async request's timeout included that wait.
On a page with many resources from one origin, later requests timed out
while queued, and waiting requests tied up shared thread-pool workers
that other origins needed.

Connection queue:
- Serve blocking and async requests from one first-come, first-served
  queue per pool. Requests waiting on one origin's limit never block
  requests to other origins.
- In shared thread-pool mode, an async request runs on a worker only
  after it has been granted a connection. Grants are handed to the
  executor from a service thread, never from the thread releasing a
  connection, which could be inside the executor's own lock.
- Requests hold their executor only weakly, so a request can never be
  the last owner of the thread pool running it.
- Start an async request's timeout once it holds a connection. A
  blocking call's timeout still covers the wait plus the transfer, and
  a resumed download keeps its deadline across the HEAD probe.
- Wait on a condition variable instead of polling. Cancelling by ID,
  shutdown() and Pool::close() release queued requests immediately.
- Let running requests and blocking callers take over a slot reserved
  for queued work that has not started; that work queues again, first
  in line. Without this, a redirect, retry or resumed download on a
  busy executor could wait forever on slots reserved behind it.
- When queued work starts, switch to a connection that went idle while
  it waited, instead of opening a new one.
- Replace an idle connection the server has closed in place, keeping
  its slot.

Process-wide limit and idle expiry:
- Limit open sockets across all pools with
  Http::setMaxOpenConnections() (default 256). At the limit, close the
  least recently used idle socket in any pool, then a socket held for
  queued work, and only wait while every socket is in active use.
- Wake waiters on the limit when a socket goes idle, and recheck a
  change counter so a wake-up just before waiting is never missed.
- Only inspect a socket for reclaim once its connection is known to be
  idle or reserved, never while a request is using it.
- Close idle connections from a background timer when idleTimeout
  elapses, instead of only when a connection is next requested in the
  same pool.
- The budget and its service thread are intentionally never destroyed,
  so the thread is never joined during static destruction, which would
  deadlock under the Windows loader lock.

Shutdown:
- Add Http::cancelAllRequests(), which cancels every queued and running
  request in every pool and closes idle connections. A per-pool
  generation counter makes running requests stop at their next check,
  and the pools stay usable afterwards.
- Add Http::waitForConnectionsToClose().
- Engine cancels all requests as it starts shutting down. Once its
  windows are closed, it waits up to 100 ms for sockets to close before
  ending TLS.
- Check for cancellation every 25 ms instead of 100 ms while reading, so
  requests stop within that wait.

TLS:
- SSLSocket::end() now waits while TLS sockets exist: the last socket
  destroyed releases the backend, and a socket created in the meantime
  keeps it.
- Set up the backend and register a new socket a
  lock, so a concurrent end() cannot release the backend in between.
- Add SSLSocket::isInitialized() and a testing h
  socket construction.
2026-10-15 00:36:56 -03:00
Martín Lucas Golini ad69ee977e Fix project encoding test scanning downloaded SDL3 SDKs
Skip versioned SDL2 and SDL3 SDK directories before recursing,
preventing bundled libraries and debug symbols from being treated
as project text files.
2026-10-15 00:07:27 -03:00
Martín Lucas Golini 0b182de93e Fix Windows MSVC build. 2026-10-14 22:01:18 -03:00
Martín Lucas Golini a7ca505229 Add bounded HTTP/1.1 connection pooling for browser sessions
Replace thread-local connections with owned pools shared across workers.
Bound total and per-origin connections, expire idle sockets, and check
idle connections before reuse. Retry safe requests after stale-connection
races without replaying POST requests.

Fix response framing, chunk trailers, decompression completion, empty
compressed bodies, and handling of bytes beyond completed responses.

Give each WebResourceCache partition its own transport, preserving
connections across navigation and shared tabs. Close session transports
without blocking the UI thread. This substantially improves browsing
performance in the ui_html example.

Preserve every Set-Cookie field and attribute redirect cookies to the
client that received the response. Prevent rejected redirects from
assigning cookies to their destination.

Add regression coverage for pooling, framing, cancellation, TLS policy
isolation, browser sessions, and redirect cookie attribution
2026-10-14 21:05:40 -03:00
Martín Lucas Golini b53ea69258 Fixed the missing SDL3 startup wrappers. Premake now adds sdl3_main.cpp (src/eepp/main/sdl3_main.cpp) once per MSVC executable to supply main/WinMain, while preserving the accessibility harness’s own wmain. 2026-10-14 20:38:57 -03:00
Martín Lucas Golini 60f025fde2 Fix SDL backend isolation in platform helpers
Include only the selected backend in Engine and guard both platform helper
classes and the SDL2 implementation. This prevents MSVC SDL3 builds from
exporting SDL2 vtables and failing with unresolved helper methods.
2026-10-14 19:16:26 -03:00
Martín Lucas Golini 45f11f6816 Add native file dragging on macOS
- 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.
2026-10-14 18:37:08 -03:00
Martín Lucas Golini f809e84b53 test(a11y): stabilize inactive performance benchmark and CI coverage
- Warm the notification workload before timing one million calls
- Collect ten fixed enabled/disabled pairs with alternating order
- Preserve the 1.01x ratio-of-medians guard without conditional retries
- Validate reported measurements and retain JSON diagnostics on failure
- Prevent D-Bus service output from contaminating benchmark artifacts
- Run native AT-SPI checks after timing failures without masking CI failure
- Add deterministic runner tests and document the measurement protocol
2026-10-14 18:12:23 -03:00
Martín Lucas Golini 6e38945211 Add native file dragging on X11 and Windows
- 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.
2026-10-14 17:24:56 -03:00
Martín Lucas Golini 110a9d46f0 Fix numeric cleanup stripping significant trailing zeros
Only trim zeros from fractional digits, preserving integers and
scientific notation. Fixes the universal locator calculator displaying
14 instead of 140 for 86504-86364.
2026-10-14 14:48:35 -03:00
Martín Lucas Golini ea40c532a7 Fix Fish startup warnings from placeholder terminal dimensions
Use an 80×24 grid when a terminal view has fewer than two rows or
columns, preventing placeholder and collapsed layouts from creating
a one-row PTY. Resize normally once usable layout dimensions exist.

Add regression coverage for startup sizing and resizing after layout.

Refs: SpartanJ/ecode#969
2026-10-14 11:34:54 -03:00
Martín Lucas Golini 5833344902 refactor(scene): unify current scene and window context binding
Move Context and makeCurrent() from UISceneNode to SceneNode, allowing
scene drawing, updates, and input/IME dispatch to use the same scoped
binding without UI-specific branches.

Replace SceneManager's cached UI scene and scoped scene pointers with
one persistent SceneNode binding. Add setCurrentSceneNode() and make
getUISceneNode() return nullptr when the current scene is not a UI scene,
removing implicit fallback searches.

Establish the default binding during initialization and select a
surviving application scene when the current native window closes.
Use scoped binding in UICodeEditor::showFindReplace() and migrate
existing callers of the UI-specific setter.

Add regression coverage for nested and moved contexts, strict UI lookup,
cross-window restoration, scene removal, find/replace, and window closing.
2026-10-13 01:29:35 -03:00
Martín Lucas Golini d1ea03f420 fix(ui): clear stale dirty queues when widgets change scenes
Remove pending layout, style and style-state entries from the old
scene during rebinding without invalidating shared accessibility
identities. Requeue dirty layouts in the destination scene while
preserving their invalidation reasons.

Fix a use-after-free exposed by TabFocus.WidgetCreatorDefaultsAreIntentional
after deleting a WebView.

Add regression coverage for WebView deletion, subtree and reverse
rebinding, and coalesced layout work.
2026-10-13 00:17:21 -03:00
Martín Lucas Golini c59920c72c feat(a11y): expose basic HTML accessibility semantics
- Expose source text, heading levels, links, lists/items and image alt text
- Keep formatting wrappers transparent and nested controls accessible
- Route link activation through existing navigation and interception
- Project passive fragment focus to links while preserving control focus
- Notify clients of text, href, alt text and semantic role changes
- Map HTML semantics to AT-SPI, UIA and macOS accessibility APIs
- Avoid advertising selection capabilities for static HTML lists
- Preserve dormant allocation behavior without new per-widget caches
- Fix MinGW harness compatibility with both TreeScope enum spellings
- Add unit/native regression coverage and update accessibility docs
2026-10-12 23:33:46 -03:00
Martín Lucas Golini 28cc1e528f fix(a11y): restore compatibility with older macOS and MinGW SDKs
- 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
2026-10-12 20:00:57 -03:00
Martín Lucas Golini ddbec94c2f Merge branch 'feature/a11y' into develop 2026-10-12 13:38:35 -03:00
Martín Lucas Golini 7044db3038 Update docs. 2026-10-12 12:27:44 -03:00
Martín Lucas Golini edf0ab26f0 Fix build warnings. 2026-10-12 11:06:50 -03:00
Martín Lucas Golini 20cef23920 Fixed an HTML input regression:
- focusable now targets the native control, without making the host another Tab stop.
- Overrides survive type changes, including transitions through hidden.
- Added regression coverage and updated documentation.
2026-10-12 02:52:53 -03:00
Martín Lucas Golini 1aa874d766 feat(ui): introduce intentional tab-focus defaults
- Make generic widgets non-tabbable and opt interactive controls in
- Keep composite controls and model views from exposing duplicate stops
- Fix reverse traversal and list-row focus navigation
- Complete keyboard activation and popup navigation for affected controls
- Preserve explicit focus policies and ecode search navigation callbacks
- Align accessibility focus semantics with effective keyboard targets
- Add tab-navigation regressions and document custom-widget migration
2026-10-12 02:38:25 -03:00
Martín Lucas Golini a06826ee72 refactor(a11y): expose virtual widget semantics and encapsulate hierarchy bridge
- 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.
2026-10-12 01:16:35 -03:00
Martín Lucas Golini 2a2bbea989 refactor(a11y): move scene-rebinding cleanup into UIWidget
- 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
2026-10-11 23:50:01 -03:00
Martín Lucas Golini 273abed43d test(a11y): cover dormant reparenting and reentrant indexed insertion
- Verify semantic references survive same-scene reparenting through plain
  nodes and are invalidated when moving between scene owners.
- Check text references and semantic hierarchy without native clients.
- Verify indexed insertion reports the final semantic index when a
  child-count callback reorders destination siblings.
- Assert stable identities and exactly one ordered removal/arrival pair.
2026-10-11 19:56:02 -03:00
Martín Lucas Golini 87d50eb177 perf(a11y): reduce dormant overhead and decouple scene notifications
- Move process-wide client activity tracking into Accessibility
- Remove UI dependencies from Node through an optional hierarchy observer
- Inline dormant manager checks and avoid redundant subtree cleanup
- Preserve invalidation of identities retained by explicit semantic queries
- Skip idle AT-SPI atomic exchanges and async-resource queue locking
- Avoid empty-set style lookups and redundant dispatcher lookups
- Add lifecycle, multi-scene activity and async-delivery regression tests
- Update accessibility architecture documentation
2026-10-11 18:48:53 -03:00
Martín Lucas Golini 866851c061 fix(a11y): track plain-node subtree moves and fix MSVC build
- 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.
2026-10-11 15:12:31 -03:00
Martín Lucas Golini 4112805706 Fix debug build. 2026-10-11 14:08:29 -03:00
Martín Lucas Golini 218c634bf2 Merge branch 'develop' into feature/a11y 2026-10-11 14:08:11 -03:00
Martín Lucas Golini 48b0ce6db6 Should fix MSVC build. 2026-10-11 14:07:18 -03:00
Martín Lucas Golini f380cd7630 Merge branch 'develop' into feature/a11y 2026-10-11 13:08:33 -03:00
Martín Lucas Golini 15f76e4872 Fix MSVC build. 2026-10-11 13:08:12 -03:00
Martín Lucas Golini b79b4444d6 Merge branch 'develop' into feature/a11y 2026-10-11 12:59:47 -03:00
Martín Lucas Golini ccb03a3b8e Add inherited RTL direction and logical UI layout support
- 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.
2026-10-11 12:29:16 -03:00
Martín Lucas Golini 32a9b7084d fix(ui): preserve LSP tooltip highlighting on repeated hover responses
Restore the tooltip source when its text cache has been transformed,
even if the incoming tooltip text is unchanged. This prevents repeated
Markdown highlighting from losing fenced-code syntax colors.

Keep accessibility notifications gated on actual source-text changes.
Add a regression test covering repeated hover responses and rendered
color retention.
2026-10-11 11:54:25 -03:00
Martín Lucas Golini 925053484d Fixed all review items:
- Password-mode changes immediately clear/restore the Inspector preview and notify native clients.
- Added regression tests without artificial focus events.
- Verified full-value copying and password privacy using an in-memory clipboard.
- Updated incremental-index documentation.
2026-10-11 11:10:31 -03:00
Martín Lucas Golini 64e13cc80b perf(ui): bound accessibility Inspector value refreshes
- 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.
2026-10-11 03:05:18 -03:00
Martín Lucas Golini cc2097f854 Fixed the test’s recursive callback with std::exchange(nested, nullptr) and added assertions that it runs exactly once and remains cleared. 2026-10-11 01:31:38 -03:00
Martín Lucas Golini a154e1c9f9 perf(a11y): reduce cold text indexing overhead
- 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.
2026-10-11 00:58:03 -03:00
Martín Lucas Golini e8e0a26727 perf(a11y): incrementally index text and bound AT-SPI dispatch
- 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
2026-10-10 23:59:58 -03:00