- 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.
- 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.
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.
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.
- 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.
- 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.
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.
- 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.
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.
- Implement a Cocoa drag source on NSDraggingSession for SDL2 and SDL3.
- Use the offered snapshot as the drag image, or each file's Finder icon,
with AppKit's own count badge and copy cursor.
- Offer Generic alongside Copy only within the application, so SDL2's
Cocoa windows accept drops while other apps still see a copy-only offer.
- Report cancellation immediately and refuse the drop, since AppKit cannot
abort a running session.
- Fix macOS SDL3 builds: use pkg-config instead of the removed sdl3-config
and keep EE_SDL3_FROM_ROOTPATH for framework builds only.
- Build the native drag tests on macOS, add the Android drag sources, and
avoid the windows.h max macro in the Win32 source.
- Document macOS behavior and platform support.
- Introduce DragAndDrop with capability queries, copy-only file offers,
image previews, cancellation, and completion callbacks.
- Implement XDND and OLE sources with safe input recovery and window teardown.
- Keep SDL2 and SDL3 presentation and input handling in their own backends.
- Load X11 dynamically without adding a link dependency.
- Reuse Image, URI, and timing APIs; fix Image::fillWithColor().
- Add a manual playground, integration tests, and consumer documentation.
- Migrate SDK builds and packaging to SDL3 and fix bundled runtime lookup.
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
- Use the native AX navigation-order attribute name on older AppKit SDKs
- Supply missing UIA declarations with compatible COM signatures and UUID
- Generate missing x86/x64 UIAutomationCore import libraries for older MinGW
- Keep fallback library paths consistent across Premake 4 and 5
- Add native navigation-order and UIA event-advice ABI regression coverage
- Cache effective direction and skip unchanged subtree propagation.
- Add logical alignment, box edges, and relative positioning.
- Mirror layouts and controls while preserving logical node order.
- Apply inherited base direction to UI text and editing.
- Keep logical-edge storage lazy and compact.
- Add regression tests, an isolated WebView demo, and RTL documentation.
- Document RichText bidi limitations and plan paragraph-level support.
CI fixes for the previous commit:
- Windows: announce one BoundsChanged on the window root when the scene
resizes, so UIA raises LayoutInvalidated again. Widgets still do not
report their own bounds changes.
- macOS: collapse identical pending notifications per element within one
update, so one text selection change posts a single
AXSelectedTextChanged. Created/Destroyed keep every occurrence, in order.
- MinGW: link the UIA test harness with -municode and uuid, which fixes
the nightly MinGW build.
Backends:
- Split the AT-SPI backend into a private header plus connection, events,
tree/marshalling and method files. Break the 600-line D-Bus dispatcher
into one handler per interface.
- Split the UIA backend into a private header plus core, element provider
and text range files.
- Share hasState/hasAction in accessibilitybackend.hpp instead of three
per-backend copies.
CI and docs:
- Run test_atspi.py --multi-window on Linux: closing a secondary window
while an AT-SPI client stays connected.
- Add docs/articles/uiaccessibilityarchitecture.md (layer map, files,
invariants, per-backend layout, common tasks, test matrix) and link it
from the articles index and the accessibility guide.
- Add a unit test for the single layout notification on scene resize.
Publish the base process snapshot without waiting for PSS collection.
Leave Family Memory blank until startup accounting completes.
- Derive PSS policy from saved column visibility before startup.
- Collect Linux startup PSS with four temporary workers and seed the cache.
- Apply completed samples only to matching process identities without
advancing performance history or aging ended processes.
- Preserve live cache entries while memory columns are hidden and
invalidate entries on PID reuse.
- Share table-state parsing and validation; remove unused migrations.
- Add next-tab and previous-tab commands with Mod+Tab and Mod+Shift+Tab.
- Remember and restore each tab's last focused widget.
- Add coverage for startup collection, cache lifetime, saved visibility,
and asynchronous family-memory updates.
Selector matching (Selectors Level 4 §17.3):
- Retry other candidates for descendant and general-sibling combinators
instead of rejecting after the first failed path. Checkpoints use a
fixed array of one entry per checkpoint-saving rule (16 on the stack,
32/64 in out-of-line helpers, heap beyond), with failure pruning so
exhausted searches stop early.
- Handle <html> as a style-sheet parent boundary whose siblings stay
visible: failed parent steps at an <html> with element siblings retry
instead of rejecting, and a ~ candidate that is such an <html> resumes
its search without a checkpoint.
- Reject the subject before sizing storage for long selectors.
Style dependencies:
- getRelatedElements() now returns the union of tracked elements over
every matching path, so state changes on any eligible ancestor or
sibling restyle the subject. Strategies are chosen per selector:
immediate exit, fixed-prefix walk, single candidate scan (with a
shared suffix for ~ candidates), an ancestor-path DP, and a memoized
collector. All are linear and allocation-free for common selectors.
Other fixes:
- Exclude raw text nodes from matched author styles; their widget
backgrounds painted over glyphs drawn by the parent rich text.
- Report widget ids from getPropertyString() so [id=...] selectors match.
- Add StyleSheetSelectorRule::hasAnyPseudoClasses() and
UIStyle::getRelatedWidgets() (inline, ABI-compatible additions).
Build:
- Link libeepp with -Wl,-Bsymbolic-functions on Linux, BSD and Haiku so
internal calls skip the PLT (11,314 -> 619 PLT entries). Measured:
Markdown load -25%, selector matching -11%, attribute matching -14%.
Tests and benchmarks:
- Regression tests for backtracking, <html> boundaries, subscription
union and cleanup, operation-count bounds, long selectors and id
attribute selectors, plus a differential test against an exhaustive
reference matcher.
- Add Benchmark.CSSSelectorCombinators and Benchmark.CSSStateDependencies
and create all benchmark windows hidden.
- Add CalendarDate, TimeOfDay, LocalDateTime and DateRange with Gregorian
arithmetic, locale-aware formatting/parsing, ISO serialization and Unix
timestamp conversions with explicit UTC offsets.
- Add UIDateTimeEdit, UIDatePicker, UITimePicker, UIDateTimePicker and
standalone UICalendar, with XML/CSS registration and data binding.
- Support segmented keyboard editing, numeric entry, ISO paste, configurable
steps, bounds, empty values and independent seconds/milliseconds display.
Default time display to hours and minutes while preserving stored precision.
- Add day/month/year calendar navigation and a combined date-time popup with
time steppers, live configuration updates and scoped event connections.
- Add Breeze and fallback theme styles with CSS-defined SVG icons, dp sizing,
font-aware calendar dimensions and muted read-only/disabled controls.
- Map HTML date, time and datetime-local inputs to native controls with strict
value sanitization, min/max/step/required/readonly/disabled handling,
constraint validation and normalized form serialization.
- Provide private light HTML control defaults and intrinsic temporal sizing;
prevent author CSS from styling anonymous implementation parts.
- Share popup placement and visibility helpers across pickers, dropdowns and
trigger/cursor menus while retaining cascading-menu placement rules.
- Fix fractional grid wrapping and input cursor bubbling over child buttons;
notify and refresh styles when editing permission changes.
- Reduce CSS registration allocations with string_view parameters and
heterogeneous name lookup; inline frequently used node and CSS getters.
- Align CodeEditor default font sizing with text widgets without overriding
application preferences.
- Add HTML form margin defaults and update the affected rendering baseline.
- Upgrade Windows ecode nightly builds to Ubuntu 24.04 and newer MinGW.
- Add picker documentation, an example and regression coverage for date math,
locales, editing, popup placement/lifetime, HTML controls and pixel density
- Add persistent eproc settings for refresh interval, appearance, fonts,
and renderer options, with a settings button in the main window.
- Collect per-core CPU usage on macOS and FreeBSD for Performance charts.
- Keep the settings search focused in eproc and eterm, and wrap long
setting names.
- Share macOS theme-colored titlebar handling across ecode, eproc,
and eterm.
- Stabilize fixed-size UI tests on Retina displays and prevent macOS
build scripts from starting unlimited jobs when sysctl fails.
Implement chart axes, line series, data sources, pixel-bucket reduction,
tooltips, and pan, zoom, fit, and live-follow interactions. Register Chart
as a default UI widget and expose the new APIs through ui.hpp.
Add a responsive four-chart example, benchmarks, and unit tests. Reuse
rendering buffers and fix ring-buffer rendering and hover tooltip behavior.
Use KERN_PROC_PROC so eproc shows one row per process instead of one
row per thread.
Select clang by default in Premake 4 and 5, add the required FreeBSD
library paths and links, and remove redundant CI compiler overrides.
Fix the Premake 4 BSD SONAME rule so eproc can find libeepp.so when
launched from the repository root.
- Collect process and system metrics on macOS and FreeBSD.
- Resolve macOS app icons and share the XDG icon resolver between Linux and FreeBSD.
- Hide unavailable columns, label resident memory “Real Mem” on macOS, and scale row height with pixel density.
- Fix Premake filters and add macOS collector tests.
Add process columns, GPU metrics, tree mode, multi-process actions,
GUI and tray detection, and persistent filter and table settings.
Add optional column header reordering to eepp table and tree views.
Keep dragged headers in place during refresh and draw them above other
headers. Preserve row selection when sorting and when opening context
menus, and support application items in header context menus.
Refresh eepp and tool icons and add the icon generation script.
Add tests for the process views, icon decoding, and GUI table behavior.
Compute document line changes asynchronously against the repository
baseline and render added, modified, and removed markers in the editor
gutter and minimap.
Keep diff indicators disabled by default to avoid unexpected background
work. Add settings for enabling them and configuring the debounce delay,
with translations for all supported locales.
Handle fully added files, stale asynchronous results, document lifetime,
repository changes, and unsaved edits. Add focused Git diff and document
serialization regression coverage.
Vendor a reduced simdutf build and use it to accelerate String UTF-8 and
UTF-32 conversion and codepoint counting. Preserve efficient scalar and
cached-ASCII paths while reusing output storage for document snapshots.
Add simdutf to the Premake 4, Premake 5, and Android builds.
Fix UIConsole wheel and keyboard scrolling, and repair its text cache by
hashing log entries before moving their strings. Initialize cache hashes
and add regression coverage for scrolling and moved log entries.
Preserve debugger response data when notifying multiple listeners by
copying for all but the final listener. Remove an evaluation-order hazard
when capturing and submitting URIs for asynchronous document loading.
Refs SpartanJ/ecode#955.
- Centralized .gitignore, .prjallowed, and .prjdisallowed filtering in src/tools/ecode/projectdirectorytree.cpp:392.
- Live directories now require an already-admitted parent and use (parentDirectory, filename) matching before insertion.
- Live file additions use the same shared filtering.
- Newly admitted directories still load their own nested .gitignore before recursive scanning.
- Added eight direct regression tests in src/tests/unit_tests/projectdirectorytree_tests.cpp:84.
- Added the required ecode sources to both Premake unit-test targets.
- No FileSystemListener changes; directory moves remain outside this Add-focused patch.
- Context menu issue cause was terminal focus reporting: Codex enables focus events, and opening the popup sent ESC [ O through the ordinary input path, which scrolls to the bottom. Focus reports now use the non-scrolling protocol-write path while still reaching the application correctly.
- Add the eproc process-monitoring application and persistent window/table state
- Implement Linux process, network, GPU, icon, and GUI-window collection
- Add optional process columns, styling, i18n-ready strings, and command copying
- Retain exited processes for one update and color them as ended
- Extend table sizing and header behavior for persisted column layouts
- Organize Linux-specific sources under platform/linux
- Keep unsupported platforms buildable with a startup WIP warning
Add an EE::System::FileAssociation abstraction with XDG, Windows,
and macOS implementations.
Expose extensions from syntax predefinitions and add custom widget
support to UISettingsPanel. Add an ecode settings page for selecting
file associations and installing an XDG desktop entry.
Apply changes asynchronously with lifecycle-safe UI handling, disable
controls while applying, and avoid redundant XDG database updates.
Add translations and coverage for the new functionality.
Implements SpartanJ/ecode#192
- expose per-HWND fragment roots with safe WM_GETOBJECT subclassing
- marshal UIA queries and actions onto the owning UI thread
- stabilize provider identity, cache lifetime, and stale-node handling
- implement selection, value, range, expand, scroll, and text patterns
- add UTF-16 text ranges and native accessibility event delivery
- add a Windows UIA validation harness and CI coverage
- document lifecycle, performance, and compatibility results
Introduce UIScrollController to provide frame-rate-independent wheel
interpolation, touch dragging, and momentum for code editors, terminals,
scroll views, and scrollable widgets while preserving the legacy instant
scrolling path.
Add a UISceneNode-level smooth-scrolling policy. Embedded scenes inherit
the root scene setting, new widgets snapshot it during construction, and
setSmoothScrollEnabled() can optionally apply changes to existing widgets
across the complete embedded-scene hierarchy.
Move native macOS scrolling and title-bar helpers into PlatformHelper,
enable native momentum from UIApplication, and explicitly enable it in
ecode. Preserve precise SDL2 and SDL3 wheel deltas for fractional momentum
events without changing normal integer wheel steps.
Replace the separate editor and terminal preferences in ecode and eterm
with one global smooth-scrolling setting, including legacy configuration
migration, live updates, and localized settings text.
Improve UITouchDraggableWidget momentum handling and add regression tests
for scrolling interpolation, pixel-aligned editor positions, scene
inheritance, widget overrides, and immediate policy application.
- expose eepp windows and widgets through Cocoa NSAccessibility
- add lazy, stable native wrappers with safe lifecycle invalidation
- support hierarchy, focus, geometry, actions, values, and UTF-16 text APIs
- deliver coalesced native notifications for UI and model changes
- preserve surviving secondary windows when the primary closes
- add macOS semantic, notification, lifecycle, and performance harnesses
- add native unit coverage and accessibility example scenarios
- keep dormant accessibility overhead negligible
Decouple GL object sharing between native windows from auxiliary worker-thread context support. Platforms without threaded GL contexts, such as Haiku, must still share textures and other GL resources between their window contexts.
Always configure SDL_GL_SHARE_WITH_CURRENT_CONTEXT according to the requested context settings, while continuing to create the auxiliary thread context only on supported platforms. Explicitly reset the SDL attribute for non-shared contexts to avoid leaking state into subsequent window creation.
Apply the fix to both SDL2 and SDL3 backends. Also link the Haiku unit test executable against libbsd and libnetwork to resolve its PTY and socket dependencies.
- let UIApplication create, manage, render, and destroy multiple native windows
- add scoped scene and GL window-context switching
- route input events to the scene belonging to each native window
- share application fonts, themes, icons, styles, and graphics resources safely
- add NewInApplicationWindow factories for UIWindow, UIFileDialog, and UIMessageBox
- support native parent relationships, modality, minimum sizes, and optional positioning
- close child windows when the primary application window closes
- defer native context destruction until the end of the application tick
- fall back to in-scene windows for Emscripten and terminal rendering
- reapply renderer state caches when switching OpenGL contexts
- fix SDL2/SDL3 display bounds and multi-window lifecycle handling
- add a native file-dialog and message-box multi-window example
- add integration coverage for context switching, input, resources, modality, and closing