- 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
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
- 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.
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.
- add searchable user and project settings panels
- organize settings into navigable categories and subsections
- apply supported configuration changes in real time
- add direct document and terminal settings accessors
- retain only contextual actions in the legacy settings menus
- replace legacy configuration dialogs with inline controls
- improve modal behavior, keyboard navigation, and persistence
- add validation for editable settings
- update and remove obsolete i18n strings
Mirror UIMenuBar hierarchies into AppKit while keeping eepp menus as the
source of truth.
Add semantic item activation and menu lifecycle hooks so native actions,
lazy menus, checkboxes, radio buttons, visibility, enabled state, and
submenus preserve existing eepp behavior. Support shortcuts and standard
About, Preferences, Quit, Window, Help, and Services menu integration.
Keep the platform adapter private to the UI implementation and support
safe installation, synchronization, and removal of the native menu.
Migrate ecode away from its hand-written Cocoa menu, assign semantic menu
roles, and populate the UI Language submenu synchronously so it is ready
on its first opening.
Add unit tests covering activation, menu lifecycle, roles, and submenu
preparation.
Refs: SpartanJ/ecode#823
Introduce modal user and project settings panels with searchable tree navigation and live configuration updates.
- centralize settings registration and presentation
- add user and project settings commands and shortcuts
- preserve operational actions in the existing settings menu
- support boolean, choice, numeric, and action-based settings
- restore renderer notifications and choice descriptions
- persist settings when closing the panel
- add translated settings strings for all supported locales
- fix live color preview updates
Initialize SystemFontResolver when enabled and make its lifecycle and font-list
population thread-safe.
Use native codepoint fallback matching through Fontconfig on Linux, BSD, and
Haiku, DirectWrite on Windows, and Core Text on macOS and iOS. Preserve the
cached FreeType scan as a fallback when native matching is unavailable.
Enable system fonts by default for UIApplication and warm the font database in
the background. Allow applications to override the policy and disable the
automatic default in the unit-test runner.
Fix glyph fallback checks to respect the resolver's enabled state and add
coverage for concurrent warm-up and shaped symbol fallback.
Update efsw.
Add an optional Tab Out behavior that moves a single cursor past configured trailing characters when pressing Tab. Expose the feature in Global Document Settings, keep it disabled by default, persist its configuration, and preserve existing selection and multi-cursor indentation behavior (SpartanJ/ecode#951).
- queue and batch filesystem model updates on the main thread
- process directory-tree updates and worker-affine listeners asynchronously
- coalesce adjacent modified events for the same path
- preserve captured file metadata across delayed event delivery
- add event, path, and thread-affinity filters for listener subscriptions
- configure optimized per-plugin filesystem subscriptions
- make listener removal wait for active callbacks safely
- handle self-removal without deadlocking
- support allocation-free matching of moved source paths
- synchronize project directory-tree mutations with active searches
- centralize diff-view button visibility around find/replace state
- improve code editor wrap-content and scrollbar sizing
- add queue, listener, and filesystem-model regression tests
Add FileSystem::dirRemoveAll() to normalize trailing separators and use the non-throwing std::filesystem::remove_all overload.
Migrate ecode and unit-test cleanup call sites to the centralized helper, preventing Haiku from crashing when removing directories with trailing slashes during shutdown.
- enable efsw cross-directory move reporting in ecode
- transfer FileSystemModel nodes between materialized parents
- preserve selections, descendant paths, and lazy destination branches
- update open document paths when parent directories move
- fix persistent indexes across insert, delete, and move operations
- clear stale tree-view metadata before model nodes are deleted
- safely handle getRealPath() failures for stale paths
- add model operation and filesystem move regression tests
- update efsw and SOIL2 submodules
Support explicit liga, calt, clig, and dlig shaping features and include
text hints in layout caching, measurement, drawing, and character
position calculations.
Propagate scene-wide font feature defaults through UI text producers,
with granular widget overrides and recursive cache invalidation. Update
UICodeEditor and UIConsole to use shaped positioning when font features
are enabled, including with monospaced fonts.
Add separate UI and editor font feature settings to ecode, persist them
as comma-separated OpenType tags, and apply changes immediately. Add
localized menu labels, reusable Text feature conversion helpers, and
regression coverage for shaping, positioning, propagation, and parsing.
- add a reusable right-side panel managed at the application level
- migrate debugger tabs to UITabWidgetSplitter instances
- support moving and splitting debugger tabs across bottom and right panels
- restrict debugger tab drops to debugger-owned panel targets
- serialize debugger tab layouts, panel state, and table column widths
- add pixel and percentage column-width modes to UIAbstractTableView
- support XML/CSS configuration and an optional width-mode context menu
- preserve percentage totals across resizing, fit-to-content, minimum widths,
scrollbar changes, and pixel-density rounding
- add splitter edge hiding while preserving splitter-always-show precedence
- use EventConnection ownership for safe widget and controller lifetimes
- validate serialized splitter layouts with structural limits
- display project-relative source paths in debugger stack frames
- add ecode localization strings, CSS documentation, tests, and agent rules
Add an unlocked take-screenshot command and expose it under Settings -> Window with a default Print Screen binding.
Allow configuring the screenshot destination, filename pattern, and output format. Save screenshots under the ecode configuration directory by default, notify users after capture, and provide an action to open the result in the integrated image viewer.
Addresses a request in SpartanJ/ecode#950.
Allow UIFontPickerDialog sections to be hidden and make ecode's UI, editor, and terminal font dialogs select both the font and its size.
Keep external fonts selectable across asynchronous font enumeration, including when they share a family name with a system font, and label them as external. Also normalize UILinearLayout weights across visible children so hidden picker columns release their space correctly.
Update font picker previews, size units, menu labels, translations, and lifetime handling.
Addresses SpartanJ/ecode#944.
- reuse formatting, document text, property resolution, and layout storage
- use inline containers for interpolations, callbacks, wrapping, and matcher state
- optimize single-line insertion by mutating document lines without splitting
- iterate PATH entries directly in Sys::which and reuse candidate buffers
- avoid temporary clocks and string copies in frequent ecode plugin updates
- retain documents during autocomplete cache jobs and prevent duplicate scheduling
- fix PatternMatcher copy assignment and MSVC move-only container compilation
- expand coverage for matching, text insertion, reusable strings, and Sys::which
ecode image viewing will not auto-scale images to the pixel density.
eeiv: Modernizing eeiv to use eepp GUI, already working just like before, there are probably a few things to fix.
Fix:
- User fallback now uses "user-fallback-font".
- Built-in CJK and custom fallback fonts remain registered together.
- Added and passed a regression test verifying both fallback resources remain in the chain.
Fixes in premake5.lua:
- Removed obsolete PRECISE_F32=1; Wasm already provides precise float behavior.
- Moved ENVIRONMENT=worker,web to final application link options.
Fixed MarkdownView not getting the correct CSS style from the base theme.
- migrate themes, skins, icons, shaders, and shader programs to resource handles
- make UIThemeManager scene-owned and publish resources through scopes and catalogs
- retain shaders through their programs and expose non-owning GPU registries
- replace FrameBuffer and VertexBuffer factory ownership with unique pointers
- migrate engine, UI, tools, examples, tests, and eterm to the new ownership APIs
- remove the obsolete raw-owning ResourceManager templates
- document the completed Stage 7 architecture and remaining validation work
- add ownership, registry, and scoped shader-program coverage
- replace FontManager with per-ResourceScope FontService instances
- publish font factories into explicit or default resource scopes
- import default resources into UI scene scopes unless explicitly disabled
- keep related font faces strongly owned without hot-path weak_ptr locking
- add cached glyph advance queries without creating texture pages
- fix font picker preview ownership, cleanup, and rapid switching
- selectively evict TextLayout cache entries when referenced fonts unload
- document FontService, ResourceCatalog, and cache invalidation semantics
- migrate examples, tools, benchmarks, and tests to the scoped font API
- expand coverage for font ownership, texture release, and layout caching
by overwriting an occupied default shortcut, which treated user bindings like mod+d=duplicate-line-or-selection as stale
because that command is not in the default keybinding table. Now it only adds a default when the default shortcut is actually
free.
Added a regression test in src/tests/unit_tests/uicodeeditor_tests.cpp:108 covering the reported case: mod+d reassigned, then
an extra mod+e=show-markdown-preview binding exists. This was reported in SpartanJ/ecode#914.
• Implemented the splitter-level focus state cache, it will remember closed documents cursor state when reopened and it will restore cursor state per-code editor and not per-document (SpartanJ/ecode#893).
Fix: Ctrl+W does not close the tab in Build Settings: Added Event::OnFocusWithin so the tab widget registers that event to setCurrenWidget in UICodeEditorSplitter.
Also: "lsp-symbol-code-action" will default to cmd+return. "format-doc" will default to mod+option+f.
Important: these changes do not *change* any currently configured shortcut, existing users will have to migrate manually, this is intentional to not disrupt current users work flows.
These changes are for the issue: SpartanJ/ecode#877.