|
15 | 15 | use shpool_protocol::TtySize; |
16 | 16 | use tracing::info; |
17 | 17 |
|
18 | | -use crate::config::{self, SessionRestoreMode}; |
| 18 | +use crate::config::{self, SessionRestoreEngine, SessionRestoreMode}; |
19 | 19 |
|
20 | 20 | // To prevent data getting dropped, we set this to be large, but we don't want |
21 | 21 | // to use u16::MAX, since the vt100 crate eagerly fills in its rows, and doing |
@@ -119,24 +119,59 @@ impl SessionSpool for Vt100Lines { |
119 | 119 | } |
120 | 120 | } |
121 | 121 |
|
| 122 | +/// A spool that restores the last screenful of content using shpool-vterm. |
| 123 | +pub struct Vterm { |
| 124 | + term: shpool_vterm::Term, |
| 125 | + mode: SessionRestoreMode, |
| 126 | +} |
| 127 | + |
| 128 | +impl SessionSpool for Vterm { |
| 129 | + fn resize(&mut self, size: TtySize) { |
| 130 | + self.term |
| 131 | + .resize(shpool_vterm::Size { height: size.rows as usize, width: size.cols as usize }); |
| 132 | + } |
| 133 | + |
| 134 | + fn restore_buffer(&self) -> Vec<u8> { |
| 135 | + match self.mode { |
| 136 | + SessionRestoreMode::Simple => vec![], |
| 137 | + SessionRestoreMode::Screen => self.term.contents(shpool_vterm::ContentRegion::Screen), |
| 138 | + SessionRestoreMode::Lines(nlines) => { |
| 139 | + self.term.contents(shpool_vterm::ContentRegion::BottomLines(nlines as usize)) |
| 140 | + } |
| 141 | + } |
| 142 | + } |
| 143 | + |
| 144 | + fn process(&mut self, bytes: &[u8]) { |
| 145 | + self.term.process(bytes); |
| 146 | + } |
| 147 | +} |
| 148 | + |
122 | 149 | /// Creates a spool given a `mode`. |
123 | 150 | pub fn new( |
124 | 151 | config: config::Manager, |
125 | 152 | size: &TtySize, |
126 | 153 | scrollback_lines: usize, |
127 | 154 | ) -> Box<dyn SessionSpool + 'static> { |
| 155 | + let restore_engine = config.get().session_restore_engine.clone().unwrap_or_default(); |
128 | 156 | let mode = config.get().session_restore_mode.clone().unwrap_or_default(); |
129 | 157 | let vterm_width = config.vterm_width(); |
130 | | - match mode { |
131 | | - SessionRestoreMode::Simple => Box::new(NullSpool), |
132 | | - SessionRestoreMode::Screen => Box::new(Vt100Screen { |
| 158 | + match (mode, restore_engine) { |
| 159 | + (SessionRestoreMode::Simple, _) => Box::new(NullSpool), |
| 160 | + (SessionRestoreMode::Screen, SessionRestoreEngine::Vt100) => Box::new(Vt100Screen { |
133 | 161 | parser: shpool_vt100::Parser::new(size.rows, vterm_width, scrollback_lines), |
134 | 162 | config, |
135 | 163 | }), |
136 | | - SessionRestoreMode::Lines(nlines) => Box::new(Vt100Lines { |
| 164 | + (SessionRestoreMode::Lines(nlines), SessionRestoreEngine::Vt100) => Box::new(Vt100Lines { |
137 | 165 | parser: shpool_vt100::Parser::new(size.rows, vterm_width, scrollback_lines), |
138 | 166 | nlines, |
139 | 167 | config, |
140 | 168 | }), |
| 169 | + (mode, SessionRestoreEngine::Vterm) => Box::new(Vterm { |
| 170 | + term: shpool_vterm::Term::new( |
| 171 | + scrollback_lines, |
| 172 | + shpool_vterm::Size { width: size.cols as usize, height: size.rows as usize }, |
| 173 | + ), |
| 174 | + mode, |
| 175 | + }), |
141 | 176 | } |
142 | 177 | } |
0 commit comments