Commit Graph

4759 Commits

Author SHA1 Message Date
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
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
5d3be27a9d fix: release compression state and skip offscreen maximize
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.
2026-09-12 01:11:35 -03:00
Martín Lucas Golini
e88d068acc window: use native SDL drivers for terminal runtime
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.
2026-09-12 00:51:33 -03:00
Martín Lucas Golini
86277832fc Fix SystemPath.workingDirectoryRoundTripsUnicode in macOS test. 2026-09-11 00:37:03 -03:00
Martín Lucas Golini
60ac3a0ffa Fixed the Unicode-path crash and misleading AI Assistant teardown fault (SpartanJ/ecode#953).
- 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.
2026-09-11 00:03:03 -03:00
Martín Lucas Golini
3effffd16f Add shared controls for multi-file diff views
- 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.
2026-09-10 23:15:46 -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
Martín Lucas Golini
3493e849a2 Remove tabulate because it's getting annoying. 2026-09-10 13:43:18 -03:00
Martín Lucas Golini
01bc68957e Fix Windows build. 2026-09-10 13:04:13 -03:00
Martín Lucas Golini
6ccb433dd5 perf: optimize and benchmark terminal frame damage detection
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.
2026-09-10 12:03:15 -03:00
Martín Lucas Golini
fcc3a412fb fix: restrict persistent Kitty updates to eterm by default
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.
2026-09-10 01:42:51 -03:00
Martín Lucas Golini
95d52cdbb3 eepp:
- 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
2026-09-10 00:57:56 -03:00
Martín Lucas Golini
a294d78733 eterm: extract settings actions and fix macOS efsw linkage
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
2026-09-09 17:06:38 -03:00
Martín Lucas Golini
fe91253276 eterm:
- 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
2026-09-09 14:32:43 -03:00
Martín Lucas Golini
410c9ba09f eterm: fix configuration and window state persistence
- 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
2026-09-09 11:35:35 -03:00
Martín Lucas Golini
71ede34599 eepp: add reusable UISettingsPanel
- 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
2026-09-09 00:56:03 -03:00
Martín Lucas Golini
64512ab44d eterm: expand tab controls and fix maximized tab lifecycle
- 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
2026-09-08 01:57:35 -03:00
Martín Lucas Golini
a24eb12182 Add SDL3 non-text clipboard data support
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.
2026-09-07 00:31:27 -03:00
Martín Lucas Golini
827f5d7524 ecode: fix stale and symbolic remote branch entries
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.
2026-09-06 21:39:11 -03:00
Martín Lucas Golini
90499462ea Fix Reset zoom in new eeiv port. 2026-09-06 21:18:06 -03:00
Martín Lucas Golini
3d4aea6df4 Reduce heap-allocations on possible hot-paths. 2026-09-06 21:02:58 -03:00
Martín Lucas Golini
bd9360cf3e optimize Kitty streaming and complete terminal input
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.
2026-09-05 17:17:09 -03:00
Martín Lucas Golini
a22489fd58 Fix Android build. 2026-09-05 11:33:02 -03:00
Martín Lucas Golini
94c3b7ab99 window: add headless and Kitty terminal runtimes
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.
2026-09-05 02:54:27 -03:00
Martín Lucas Golini
6a24bc0d6e eterm: implement Kitty keyboard protocol
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.
2026-09-04 21:13:27 -03:00
Martín Lucas Golini
2a3ba5271e Merge branch 'develop' of github.com:SpartanJ/eepp into develop 2026-09-04 19:48:17 -03:00
Martín Lucas Golini
34c33152ac Merge branch 'feature/kitty-graphics-protocol' into develop 2026-09-04 19:48:05 -03:00
Martín Lucas Golini
adc562fb1d Fix regression due to kitty metadata being erased on every single pass. 2026-09-04 19:47:46 -03:00
Martín Lucas Golini
0e9f2e832f Optimize eterm Kitty graphics frame replacement
- swap decoded frames into reusable image storage
  - recycle previous frame allocations for subsequent transfers
  - avoid full-frame copies during anonymous image replacement
  - extend tests to verify safe allocation reuse across frames
  - document eterm and eeiv in the project introduction
2026-09-04 18:45:10 -03:00
Martín Lucas Golini
7ed9b7c517 Optimize Kitty graphics decoding and RGB24 rendering
- 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
2026-09-04 18:12:26 -03:00
Martín Lucas Golini
1d84bfda1b Nit. 2026-09-04 02:04:41 -03:00
Martín Lucas Golini
935b74a1a9 SDL3 fix version reported (report runtime, not comptime version). 2026-09-04 01:46:17 -03:00
Martín Lucas Golini
090e7c1288 Compilation fixes. 2026-09-03 20:29:57 -03:00
Martín Lucas Golini
e45ff6af00 eterm: reuse Kitty graphics transfer buffers
Reduce allocation pressure in the Kitty graphics receive path by caching and
reusing decoded, pixel-conversion, encoded-image, and frame-composition
buffers.

Reuse uniquely owned pixel storage when replacing an existing image while
preserving immutable update data still referenced by the renderer.

Add runtime SSSE3 capability detection to CPU for future optimized paths and
extend Kitty graphics tests to cover buffer reuse and strict Base64 decoding
across boundary and large payload sizes.
2026-09-03 20:18:30 -03:00
Martín Lucas Golini
0fa1f65d04 Optimize eterm Kitty graphics rendering
- bulk-ingest Kitty APC payloads without per-byte UTF-8 processing
  - preserve APC buffer capacity between graphics commands
  - update existing GPU textures when replacing video frames
  - validate Base64 while decoding directly into transfer storage
  - reserve known image sizes and share immutable pixel buffers
  - coalesce superseded anonymous video-frame updates
  - support POSIX shared-memory transmission with stable snapshots
  - fix large unchunked images and anonymous placement replacement
  - add fragmentation, malformed input, video, and shared-memory tests
  - update Kitty graphics protocol documentation
2026-09-03 19:39:47 -03:00
Martín Lucas Golini
57754feb31 Added Kitty Graphics Protocol support for eterm module, still a WIP but working. 2026-09-03 17:19:27 -03:00
Martín Lucas Golini
53553b7861 Fix debugger pluging not initializing correctly on some cases. 2026-09-03 11:56:15 -03:00
Martín Lucas Golini
0f2f529276 Fix IME incorrectly positioning always in the terminal cursor position even if the editor was focused. 2026-09-03 00:15:23 -03:00
Martín Lucas Golini
3261b460c8 Fix Windows build. 2026-09-02 10:23:43 -03:00
Martín Lucas Golini
fbfd1f3efa add cross-platform local IPC and migrate ecode
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
2026-09-02 02:28:35 -03:00
Martín Lucas Golini
51739165d0 Nit in test. 2026-09-02 00:49:03 -03:00
Martín Lucas Golini
3286cae23a Merge remote-tracking branch 'origin/feature/eterm-worker' into develop 2026-09-02 00:48:17 -03:00
Martín Lucas Golini
bd335cfbf9 Merge branch 'develop' into feature/eterm-worker 2026-09-01 13:23:13 -03:00
Martín Lucas Golini
56de1e1c41 Migrate eterm to eterm-tabs, no need to keep the old eterm. The new eterm have tabs and splits by default, with no performance penalty. 2026-09-01 13:22:53 -03:00
Martín Lucas Golini
eb8e56c78f Damn, forgot to stage the latest changes. 2026-09-01 11:57:10 -03:00
Martín Lucas Golini
f8c324b1f1 Optimize native system font resolution. Fix duplicate macOS menu shortcuts and suppress popup hint.
Avoid enumerating every installed font during SystemFontResolver warmup.
Use native platform matching for generic families and lazily resolve
fallback fonts when a missing glyph is encountered.

Cache generic and codepoint fallback results, preserve collection face
indices, and validate native matches with FreeType. Improve CoreText,
DirectWrite, and Fontconfig matching while retaining full enumeration
for font-listing APIs.

Add a Fontconfig override for testing the backend on macOS and extend
resolver coverage for lazy matching, CJK fallback, and enumeration.

Make pixel-exact subpixel rendering tests disable HiDPI so their
framebuffer dimensions remain deterministic on Retina displays.

Avoid executing native menu key equivalents twice when SDL also forwards
the same key-down event through eepp's keybinding dispatcher.

Preserve native menu item activation for mouse clicks.

Hide the "Hold Shift to keep menu open" hint while the native macOS menu
bar is enabled.
2026-09-01 11:56:49 -03:00
Martín Lucas Golini
cff165fa37 Build fix for macOS + premake4 + brew sdl2 2026-09-01 03:20:08 -03:00
Martín Lucas Golini
5ffe6da00c Build ecode macOS nightly using frameworks (brew SDL2 is broken because it points to sdl2-compat, will fix later). 2026-09-01 03:06:56 -03:00
Martín Lucas Golini
47f9336c0a Add optional LTO and harden Windows clipboard handling
- add --with-lto support to Premake 4 and 5 release builds
  - use ThinLTO with Clang, automatic LTO with GCC, and LTCG with MSVC
  - exclude Emscripten builds from LTO configuration
  - retry SDL2 clipboard writes on Windows when the clipboard is temporarily unavailable
  - make the UIMergeView copy regression test independent of the system clipboard
2026-09-01 00:46:13 -03:00