Releases: raphamorim/rio
Releases · raphamorim/rio
v0.2.28
- Optimized rendering pipeline for improved performance: Implemented deferred damage checking and render coalescing
- Added Wakeup events to batch multiple rapid terminal updates into single render passes
- Deferred damage calculation until render time to reduce unnecessary computations
- Skip rendering for unfocused windows when
disable_unfocused_render
is enabled - Skip rendering for occluded windows when
disable_occluded_render
is enabled - Improved damage merging to always accumulate updates even when already marked dirty
- Enhanced performance for rapid terminal output by coalescing non-synchronized updates
Changelog
- 4a1ac1b update deps and prepare v0.2.28
- 883027f update release.md
- 8b0549f fix lint
- b540149 remove damage
- fa62e33 drop snapshots
- fabba97 performer
- 1462227 Improve terminal update synchronization and reduce lock contention
- 79d8658 wip new sync logic
- ce0882c flake.lock: Update
- 11a1416 default_disable_occluded_render as false
- 5ecb738 mark 0.2.27 for metainfo.xml
nightly
v0.2.27
- Breaking: If
xterm-rio
is installed we prioritized it overrio
terminfo. - Fix sixel/iterm2 graphics persistence issue: Fixed graphics remaining visible when overwritten by text
- Graphics are now properly removed when cells containing them are overwritten
- Fixes issues with file managers like Yazi where images would persist incorrectly
- Simplified graphics cleanup logic by removing unused ClearSubregion functionality
- CJK Font Metrics: Fixed CJK characters displaying "higher" than Latin characters #1071
- Implemented comprehensive CJK font metrics handling with consistent baseline adjustment
- Fixed scrolling issues for mixed Latin and CJK text content
- Added CJK character width measurement using "水" (water ideograph) as reference
- Created consistent cell dimensions across different font types
- Developed extensive test suite with 40+ font-related tests to verify fixes
Changelog
- 7ccc174 prepare v0.2.27
- bdba71b add notes
- 596ac8e use borrowed ID
- 3bd5481 font id should be always default to respect cell
- 705f30f update releases.md
- 4cf26f0 Fix CJK characters displaying higher than Latin characters
- 808be0a Implement consistent font metrics for CJK rendering
- f5872bf unify clearsubregion to remove texture (ref: #709)
- aa1b201 update com.rioterm.Rio.metainfo.xml
- edb0049 update docs about terminfo
- a0a1874 update terminfo
- 1f5d69c prioritize xterm-rio if installed
v0.2.26
- Fix frame dropping in release builds: Fixed an issue where release builds would drop frames due to damage event timing
- Damage events are now emitted directly after parsing PTY data, ensuring proper batching
- Removed redundant Wakeup event mechanism that was causing multiple renders per update
- Synchronized update timeouts now properly emit damage events
- Significantly improves rendering smoothness in optimized builds
Changelog
v0.2.25
- Fix: Rio doesn't launch from context menu on Windows.
- Fix: Rio lacks embedded icon on Windows 10 by @christianjann.
- Fix custom shells in /usr/local/bin not found on macOS: Fixed an issue where custom shells installed in
/usr/local/bin
were not found when Rio was launched from Finder or other GUI applications- On macOS, Rio now uses
/usr/bin/login
to spawn shells, ensuring proper login shell environment with full PATH - Custom shells like Fish, Nushell, or custom Zsh installations in
/usr/local/bin
will now work correctly
- On macOS, Rio now uses
Changelog
- 018afe9 fix lint
- cc9c25c prepare 0.2.25
- 13c7185 Add embedded icon for Windows
- 915ef1e fix working-dir parameter for windows (closes #1239)
- 06dc3e1 update README
- b00e893 update releases
- 02c836e use login shell for macos
- 274974e flake.lock: Update
- e19ef8c Apply fixes suggested by clippy
- 1763fa8 update flatpak metainfo
v0.2.24
- Fix game mode regression.
- Hint Label Damage Tracking: Improved hint label rendering performance with proper damage tracking
- Hint label areas are now properly marked for re-rendering when cleared
- Eliminates visual artifacts when hint labels are removed
- Optimized rendering to only update affected screen regions
- Configurable Hyperlink Hover Keys: Hyperlink hover modifier keys are now configurable
- Configure custom modifier keys through the hints system in
config.toml
- Default behavior unchanged: Command on macOS, Alt on other platforms
- Supports any combination of Shift, Control, Alt, and Super/Command keys
- Example:
mouse = { enabled = true, mods = ["Shift"] }
to use Shift key
- Configure custom modifier keys through the hints system in
- Hints Configuration: Renamed
hints.enabled
tohints.rules
for better clarity- Update your configuration:
[[hints.enabled]]
→[[hints.rules]]
- All hint configuration sections now use
hints.rules.*
instead ofhints.enabled.*
- Functionality remains the same, only the configuration key names changed
- Update your configuration:
Changelog
- 8a243cc prepare 0.2.24
- 51b845e fix tests for hints and links
- fe30b5b fix bindings
- 0c82d8f update force_full_damage
- 110b53b migrate hint logic to new snapshot system
- d3db672 Fix IME behavior on macOS to prevent spurious commit events
- 3140c64 fixup! fix build
- 475005c fix build
- ced2811 rename to rules
- d8c817d add configurable colors for hint
- dbc9260 hints initial implementation
- 0bc944e hints
- 31a2ebf implement hyperlink hints
- 06f7f9a flake.lock: Update
- ff9fd98 flake: devShells: include rustfmt and rust-analyzer nightly
- 8bce14b flake: packages: rio: build with minimal toolchain
- 31cc24a flake: devShells: msrv: use rust-toolchain.toml
- 4005b1f migrate to hashmap again
- ec6c853 fix panels not being updated
- cf3d016 avoid heap for contexts
- 5cd5d42 update cache
- 2b91b56 shutdown io when is done
- 445a9fd fix game mode
- 937d2d0 fix game strategy
- 4add1fe update com.rioterm.Rio.metainfo.xml
v0.2.23
- Fix some rendering regressions introduced by 0.2.21.
- Improve performance by stopping locking on rendering run steps.
- Fix: X11: WM_CLASS has an empty string property.
v0.2.22
Changelog
- 32373d5 Merge branch 'wip-perf'
- a20fe57 comment markers for now
- a8caf55 schedule every 2 seconds
- a8a29e6 fix caret cursor
- 25bc218 update note to mention v0.2.20
- a42e9fe revisit perf on renderer
- 18db3ef fix lint on cache key changes
- f59050c if there's something pending we need to act
- cc432a5 emit the actual damage
- a740295 update tests
- 3717a3e base on font_id only
- 1401d30 deserialization
- 8f823fd remove unnecessary metrics
- 27038bd remove unnecessary stuff
- 86cf79a remove warm cache
- b501d89 remove unused vertexpool
- 677c72a fix lint
- d8aaf94 drop cursor update
- cd25106 update to skip save double cache (non-color)
- 510f42c remove opt-level declaration from dev and let it to rust decide
- c8da8e8 fix tab identation on scd files
- b09619e Merge branch 'fix-regression-on-release'
- 9166073 reinforce damage through event
- 7fa3860 fixup! rewriting cache on text_run
- 350fe17 rewriting cache on text_run
- c7fc36e move to hashmap
v0.2.21
Note: v0.2.21 introduces a new rendering architecture per terminal damage system, and it may contain bugs. Any issue please report 🙏
Changelog
- Breaking:
navigation.use-current-directory
has been renamed tonavigation.current-working-directory
.
Performance Optimizations
- Major: Implemented efficient CVDisplayLink-based VSync synchronization for macOS
- Perfect frame timing aligned with display hardware refresh cycles
- Eliminates screen tearing and stuttering through hardware VSync synchronization
- Adaptive refresh rate support: automatically handles 60Hz, 120Hz, ProMotion displays
- Multi-display support: adapts when windows move between displays with different refresh rates
- Grand Central Dispatch (GCD) integration for thread-safe cross-thread communication
- Smart rendering: Only renders when content actually changes using dirty flag system
- Power efficient: skips unnecessary redraws when content is static, reducing CPU usage
- Professional rendering quality with smooth, tear-free visual updates
- CVDisplayLink runs on dedicated background thread, never blocking UI operations
- macOS VSync Optimization: Disabled redundant software-based vsync calculations on macOS
- CVDisplayLink already provides hardware-synchronized VSync timing
- Eliminates unnecessary frame timing calculations and monitor refresh rate queries
- Reduces CPU overhead and improves rendering performance
- Software vsync logic remains active on other platforms for compatibility
- Major: Implemented a new text run caching system replacing line-based caching
- Up to 96% reduction in text shaping overhead for repeated content
- Individual text runs (words, operators, keywords) cached and reused across frames
- 256-bucket hash table with LRU eviction for optimal memory usage
- Cache Warming: Pre-populate cache with 100+ common terminal patterns on startup
- Programming keywords:
const
,let
,function
,class
,import
,export
, etc. - Indentation patterns: 4/8/12/16 spaces, single/double/triple tabs
- Shell commands:
ls
,cd
,git
,npm
,cargo
,sudo
, etc. - Operators & punctuation:
=
,==
,=>
,();
,{}
,[]
, etc. - File extensions:
.js
,.ts
,.rs
,.py
,.json
,.md
, etc. - Error/log patterns:
Error:
,[INFO]
,FAILED
,SUCCESS
, etc. - Immediate cache hits eliminate cold start shaping delays
- Programming keywords:
- SIMD-Optimized Whitespace Detection: Multi-tier optimization for indentation processing
- AVX2: 32 bytes per instruction (x86-64 with AVX2 support)
- SSE2: 16 bytes per instruction (x86-64 with SSE2 support)
- NEON: 16 bytes per instruction (ARM64/aarch64)
- Optimized scalar: 8-byte chunks (universal fallback)
- Up to 32x performance improvement for long indentation sequences
- Critical for Python, nested JavaScript/TypeScript, YAML, and heavily indented code
- Memory Pool for Vertices: High-performance vertex buffer pooling system
- Size-categorized pools: Small (64), Medium (256), Large (1024), XLarge (4096) vertices
- Zero allocation overhead through buffer reuse across frames
- LRU management with automatic cleanup when pools reach capacity
- Thread-safe concurrent access with performance monitoring
- Eliminates GC pressure and improves frame rate consistency
- Background Font Operations: Non-blocking font management
- Font data release and cleanup in dedicated background thread
- System font scanning and preloading without blocking main thread
- Prevents frame rate drops during font operations
- Occlusion-Based Rendering: Skip rendering for occluded windows/tabs
- Automatically detects when windows are completely hidden by other windows
- Skips rendering for occluded windows to save GPU resources and improve performance
- Renders one frame when window becomes visible again to ensure display is updated
- Configurable via
[renderer] disable-occluded-render = true
(enabled by default) - Significantly improves performance when running multiple tabs or windows
Other Improvements
- Optimize the character cluster cache for wide space characters.
- New font atlas, more efficient.
- Implemented around 75% Memory Reduction: Text glyphs now use R8 (1 byte) instead of RGBA (4 bytes).
- IME Cursor Positioning: Added configurable IME cursor positioning based on terminal cell coordinates
- IME input popups now appear precisely at the cursor position
- Improves input experience for CJK languages (Chinese, Japanese, Korean)
- Configurable via
[keyboard] ime-cursor-positioning = true
(enabled by default)
- Shift+Click Selection: Added Shift+click support for expanding text selections
- Shift+clicking now extends the current selection to the clicked cell
- Provides standard terminal selection behavior expected by users
- Regular clicking without Shift still clears selection and starts new one as before
- CLI accepts relative paths for working directory CLI argument: When invoking rio from other terminals using
rio --working-dir=<path>
, a relative path is now correctly processed
Bug Fixes
- Cursor Damage Tracking: Fixed cursor rendering issues after
clear
command and during rapid typing- Replaced complex point-based damage tracking with simplified line-based approach
- Eliminates edge cases where cursor updates were missed during fast typing sequences
- Improved reliability by always damaging entire lines instead of tracking column ranges
- Aligns with modern terminal design principles for more robust damage calculation
- Selection Rendering: Fixed selection highlight not appearing on first render
- Selection changes now properly trigger damage tracking and rendering
- Optimized selection damage to only redraw affected lines for better performance
- Selection highlights now appear immediately when making selections
- Text Selection: Fixed selection behavior during input and paste operations
- Selection properly clears when typing or pasting text (both bracketed and regular paste)
- Selection coordinates remain stable during viewport scrolling (following Alacritty's approach)
- Prevents selection from being lost unexpectedly during normal terminal usage
- Auto-scroll on Input: Fixed issue where typing after scrolling up wouldn't automatically scroll to bottom
- Now properly scrolls to bottom for both keyboard input and IME/paste operations
- Ensures cursor remains visible when typing new content
- Scroll Performance: Improved scrolling performance by optimizing render event handling
- Moved scroll display offset update before mouse cursor dirty event
- Removed redundant render calls during scroll operations
- Implemented centralized damage-based rendering in event loop for better performance
- macOS IME Improvements: Fixed emoji input and IME stability issues
- Resolved
IMKCFRunLoopWakeUpReliable
errors when using emoji picker - Improved coordinate validation and error handling for IME positioning
- Better handling of direct Unicode input (emoji picker, character viewer)
- Added throttling to prevent excessive IME coordinate updates
- Resolved
- Documentation: Added comprehensive manual pages (man pages) for Unix-like systems
man rio
- Main Rio terminal manual page with command-line optionsman 5 rio
- Complete configuration file format documentationman 5 rio-bindings
- Key bindings reference and customization guide- Available in
extra/man/
directory with build instructions
- Terminfo Compatibility: Improved terminal compatibility by adding
xterm-rio
terminfo entry- Added
xterm-rio
as primary terminfo entry withrio
as alias for better application compatibility - Applications that look for "xterm-" prefixed terminals (like termwiz-based apps) now work correctly
- Maintains
TERM=rio
environment variable for consistency with terminal identity - Fixes crashes with applications like
gitu
and other termwiz-based terminal programs - Follows same pattern as other modern terminals (Alacritty, Ghostty) for maximum compatibility
- Added
Technical Details
The performance optimizations in this release represent a significant architectural improvement to Rio's text rendering pipeline:
- Text Run Caching: Replaces line-based caching with individual text run caching. Each unique text sequence (word, operator, keyword) is shaped once and reused across all occurrences.
- SIMD Implementation: Platform-adaptive SIMD instructions automatically detect and use the best available CPU features (AVX2 > SSE2 > NEON > optimized scalar) for maximum performance across different architectures.
- Memory Management: The vertex pool system uses size-categorized buffers with LRU eviction, eliminating allocation overhead while preventing memory bloat.
- Cache Strategy: Two-level caching (render data + text runs) with 256-bucket hash table using FxHasher for optimal lookup performance.
- Compatibility: All optimizations maintain full backward compatibility with existing Rio APIs and configurations.
These changes are particularly beneficial for:
- Programming workflows with repetitive code patterns
- Terminal sessions with heavy indentation (Python, nested JS/TS, YAML)
- Long-running sessions where cache warming provides sustained performance benefits
- Systems with limited memory where reduced allocation overhead improves overall responsiveness
Bug Fixes
- Backspace Key Compatibility: Fixed backspace key not working properly in vim when
TERM=xterm-256color
- Changed backspace key bindings to send BS (0x08) instead of DEL (0x7F)
- Updated Rio terminfo and termcap entries to match actual key behavior
- Updated XTGETTCAP response to return
^H
forkbs
capability - Ensures compatibility with applicati...
v0.2.20
0.2.20
- Performance: Implemented SIMD-accelerated UTF-8 validation throughout Rio terminal using the
simdutf8
crate.- Architecture support: AVX2/SSE4.2 (x86-64), NEON (ARM64), SIMD128 (WASM)
- Automatic optimization: Runtime detection selects fastest implementation available
- Support for XTGETTCAP (XTerm Get Termcap) escape sequence for querying terminal capabilities.
- Font library is now under a RWLock instead of Mutex to allow multiple tabs readings same font data.
- Fix: crash on openSUSE Tumbleweed #1160.
Changelog
- 3a51a09 update lock files
- 9a82477 update releases.md
- b5db389 update release.md
- 16d8fe7 use RWLock to font library instead
- 2c0dc19 add xtgettcap support (#1157)
- 4ba19a1 implement simd support for utf8 operations (#1159)
- 72fa676 avoid use fixed format
- 23e295a move 0.2.19 back to com.rioterm.Rio.metainfo.xml