Commit Graph
4832 Commits
Author SHA1 Message Date
Martín Lucas Golini f8f5627f77 Add clipboard change events and configurable split tab bars in eterm and fixed scrolling tests.
- Translate SDL2 and SDL3 clipboard updates into ClipboardChanged events.
- Expose Unknown, Self, and External clipboard ownership metadata.
- Add regression tests for event dispatch and ownership defaults.
- Add a persisted eterm setting controlling tab bars in split panes.
- Fixed both scrolling tests. SDL2 starts text input automatically on desktop, so the first Space waited for a text event the key-only test never sent.
2026-09-29 19:38:19 -03:00
Martín Lucas Golini a8eb1834eb Add tabbed HTML browsing and extend eepp navigation and input support
eepp framework:
- Add shared cookie jars to UISceneNode and UIWebView, plus versioned
  CookieManager persistence, domain clearing, and locking in hasCookie().
- Follow HTTP 303 redirects and merge same-host redirect cookies as
  name/value pairs without forwarding Set-Cookie attributes.
- Include Cookie headers in document cache keys while preserving static
  resource reuse as cookies change.
- Submit HTML forms with an empty action to the current document URL.
- Extend NavigationRequest with source, mouse buttons, modifiers, and
  navigation target; anchors forward this context to the scene.
- Emit OnLinkOpenRequested for middle-click, platform-modifier click,
  and explicit new-tab requests, with current-view fallback if unhandled.
- Install the WebView navigation interceptor during construction.
- Dispatch middle clicks to the hovered node without moving keyboard focus.
- Add the clicked target to ContextMenuEvent so applications can extend
  context menus through existing events.
- Parse HTML titles, emit TitleEvent, and fix onTitleChanged's payload cast.
- Load declared favicons through the shared image cache, emit
  OnFaviconChanged, and ignore responses from superseded navigation.
- Add optional UITabWidgetSplitter tab-bar visibility while split;
  keep it disabled by default and respect explicitly hidden tab bars.
- Add Space/Shift+Space scrolling and viewport-sized Page Up/Down steps
  to UIScrollView, shared by WebView and Markdown content.
- Implement setEnableDefaultKeybindings() and preserve text-input
  priority through normal bubbling without control-type checks.
- Report inserted UICodeEditor text as handled.
- Add UITextView::onFontColorChanged() and synchronize password-mask color.
- Support validated left, middle, and right clicks in the inspector
  server and Python client.

ui_html example:
- Use UITabWidgetSplitter for tabs and user-controlled splits.
- Share cookies and the resource cache across tabs; persist cookies
  between sessions and open new tabs blank.
- Add Inspect, Clear Domain Cookies, Clear All Cookies, and contextual
  Open Link in New Tab actions through menu event subscriptions.
- Open requested links in background tabs and synchronize navigation UI.
- Use document titles and 16dp favicons for tabs, cap width at 200dp,
  and truncate long titles with ellipsis.
- Enable tab-bar visibility across split panes.
- Fixed: the selection rectangle now uses the visible password symbols instead of the original text.

Update HTML compatibility and inspector documentation and add regression
coverage for persistence, redirects, cache isolation, navigation, menus,
titles, favicons, password colors, split visibility, and scrolling.
2026-09-29 18:58:51 -03:00
Martín Lucas Golini a090d1a666 Fix CSS state rollback for transient properties. eproc: add keyboard navigation between search and process views, fix Send Signal menu events.
Store native and inherited fallback values outside local styles, then restore them when state rules stop matching. Handle indexed properties across overlapping states and retain a serialized value when an inherited source disappears. Add rollback regression tests and update the CSS documentation

Focus and select the first process row when pressing Down in the search input. Pressing Up from the first row returns focus to search in both table and tree views.
2026-09-29 14:56:01 -03:00
Martín Lucas Golini 3dada4857a Slight improvements to the macOS icons. Fix CI. 2026-09-29 02:03:55 -03:00
Martín Lucas Golini 850f33c336 Polish app icon sizing and bump eepp and ecode versions
Generate size-aware macOS icons and separate runtime Dock PNGs for ee,
ecode, eterm, eeiv, and eproc. Keep shared PNGs sized for small Linux
icons, and package ecode's macOS runtime icon.

Bump eepp to 5.0.0 (Kittima-attā) and ecode to 0.9.0 (Yanta-lekhā).
2026-09-29 01:02:07 -03:00
Martín Lucas Golini 6e665c533d docs: reorganize agent files and improve UI onboarding
- Rename .agent to .agents and update plan references
- Add an articles index and clearer links to the UI inspector
- Correct the UI introduction’s CSS inheritance guidance and add an example workflow
- Add F11 visual inspection to the hello-world example and enlarge its window to fit
- Remove the old Kitty keyboard plan and TODO.md
2026-09-28 19:59:10 -03:00
Martín Lucas Golini ee0d9378ad Expand UI documentation and refine link context menus
Add guides for native UI authoring, layouts, application CSS, and HTML
compatibility. Update the CSS reference, rename article files consistently,
and point README links to the local guides.

Add Copy Link for HTML and Markdown anchors when no text is selected.
Resolve relative links against the document URI before copying, and cover
Markdown and WebView behavior with tests.

Fix layout width policy serialization to use the widget's width.
2026-09-28 19:20:34 -03:00
Martín Lucas Golini fd5a3718d4 Renamed UIStackLayout to UIFlowLayout throughout the engine and its usages, including the header and source files, XML tag, runtime type, widget factory, docs, and typed lookups. The layout behavior is unchanged. Separate UIStackWidget and debugger stack views retain their names. 2026-09-28 15:25:56 -03:00
Martín Lucas Golini 1b3227699f eproc: improve process names and performance charts
Extend truncated Linux process names from argv[0] when it safely matches
the kernel-provided name. Fill performance chart lines and show uptime
in readable days, hours, and minutes, with the new text ready for i18n.
2026-09-28 13:10:53 -03:00
Martín Lucas Golini 89512ce8b0 Fix MSVC Windows build. 2026-09-28 12:22:05 -03:00
Martín Lucas Golini 5db8d78725 - SocketSelector::isReady() (src/eepp/network/socketselector.cpp:111) no longer treats a Windows socket handle as an FD_SETSIZE index. That check prevented the inspector server from responding.
- Token generation (src/eepp/ui/tools/uiinspectorserver.cpp:67) now uses `BCryptGenRandom` on Windows, including for screenshot filenames.
- Split basic HTML defaults from document and form styles
- Load only structural defaults for Markdown views, leaving document colors and form-control styles to full HTML documents. Add Breeze styling for Markdown horizontal rules and HTML textareas.
2026-09-28 11:45:35 -03:00
Martín Lucas Golini 4073208e87 Fix HTML and Markdown text selection starting from unrelated drags
Require the initial mouse press to occur within the view’s selection tree, excluding scrollbars. This prevents scrollbar drags and drags from a code editor from starting text selection when the pointer enters the view.

Add regression coverage for both cases
2026-09-28 11:04:44 -03:00
Martín Lucas Golini 542075cca6 **fix(ui): prevent MSVC from generating UIInspector copy operations**
`UIInspector` owns move-only event connections. Explicitly delete its copy constructor and assignment operator so MSVC does not instantiate invalid copies of the handle maps. Restore the dense map implementation
2026-09-28 10:51:16 -03:00
Martín Lucas Golini 27bfbb4b3a * UIInspector now stores move-only event connections in a node-based map, avoiding the MSVC vector copy error.
* Batch results now initialize as a JSON object. The previous initialization created an array, causing both reported Linux and macOS test failures.
2026-09-28 10:10:44 -03:00
Martín Lucas Golini 4ffba20d07 feat(ui): add runtime inspector and fix HTML layout regressions
Add an opt-in TCP/NDJSON inspector for running eepp applications. It
provides authenticated, UI-thread-safe access to windows, scenes, and
widgets, including nested WebView documents. The v1 protocol supports
queries, trees, properties, focus, input actions, watches, screenshots,
and composed batches with result references and deferred execution.

Add a standard-library Python CLI, protocol documentation, build
entries, and integration tests. The listener remains disabled unless
explicitly enabled.

Fix HTML compatibility issues found while debugging NewsBlur:
- Let explicit flex minimums, including min-width: 0, replace the
  automatic content minimum.
- Measure flex lines against the container content box when padding
  and explicit dimensions are present.
- Keep promoted positioned descendants of hidden ancestors out of
  the paint list.
2026-09-28 01:15:39 -03:00
Martín Lucas Golini cfe7761880 fix(ui): clear shared dispatcher references when an embedded scene is destroyed
An embedded UI scene can leave the host event dispatcher pointing to it after teardown. With hidden windows starting the mouse at (0, 0), the next update can call onMouseLeave on the destroyed scene and crash.

Clear hover, focus, and mouse-down references before detaching the shared dispatcher.

Verified with 20 runs of UIWebView.DestroyWithPendingSubresourcesIsSafe and the full macOS release suite (1,310 tests).
2026-09-27 01:26:47 -03:00
Martín Lucas Golini 0bf8db4cf0 feat(ecode): add Zen Mode
Add a View menu toggle, keyboard shortcut, and --zen-mode option.
Hide the side panel, status bar, menu controls, tab bar, and document
info while Zen Mode is active, then restore configured visibility.
Add the menu label to all locale catalogs. Refs SpartanJ/ecode#964.

Test stability

test(ui): stabilize visual tests and Windows clipboard assertions

Initialize hidden SDL windows with an internal mouse position of (0, 0)
so desktop cursor hover cannot affect visual tests. Assert this in
complexLayout3 and normalize Windows clipboard line endings in the
Markdown selection test.
2026-09-27 00:47:29 -03:00
Martín Lucas Golini 1174e97911 Add optional filled areas to UI chart lines
Allow each LineSeries to fill down to the plot’s bottom edge, using a translucent version of its line color by default or a custom fill color. Render overlapping fills beneath the strokes, document the new API, and demonstrate it in the charts example. Add coverage for blending, data gaps, and toggling fills.
2026-09-26 23:59:19 -03:00
Martín Lucas Golini 2d7623c5fa Fix Windows build. 2026-09-26 23:30:00 -03:00
Martín Lucas Golini ec7c3c45dd Add document-level text selection to HTML and Markdown views
Introduce UITextSelectionController to coordinate selection across independent
RichText owners while retaining RichText hit testing and painting. Support
forward and reverse dragging, nested content, gap hit testing, autoscroll,
plain-text copy, select-all, and context menus.

Enable UIRichText and UITextSpan selection by default. Add CSS user-select
semantics and the -webkit-user-select alias, while preserving the separate
text-selection capability flag.

Clear selection safely when owners or documents are destroyed, suppress link
activation after a selection drag, and add regression tests, documentation,
and an updated rich-text example.
2026-09-26 22:11:32 -03:00
Martín Lucas Golini de040ef17e Add eproc settings and macOS/FreeBSD per-core CPU metrics
- 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.
2026-09-26 01:44:10 -03:00
Martín Lucas Golini 8df1298470 eepp: add UI environment overrides and theme-aware eproc colors
Use Breeze theme colors for eproc's process table and Performance charts,
while preserving the translucent Username colors. Keep process icons
visible in the light theme with a white tint.

Add eproc CLI options for font hinting, font antialiasing, and color scheme.
Add -c/--prefers-color-scheme to eterm and retain close-on-exit through
its long options.

Support EEPP_FONT_HINTING, EEPP_FONT_ANTIALIASING, and EEPP_COLOR_SCHEME
across eepp UI apps, with valid environment values taking precedence
over application settings. Document and test the overrides.
2026-09-25 22:59:58 -03:00
Martín Lucas Golini 0f37cee540 mingw32 build fix. 2026-09-25 20:39:24 -03:00
Martín Lucas Golini b0702d870c Fix tests. 2026-09-25 20:20:29 -03:00
Martín Lucas Golini 1ca5995d3e ecode: mark local-only branches and fix binary rename status
Show local branches without a matching fetched remote ref as local only.
Match binary rename paths in Git numstat output to staged files so they
do not appear as untracked. Add regression coverage for rename paths
and filenames containing " => "
2026-09-25 19:13:40 -03:00
Martín Lucas Golini 1de732962d Add eproc Performance view and family memory metrics
- Add CPU, memory, GPU, and network charts with ten-minute history,
  a 60-second view, clickable cards, and overall or per-core CPU views.
- Add Family Memory and Family Memory % to both process views. Use
  proportional memory on Linux, count zero-memory zombies correctly,
  and collect the data after the first frame without delaying it.
- Add column tooltips, rename Total Memory to Resident Memory, keep
  Command last by default, and migrate saved column layouts.
- Enable sorting within each tree level and preserve selection.
- Improve eepp chart margins and sorting behavior, and document UIChart.
2026-09-25 16:22:00 -03:00
Martín Lucas Golini f2ab50f2d8 Add chart grids, smoothing, and rotated tick labels
- Add configurable vertical and horizontal grids with axis tick, data,
  and screen spacing modes.
- Add monotone cubic line smoothing and angled X-axis tick labels.
- Return references for chart APIs that always have a result, and document
  model ownership and borrowed references.
- Prevent empty tooltips and refresh chart hover when live data changes
  under a stationary cursor.
- Update the charts example and add rendering and tooltip regression tests.
2026-09-25 12:26:11 -03:00
Martín Lucas Golini b3e6ea559d Add pixel-density default and improve chart rendering
- Honor EEPP_PIXEL_DENSITY when an app has not specified a scale,
  without resizing its window.
- Scale chart measurements in dp, expose chart styling, and resolve
  default colors through the UI theme.
- Fix gaps at miter joins and round chart text to device pixels.
- Use inline storage for common chart axis, series, and label counts.
- Add density and rendering regression tests.
2026-09-25 10:51:55 -03:00
Martín Lucas Golini 7a66563114 Add eepp charts module and interactive example
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.
2026-09-24 21:16:52 -03:00
Martín Lucas Golini 8d1d22ed5d Fix FreeBSD eproc process listing and build configuration
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.
2026-09-24 14:16:36 -03:00
Martín Lucas Golini fd365f3a4c FreeBSD fix eepp complete build 2026-09-24 11:37:02 -03:00
Martín Lucas Golini f0ecd50609 Add macOS and initial FreeBSD support to eproc
- 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.
2026-09-24 02:37:24 -03:00
Martín Lucas Golini 0ead9dc33d Add eproc to sdk. Update eproc and eeiv windows executables icons. Generate app icons also for eproc and eeiv. 2026-09-24 01:27:36 -03:00
Martín Lucas Golini 6062639784 Add basic Windows support to eproc. 2026-09-23 21:52:06 -03:00
Martín Lucas Golini c9a2108033 Ups! Fix test golden image. 2026-09-23 21:16:48 -03:00
Martín Lucas Golini d551ac170c Expand eproc and improve eepp table and tree views
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.
2026-09-23 20:57:34 -03:00
Martín Lucas Golini bdef64b957 Fix SpartanJ/ecode#961 regression. 2026-09-23 10:57:53 -03:00
Martín Lucas Golini 6c7cc505e6 Added a teardown test to verify old crash reported at SpartanJ/ecode#959. 2026-09-23 01:50:15 -03:00
Martín Lucas Golini 9f190924af fix(ecode): refresh Git diff indicators after external file reload
Handle document reload events in the Git plugin, since reloading replaces
the document lines without emitting a text-changed event.

Clear stale gutter and minimap markers, invalidate in-flight diff results,
and compare the reloaded contents against the existing Git baseline.
2026-09-22 18:04:04 -03:00
Martín Lucas Golini 61ca3844ba Fix splitter widget callbacks being dropped on tab moves
* Fix UICodeEditorSplitter dropping its widget listeners on tab moves:
    UITabWidget reports drag & drop transfers as OnTabClosed + OnTabAdded,
    so treating OnTabClosed as "left the splitter" permanently unhooked the
    moved widget and left mCurEditor/mCurWidget tracking nothing
    (SpartanJ/ecode#958).
  * Tie splitter-owned callbacks to splitter membership: attach on
    OnTabAdded of managed tab widgets, detach on OnTabClosed. Creation and
    transfer now share one registration path; moves to external tab
    widgets stay detached.
  * Keep mEditorSelections for the editor lifetime instead of the tab
    membership lifetime: it survives split moves and is cleared from the
    editor OnClose callback, which is disconnected in the splitter
    destructor so outliving editors cannot call into a destroyed splitter.
  * Apply the same ownership model to UITabWidgetSplitter, which had the
    inverse bug: widgets dragged out kept notifying the splitter through
    stale connections; drop the duplicated closeTab() cleanup.
  * Store listeners as Scene::EventConnection/List (RAII disconnect)
    instead of std::vector<Uint32> + removeEventListener bookkeeping.
  * Add regression tests covering editor and generic widget moves between
    splits, in and out of the splitter, focus/title tracking after each
    transition, selection cache survival, and editor destruction cleanup.
2026-09-22 14:00:11 -03:00
Martín Lucas Golini 7a63e13070 Fix eproc not displaying the full command. Fix UITableHeaderColumn mist-firing a sort after drag. 2026-09-22 01:30:27 -03:00
Martín Lucas Golini f200850941 Fix eterm tab closing and macOS menu integration
* Serialize tracked realloc and free bookkeeping to prevent cross-thread
    address reuse from corrupting the memory tracker during tab teardown.
  * Add concurrent allocation and terminal close/resize regression coverage.
  * Install a macOS-only File, Edit, and Window menu that mirrors eterm
    keybindings without binding Cmd+W.
  * Keep the native menu outside the splitter layout and document the canonical
    macOS build workflow.
2026-09-21 21:39:39 -03:00
Martín Lucas Golini e2174aa044 feat(ecode): add Git diff gutter and minimap indicators
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.
2026-09-21 18:05:23 -03:00
Martín Lucas Golini 53f1fe6045 perf(ui): store Variant values inline
Replace Variant's heap-owned payloads with manually managed inline
  storage while preserving its return-by-value API.

  - inline std::string, String, DrawablePtr, Vector2f, and Rectf
  - add move construction and capacity-preserving assignment
  - add explicit borrowed std::string support and string views
  - avoid redundant conversions in table and tree hot paths
  - borrow stable process fields in eproc
  - eliminate per-frame eproc class allocation churn
  - focus the eproc search input on startup
  - add comprehensive Variant lifecycle and ownership tests
2026-09-21 02:37:11 -03:00
Martín Lucas Golini 51b88fa125 fix(ui): harden asynchronous document search
Snapshot document search state before dispatching highlight workers and
retain the searched document for the duration of each job.

Publish results through MainThreadLifetime and reject results when the
editor has changed document or search parameters. Remove the obsolete
worker counter and destructor wait used for editor lifetime management.

Use atomic cancellation flags in TextDocument::findAll() and protect
active-search map inspection during destruction.

Add regression coverage for concurrent cancellation, stale highlight
results, rapid backtick searches after a large multiline paste, and
editor destruction during active search.

Refs SpartanJ/ecode#956.
2026-09-21 01:55:58 -03:00
Martín Lucas Golini 311d3e701a Fix tests in Windows build. 2026-09-20 16:34:29 -03:00
Martín Lucas Golini 2beab631a2 Implemented the live-indexing fix + Fixed opening and closing the context menu no longer changes the scrollback position.
- 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.
2026-09-20 14:41:47 -03:00
Martín Lucas Golini 66962c6a82 Merge branch 'develop' of github.com:SpartanJ/eepp into develop 2026-09-20 13:11:55 -03:00
Martín Lucas Golini cae1af6098 Do not depend on pcap at build time for eproc. 2026-09-20 13:11:45 -03:00
Martín Lucas Golini 7568ec5f22 Fix missing include. 2026-09-20 12:16:01 -03:00