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
- 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
Add an explicit Plugin::shutdown() phase that removes all application-facing
state while the complete plugin type is still alive. Detach editor and
document commands, listeners, clients, UI objects, and queued callbacks on
the main thread before scheduling resource-only destruction on a worker.
Move plugin-specific cleanup into unregisterEditors() and the PluginBase
unregister hooks. Keep potentially blocking cleanup, such as stopping LSP
servers or joining workers, in destructors so normal plugin unload does not
stall the UI.
Stop plugin reloads, broadcasts, late ready callbacks, and unlocked command
dispatch once application closing begins. During final shutdown, unload
plugins synchronously and wait for any previously queued destruction.
Document the Plugin and PluginBase lifecycle, cleanup checklist, and a
complete implementation example.
Previously, plugin destructors could mutate editor and UI state from a worker
thread, while destructor-time virtual dispatch skipped derived unregister
logic. This could leave commands capturing a destroyed plugin instance or
race registrations from a newly loaded generation. A queued key event during
application close could then execute one of these stale callbacks and jump to
invalid memory.
- Add a Delete action for untracked files and the Untracked section, with
confirmation before permanently removing the selected paths.
- Decode Git-quoted status paths using new byte-oriented std::string
String::escape() and String::unescape() overloads, preventing quoted or
octal-escaped filenames from breaking deletion.
- Add translations and regression tests for string escaping and quoted
untracked paths.
- Queue native wheel events until hover state has been rebuilt, restoring
scroll propagation from children that cannot scroll to their scrollable
ancestors.
- Add MouseWheelEvent and UICodeEditorPlugin::onMouseWheel() so plugins can
consume precise wheel input before the editor handles it. Migrate
autocomplete and AI Assistant wheel handlers to the new API while
preserving the existing virtual event dispatch semantics.
- Add regressions for wheel bubbling, plugin interception, generic wheel
listeners, and override-based callback suppression.
- add -r/--read-only to lock files opened from the command line
- preserve read-only mode when forwarding files over IPC
- apply locking only to the input files
- fix the Read Only checkbox by routing it through lock-toggle
- correctly process each path when opening multiple input files
Implements SpartanJ/ecode#954
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.
- Windows executable paths now always use GetModuleFileNameW(), with dynamic long-path support.
- Sys::getProcessPath() derives directly from the UTF-8 executable path.
- Windows working-directory APIs now use wide-character functions under both MinGW and MSVC.
- AI Assistant teardown checks that the editor splitter exists during partial initialization.
- Added process-path and Unicode working-directory regression tests using EXPECT_STDSTREQ.
- Introduce UIMultiDiffView as a first-class container for multi-file diffs, with a compact toolbar for expanding or collapsing all files, switching between unified and split views, and displaying aggregate file and line-change statistics.
- Calculate addition and removal totals during diff preparation so asynchronously prepared diffs do not need to rescan their contents on the UI thread. Cache the child diff views and expose the multi-diff state through the new component.
- Use UIMultiDiffView for regular diff tabs and Git commit details, removing the duplicated commit-specific toolbar, styling logic, tokenizer state, and view-mode handling. Preserve the original Git commit toolbar appearance, spacing, icons, tooltips, and colored changed-files summary.
- Keep the existing UIDiffView multi-file factory available for compatibility and add regression coverage for aggregate statistics, toolbar visibility, unified/split propagation, collapse state, prepared diffs, and large patches.
- Add localized changed-files summaries to all ecode translation catalogs.
- Fix the secondary-window UI test to use the appropriate std::string assertion helper.
- add reusable-buffer String::toUtf8() conversion
- extract shared find-bar CSS into UIFindBarStyle
- reuse the shared style from UIDocFindReplace
ecode:
- enable terminal find, next, and previous shortcuts
- install terminal bindings after conflicting editor bindings are removed
eterm:
- add searchable terminal history with plain text, RegEx, and LuaPattern modes
- support case-sensitive and whole-word matching across wrapped rows
- debounce searches and avoid unnecessary string allocations
- add an animated find bar with status and wrapped result navigation
- expose find commands through configurable keybindings and the context menu
- render and navigate search matches in terminal history
- forward right-button releases when applications capture the mouse
- fix UITabWidgetSplitter ownership during shutdown
tests:
- cover UTF-8 buffer reuse and terminal search behavior
- verify wrapped lines, Unicode, pattern modes, invalid expressions, and navigation
- verify SGR right-button release encoding
tooling:
- clarify the mandatory optimized build workflow for performance work
- require direct release test execution before falling back to Xvfb
Build:
- Link eterm with CoreFoundation and CoreServices on macOS
- Satisfy the framework dependencies required by efsw's FSEvents backend
Applications:
- Move eterm settings operations into a dedicated SettingsActions class
- Centralize settings window lifecycle and font configuration actions
- Route settings panel font-size updates through SettingsActions
- persist keybindings in keybindings.cfg with configurable primary and secondary modifiers
- hot-reload bindings and merge newly introduced defaults
- open keybindings.cfg in a terminal-font-sized code editor tab
- indicate unsaved keybinding changes using the modified-tab marker
- share tab and split commands between terminals and the keybindings editor
- add bindings for terminal actions, tab navigation, numbered tabs, splits, renaming, and tab movement
- expose keybindings through terminal and tab context menus
- add tab split and move-left/right context menu actions
- load preferences and window state from their configuration files
- persist CLI overrides after applying them
- capture window state before closing the native window
- restore window position and defer maximization until initialization completes
- avoid applying pixel density twice when restoring window dimensions
- display active keybindings in terminal and tab context menus
- add the New Terminal context-menu action
- add the generic settings model and panel to EE::UI::Tools
- support category navigation, filtering, and lazy materialization
- add UISettingsPanel model and filtering tests
ecode: migrate settings to UISettingsPanel
- replace the application-specific settings model
- use the generic settings panel implementation
- add monitor refresh rate as a frame limit option
- normalize UI labels and translations
eterm: add persistent configuration and settings panel
- persist application preferences and window state
- use saved values as defaults for command-line options
- persist command-line overrides
- add graphical settings with live application
- expose renderer, terminal behavior, appearance, font, and scale options
- add ellipsized tabs and ecode-style context actions to eterm
- support session rename, exclusive mode, tab movement, and maximize/restore
- restore maximized tab widgets before close or split operations
- track detached tab state directly to prevent stale references in ecode
- keep dirty rows valid during asynchronous terminal resize
- expose eterm's widget inspector and disable default UI effects
- localize the new exclusive-mode action
Exclude symbolic remote refs such as origin/HEAD from the branch list.
Remove the corresponding local remote-tracking ref after deleting a
remote branch, and prune stale refs when pulling.
Add persistent Kitty image presentation with RGB24 framebuffer updates,
tile-based damage detection, adaptive zlib compression, chunked Base64
transmission, and unchanged-frame suppression. Fall back to complete updates
when damage exceeds the configured threshold.
Expose environment controls for damage updates, persistent presentation, and
zlib compression level. Resolve presentation policy once during initialization
to keep environment parsing outside the frame path.
Repeat a=f on animation-frame continuation chunks as required by the Kitty
protocol, and suppress graphics acknowledgements from the terminal input
stream.
Complete Kitty keyboard translation for punctuation, function, keypad,
modifier, lock, and navigation keys. Preserve associated multi-codepoint text
and disambiguate Backspace from Delete using their protocol context.
Fix IOStreamMemory::write() to report bytes written so multi-chunk compression
works correctly, avoid stdout logging in the offscreen examples, and add
regression coverage for compressed streams and chunked frame updates.
Add a generic, message-oriented EE::System::IPC abstraction using Unix-domain
stream sockets on POSIX platforms and named pipes on Windows.
- add versioned, binary-safe message framing
- provide same-user endpoint isolation and hashed native endpoint names
- handle stale POSIX sockets, duplicate listeners, timeouts, and clean shutdown
- optimize common messages with inline storage and stack-backed endpoint buffers
- document the public IPC API and worker-thread callback contract
- add IPC coverage for framing errors, partial messages, binary payloads,
sequential clients, duplicate ownership, stale sockets, and relistening
- migrate ecode to profile-scoped IPC endpoints and JSON open-file messages
- preserve first/latest-instance selection behavior
- remove the filesystem watcher-based IPC transport
- add Discard actions for conflicted files and conflict groups
- restore discarded conflicts from HEAD in both index and working tree
- restrict regular discard actions to changed tracked files
- preserve default editor commands when replacing an editor document
- enable copying from the read-only merge-view side panels
- cover conflict restoration and merge-side copying
- document build parallelism and function-spacing conventions
- Share immutable built-in document commands, editor command tables, default keybindings, and syntax color scheme storage across editor instances. Preserve mutations through copy-on-write storage and explicit command-removal tracking.
- Use ShortcutMap consistently with unordered lookup while retaining deterministic ordering where serialization or conflict resolution depends on it. Cache ambiguous syntax-extension checks and invalidate the cache when language definitions change.
- Prepare Git commit-detail diffs and sub-line changes on worker threads with cancellation and stale-request protection. Release raw patch memory before UI construction and add regression coverage for prepared and cancelled diffs.
- Add Diff Changed support and enable collapsible file headers for Diff HEAD, Diff Staged, and Diff Changes.
- Update translations, compatibility call sites, tests, and the efsw dependency.
- Lazily compute document line hashes, avoid redundant multiline insertion
walks, and defer longest-line measurement for large or exceptionally long
text changes.
- Cache default code editor keybindings, reserve common command storage, and
create UIDiffView image viewers only when an image diff requires them.
- Keep cached screen positions coherent when descendants are queried before
dirty ancestors, and add regression coverage for ancestor movement.
- Relocate font-rendering golden images into the unit-test asset directory
and resolve image fixtures independently of the current working directory.
- Fix spurious status entries for files moved between directories. Preserve the suffix after Git's abbreviated brace notation when parsing renamed paths from numstat output. This prevents directory moves such as `bin/{ => unit_tests}/assets/...` from producing truncated synthetic untracked entries like `unit_tests`. Add regression coverage for staged files moved into a different directory.
- Git Plugin now remembers between sessions the uncommited commit message.
Add native hint text support to UITextEdit, matching UITextInput behavior and exposing configurable hint text, color, font, size, style, shadow, outline, and HintDisplay modes. Render hints only for empty
documents and preserve the correct drawing order beneath the caret.
Expose the corresponding hint CSS properties through UITextEdit and apply the theme hint color to TextEdit and TextArea widgets.
Add an “Add Tag & Push” action alongside local-only tag creation. Push only the newly created tag using an explicit refspec and the current branch’s tracked remote, falling back to origin.
- Add SmartGit-inspired context actions to Git History commits, including checkout, merge, fast-forward merge, cherry-pick, revert, branch creation, tag creation, and copying commit IDs or complete messages.
- Order commit actions into consistent operation, ref-creation, and clipboard groups. Hide the redundant Show in Git History action inside detached history tabs while retaining it in the source-control sidebar.
- Add a Working Tree / Index context menu with status-aware Commit and Stage actions. Track staged and unstaged availability in the history model and keep it synchronized as repository status changes.
- Extend the Git command wrapper with operations for creating branches at commits, creating and deleting tags, deleting remote branches, cherry-picking commits, and reverting commits.
- Support deleting tags and remote branches from the Branches view. When deleting a local branch with an upstream, optionally delete its tracked remote branch as part of the operation.
- Add confirmation and input dialogs for branch, tag, remote-deletion, and revert workflows. Disable history-changing commit actions while another Git operation is active.
Added a synthetic “Working Tree / Index” first row whenever the selected repository has local or staged changes.
Displays separate changed and staged counts.
Updates dynamically from normal status refreshes without reloading commit history.
Selecting it opens the shared details view in “Uncommitted changes” mode.
Shows tracked changes from HEAD through the working tree, plus untracked-file patches.
Supports both sidebar and detached History views.
The History shortcut focuses working changes when present, otherwise the newest commit.
Added the History button beside Refresh.
Added consistent 2dp spacing between the ref dropdown and both buttons.
Added translations for the new labels.
Add a detached Git Commit History tab with a traditional table layout, persistent column widths, commit focusing, and a splitter-based commit details pane.
Register the git-show-history command and expose “Show in Git History” from commit details and history context menus. Add History and Git Commit tab icons, localized titles, appropriate tooltips, and ref-aware
tab naming.
Share the commit-details layout and behavior between standalone commit tabs and detached History views. Move view creation, widget binding, state management, controls, and asynchronous changed-file loading into
CommitDetailsState.
Display complete commit metadata and messages, GitHub links, copyable commit SHAs, colored changed-file statistics, and multi-file diffs with global expand/collapse and unified/split controls.
Improve detached-history lifecycle behavior, selection and focus handling, stale-request protection, tooltip formatting, and column recalculation. Restore “Load older commits” by preserving pagination-node
semantics while asynchronous loading is in progress.
Fix expandable History rows so merge subjects and metadata render correctly without regressing generic UITreeView cells. Add recursive commit lookup for focusing nested history entries.
Add deferred tooltip-created notifications and configure History tooltips only after their widgets exist.
Preserve tokenizer-applied UITextView color ranges during layout recalculation when custom styling is enabled, preventing changed-file statistics from losing their colors after splitter resizing.
Add the required Codicons and translations, expose UIWidget pseudo-class queries, reuse cached tree-expander drawable sources, and use SmallVector for nested stylesheet property resolution.
Add a History ref selector for HEAD, local branches, remote branches, and tags without requiring checkout. Reuse cached branch-model display strings to keep large ref lists efficient.
Make deferred main-thread callbacks lifetime-safe across ecode controllers and plugins. Initialize plugin dispatchers during UIReady and extend MainThreadLifetime to support delayed and tagged dispatch.
Fix expandable Git History rows, empty merge projections, and commit-description expansion. Display only the physical first line while collapsed and avoid duplicating it in the expanded body.
Add coverage for history ref handling and preserve stale-request guards during repository and revision changes.
Fix UIImageViewer dimension reporting for sprites by displaying the underlying texture dimensions.
The Git History interface remains a work in progress.
Display bounded first-parent commit history with asynchronous loading, independent pagination, and lazily expandable merge commits. Propagate inherited exclusions through nested merges to avoid repeating already represented history.
Add custom compact history rows, loading/error/retry states, keyboard navigation, repository and history-generation guards, and lifecycle invalidation after history-changing operations.
Add a commit details tab with full commit metadata and message, changed-line totals, GitHub links when available, and a multi-file diff viewer with global collapse and unified/split controls.
Extend UIDiffView with multi-file view controls and register the required Codicons.
The Git History interface and visual design remain a work in progress.
Fix caret positioning inside shaped ligature clusters.
Add explicit closest-glyph and interpolated ligature caret-positioning modes while keeping interpolation as the default for general text geometry.
Use the original closest-glyph behavior for caret and IME positioning in UICodeEditor, UITextEdit, UITextInput, and UIConsole, preventing cursor positions from being synthesized inside ligature glyphs.
Add regression coverage for both positioning modes.
Optimize SyntaxTokenizer by returning tokenizer results in a SmallVector, avoiding heap allocations in common cases.