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}