Skip to main content

vtcode_ui/tui/
options.rs

1use crate::tui::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::tui::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::tui::config::UiSurfacePreference> for SessionSurface {
17    fn from(value: crate::tui::config::UiSurfacePreference) -> Self {
18        match value {
19            crate::tui::config::UiSurfacePreference::Auto => Self::Auto,
20            crate::tui::config::UiSurfacePreference::Alternate => Self::Alternate,
21            crate::tui::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 = [SessionSurface::Auto, SessionSurface::Alternate, SessionSurface::Inline];
77
78        for variant in variants {
79            let converted: crate::tui::config::UiSurfacePreference = variant.into();
80            let roundtrip = SessionSurface::from(converted);
81            assert_eq!(variant, roundtrip);
82        }
83    }
84
85    #[test]
86    fn ui_surface_defaults_to_inline() {
87        assert_eq!(SessionSurface::default(), SessionSurface::Inline);
88        assert_eq!(crate::tui::config::UiSurfacePreference::default(), crate::tui::config::UiSurfacePreference::Inline);
89    }
90
91    #[test]
92    fn keyboard_protocol_conversion_roundtrip() {
93        let settings = KeyboardProtocolSettings {
94            enabled: true,
95            mode: "custom".to_string(),
96            disambiguate_escape_codes: true,
97            report_event_types: false,
98            report_alternate_keys: true,
99            report_all_keys: false,
100        };
101
102        let config: KeyboardProtocolConfig = settings.clone().into();
103        let restored = KeyboardProtocolSettings::from(config);
104
105        assert_eq!(settings, restored);
106    }
107
108    #[test]
109    fn fullscreen_interaction_settings_default_values() {
110        let settings = FullscreenInteractionSettings::default();
111
112        assert!(settings.mouse_capture);
113        assert!(settings.copy_on_select);
114        assert_eq!(settings.scroll_speed, 3);
115    }
116}