1use crossterm::event::{DisableBracketedPaste, DisableMouseCapture, EnableBracketedPaste, EnableMouseCapture};
2use crossterm::execute;
3use crossterm::terminal::{disable_raw_mode, enable_raw_mode};
4use std::io;
5
6pub fn terminal_size() -> io::Result<(u16, u16)> {
7 crossterm::terminal::size()
8}
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum MouseCapture {
12 Disabled,
13 Enabled,
14}
15
16#[doc = include_str!("../docs/terminal_session.md")]
17pub struct TerminalSession {
18 enable_bracketed_paste: bool,
19 mouse_capture: MouseCapture,
20}
21
22impl TerminalSession {
23 pub fn new(enable_bracketed_paste: bool, mouse_capture: MouseCapture) -> io::Result<Self> {
24 enable_raw_mode()?;
25 let mut stdout = io::stdout();
26
27 if enable_bracketed_paste {
28 execute!(stdout, EnableBracketedPaste)?;
29 }
30 if mouse_capture == MouseCapture::Enabled {
31 execute!(stdout, EnableMouseCapture)?;
32 }
33
34 Ok(Self { enable_bracketed_paste, mouse_capture })
35 }
36}
37
38impl Drop for TerminalSession {
39 fn drop(&mut self) {
40 let mut stdout = io::stdout();
41 if self.mouse_capture == MouseCapture::Enabled {
42 let _ = execute!(stdout, DisableMouseCapture);
43 }
44 if self.enable_bracketed_paste {
45 let _ = execute!(stdout, DisableBracketedPaste);
46 }
47 let _ = disable_raw_mode();
48 }
49}