Read application cursor, keypad, and NumLock state from the worker display
when encoding mapped keys. These are display modes rather than terminal text
modes, so checking mTerm.mode caused full-screen applications such as htop
and nvtop to receive normal cursor sequences instead of application-mode
sequences.
Add regression coverage for application-mode Up and Down keys.
eterm:
- derive scroll and history notifications from adopted snapshots instead
of delayed worker events
- prevent PTY parsing from publishing its temporary live-buffer viewport
- restore scrollback correctly when new output wraps the history ring
- keep selections attached to their text during output and absolute scrolling
- preserve terminal focus and selection while interacting with the scrollbar
- keep the scrollbar available while a selection is active
- suppress application mouse reports when Shift overrides mouse capture
- preserve scrollback when Kitty reports standalone modifier keys
- retain scroll-to-bottom behavior for regular and modified input keys
- remove obsolete worker scroll and history event tracking
- add regression coverage for viewport, selection, focus, keyboard, and
history behaviord selection synchronization
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
eterm:
- render the active match with palette yellow and black text
- use translucent palette yellow for inactive matches
- share search color handling across all terminal rendering paths
- collect the complete visible range of wrapped active matches
- move the find bar below matches in either of the first two rows
- remove unreliable horizontal overlap checks from find bar placement
eterm:
- expose the visible active terminal search range
- move the find bar below first-row matches it would otherwise occlude
- restore the top-right position when no overlap exists
- recalculate find bar placement when the terminal is resized
- clip animated find bar content to the terminal bounds
- serialize and tag visibility transitions to prevent conflicting actions
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.
The test now compares the plugin position against EventDispatcher::getMousePos(), which is the actual scene-space value passed by UICodeEditor. Native pixel coordinates can differ by one after DPI/view mapping.
- Derive isMouseOverMeOrChildren() from the event dispatcher's committed
mouse-over node instead of maintaining a transient flag on every node.
- Remove the mouse-over tracking set, per-frame flag clearing, and hover
bookkeeping side effects from hit testing. This makes hover ancestry
available between scene updates while reducing SceneNode size and
eliminating hash-set operations during overFind().
- Add coverage for persistent ancestry, sibling transitions, hover state
synchronization, and side-effect-free hit testing.
- 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
Add a backend-neutral Input::pushEvent() API with SDL2 and SDL3
implementations, allowing native input translation and routing to be
covered without requiring physical input or backend-specific test code.
Add regression coverage ensuring a native mouse-wheel event is emitted
exactly once and delivered only to its target application window.
Resolve event coordinates and resize dimensions using the target
window's scale instead of the window polling SDL's global event queue.
This preserves correct input and sizing across windows on displays with
different DPI scales.
Also restore SDL3 compatibility with versions older than 3.2.12 when
deriving integer wheel directions from floating-point offsets.
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.
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.
Finalize zlib streams on every success and failure path after initialization,
preventing terminal frame compression from leaking encoder allocations.
Skip SDL window maximization in headless and terminal runtimes, where it is
meaningless and can leave worker-thread SDL error/TLS allocations alive.
Also correct the dormant Brotli streaming encoder loop so it validates
parameters, handles empty input and read failures, drains pending output,
finishes the stream completely, and destroys its state on every exit path.
Use Cocoa, Windows, and Haiku native drivers for terminal-mode OpenGL context
hosts instead of the unsupported offscreen driver. Keep hosts hidden and work
around Haiku SDL2 showing hidden windows during creation.
- 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.
- 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
Extract frame damage detection into a private reusable implementation and add
release benchmarks for representative GUI damage patterns at 720p, 1080p,
and 4K.
Use tile-major traversal for smaller framebuffers and cache-friendly row-major
traversal above 16 MiB, with reusable scratch storage and no whole-frame
equality precheck. Determine full-frame updates from the completed damage
bounds instead of prematurely falling back based on dirty-tile area.
Present benchmark results as a table showing each strategy, the selected
production path, its gap to the fastest candidate, and resulting transfer
size.
Enable persistent root-image and damage updates automatically only when
TERM=eterm, since Kitty a=f root-image edits are not consistently supported
by other terminal emulators.
Use reliable anonymous full-frame transfers elsewhere while preserving the
environment variables as explicit overrides. Document the compatibility
rationale and the dependency of damage updates on persistent images.
- 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
Expose MIME-based clipboard data operations through the Clipboard interface, with unsupported defaults for SDL2.
Implement lazy data providers, cleanup callbacks, MIME type enumeration, data retrieval, availability checks, and clipboard clearing for SDL3.
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 process-level native, headless, and terminal runtime modes while keeping
the SDL2/SDL3 window backends responsible for creating the graphics context.
Use SDL's offscreen video driver with an eepp-owned logical root FBO for
headless rendering. Add caller-owned RGB24/RGBA32 framebuffer readback through
the renderer abstraction without leaking GL calls into the Window namespace.
Introduce a generic FramePresenter boundary and a Kitty presenter that streams
chunked direct RGB24 frames from a bounded worker queue. Optimize Base64
encoding for this streaming path.
Add POSIX and Windows terminal lifecycle support, Kitty keyboard input,
SGR-Pixels mouse input, focus handling, and terminal pixel-size resize events.
Inject translated events through a thread-safe Input queue so applications
continue using the normal input path.
Make UIApplication independent of physical displays in offscreen modes,
preserve native runtime behavior, and report the selected runtime and
presentation mode during initialization.
Add Sys::setEnv() for portable process environment configuration.
Add Kitty keyboard protocol negotiation, state stacks, and semantic
key encoding with support for alternate keys, event types, associated
text, and reporting all keys as escape sequences.
Forward key press, repeat, and release events through the terminal
worker while preserving legacy input behavior. Keep AltGr composition
distinct from Alt shortcuts and correlate SDL text events to prevent
missing or duplicated international-layout input.
Add protocol documentation and unit coverage for negotiation, state
transitions, modifiers, function and keypad keys, shifted input,
AltGr composition, repeats, releases, and duplicate suppression.
- use fast Base64 decoding for non-final transfer chunks
- rewrite strict Base64 decoding around complete quartets
- vectorize Kitty APC control scanning with runtime AVX2 detection
- preserve RGB24 frames through protocol storage and GPU upload
- convert RGB24 roots to RGBA only when mutation requires it
- handle tightly packed RGB texture uploads correctly
- bridge transient PTY producer gaps to avoid per-chunk idle delays
- remove the slower POSIX shared-memory transmission path
- expand Kitty graphics and Base64 regression coverage
- isolate the Git conflict test from user rerere configuration