Commit Graph
100 Commits
Author SHA1 Message Date
Martín Lucas Golini a71e062dfb Fix font picker collision test on macOS: Use the bundled Noto Sans KR font for both the managed and copied external font fixtures. This guarantees matching family metadata without relying on platform-specific system font collections or face aliases. 2026-08-11 13:47:44 -03:00
Martín Lucas Golini cd3df721a8 Try fix test in macOS 2026-08-11 13:20:46 -03:00
Martín Lucas Golini 6df0c0738f Add font size selection to ecode font picker:
Allow UIFontPickerDialog sections to be hidden and make ecode's UI, editor, and terminal font dialogs select both the font and its size.
Keep external fonts selectable across asynchronous font enumeration, including when they share a family name with a system font, and label them as external. Also normalize UILinearLayout weights across visible children so hidden picker columns release their space correctly.
Update font picker previews, size units, menu labels, translations, and lifetime handling.

Addresses SpartanJ/ecode#944.
2026-08-11 12:38:34 -03:00
Martín Lucas Golini 10a5d7effc ecode: Enable line-wrap by default on new installations.
Added Code of Conduct and Contributing documents.
Added templates for bug reports and feature requests.
2026-08-10 21:13:16 -03:00
Martín Lucas Golini d31e880cc3 Fix bidirectional clipboard support in Emscripten builds:
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.
2026-08-10 00:32:01 -03:00
Martín Lucas Golini 357f00c8ed perf: keep common text selections in inline storage
- migrate TextRanges to SmallVector with capacity for two selections
  - preserve vector, initializer-list, and single-range construction
  - add coverage for inline storage, copying, and heap fallback
  - export UIStyle::PropertyResolution for Windows shared builds
2026-08-09 22:09:29 -03:00
Martín Lucas Golini 23cf9084ce perf: reduce allocations across UI and editor hot paths
- reuse formatting, document text, property resolution, and layout storage
  - use inline containers for interpolations, callbacks, wrapping, and matcher state
  - optimize single-line insertion by mutating document lines without splitting
  - iterate PATH entries directly in Sys::which and reuse candidate buffers
  - avoid temporary clocks and string copies in frequent ecode plugin updates
  - retain documents during autocomplete cache jobs and prevent duplicate scheduling
  - fix PatternMatcher copy assignment and MSVC move-only container compilation
  - expand coverage for matching, text insertion, reusable strings, and Sys::which
2026-08-09 21:38:17 -03:00
Martín Lucas Golini 5f419ca58d Reduce allocations in CSS parsing and style updates
- reuse reentrant property-resolution storage during variable substitution
  - skip redundant resolution-slot copies using structural source comparison
  - retain variable cache capacity and resolve variables in place
  - avoid copying canonical names for definition-backed properties
  - propagate resolved inherited properties by reference through widget trees
  - parse animation and transition declarations with allocation-light string views
  - share declaration tokenization between animation and transition parsers
  - avoid empty animation-map and action-query allocations
  - parse border radii without temporary split vectors
  - accept string views when converting UI lengths
  - format color hex values directly without string streams
  - use inline storage for small polygon point collections
  - preserve animation parsing semantics and fix longhand direction handling
  - save eeiv configuration when closing through keyboard shortcuts
  - extend animation, variable-resolution, property-name, and color tests
2026-08-09 19:22:00 -03:00
Martín Lucas Golini 482833d95f * Fixed the crash in src/tools/ecode/globalsearchcontroller.cpp:603.
Probable reproduction:
  1. Open global search.
  2. Enter a search term.
  3. Start “replace in files” with Mod+R.
  4. Before the asynchronous search finishes, switch to document search.
  5. Immediately reopen normal global search.

The replace tree becomes active as soon as the search starts, but its model is only assigned when the asynchronous result arrives. Reopening normal global search tried to reuse that still-null model and called rowCount() on it. The loader is also closed during this transition, explaining the SceneNode::checkClose() trace from another timing of the same sequence.

The fix:
- Only transfers replace results when the replace model exists.
- Adds a defensive null check to updateGlobalSearchBarResults().
2026-08-09 01:02:46 -03:00
Martín Lucas Golini b6cdc83818 ui: add typed value conversion errors
Replace boolean output-parameter converters with UIValueResult so conversion failures can provide numeric codes and optional diagnostics without exposing partially converted values.
Expose observable converter error state from UIDataBind, UIProperty, and UIValueBinding.
Reject invalid widget input without changing the model or propagating it to sibling widgets, while keeping programmatic model updates authoritative.
Migrate ecode's custom output parser converter, expand binding tests, and document the data-handling architecture and next form-validation
phase.
2026-08-09 00:52:00 -03:00
Martín Lucas Golini 01d5614a71 ui: add scoped event and observable value bindings
Introduce EventConnection and EventConnectionList for scoped Node event listeners that safely handle either emitter or observer destruction order.

Add ObservableValue and UIValueBinding for UI-independent observable state, along with a shared UIValueConverter policy used by both observable and raw data bindings.

Harden UIDataBind and UIProperty lifetime behavior, documentation, conversion, operators, and multi-widget handling. Preserve UIProperty as the lightweight option for UI-local owned values and UIDataBind for explicitly managed external values.

Use inline ordered callback storage to preserve registration-order dispatch without per-listener tree allocations.

Migrate submenu observation to scoped connections, safely clear ecode run configuration bindings before model erasure, and simplify the 7GUIs Counter example with UIProperty.

Add lifecycle, ordering, conversion, binding, and mutation regression tests.
2026-08-08 20:28:45 -03:00
Martín Lucas Golini 90c5d12c3e ecode: Ups restore the correct find and replace. 2026-08-08 00:52:13 -03:00
Martín Lucas Golini a7002ed08c ecode: Fix several commands being executed in the editor that registered the commands and not the current editor! 2026-08-08 00:32:13 -03:00
Martín Lucas Golini 5c957121d9 Link unit-tests against pthread 2026-08-07 01:59:01 -03:00
Martín Lucas Golini ea44f9f0f7 ecode: defer top-level settings menus to first show - Settings sub-menus were built eagerly on the startup critical path. Defer each top-level menu (Edit, Terminal, Tools, Window, Help, Document, View, Project) to its first OnMenuShow, following the existing lazy-submenu pattern: an empty placeholder is populated on first show and reloadStyle'd so it sizes correctly before positioning. Measured with Superluminal: settings-menu construction dropped from ~22.7ms to ~3.6ms, cutting launch time from 125ms to 107ms minimum (on my old AMD 3900X). 2026-08-07 00:05:06 -03:00
Martín Lucas Golini 0c6e14b9a4 Should fix MSVC build. 2026-08-06 10:24:23 -03:00
Martín Lucas Golini d90ffe6fea Reduce allocations in actions and CSS style updates
- allocate Action instances from reusable size-class pools
  - use inline storage for Runnable callbacks, action sequences, spawned actions,
    callback registrations, and main-thread action queues
  - preserve action factory and ownership semantics while recycling completed actions
  - cache computed transitions in ElementDefinition instead of reparsing them on
    every state change
  - parse transition and timing-function values through allocation-light string views
    and inline parameter storage
  - add a non-owning FunctionString view parser with callback-based parameter iteration
  - preserve nested functions, quoted parameters, escaped quotes, and early termination
  - fix transition timing-function lists to cycle independently from delay lists
  - avoid copying variable caches during CSS variable substitution
  - parse drawable sizes and positions without allocating split string vectors
  - reuse animation state and reduce temporary property parsing allocations
  - avoid memory-manager bookkeeping allocations for static source filenames
  - consolidate whitespace trimming through the existing String utilities
  - add regression coverage for action reuse, transition parsing, computed transition
    lookup, timing-list cycling, and non-owning FunctionString parsing
2026-08-06 01:16:52 -03:00
Martín Lucas Golini 74b0454721 Refactor CSS properties to use dense IDs and bitsets:
Introduce contiguous PropertyId and ShorthandId enums backed by name-to-ID maps, replacing hash-valued property identifiers throughout the style system.
Replace PropertyIdSet's unordered set with a fixed-size bitset, eliminating heap allocations during style state changes while providing deterministic ascending iteration.
Keep name hashes for stylesheet storage and unknown or custom properties, while using dense typed IDs for registered-property lookup and dispatch.
Preserve property aliases and the public Checked compatibility identifier.
Add transaction-end reconciliation for interdependent image sizing properties, deferring percentage-based calculations until their containing block is resolved.
Keep formatting-context-owned sizes intact for table cells and inline content.
Add validation and tests for dense built-in registration, custom IDs, aliases, bitset operations, allocation-free storage, unknown properties, property application order, and image sizing regressions.
2026-08-05 20:53:13 -03:00
Martín Lucas Golini ca97999942 Ups, this should fix MSVC Windows build of unit-tests. 2026-08-05 12:47:30 -03:00
Martín Lucas Golini 120471343c Fixed both CI issues.
- MSVC:
      - Removed lambda-based eeNew expansion in favor of typed MemoryManager::trackNew().
      - Added macro expansion indirection.
      - Enabled MSVC’s conforming preprocessor with /Zc:preprocessor across Premake 4/5 static libraries, shared libraries, and executables.
      - Verified generated VS2022 projects contain the flag, including eterm-static and eepp-maps-static.
      - Added explicit standard-library includes to memorymanagerglobal.cpp.

  - Linux/macOS release tests:
      - MemoryManager.tracesPlainNew is now compiled only with EE_MEMORY_MANAGER, since global tracing is intentionally debug-only.

Added new plan to improve PropertyIdSet.
2026-08-05 11:53:36 -03:00
Martín Lucas Golini afb2d44bda core: extend debug allocation tracing and reduce render-time allocations
- intercept global new/delete operations in debug memory-manager builds
  - distinguish anonymous global allocations from source-tracked leaks
  - modernize eeNew to support constructor-expression syntax
  - improve memory reports with tabulated leaks and separate largest allocations
  - cache autocomplete shortcuts instead of hashing string keys on key events
  - reuse UIStyle property sets across state changes
  - reuse Text shadow colors and avoid temporary outline-color copies
  - use inline storage for temporary linear-gradient rendering data
  - make unit tests resolve assets from the executable directory
  - add memory-manager and PropertyIdSet regression coverage
2026-08-05 11:02:35 -03:00
Martín Lucas Golini 445aac792d Fix CSS auto margins for replaced HTML elements
Model HTML images as replaced UIHTMLWidget elements with independent loading, sizing, and rendering behavior.

Resolve auto margins according to each element's formatting context, including normal-flow blocks, positioned elements, flex items, and grid items. Preserve intrinsic sizing for block-level images with width:auto and constrain them through CSS min/max dimensions.

Correct absolute-positioned containing-block coordinates and rich-text handling of atomic inline elements. Add regression coverage for centered images, deferred image loading, grid margins, positioned elements, and document flow after image loading.

Document the remaining work required for dynamically changing non-atomic inline elements.

Avoid saving eeiv configuration during destruction (fixes window state saving).
2026-08-04 13:32:22 -03:00
Martín Lucas Golini 0de33c574d Fix CSS statement at-rules consuming following rules
- stop statement at-rules such as @charset at their semicolon
  - preserve the following selector and declaration block
  - support feature-level not() expressions in media queries
  - add regression coverage for @charset and negated media features

Fixes Lobsters theme variables being discarded, which caused mixed light and dark colors when loading its stylesheets.
2026-08-03 22:52:25 -03:00
Martín Lucas Golini bfe72a439b Optimize compile times by isolating chrono usage
- move chrono implementation details out of the public Clock header
  - define Sys system time as Unix epoch milliseconds
  - add getUnixTimestamp() for epoch timestamps in seconds
  - replace chrono wall-clock usage in ecode plugins with Sys APIs
  - update existing Sys time callers for the new millisecond contract
  - remove redundant chrono inclusion from HTTP tests
  - remove the completed user-defined snippets plan

This prevents chrono and std::format internals from being instantiated across large portions of the project while preserving timestamp precision.
2026-08-03 00:10:00 -03:00
Martín Lucas Golini 861b2bc3c4 Fix driver-dependent patterned border rasterization
Snap dotted and dashed border geometry to physical pixels so centered
  patterns cannot begin on ambiguous half-pixel coordinates. This makes
  rectangular dot placement deterministic across llvmpipe and macOS GPU
  drivers.

  Update the old Reddit golden image to use the snapped dot phase.

Optimize compile-time header dependencies

  - Extract lightweight singleton declarations.
  - Remove unnecessary core.hpp, stream, pack, and container includes.
  - Add explicit direct dependencies across system, network, graphics, and syntax headers.
  - Forward-declare stream and pack types where possible.
  - Normalize selected network headers to LF.
2026-08-02 19:20:07 -03:00
Martín Lucas Golini 48b7e7c21f ui: improve HTML inline layout and old Reddit rendering
- implement per-side CSS border styles and patterned rendering
  - preserve rectangular rasterization for thin dotted borders
  - separate CSS and native-widget border defaults
  - correct inline atomic-box and vertical-align baseline layout
  - collapse adjacent block margins in rich-text flow
  - preserve forced line breaks and formatting margins
  - size HTML text inputs from font ascent and descent
  - expose replaced-control text baselines to inline layout
  - enforce single-owner painting for inline backgrounds and borders
  - enable and update the old Reddit visual regression golden
  - add generic layout, border, and form-control regression tests
  - document spec-first HTML work and project build conventions
2026-08-02 17:48:53 -03:00
Martín Lucas Golini 2df0861d76 Fix CSS auto margins for inline HTML images
Resolve auto margins according to the element's formatting context instead of applying native block centering to every HTML child.
Inline-level replaced elements, inline-blocks, floats, and out-of-flow boxes now use zero-valued auto margins in rich-text measurement and positioning, while normal-flow blocks retain horizontal auto-margin resolution. This prevents asynchronously loaded images from feeding stale calculated margins back into their inline ancestors and producing unbounded document widths, as observed on the Asahi Linux site.
Add synchronous and threaded WebView regression coverage using the Asahi fixture, including its weighted host layout and asynchronous SVG loading.
Document the follow-up plan for explicit formatting-role margin resolution, shared image-content composition, and rebasing UIHTMLImage on UIHTMLWidget.
2026-08-02 01:47:38 -03:00
Martín Lucas Golini eb7398f9ec Fix HTML loading stalls on large modern pages
- batch asynchronous HTTP stylesheets and apply them in a single reload
  - skip unsupported block at-rules without leaking nested rules
  - prevent scripts nested in unknown custom elements from entering the render tree
  - add regression coverage for unsupported at-rules and nested scripts
  - document the Ninja release workflow for performance testing
2026-08-02 00:55:03 -03:00
Martín Lucas Golini fe8417bdc7 Fix debugger crash when attaching to a PID: Guard against dereferencing an empty debugger command and use stdio for local PID attachments unless socket transport is explicitly requested. 2026-08-01 23:32:48 -03:00
Martín Lucas Golini 6d70183da6 Fix shrink-to-fit floats and atomic inline alignment
Blockify floated inline elements and use wrap-content sizing for width-auto
floats so vote columns do not stretch across their containing block.

Recompute right-aligned text using the float's final shrink-to-fit width,
preventing overflow clipping from hiding rank text.

Handle bottom-edge fallback baselines in middle-aligned atomic boxes so
fixed-height inline parents do not vertically displace and clip elements
such as Reddit flair emoji.

Add a regression test covering the Reddit rank, vote arrows, rendered text,
and flair emoji alignment.
2026-08-01 16:05:05 -03:00
Martín Lucas Golini da4d201eeb Implemented both opt-out settings for vscode config load, although enabled by default:
```json
  // autocomplete.json
  {
    "config": {
      "load_vscode_snippets": false
    }
  }

  // debugger.json
  {
    "config": {
      "load_vscode_launch_config": false
    }
  }
```

Disabling them affects only .vscode imports. Personal/.ecode snippets and .ecode/launch.json continue loading normally.

Refs SpartanJ/ecod€#111
2026-08-01 01:38:14 -03:00
Martín Lucas Golini 323d511eed Fixed a regression in UIWebView that caused to basically don't have render culling:
- Added UISceneNode::getVisibleWorldBounds() with an optional bounds-node binding.
  - UIWebView binds its document scene to the scroll container’s clipped viewport.
  - UINode::nodeDraw() now culls against visible scene bounds instead of the full document extent.
  - Existing top-level scenes retain their previous behavior.
  - Added a regression test confirming offscreen document widgets are skipped and visible widgets render.
2026-08-01 01:16:13 -03:00
Martín Lucas Golini 24302ec9f1 eterm: Use usable bounds instead of display bounds for window sizing. 2026-08-01 00:41:19 -03:00
Martín Lucas Golini 14207f228b eepp: Fixed a crash on single click navigation when selecting folder or file in UIFileDialog.
eeiv: Add drag & drop of images and folders. Added small welcome screen.
eterm: Detect windows below the default width and height and resize the window to fix the screen.
2026-08-01 00:31:55 -03:00
Martín Lucas Golini 13508c20d1 UIImageViewer expanded capabilities.
ecode image viewing will not auto-scale images to the pixel density.
eeiv: Modernizing eeiv to use eepp GUI, already working just like before, there are probably a few things to fix.
2026-07-31 01:25:41 -03:00
Martín Lucas Golini 51ceff9b08 Move eeiv to the main repo, I'll start modernizing the tool. 2026-07-31 00:04:21 -03:00
Martín Lucas Golini b60ee4e4b6 Fix test. 2026-07-30 23:10:18 -03:00
Martín Lucas Golini 58cd2ec327 fix rich text propagated float placement loop
- require propagated float placement to make forward progress
  - avoid zero-displacement loops when float edges touch
  - recompute collisions after each vertical adjustment
  - add regression coverage for touching propagated and active floats
2026-07-30 20:39:07 -03:00
Martín Lucas Golini 774e09efc2 Correctly interpret prefixes in CSS display. 2026-07-30 19:53:20 -03:00
Martín Lucas Golini a2ee615553 • Fixed the Reddit inline sibling regression.
The float-aware rich-text layout was resetting curX for every block formatting context, including inline-blocks. That made consecutive action buttons overlap. The reset is now limited to block-level BFCs;
  inline-blocks retain normal cursor advancement.

  Added:

  - An always-on deferred CSS regression covering inline anchors, inline-block siblings, and float exclusions.
  - Strict action-row and title/domain ordering checks in the opt-in Reddit visual smoke test.
  - A small CSS fixture reproducing Reddit’s layout rules.
2026-07-30 19:33:20 -03:00
Martín Lucas Golini d3ed96919a Fix percentage margin resolution after async HTML layout
Track percentage-based margins in UIHTMLWidget and re-resolve them when
  the containing parent acquires its final size. This prevents margins
  computed against an initial zero-width container from remaining stale
  until the viewport is resized.

  Add regressions covering percentage margin recomputation and the SS64
  footer layout after a deferred stylesheet is loaded.
2026-07-30 19:08:49 -03:00
Martín Lucas Golini 943103869a fix(ui): preserve CSS order for deferred stylesheets
Reserve stylesheet source positions when link elements are encountered
  instead of assigning them when asynchronous loading completes.

  Track the stylesheet and rule ordinals explicitly so deferred external
  styles retain their document order relative to later inline styles.
  Preserve this ordering when extracting marked stylesheet rules.

  Add an SS64 regression test covering heading and button styles after a
  deferred stylesheet finishes loading.
2026-07-30 17:52:27 -03:00
Martín Lucas Golini 660395ee4d Fix cursor precedence for specialized UI widgets:
Activate retained CSS cursors when the event dispatcher resolves a new
  hover target instead of applying them at the end of UIWidget mouse-over
  handling.

  Resolve cursors through the nearest widget ancestor for non-widget hit
  targets while allowing text inputs, editors, splitters, resize handles,
  and plugins to override the default cursor contextually.

  This restores ecode and Breeze cursor behavior without changing their
  existing styles.
2026-07-30 17:06:21 -03:00
Martín Lucas Golini ae0c5ffef0 Fix CSS pointer cursor handling on hovered widgets
Map the standard CSS pointer value to the hand cursor and retain the
computed cursor in each UIWidget instead of mutating the scene during
style application.

Apply the retained cursor when a widget becomes the hover target, restore
the arrow when leaving the UI, and make cursor inheritance available to
descendants such as inline SVG elements.

Store cursor state in an existing UIWidget padding gap and centralize
cursor serialization in Cursor::toName().

Add regressions for pointer parsing, cursor serialization, inheritance,
and the SS64 search button SVG.
2026-07-30 16:47:52 -03:00
Martín Lucas Golini 246161be7e Fix nested float propagation in rich text layout
Propagate descendant float exclusions through non-BFC HTML containers so
floats participate in their nearest block formatting context.

Finalize line geometry before translating propagated exclusions, track
finalized lines incrementally, and search successive float bands when a
fixed-width inline-block does not fit beside active floats.

Recognize inline-block elements as block formatting contexts while
preserving their fixed width. Reuse persistent float-exclusion storage
across relayouts to avoid repeated allocations.

Add SS64 regressions covering narrow viewports, HiDPI rendering, stacked
floats, anchor sizing, SVG sizing, and footer overlap.

Fixed `cursor: pointer`, `pointer` was not registered.
2026-07-30 16:28:36 -03:00
Martín Lucas Golini 0485dc0d14 Fix HTML button sizing and HiDPI SVG rendering
Use border-box sizing for HTML buttons to match browser user-agent styles and
prevent padding from increasing explicitly declared button heights.

Keep inline SVG textures rasterized at full physical resolution while assigning
density-independent sprite destination sizes, avoiding double scaling on HiDPI
displays.

Add SS64 and pixel-density regressions for button alignment, percentage-sized
SVG layout, and drawable dimensions.
2026-07-30 13:47:28 -03:00
Martín Lucas Golini 9fc385307a Fix percentage-sized inline SVG layout and rendering
Resolve percentage dimensions for HTML-backed widgets after their containing
block has a definite size. Apply the resolution during rich-text, flex, and
grid layout without triggering broad layout invalidation.

Rasterize SVGs using their resolved dimensions when intrinsic width or height
attributes are missing or percentage-based.

Add regression coverage for percentage-sized SVGs and the SS64 navigation
buttons and search icon.
2026-07-30 13:38:36 -03:00
Martín Lucas Golini 4d644880d8 Fix in CSS properties parser when comments were between and inside properties. 2026-07-30 13:11:33 -03:00
Martín Lucas Golini d61c8a7582 Fix flex items losing their stretched cross size
Preserve the final cross-axis size assigned to auto-sized stretched flex
items when their block layout runs. Keep intrinsic flex measurement
separate so content changes can still update item sizing correctly.

Add an HTML regression test covering a short sidebar stretched alongside
taller content.
2026-07-30 11:46:54 -03:00
Martín Lucas Golini 9f65377c50 Fixed the heap-use-after-free, root cause: system fallback loading published a font under desc.family, replacing and destroying an existing same-family font while its getGlyph() call was still executing. 2026-07-30 11:21:09 -03:00
Martín Lucas Golini 1dc8195187 - add a searchable Insert Snippet Universal Locator provider
- support runtime locator provider registration and removal
- filter snippets with workspace-relative include/exclude globs
- add the remaining VS Code-compatible snippet variables
- support camelcase, pascalcase, snakecase, and kebabcase modifiers
- reuse the existing insertion flow for locator-selected snippets
- expand snippet parser and store test coverage
- update the implementation plan and C/C++ example snippets

Refs: SpartanJ/ecode#111
2026-07-29 18:49:01 -03:00
Martín Lucas Golini 683b35b249 feat(ecode): add VS Code-compatible user snippets
Add user-defined snippet support to the autocomplete plugin, including
language-specific, global, .vscode, and .ecode project snippets.

Support JSONC parsing, scopes, hot reload, source-aware ranking, exact
prefix replacement, multi-cursor insertion, contextual indentation,
variables, transforms, choices, linked placeholders, and tab navigation.

Recognize .code-snippets files as JSON and preserve existing LSP snippet
completion behavior.

Refs SpartanJ/ecode#111
2026-07-29 01:11:01 -03:00
Martín Lucas Golini acd19069c3 Add table/tree view CSS properties, UIModelCreator, and optimize string allocations
- Add CSS properties: editable, selection-type, selection-kind, icon-size,
  sort-icon-size, main-column, row-header-width, table-flags (pipe-separated),
  indent-width, expander-icon-size, table-model
- Create UIModelCreator static factory with 4 built-in models:
  widgettree, filesystem, diskdrives, cssproperties
- Eliminate 17 heap-allocating std::string copies in applyProperty()
  handlers across 12 files using String::iequals with const refs
- Replace table-flags token parsing with allocation-free String::splitCb
- Update cssspecification.md with all new property documentation

Fixed fall-through bugs in applyProperty.
Fixed status terminal button "Terminal" not setting the tooltip text correctly.
2026-07-28 00:15:04 -03:00
Martín Lucas Golini 935b28c91a Fix HTML input styling and internal control layout
Treat UIHTMLInput as the stable HTML/CSS host while keeping its native
control as an anonymous implementation detail.

Prevent author CSS from matching internal control widgets, avoiding
duplicated backgrounds and other styles. Keep valid input types such as
email intact for attribute selectors while falling back to compatible
native implementations.

Synchronize the internal control with the host content box after layout,
including flex sizing, and preserve intrinsic measurement for size and
font changes. Preserve input state across dynamic type changes and make
hidden transitions reversible.

Also fix border-radius calculations and add regressions for CSS ownership,
anonymous widget isolation, dynamic type changes, input sizing, and the
Causality newsletter form.
2026-07-27 11:17:23 -03:00
Martín Lucas Golini 90f41a64aa Fix HTML viewport sizing and background shorthand parsing
- parse slash-separated background position and size without requiring whitespace
  - recognize custom-property background images following an explicit size
  - resolve root body and html minimum heights against the layout viewport
  - avoid expanding semantic document boxes to the scrollable content extent
  - handle auto margins and percentage offsets correctly for absolute positioning
  - add DuckDuckGo layout and background shorthand regression tests
  - document the Xvfb limitation with multisampled OpenGL contexts
2026-07-27 00:59:39 -03:00
Martín Lucas Golini a113c0f6c9 Rename FrameBufferRegistry, ShaderProgramRegistry and VertexBufferRegistry file names.
Rename class and file of PackManager to PackRegistry to follow the new naming convention.
2026-07-26 23:16:24 -03:00
Martín Lucas Golini 46d365f1b3 Update TODO. 2026-07-26 16:38:17 -03:00
Martín Lucas Golini dedccccd4c Merge branch 'feature/subpixel-antialiasing' into develop 2026-07-26 16:38:04 -03:00
Martín Lucas Golini 33bba67dde Correct paddings in Glyph struct.
Disable Haiku build until beta6 vm.
2026-07-26 13:22:21 -03:00
Martín Lucas Golini ce3a10a3bd Single pass subpixel rendering in all backends.
Build fixes.
2026-07-26 01:44:31 -03:00
Martín Lucas Golini fac6c4ab05 Single pass subpixel rendering in OpenGL 2 context.
Fix unit-tests build issue.
2026-07-26 01:02:06 -03:00
Martín Lucas Golini 0bf2b89970 Handle downscaled LCD glyphs with a dedicated resize path before atlas upload. This preserves row stride and RGB coverage, fixing corrupted icon-font glyphs at small sizes.
Add a golden-image regression test covering scaled subpixel glyphs from the Nonicons font.
2026-07-26 00:23:24 -03:00
Martín Lucas Golini 521e2af2e2 Should fix unit-tests. 2026-07-26 00:04:03 -03:00
Martín Lucas Golini 9f4ae9e83c Font SubPixel antialiasing support for eterm and ui_html. 2026-07-25 21:24:45 -03:00
Martín Lucas Golini 5aeb0b1acf The new sparse invariant is:
- Empty vector: every quad is Mask; use the existing single draw call.
  - Non-empty vector: the text contains subpixel glyphs; entries correspond to every quad.

  addGlyphQuad() therefore delays allocation until the first subpixel glyph. At that point it backfills earlier quads as Mask, records the current subpixel glyph, and tracks every subsequent quad.

  addLine() only appends Mask after tracking has started. A line before the first subpixel glyph will be included by the later backfill; a line after it must be appended to preserve the one-entry-per-quad mapping.

  This protects the common grayscale path from subpixel-related overhead while correctly handling mixed mask/subpixel text. It introduces no allocations until subpixel rendering is actually encountered.

  The critical fix versus the earlier broken version is that the first subpixel glyph is appended unconditionally. The old code accidentally skipped it when it was the first quad, causing the first character to be
  classified as Mask.
2026-07-25 20:41:35 -03:00
Martín Lucas Golini b71ef9522d Clean up. 2026-07-25 20:31:52 -03:00
Martín Lucas Golini c0debbee9f Rollback to fix rendering. 2026-07-25 20:26:24 -03:00
Martín Lucas Golini 27a57960f4 SubPixel hinting support. 2026-07-25 18:59:20 -03:00
Martín Lucas Golini ed46508df4 Merge branch 'feature/resource-shared-ownership' into develop 2026-07-25 01:36:21 -03:00
Martín Lucas Golini b940407102 ecode: The custom fallback font reused the "fallback-font" resource key, replacing the built-in CJK fallback in FontService.
Fix:

  - User fallback now uses "user-fallback-font".
  - Built-in CJK and custom fallback fonts remain registered together.
  - Added and passed a regression test verifying both fallback resources remain in the chain.

Fixes in premake5.lua:

  - Removed obsolete PRECISE_F32=1; Wasm already provides precise float behavior.
  - Moved ENVIRONMENT=worker,web to final application link options.

Fixed MarkdownView not getting the correct CSS style from the base theme.
2026-07-25 01:36:00 -03:00
Martín Lucas Golini 9894231d04 - Fixed emscripten build
- Added .github/workflows/eepp-emscripten-build-check.yml
  - Mirrors Linux CI structure.
  - Uses Premake 5 beta6.
  - Pins Emscripten 4.0.1.
  - Caches EMSDK system libraries.
  - Builds with all available cores.

- Completed Premake 5 Emscripten support:
  - Native wasm32 platform.
  - Correct .html application targets.
  - Asset preloading restored from Premake 4.
  - SDL2 supplied through Emscripten instead of native -lSDL2.
  - Static archives emitted under libs/emscripten/wasm32/.
  - Unsupported shared-library projects excluded.

- Modernized projects/emscripten/make.sh.
2026-07-25 00:47:18 -03:00
Martín Lucas Golini 2601048a17 clarify FontTrueType scope ownership
Document that a FontTrueType can be locally associated with only one
  ResourceScope and that catalog imports should be used to share fonts
  between scopes.

  Note the current single FontService pointer limitation and the possible
  future direction of moving fallback resolution out of shared fonts.
2026-07-24 23:40:19 -03:00
Martín Lucas Golini 8bdee0281f graphics: add strong 64-bit resource name hashes
Introduce ResourceNameHash using wyhash for fast drawable and font
  secondary indexes without changing the global String::HashType.

  Replace the 32-bit resource indexes with direct 64-bit weak-handle
  lookups while keeping complete ResourceKey lookup authoritative.
  Preserve legacy persisted drawable hash support through a documented
  compatibility scan and migrate internal font operations to semantic
  name lookup.

  Add regression coverage proving names that collide under the legacy
  hash remain independently addressable.
2026-07-24 23:33:16 -03:00
Martín Lucas Golini 605c81087d harden web resource cache completion lifecycle
Identify asynchronous loads by cache epoch and operation ID so stale
  completions cannot modify replacement entries or corrupt in-flight
  accounting after clear().

  Move decoding, GPU texture mutation, notifications, callback destruction,
  and final resource releases outside the cache mutex. Revalidate operation
  identity between completion phases to preserve correctness across decode
  delays and notification reentrancy.

  Add regression coverage for stale same-key completions after cache reset.
2026-07-24 23:20:42 -03:00
Martín Lucas Golini caa461a735 complete scoped ownership migration
- migrate themes, skins, icons, shaders, and shader programs to resource handles
  - make UIThemeManager scene-owned and publish resources through scopes and catalogs
  - retain shaders through their programs and expose non-owning GPU registries
  - replace FrameBuffer and VertexBuffer factory ownership with unique pointers
  - migrate engine, UI, tools, examples, tests, and eterm to the new ownership APIs
  - remove the obsolete raw-owning ResourceManager templates
  - document the completed Stage 7 architecture and remaining validation work
  - add ownership, registry, and scoped shader-program coverage
2026-07-24 22:45:31 -03:00
Martín Lucas Golini 85ceace782 Merge branch 'develop' of github.com:SpartanJ/eepp into develop 2026-07-24 10:48:19 -03:00
Martín Lucas Golini 6351332d9b Closes SpartanJ/ecode#939 2026-07-24 10:48:11 -03:00
Martín Lucas Golini 6b277e508b migrate fonts to scoped resource ownership
- replace FontManager with per-ResourceScope FontService instances
  - publish font factories into explicit or default resource scopes
  - import default resources into UI scene scopes unless explicitly disabled
  - keep related font faces strongly owned without hot-path weak_ptr locking
  - add cached glyph advance queries without creating texture pages
  - fix font picker preview ownership, cleanup, and rapid switching
  - selectively evict TextLayout cache entries when referenced fonts unload
  - document FontService, ResourceCatalog, and cache invalidation semantics
  - migrate examples, tools, benchmarks, and tests to the scoped font API
  - expand coverage for font ownership, texture release, and layout caching
2026-07-24 01:54:51 -03:00
Martín Lucas Golini 2e2d3f808f Add plan for HTML paint order and stacking context support 2026-07-23 13:13:52 -03:00
Martín Lucas Golini 24531b4411 Fix sprites examples. 2026-07-23 01:50:59 -03:00
Martín Lucas Golini 373bd40e59 migrate texture atlases to scoped ownership
- replace TextureAtlasManager and GlobalTextureAtlas with catalog-backed atlas ownership
  - make TextureAtlas and TextureRegion creation return explicit resource handles
  - let atlases retain their textures and regions through shared ownership
  - add atlas publication, lookup, removal, and enumeration to ResourceCatalog and ResourceScope
  - make TextureAtlasLoader publish atlases and regions into an explicit resource scope
  - move theme atlas ownership into each theme resource catalog
  - migrate maps, editors, examples, and tests away from the global atlas manager
  - add scope-aware Sprite pattern-loading overloads while preserving default-scope compatibility
  - fix re-entrant style-state invalidation when applying styles creates new widgets
  - add atlas ownership, scoped Sprite lookup, and style-state regression coverage
  - update the resource ownership plan and texture atlas editor launch configuration
2026-07-23 01:41:11 -03:00
Martín Lucas Golini 574b6b9014 move nine-patches into scoped catalogs
Return shared handles from NinePatch creation and remove the process-wide
  NinePatchManager singleton.

  Extend ResourceCatalog with typed drawable-source ownership and expose
  drawable publication, lookup, and removal through ResourceScope. Preserve
  separate texture and drawable namespaces for direct typed lookup.

  Give each UITheme its own resource catalog and have scene-owned theme
  managers explicitly import and remove theme catalogs. Handle registered
  themes and default-only themes without leaking stale resource visibility
  between scenes.

  Update theme loading, Engine teardown, platform source manifests, and
  resource ownership tests for the catalog-based model.

  Document that remaining singleton resource managers must migrate to
  naturally owned catalogs and explicit scope imports instead of becoming
  new process-global semantic namespaces.
2026-07-22 22:07:00 -03:00
Martín Lucas Golini fb433715fc release stale web resources and avoid diagnostic texture pinning
Advance the web resource cache generation only when the replacement
  document is installed, after the previous document and its asynchronous
  loads have been detached. This prevents outgoing document nodes from
  acquiring leases under the new generation.

  Add UIWebView coverage for delayed document replacement, stale resource
  release, and periodic cache pruning.

  Make Texture Viewer thumbnails observe textures through weak handles and
  retain them only for the duration of drawing. Keep explicit selection as
  the only operation that pins a texture, so opening the diagnostic viewer
  no longer prevents unused textures from being released.

  Update the shared-resource ownership plan to document the replacement-time
  navigation boundary.
2026-07-22 20:15:29 -03:00
Martín Lucas Golini 2d8693295c add shared WebView resource cache:
Introduce WebResourceCache with partitioned sharing, per-document sessions,
navigation generations, leases, and canonical request keys.

Coalesce concurrent document, stylesheet, font, and image requests while
discarding stale navigation subscribers independently. Retain completed
resources with TTL/LRU and byte-budget policies, and periodically prune
expired unleased entries from UIWebView.

Route UISceneNode, UIWebView, UIImage, CSS background images, and remote
drawable resolution through the shared cache. Preserve ResourceScope entries
as explicit overrides and allow multiple WebViews to share a cache partition.

Keep image decode and texture replacement on the guarded graphics-thread
completion path. Exclude volatile Cookie and Referer values from cache
identity while preserving partition isolation and content-affecting variants.

Start TTL retention when the final document lease is released so Back/Forward
navigation can reuse resources regardless of how long the previous page was
open.

Avoid unstable pointers and iterators into unordered_dense storage when
tracking leases and pruning entries. Add ASan regression coverage for dense
map growth, navigation, eviction, partition isolation, request coalescing,
retry behavior, and cache retention.

Fully document cache partitions, sessions, generations, request identity,
ownership, threading, and maintenance behavior.
2026-07-22 02:22:38 -03:00
Martín Lucas Golini f7dba042df Replace DrawableSearcher with scoped drawable resolution:
Add a scene-owned UI::DrawableResolver for resolving file, data, HTTP, and
named drawable references through each UISceneNode's current resource scope.

Move generic texture, atlas region, nine-patch, and sprite lookup into
Graphics::ResourceScope, preserving drawable resolution for pure Graphics
consumers without introducing a UI dependency.

Migrate UI images, sprites, menus, CSS parsing, and tests to the new resolver.
Resolve CSS icons through the requesting node's scene instead of the global
scene, preserving embedded-scene isolation.

Remove the obsolete DrawableSearcher API and update platform project manifests,
tests, and the shared-resource architecture plan.
2026-07-21 23:50:58 -03:00
Martín Lucas Golini b5efd6d709 Graphics: refine drawable cloning and icon source rendering:
Rename Drawable::createInstance() to clone() and update drawable implementations,
typed helpers, consumers, tests, tools, and external modules.

Avoid retaining private icon clones for immediate single-threaded rendering in the
code editor and ecode plugins. Borrow cached per-size icon sources instead, restoring
temporary color changes after drawing, while preserving owned clones for widgets,
menus, models, and other stateful consumers.

Reduce common drawable allocation overhead by lazily creating DrawableResource
callback state, using inline callback storage and notification snapshots, and safely
supporting callback disconnection during notification.

Lazily allocate UIImage and UINodeDrawable asynchronous lifetime tokens only when
an uncached asynchronous load is actually scheduled.

Document the distinction between borrowed immediate rendering and independently
owned drawable state.
2026-07-21 21:16:32 -03:00
Martín Lucas Golini 3c78284283 Add exit command in UIConsole (closes SpartanJ/ecode#937).
Improve move-to-start-of-content command to behave like other editors (SpartanJ/ecode#935).
2026-07-21 20:27:51 -03:00
Martín Lucas Golini 953e0ea006 Merge branch 'develop' into feature/resource-shared-ownership 2026-07-21 15:38:11 -03:00
Martín Lucas Golini 2f18e4a2b5 Pump version, release commit. 2026-07-20 22:59:58 -03:00
Martín Lucas Golini 2e7958c8d2 Compilation fixes. 2026-07-20 10:38:22 -03:00
Martín Lucas Golini dc377335b9 graphics: migrate drawables to shared ownership
- introduce DrawablePtr and per-consumer createInstance() semantics
  - add TextureDrawable wrappers backed by shared TexturePtr handles
  - migrate regions, sprites, nine-patches, state lists, skins, groups, gradients,
    UI widgets, tools, modules, ecode, and eeiv to shared drawable ownership
  - remove ownIt flags, manual drawable deletion, and unload-based lifetime handling
  - replace drawable callback IDs with RAII change connections
  - move Variant drawable storage outside its scalar union
  - split UIIcon source lookup from explicit drawable instance creation
  - retain icon instances used by rendering loops instead of cloning per frame
  - avoid shared source mutation in texture-region consumers
  - use drawable type tags instead of RTTI casts
  - fix nearest-size UIIcon lookup
  - document the drawable source/instance contract and add ownership tests
2026-07-20 01:09:36 -03:00
Martín Lucas Golini a597214074 Minor comment in UI Module description about the HTML+CSS compatibility layer. 2026-07-19 23:34:47 -03:00
Martín Lucas Golini 04f600bef5 graphics: move texture ownership to catalogs and scopes
Add ResourceCatalog and ResourceScope to provide explicit strong ownership
  and deterministic semantic lookup independently from the live texture
  registry.

  Let Engine own the global catalog and default Graphics scope, and give
  each UISceneNode an isolated scope that can be explicitly shared with
  other scenes.

  Remove TextureFactory's strong texture retention and name/hash lookup.
  The factory now observes textures weakly for identity, diagnostics, and
  deferred destruction without controlling their semantic lifetime.

  Migrate drawable resolution, texture atlas loading, UI image caches,
  tile maps, ecode resources, and related tests to scoped lookup and
  publication.

  Allow final TexturePtr release from worker threads while keeping actual
  texture destruction deferred to the graphics thread. Fix mismatched
  pixel deallocation uncovered by asynchronous texture loading tests.

  Add ownership, scope isolation, scene sharing, worker release, and
  decoder allocation regression tests, and update the shared-resource
  architecture plan through Stage 3.
2026-07-19 23:06:23 -03:00
Martín Lucas Golini 8556bda68c migrate texture consumers to shared ownership
- return TexturePtr from texture creation and lookup APIs
  - retain texture handles in regions, atlases, fonts, framebuffers, sprites, UI, and maps
  - keep queued batch textures alive until rendering completes
  - preserve asynchronous atlas load results directly
  - replace TextureLoader unload semantics with reset
  - remove public texture deletion APIs and obsolete Sprite ownership flags
  - migrate bundled tools, examples, tests, ecode, and diagnostics
  - document Stage 2 completion and the temporary factory retention boundary
2026-07-19 21:27:30 -03:00
Martín Lucas Golini b0129880d8 Add LSP snippet navigation and expansion support
Implement LSP snippet parsing and editing sessions with tab stops, linked placeholders, choices, variables, transforms, visual feedback, and multi-cursor insertion.
This adds snippet support for LSP completion items. User-defined snippets will be implemented separately.
Refs SpartanJ/ecode#111
2026-07-18 16:51:45 -03:00
Martín Lucas Golini f5ce1589e3 Some snippets improvements to support insertTextFormat (SpartanJ/ecode/discussions#929).
Closes SpartanJ/ecode#933
2026-07-18 13:31:06 -03:00
Martín Lucas Golini 0a7984b17d Register cmake.in.
Detect as function call something like `name ()` in Vala.
2026-07-17 12:30:18 -03:00
Martín Lucas Golini 41f58374bd Pre register new extensions. 2026-07-17 12:18:41 -03:00
Martín Lucas Golini c1830e3ccf Corrected Genie. 2026-07-17 10:44:46 -03:00
Martín Lucas Golini 8745871c8c Closes SpartanJ/ecode#924 SpartanJ/ecode#925 SpartanJ/ecode#926 2026-07-16 13:44:04 -03:00