Skip to main content

vtcode_tui/
options.rs

1use crate::config::KeyboardProtocolConfig;
2
3// Re-export shared types from vtcode-commons.
4pub use vtcode_commons::ui_protocol::{KeyboardProtocolSettings, SessionSurface};
5
6impl From<SessionSurface> for crate::config::UiSurfacePreference {
7    fn from(value: SessionSurface) -> Self {
8        match value {
9            SessionSurface::Auto => Self::Auto,
10            SessionSurface::Alternate => Self::Alternate,
11            SessionSurface::Inline => Self::Inline,
12        }
13    }
14}
15
16impl From<crate::config::UiSurfacePreference> for SessionSurface {
17    fn from(value: crate::config::UiSurfacePreference) -> Self {
18        match value {
19            crate::config::UiSurfacePreference::Auto => Self::Auto,
20            crate::config::UiSurfacePreference::Alternate => Self::Alternate,
21            crate::config::UiSurfacePreference::Inline => Self::Inline,
22        }
23    }
24}
25
26impl From<KeyboardProtocolConfig> for KeyboardProtocolSettings {
27    fn from(value: KeyboardProtocolConfig) -> Self {
28        Self {
29            enabled: value.enabled,
30            mode: value.mode,
31            disambiguate_escape_codes: value.disambiguate_escape_codes,
32            report_event_types: value.report_event_types,
33            report_alternate_keys: value.report_alternate_keys,
34            report_all_keys: value.report_all_keys,
35        }
36    }
37}
38
39impl From<KeyboardProtocolSettings> for KeyboardProtocolConfig {
40    fn from(value: KeyboardProtocolSettings) -> Self {
41        Self {
42            enabled: value.enabled,
43            mode: value.mode,
44            disambiguate_escape_codes: value.disambiguate_escape_codes,
45            report_event_types: value.report_event_types,
46            report_alternate_keys: value.report_alternate_keys,
47            report_all_keys: value.report_all_keys,
48        }
49    }
50}
51
52/// Standalone fullscreen interaction settings for alternate-screen behavior.
53#[derive(Debug, Clone, Copy, PartialEq, Eq)]
54pub struct FullscreenInteractionSettings {
55    pub mouse_capture: bool,
56    pub copy_on_select: bool,
57    pub scroll_speed: u8,
58}
59
60impl Default for FullscreenInteractionSettings {
61    fn default() -> Self {
62        Self {
63            mouse_capture: true,
64            copy_on_select: true,
65            scroll_speed: 3,
66        }
67    }
68}
69
70#[cfg(test)]
71mod tests {
72    use super::*;
73
74    #[test]
75    fn session_surface_conversion_roundtrip() {
76        let variants = [
77            SessionSurface::Auto,
78            SessionSurface::Alternate,
79            SessionSurface::Inline,
80        ];
81
82        for variant in variants {
83            let converted: crate::config::UiSurfacePreference = variant.into();
84            let roundtrip = SessionSurface::from(converted);
85            assert_eq!(variant, roundtrip);
86        }
87    }
88
89    #[test]
90    fn keyboard_protocol_conversion_roundtrip() {
91        let settings = KeyboardProtocolSettings {
92            enabled: true,
93            mode: "custom".to_string(),
94            disambiguate_escape_codes: true,
95            report_event_types: false,
96            report_alternate_keys: true,
97            report_all_keys: false,
98        };
99
100        let config: KeyboardProtocolConfig = settings.clone().into();
101        let restored = KeyboardProtocolSettings::from(config);
102
103        assert_eq!(settings, restored);
104    }
105
106    #[test]
107    fn fullscreen_interaction_settings_default_values() {
108        let settings = FullscreenInteractionSettings::default();
109
110        assert!(settings.mouse_capture);
111        assert!(settings.copy_on_select);
112        assert_eq!(settings.scroll_speed, 3);
113    }
114}