mirror of
https://github.com/SpartanJ/eepp.git
synced 2026-10-22 06:03:19 +03:00
Data safety (VFS): - Copies write a temporary sibling and replace the destination only once it is complete (as writeAll() already did): a failed overwrite kept nothing of the old destination, and copying onto a hard link to the source truncated the source itself. A destination symlink is written through, and one that resolves to the source fails as the same file. - Moving a symlink to another file system is refused: the fallback copy followed it and then removed the copied entries through the link, emptying its target. - Saves keep the exact mode of the file they replace: the temporary was created with it, but filtered through the umask. Deadlocks and blocking: - writeAll( createParents ) waited on makeDirs() queued on its own orchestration pool: one thread deadlocked at once, two with two concurrent saves. Orchestration jobs now create parents directly. - Copies and moves run on their own pool (Config::transferThreads), so long transfers no longer delay saves, reads and recursive removals. - Local watches are registered and removed on the I/O pool: efsw and the directory checks touch the filesystem, which blocked the UI thread on slow mounts. SSH security: - "@revoked" known_hosts keys are rejected; they were skipped as unknown, so StrictHostKeyChecking accept-new trusted them. - Sessions are shared only between configurations with the same security policy (known hosts, host key checking, algorithms, authentication settings), not just the same destination: a strict alias reused a session a permissive one had accepted. - A configured algorithm restriction that permits nothing this libssh2 supports fails the connection instead of using libssh2's defaults. SSH liveness: - Operations submitted to a failed or closed connection fail with ConnectionLost instead of staying pending forever. - ssh-agent requests run on a worker thread (SSHAgent, Unix-domain sockets), with libssh2_userauth_publickey() and a sign callback that waits without blocking: an agent waiting for a hardware key touch no longer stalls every other session. Windows keeps libssh2's agent. - Connecting no longer holds a helper thread while the user answers a host key or password prompt: the setup continues from the session's ready task, one ProxyJump hop at a time. Jump hosts only need to authenticate, not to offer SFTP. - Idle connections close after SFTPProviderConfig::idleTimeout. The old check compared use_count() with 1 and never passed: connections now track their users (open handles, pumps, jump children). - A remote watch agent that never answers falls back to polling after 5 seconds; the directory listing waited for it indefinitely. Core: - CancellationSource::cancel() keeps the shared state alive while its callbacks run: a callback destroying the source freed it mid-cancel (heap use after free under AddressSanitizer). - MainThreadExecutor::shutdown() detaches the executor from its dispatcher node and drops queued and later functions. - String::icompare(): case-insensitive comparison without allocations. VFSDirectoryModel (UI thread): - Names compare with String::icompare() instead of lowercased copies, which made every sort, merge and insertion allocate (about 2x slower when sorting). - Sorting by type asks the type provider once per entry instead of twice per comparison. - The case-insensitive plain text filter keeps a search table instead of lowercasing every name on each row rebuild. - Watch events update the visible rows in place instead of rebuilding them from every entry per event. Drag and drop: - The X11 drag source showed the pending badge over the source window for every application, which broke the X11 drag and drop integration tests in CI. DragOffer::sourceHandlesDrops now asks for it; eefm sets it, since it completes those drops as its own drag. eefm: - Shutdown destroyed the main thread executor before the VFS and the thread pool while continuations still held it: closing during a transfer could dispatch through freed memory. Transfers are cancelled, the VFS is destroyed, the executor is detached, and only then are the scene, its pool and the executor destroyed. - Remote files opened locally were downloaded to /tmp/eefm/<scheme>/<host>/<name>: files with the same name from other folders, users or ports overwrote each other, in a directory shared by every user. They now go to a per-file folder (a hash of the complete URI) in the user's cache. Every fix comes with a regression test.
eepp articles
Use this page to find the guide for the task you are doing. The articles explain eepp's supported behavior; class headers and current source code remain the reference for API details.
| Task | Start here | Follow up with |
|---|---|---|
| Build a first UI with XML and CSS | UI introduction | Application UI authoring |
| Create or change an application screen | Application UI authoring | Native layout reference, CSS for application UI |
| Look up a CSS property, selector, or value | CSS specification | CSS for application UI when styling native widgets |
| Render HTML or Markdown content | HTML compatibility layer | CSS specification for supported properties and values |
| Preview and edit native XML/CSS layouts | UI editor | Application UI authoring, Runtime UI inspector |
Support right-to-left languages or logical start/end layouts |
UI direction and RTL | CSS specification for direction and flow-relative properties |
| Inspect or automate a running UI | Runtime UI inspector | Application UI authoring for a layout debugging workflow |
| Bind application data or commands to widgets | UI data binding | Application UI authoring for screen structure |
| Make native widgets accessible | UI accessibility | Application UI authoring for screen structure |
| Work on the accessibility implementation | UI accessibility architecture | UI accessibility for the application-facing behavior |
| Add an interactive chart | UI charts | Application UI authoring for placement and sizing |
| Run async work: tasks, results, executors, cancellation | Async core | include/eepp/core/task.hpp and the other headers it lists |
| Read or write files through URIs (local, packs, SFTP), watch directories | Virtual file system | Async core, the src/modules/vfs/include/eepp/vfs/ headers |
Work on eterm Kitty support |
Keyboard protocol, graphics protocol | The corresponding src/modules/eterm/ implementation and tests |
Native application widgets and HTML documents have different layout behavior. Start with
application UI authoring for toolbars, dialogs, forms, and editor windows;
start with HTML compatibility for UIWebView and UIMarkdownView.