os_terminal/
config.rs

1use alloc::boxed::Box;
2use alloc::string::String;
3use core::fmt;
4use core::sync::atomic::AtomicBool;
5use spin::{Lazy, Mutex};
6
7use crate::color::ColorScheme;
8use crate::font::FontManager;
9
10pub static CONFIG: Lazy<TerminalConfig> = Lazy::new(TerminalConfig::default);
11
12pub trait ClipboardHandler {
13    fn get_text(&mut self) -> Option<String>;
14    fn set_text(&mut self, text: String);
15}
16
17pub type PtyWriter = Box<dyn Fn(String) + Send>;
18pub type Clipboard = Box<dyn ClipboardHandler + Send>;
19
20pub struct TerminalConfig {
21    pub auto_flush: AtomicBool,
22    pub auto_crnl: AtomicBool,
23    pub logger: Mutex<Option<fn(fmt::Arguments)>>,
24    pub clipboard: Mutex<Option<Clipboard>>,
25    pub pty_writer: Mutex<Option<PtyWriter>>,
26    pub font_manager: Mutex<Option<Box<dyn FontManager>>>,
27    pub color_scheme: Mutex<ColorScheme>,
28    pub bell_handler: Mutex<Option<fn()>>,
29}
30
31impl Default for TerminalConfig {
32    fn default() -> Self {
33        Self {
34            auto_flush: AtomicBool::new(true),
35            auto_crnl: AtomicBool::new(true),
36            logger: Default::default(),
37            clipboard: Default::default(),
38            pty_writer: Default::default(),
39            font_manager: Default::default(),
40            color_scheme: Default::default(),
41            bell_handler: Default::default(),
42        }
43    }
44}
45
46impl TerminalConfig {
47    pub fn pty_write(&self, data: String) {
48        if let Some(writer) = self.pty_writer.lock().as_ref() {
49            writer(data);
50        }
51    }
52}