Skip to main content

par_term_config/config/config_struct/
rendering_config.rs

1//! Frame pacing and GPU adapter settings.
2//!
3//! Extracted from the top-level [`super::Config`] struct via `#[serde(flatten)]`.
4//! All fields serialise at the top level of the YAML config file -- existing
5//! config files remain 100% compatible.
6
7use crate::types::{PowerPreference, VsyncMode};
8use serde::{Deserialize, Serialize};
9
10/// Frame rate target, VSync mode, GPU preference and output batching.
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct RenderingConfig {
13    /// Maximum frames per second (FPS) target
14    /// Controls how frequently the terminal requests screen redraws.
15    /// Note: On macOS, actual FPS may be lower (~22-25) due to system-level
16    /// VSync throttling in wgpu/Metal, regardless of this setting.
17    /// Default: 60
18    #[serde(default = "crate::defaults::max_fps", alias = "refresh_rate")]
19    pub max_fps: u32,
20
21    /// VSync mode - controls GPU frame synchronization
22    /// - immediate: No VSync, render as fast as possible (lowest latency, highest power)
23    /// - mailbox: Cap at monitor refresh rate with triple buffering (balanced)
24    /// - fifo: Strict VSync with double buffering (lowest power, slight input lag)
25    ///
26    /// Default: fifo (strict VSync — lowest power, most compatible)
27    #[serde(default)]
28    pub vsync_mode: VsyncMode,
29
30    /// GPU power preference for adapter selection
31    /// - none: Let the system decide (default)
32    /// - low_power: Prefer integrated GPU (saves battery)
33    /// - high_performance: Prefer discrete GPU (maximum performance)
34    ///
35    /// Note: Requires app restart to take effect.
36    #[serde(default)]
37    pub power_preference: PowerPreference,
38
39    /// Reduce flicker by delaying redraws while cursor is hidden (DECTCEM off).
40    /// Many terminal programs hide cursor during bulk updates to prevent visual artifacts.
41    #[serde(default = "crate::defaults::reduce_flicker")]
42    pub reduce_flicker: bool,
43
44    /// Maximum delay in milliseconds when reduce_flicker is enabled.
45    /// Rendering occurs when cursor becomes visible OR this delay expires.
46    /// Range: 1-100ms. Default: 16ms (~1 frame at 60fps).
47    #[serde(default = "crate::defaults::reduce_flicker_delay_ms")]
48    pub reduce_flicker_delay_ms: u32,
49
50    /// Enable throughput mode to batch rendering during bulk output.
51    /// When enabled, rendering is throttled to reduce CPU overhead for large outputs.
52    /// Toggle with Cmd+Shift+T (macOS) or Ctrl+Shift+T (other platforms).
53    #[serde(default = "crate::defaults::maximize_throughput")]
54    pub maximize_throughput: bool,
55
56    /// Render interval in milliseconds when maximize_throughput is enabled.
57    /// Higher values = better throughput but delayed display. Range: 50-500ms.
58    #[serde(default = "crate::defaults::throughput_render_interval_ms")]
59    pub throughput_render_interval_ms: u32,
60}
61
62impl Default for RenderingConfig {
63    fn default() -> Self {
64        Self {
65            max_fps: crate::defaults::max_fps(),
66            vsync_mode: VsyncMode::default(),
67            power_preference: PowerPreference::default(),
68            reduce_flicker: crate::defaults::reduce_flicker(),
69            reduce_flicker_delay_ms: crate::defaults::reduce_flicker_delay_ms(),
70            maximize_throughput: crate::defaults::maximize_throughput(),
71            throughput_render_interval_ms: crate::defaults::throughput_render_interval_ms(),
72        }
73    }
74}