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}