Commit Graph
352 Commits
Author SHA1 Message Date
Martín Lucas Golini 459ce1314a Fix VFS recursive deletion races and SSH teardown stalls
- Use descriptor-relative POSIX deletion without following swapped symlinks.
  - Reclaim terminal SSH sessions on the I/O thread without waiting for peers.
  - Add symlink-swap, cancellation, and blackholed-session regressions.
  - Document pathname traversal and temporary-publication limitations.
2026-10-18 02:39:48 -03:00
Martín Lucas Golini 5f2c9677d6 feat(vfs): add ZIP browsing and optional shared module builds
- Add a read-only ZipProvider with streaming reads, cached metadata,
  change notifications, and zip:///archive.zip!/member URIs.
- Support ZIP navigation and copying files out of archives in eefm.
- Extend Zip with explicit read-only access, optional resource
  registration, and improved stream, CRC, and error handling.
- Add EE_VFS_API exports and --with-shared-vfs support; reject
  combining shared VFS with static eepp.
- Fix polling watcher teardown from its own thread.
- Add regression tests and document ZIP and shared module behavior.
2026-10-17 01:50:55 -03:00
Martín Lucas Golini 74dc6e9fdd feat(window): receive X11 drags without files + feat(eefm): drops from Ark and XDS, run programs
Some applications drag things that only become files when they are dropped: an archive manager
drags entries it has not extracted, a browser an image it has not saved. These drags carry no file
list, so SDL's XDND support refuses them.

eepp (X11 with SDL3, getCapabilities().dataTarget):
- DragAndDrop::setFileSaveDropHandler(): drags using the XDS direct save protocol
  (XdndDirectSave0), such as Engrampa and Xarchiver. The callback picks a local folder for the
  drop position; the source then saves into it. XDS takes priority over a file list offered with it,
  which such sources only fill with temporary copies.
- DragAndDrop::setDataDropHandler(): drags offering application-defined MIME types and no file
  list. The callback receives each registered type's contents and the drop position.
- X11DropTarget takes over only the drags it accepts through the existing SDL3 X11 event hook,
  which stays installed while a window has a handler. Callbacks run from DragManager::poll(),
  outside native hooks, and may replace or remove handlers.
- Each drop receives its data in its own property, and replies must match its timestamp: a late
  reply to an abandoned drop never completes a newer one. Queued drops belong to their data
  handler registration (a never-reused generation), so a removed or replaced handler never
  receives them. INCR, oversized or unreadable replies fail the drop instead of delivering empty
  data.
- XErrorScope moves to x11errorscope.hpp, shared by the X11 drag source and drop target.
- Fix a use-after-free in the X11 drag source: destroying the drag preview pumps X events, which
  could re-enter the source and destroy the same preview window again (the intermittent
  "free(): invalid pointer" of eepp-native-dnd-tests). The preview is detached before it is reset,
  in the X11 source and in both SDL preview backends.
- Wayland is unchanged: SDL owns its data device and refuses these offers.

eefm:
- Entries dragged out of Ark are extracted where they are dropped. Ark's drag only names a D-Bus
  object; ArkDrop asks it to extract into the folder (org.kde.ark.DndExtract, as Dolphin does).
  libdbus is loaded at runtime, and the drag's name, path and the destination are validated before
  the call, since libdbus aborts on invalid ones.
- XDS drops save into the pane, or the folder row, under the pointer. Both kinds of drop refuse
  remote folders, which the source cannot write to.
- Opening a local executable runs it in its folder: native programs (ELF / Mach-O) directly,
  scripts ("#!") after a confirmation. The execute permission alone is not enough (FAT and NTFS
  mounts set it on every file), and remote files are only opened.

Tests: eepp-native-dnd-tests --automated adds the drop target checks on X11 (data drop, INCR
reply, late reply, XDS save and refusal, removed and replaced handlers) from a scripted source.
The "skipped" exit code 77 is now named TestSkipped.

Docs: native_drag_and_drop.md describes receiving drags without files.
2026-10-16 13:36:22 -03:00
Martín Lucas Golini 259b7bf32e refactor(vfs, eefm, ui): organize the pre-merge review's architecture, DRY and API items
Architecture and file organization:
- VFS: TransferEngine moves to transferengine.hpp/.cpp; the blocking write steps shared by
  writeAll() and transfers become detail::FileWriter (writeFully, makeDirs, resolveTarget,
  replace). FileInfo code moves from error.cpp to fileinfo.cpp; InlineExecutor to
  core/executor.cpp.
- SFTP: sshsession.hpp/.cpp is split into one file per class (SSHOperation, SSHChannelPump,
  SSHIOContext, SSHConnection, SSHTransport and SSHSocketTransport / SSHChannelTransport /
  SSHProcessTransport); the socket free functions become SSHSocket statics and WakeSignal is
  SSHWakeSignal. SFTPProviderImpl is implemented in sftpproviderimpl.cpp. Watch backend headers
  and SFTPProvider::impl() are no longer public.
- LocalProvider: the POSIX and Win32 implementations live in localproviderposix.cpp and
  localproviderwin.cpp.
- UISystemIconTheme: the #if-switched backend becomes SystemIconBackend with
  FreedesktopIconBackend, WindowsIconBackend and MacOSIconBackend; systemicons.hpp is gone.
- UIAbstractTableView owns focus-on-selection (backed by TableFlagFocusOnSelection), shared by
  UITableView and UITreeView; UITableView's rubber band state reads its table flag.
- New UISceneNode::applyDefaultFont() / setFontRendering() and FontTrueType::filePathOf()
  replace the copies in eefm, eterm and ecode.
- eefm: App is the shared context (as in ecode) owning PaneManager, FileOperations,
  PlacesController, TerminalPanel and SettingsActions; Pane/FileTab live in pane.hpp, location
  text helpers in Location. trash/dialogs/icons free functions become the Trash, Dialogs and
  Icons classes; SSHPrompts has its own file; currentFileDrag() is FileTableView::currentDrag().
  Deleting from the trash drops its .trashinfo through Trash::forget() on the pool.

Duplicates:
- URI: defaulted copy operations, shared authority copy, new hasSameAuthority().
- Sys::getDataPath() / getDataSearchPaths() replace six XDG_DATA_HOME/XDG_DATA_DIRS lookups;
  FileSystem::fileNameSplitExtension() replaces two base/extension splits; lowerExtension and
  toWide use FileSystem::fileExtension and String::toWideString; SSH authentication prompts
  share requestExternal() bookkeeping.

Removed unused API: FileCursor, VFSProvider::nativeCopy and VFSCapability::NativeCopy,
Transfer::progress(), Task::onCompleteOn(), SmallUniqueFunction::fitsInline(), the Result
combinators, CancellationToken::canBeCancelled(), IOStreamVFS, VFS::instance() and the
deprecated System::VirtualFileSystem / System::VFS.

Mechanical: braces on multi-line control bodies added by the branch, struct field order without
interior padding, the debug.hpp include in task.hpp, doc comment fixes. Sources wrapped entirely
in a platform guard include only eepp/config.hpp before it, and their headers inside it.

Task API, for readability: Task<T>::create( resolve ) returns a pending task and fills a
copyable TaskResolver<T>, called as resolve( value ), which replaces the move-only TaskSource and
its task()-once rule (the last copy destroyed unresolved still abandons the task).
thenOn( executor, fn ) is now then( executor, fn ); then( fn ) keeps running on the resolving
thread.
onComplete( fn ) passes std::optional<T> (nullopt when abandoned) instead of the task.
TaskDiagnostic::TaskRetrievedTwice is gone.
SSHTaskOperation receives its resolver in its constructor instead of exposing task(), and the
polling watch backend no longer creates a task it immediately abandons while stopping.
2026-10-16 11:30:43 -03:00
Martín Lucas Golini 5268a83e07 Merge branch 'develop' into feature/vfs 2026-10-15 14:10:04 -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 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 88e816f4d9 feat(eefm): tab moves, middle click tabs, visual polish and fixes
eefm:
- Tabs can be dragged between the panes. When a pane's last tab moves
  out, the pane gets a new tab on the same folder, so the split view
  stays.
- A middle click on a folder opens it in a new background tab; with
  Ctrl (Cmd on macOS) the new tab is selected and focused.
- Item context menus list Create New after the open actions.
- Open Terminal Here prefers eterm (in PATH or next to eefm), else the
  default terminal: $TERMINAL, xdg-terminal-exec, the desktop's own
  (KDE's setting, GNOME, Xfce, MATE, LXQt), x-terminal-emulator, then
  the common ones. On Windows it opens PowerShell (else cmd.exe) in a
  new console, so it shows in the default terminal; it used to start
  as a detached process with no console.
- Tab close buttons work: the focus handoff to the files took the
  focus from them, and the click goes to the focused node. Their hover
  color shows again.
- Visual polish: long cell text ends in an ellipsis, dates are shorter,
  and the name gets more room. Hover and selection are soft accent
  tints with an outline; the inactive pane's view is a little dimmer,
  with a grey selection. The location bar highlights on hover. The
  filter bar is one framed field and starts hidden (Ctrl+I). Places
  share the row tints, usage bars are softer, scrollbars are grey until
  used, unselected tabs dim their close button, and folders are tinted
  when eefm's own icons are used.
- Crashes print a stack trace (backward).

eefm and eterm:
- The font picker opens centered and preselects the font in use when
  none is configured. A picked fallback font replaces the previous one,
  so it applies at once. The UI scene gets a thread pool, as in ecode,
  so the picker lists fonts in the background.

eepp:
- UIPushButton: with an expanded text view, the content size is the
  whole text, so auto sized table columns still fit their content.
- VFSDirectoryModel: folder name cells get the vfs_folder class.

build:
- backward stack traces for more tools (texture atlas editor, map
  editor, UI editor, eterm, texture packer, eeiv, eproc, eefm); libdw
  is linked by the backward module.
2026-10-15 02:30:30 -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 0b182de93e Fix Windows MSVC build. 2026-10-14 22:01:18 -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 a152a5427d fix(ui): open model rows once on Enter; link efsw frameworks for eefm
- UITableCell: leave Enter to the model view instead of clicking the cell.
  With focus on the selected row's cell, single-click navigation opened
  the row twice: once from the cell click and once from the view's Enter
  handler. Affected UITreeView, and UITableView/UIListView since they
  follow focus-on-selection.
- Add a regression test for list, table and tree views in both click
  modes.
- Link CoreFoundation and CoreServices in eepp_module_vfs_add(): efsw's
  FSEvents watcher needs them, which broke the eefm link on macOS.
2026-10-14 20:05:48 -03:00
Martín Lucas Golini c148becc64 feat(eefm): add settings, terminal panel, system icons and in-place rename
UI:
- Add UISystemIconTheme: colored file, folder and place icons from the
  freedesktop icon theme, the Windows shell or macOS, loaded asynchronously
  with glyph fallbacks. Platform helpers live in src/eepp/ui/icons/.
- UITableView: rubber band selection (tableview::rubberband, styled in
  breeze.css), Shift range selection from an anchor, type-to-select by a
  configurable column, and focus following the selection.
- UISpinBox: keep partial text while typing; clamp and normalize on Enter or
  focus loss, and detach the input listeners on destruction.
- InputEvent: report the window position of file drops (SDL3).
- Image: detect SVG documents preceded by comments, a DOCTYPE or XML
  declarations.

eefm:
- Add a settings window (theme, fonts, rendering, files, terminal),
  persisted in config.cpp.
- Add a terminal panel (F4) whose shell follows the active pane while it
  waits at its prompt.
- Show platform icons for files and places, cached per MIME type.
- Rename in place, select created or renamed items, and copy files
  dropped from other applications into the pane or folder under the drop.
- Fix MIME descriptions and icons for exact names, multi-dot extensions and
  globs; cache unknown types negatively.

eterm:
- Apply UI font, size, hinting and anti-aliasing settings live.
2026-10-14 19:34:02 -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 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 88675a7c84 feat(vfs): add async URI-based VFS module with SFTP and the eefm file manager
Async core (EE namespace, documented in docs/articles/async_core.md):
- Add Result<T, E>, Task<T>/TaskSource<T> with continuations and
  abandonment, Executor, CancellationToken and SmallUniqueFunction
- Make ThreadPool an Executor with submit() returning a Task; work items
  are move-only
- Add Scene::MainThreadExecutor to resume continuations on the UI thread
- Move URI to EE core (eepp/core/uri.hpp) with filesystem helpers
  (fromFSPath, getFSPath, getParent); EE::Network::URI remains an alias
- Add System::SHA1 (streaming, modeled on MD5)
- Rename the pack path index to System::PackFileIndex; VirtualFileSystem
  is kept as a deprecated alias

eepp-vfs module (src/modules/vfs, documented in docs/articles/vfs.md):
- URI-addressed VirtualFileSystem with pluggable providers: file://,
  mem://, res:// (packs) and sftp://
- Async file and directory handles, metadata, space info, capabilities
  and IOStream adapters
- Copy/move transfers with progress, cancellation and conflict options
- Change watching through efsw locally, efsw-agent over SSH for sftp://,
  and a polling fallback
- VFSDirectoryModel for table views: sorting, name filtering (plain,
  glob, regex), type and item-count columns, per-column CSS classes and
  lifetime-safe executor delivery

SFTP:
- SSH sessions over libssh2 with ssh_config parsing (Host/Match,
  ProxyJump, ProxyCommand), known_hosts verification, ssh-agent, key and
  keyboard-interactive authentication, and connection pooling
- Built by default; opt out with --without-vfs-sftp
- Vendor libssh2 1.11.1 with the mbedTLS backend, and add Ed25519 host
  and user keys to it through Monocypher 4.0.2 (mbedTLS has no Ed25519)

eefm (src/tools/eefm), a Dolphin-like file manager on eepp-vfs:
- Split panes, each with its own tabs, location bar, history and
  filter bar
- Places panel with Places, Remote (saved locations and network mounts)
  and Devices (with usage), editable, hideable and reorderable by drag
- Details view with drag and drop, clipboard interoperable with other
  file managers, rename, new folder/file, trash (freedesktop, macOS,
  Windows) and properties
- Open and Open With from shared-mime-info and desktop entries
- Persisted window, panes, tabs, columns, sort and places

UI and window fixes:
- Keep table column max widths across model updates and give the main
  column the remaining width
- Count left margins when laying out push button icon and text
- Add Clipboard::setMimeData, getDataString and getTextMimeTypes
- Report Zip::close/addFile failures and free archives correctly

Tests and tooling:
- Unit tests for the async core, VFS providers, transfers, watching,
  the directory model, ssh_config, SFTP (local sshd), the efsw agent
  protocol, SHA1 and URI
- Add a VFS benchmark
- Update efsw with efsw-agent and its wire protocol
2026-10-13 14:58:11 -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 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 4baa4ae4b1 Split accessibility backends, fix CI regressions and document architecture
CI fixes for the previous commit:
- Windows: announce one BoundsChanged on the window root when the scene
  resizes, so UIA raises LayoutInvalidated again. Widgets still do not
  report their own bounds changes.
- macOS: collapse identical pending notifications per element within one
  update, so one text selection change posts a single
  AXSelectedTextChanged. Created/Destroyed keep every occurrence, in order.
- MinGW: link the UIA test harness with -municode and uuid, which fixes
  the nightly MinGW build.

Backends:
- Split the AT-SPI backend into a private header plus connection, events,
  tree/marshalling and method files. Break the 600-line D-Bus dispatcher
  into one handler per interface.
- Split the UIA backend into a private header plus core, element provider
  and text range files.
- Share hasState/hasAction in accessibilitybackend.hpp instead of three
  per-backend copies.

CI and docs:
- Run test_atspi.py --multi-window on Linux: closing a secondary window
  while an AT-SPI client stays connected.
- Add docs/articles/uiaccessibilityarchitecture.md (layer map, files,
  invariants, per-backend layout, common tasks, test matrix) and link it
  from the articles index and the accessibility guide.
- Add a unit test for the single layout notification on scene resize.
2026-10-09 01:02:11 -03:00
Martín Lucas Golini 5a4fb936f0 Merge branch 'develop' into feature/a11y 2026-10-08 10:04:08 -03:00
Martín Lucas Golini 66d2c9d4d2 eproc: improve startup memory collection and tab navigation
Publish the base process snapshot without waiting for PSS collection.
Leave Family Memory blank until startup accounting completes.

- Derive PSS policy from saved column visibility before startup.
- Collect Linux startup PSS with four temporary workers and seed the cache.
- Apply completed samples only to matching process identities without
  advancing performance history or aging ended processes.
- Preserve live cache entries while memory columns are hidden and
  invalidate entries on PID reuse.
- Share table-state parsing and validation; remove unused migrations.
- Add next-tab and previous-tab commands with Mod+Tab and Mod+Shift+Tab.
- Remember and restore each tab's last focused widget.
- Add coverage for startup collection, cache lifetime, saved visibility,
  and asynchronous family-memory updates.
2026-10-07 02:27:25 -03:00
Martín Lucas Golini be17af3da0 Fix CSS selector backtracking, union style dependencies and bind libeepp calls directly
Selector matching (Selectors Level 4 §17.3):
- Retry other candidates for descendant and general-sibling combinators
  instead of rejecting after the first failed path. Checkpoints use a
  fixed array of one entry per checkpoint-saving rule (16 on the stack,
  32/64 in out-of-line helpers, heap beyond), with failure pruning so
  exhausted searches stop early.
- Handle <html> as a style-sheet parent boundary whose siblings stay
  visible: failed parent steps at an <html> with element siblings retry
  instead of rejecting, and a ~ candidate that is such an <html> resumes
  its search without a checkpoint.
- Reject the subject before sizing storage for long selectors.

Style dependencies:
- getRelatedElements() now returns the union of tracked elements over
  every matching path, so state changes on any eligible ancestor or
  sibling restyle the subject. Strategies are chosen per selector:
  immediate exit, fixed-prefix walk, single candidate scan (with a
  shared suffix for ~ candidates), an ancestor-path DP, and a memoized
  collector. All are linear and allocation-free for common selectors.

Other fixes:
- Exclude raw text nodes from matched author styles; their widget
  backgrounds painted over glyphs drawn by the parent rich text.
- Report widget ids from getPropertyString() so [id=...] selectors match.
- Add StyleSheetSelectorRule::hasAnyPseudoClasses() and
  UIStyle::getRelatedWidgets() (inline, ABI-compatible additions).

Build:
- Link libeepp with -Wl,-Bsymbolic-functions on Linux, BSD and Haiku so
  internal calls skip the PLT (11,314 -> 619 PLT entries). Measured:
  Markdown load -25%, selector matching -11%, attribute matching -14%.

Tests and benchmarks:
- Regression tests for backtracking, <html> boundaries, subscription
  union and cleanup, operation-count bounds, long selectors and id
  attribute selectors, plus a differential test against an exhaustive
  reference matcher.
- Add Benchmark.CSSSelectorCombinators and Benchmark.CSSStateDependencies
  and create all benchmark windows hidden.
2026-10-07 00:03:22 -03:00
Martín Lucas Golini d49fe3fdc8 Add date and time pickers with calendar popups and HTML mappings
- Add CalendarDate, TimeOfDay, LocalDateTime and DateRange with Gregorian
  arithmetic, locale-aware formatting/parsing, ISO serialization and Unix
  timestamp conversions with explicit UTC offsets.
- Add UIDateTimeEdit, UIDatePicker, UITimePicker, UIDateTimePicker and
  standalone UICalendar, with XML/CSS registration and data binding.
- Support segmented keyboard editing, numeric entry, ISO paste, configurable
  steps, bounds, empty values and independent seconds/milliseconds display.
  Default time display to hours and minutes while preserving stored precision.
- Add day/month/year calendar navigation and a combined date-time popup with
  time steppers, live configuration updates and scoped event connections.
- Add Breeze and fallback theme styles with CSS-defined SVG icons, dp sizing,
  font-aware calendar dimensions and muted read-only/disabled controls.
- Map HTML date, time and datetime-local inputs to native controls with strict
  value sanitization, min/max/step/required/readonly/disabled handling,
  constraint validation and normalized form serialization.
- Provide private light HTML control defaults and intrinsic temporal sizing;
  prevent author CSS from styling anonymous implementation parts.
- Share popup placement and visibility helpers across pickers, dropdowns and
  trigger/cursor menus while retaining cascading-menu placement rules.
- Fix fractional grid wrapping and input cursor bubbling over child buttons;
  notify and refresh styles when editing permission changes.
- Reduce CSS registration allocations with string_view parameters and
  heterogeneous name lookup; inline frequently used node and CSS getters.
- Align CodeEditor default font sizing with text widgets without overriding
  application preferences.
- Add HTML form margin defaults and update the affected rendering baseline.
- Upgrade Windows ecode nightly builds to Ubuntu 24.04 and newer MinGW.
- Add picker documentation, an example and regression coverage for date math,
  locales, editing, popup placement/lifetime, HTML controls and pixel density
2026-10-06 01:13:44 -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 0f37cee540 mingw32 build fix. 2026-09-25 20:39:24 -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 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 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 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
Martín Lucas Golini e4af29af4b Merge branch 'develop' of github.com:SpartanJ/eepp into develop 2026-09-20 02:37:02 -03:00
Martín Lucas Golini 1ae2b7180b Add initial eproc system monitor
- Add the eproc process-monitoring application and persistent window/table state
  - Implement Linux process, network, GPU, icon, and GUI-window collection
  - Add optional process columns, styling, i18n-ready strings, and command copying
  - Retain exited processes for one update and color them as ended
  - Extend table sizing and header behavior for persisted column layouts
  - Organize Linux-specific sources under platform/linux
  - Keep unsupported platforms buildable with a startup WIP warning
2026-09-20 02:36:54 -03:00
Martín Lucas Golini cdde2ec49e Fix file associations in macOS. 2026-09-18 20:47:22 -03:00
Martín Lucas Golini c530e4bd6e feat: add cross-platform file association management
Add an EE::System::FileAssociation abstraction with XDG, Windows,
and macOS implementations.

Expose extensions from syntax predefinitions and add custom widget
support to UISettingsPanel. Add an ecode settings page for selecting
file associations and installing an XDG desktop entry.

Apply changes asynchronously with lifecycle-safe UI handling, disable
controls while applying, and avoid redundant XDG database updates.

Add translations and coverage for the new functionality.

Implements SpartanJ/ecode#192
2026-09-17 11:04:25 -03:00
Martín Lucas Golini 685f304d6f feat(accessibility): harden Windows UIA backend
- expose per-HWND fragment roots with safe WM_GETOBJECT subclassing
  - marshal UIA queries and actions onto the owning UI thread
  - stabilize provider identity, cache lifetime, and stale-node handling
  - implement selection, value, range, expand, scroll, and text patterns
  - add UTF-16 text ranges and native accessibility event delivery
  - add a Windows UIA validation harness and CI coverage
  - document lifecycle, performance, and compatibility results
2026-09-15 00:44:54 -03:00
Martín Lucas Golini 8d65c5388a Merge branch 'develop' into feature/a11y 2026-09-14 12:24:24 -03:00
Martín Lucas Golini 071bc5d697 Add optional smooth scrolling across UI scrollable widgets
Introduce UIScrollController to provide frame-rate-independent wheel
interpolation, touch dragging, and momentum for code editors, terminals,
scroll views, and scrollable widgets while preserving the legacy instant
scrolling path.

Add a UISceneNode-level smooth-scrolling policy. Embedded scenes inherit
the root scene setting, new widgets snapshot it during construction, and
setSmoothScrollEnabled() can optionally apply changes to existing widgets
across the complete embedded-scene hierarchy.

Move native macOS scrolling and title-bar helpers into PlatformHelper,
enable native momentum from UIApplication, and explicitly enable it in
ecode. Preserve precise SDL2 and SDL3 wheel deltas for fractional momentum
events without changing normal integer wheel steps.

Replace the separate editor and terminal preferences in ecode and eterm
with one global smooth-scrolling setting, including legacy configuration
migration, live updates, and localized settings text.

Improve UITouchDraggableWidget momentum handling and add regression tests
for scrolling interpolation, pixel-aligned editor positions, scene
inheritance, widget overrides, and immediate policy application.
2026-09-13 20:27:37 -03:00
Martín Lucas Golini b62612475f Add native macOS accessibility backend
- expose eepp windows and widgets through Cocoa NSAccessibility
  - add lazy, stable native wrappers with safe lifecycle invalidation
  - support hierarchy, focus, geometry, actions, values, and UTF-16 text APIs
  - deliver coalesced native notifications for UI and model changes
  - preserve surviving secondary windows when the primary closes
  - add macOS semantic, notification, lifecycle, and performance harnesses
  - add native unit coverage and accessibility example scenarios
  - keep dormant accessibility overhead negligible
2026-09-13 01:38:48 -03:00
Martín Lucas Golini 42de99cf3b Fix GL resource sharing across native application windows
Decouple GL object sharing between native windows from auxiliary worker-thread context support. Platforms without threaded GL contexts, such as Haiku, must still share textures and other GL resources between their window contexts.

Always configure SDL_GL_SHARE_WITH_CURRENT_CONTEXT according to the requested context settings, while continuing to create the auxiliary thread context only on supported platforms. Explicitly reset the SDL attribute for non-shared contexts to avoid leaking state into subsequent window creation.

Apply the fix to both SDL2 and SDL3 backends. Also link the Haiku unit test executable against libbsd and libnetwork to resolve its PTY and socket dependencies.
2026-09-12 01:51:17 -03:00
Martín Lucas Golini 35ebcba55a Merge branch 'develop' into feature/a11y 2026-09-11 00:20:56 -03:00
Martín Lucas Golini 095fe7919e feat(ui): add native multi-window application support
- let UIApplication create, manage, render, and destroy multiple native windows
  - add scoped scene and GL window-context switching
  - route input events to the scene belonging to each native window
  - share application fonts, themes, icons, styles, and graphics resources safely
  - add NewInApplicationWindow factories for UIWindow, UIFileDialog, and UIMessageBox
  - support native parent relationships, modality, minimum sizes, and optional positioning
  - close child windows when the primary application window closes
  - defer native context destruction until the end of the application tick
  - fall back to in-scene windows for Emscripten and terminal rendering
  - reapply renderer state caches when switching OpenGL contexts
  - fix SDL2/SDL3 display bounds and multi-window lifecycle handling
  - add a native file-dialog and message-box multi-window example
  - add integration coverage for context switching, input, resources, modality, and closing
2026-09-10 19:27:29 -03:00