Skip to content

Releases: raphamorim/rio

v0.2.28

10 Aug 20:36
Compare
Choose a tag to compare
  • 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

nightly

11 Aug 00:50
Compare
Choose a tag to compare
nightly Pre-release
Pre-release

Changelog

  • eb9fe5f update com.rioterm.Rio.metainfo.xml

v0.2.27

07 Aug 18:36
Compare
Choose a tag to compare
  • Breaking: If xterm-rio is installed we prioritized it over rio 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

04 Aug 20:30
Compare
Choose a tag to compare
  • 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

  • 92537c4 update dependencies
  • f8eca69 Add install instructions for scoop
  • 8d3ba94 remove route_id from machine
  • e054524 Damage events are now emitted directly after parsing PTY data, ensuring proper batching
  • a78f476 Only emit damage event if there's actual damage on updateTitle

v0.2.25

03 Aug 16:11
Compare
Choose a tag to compare
  • 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

Changelog

v0.2.24

01 Aug 20:36
Compare
Choose a tag to compare
  • 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
  • Hints Configuration: Renamed hints.enabled to hints.rules for better clarity
    • Update your configuration: [[hints.enabled]][[hints.rules]]
    • All hint configuration sections now use hints.rules.* instead of hints.enabled.*
    • Functionality remains the same, only the configuration key names changed

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

22 Jul 21:55
Compare
Choose a tag to compare

v0.2.22

18 Jul 11:17
Compare
Choose a tag to compare

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

16 Jul 13:13
Compare
Choose a tag to compare

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 to navigation.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
  • 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
  • Documentation: Added comprehensive manual pages (man pages) for Unix-like systems
    • man rio - Main Rio terminal manual page with command-line options
    • man 5 rio - Complete configuration file format documentation
    • man 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 with rio 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

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 for kbs capability
    • Ensures compatibility with applicati...
Read more

v0.2.20

20 Jun 15:46
Compare
Choose a tag to compare

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