aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src/config/scrolling.rs
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty/src/config/scrolling.rs')
-rw-r--r--alacritty/src/config/scrolling.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/alacritty/src/config/scrolling.rs b/alacritty/src/config/scrolling.rs
new file mode 100644
index 00000000..3b2b21f3
--- /dev/null
+++ b/alacritty/src/config/scrolling.rs
@@ -0,0 +1,53 @@
+use serde::de::Error as SerdeError;
+use serde::{Deserialize, Deserializer};
+
+use alacritty_config_derive::{ConfigDeserialize, SerdeReplace};
+
+/// Maximum scrollback amount configurable.
+pub const MAX_SCROLLBACK_LINES: u32 = 100_000;
+
+/// Struct for scrolling related settings.
+#[derive(ConfigDeserialize, Copy, Clone, Debug, PartialEq, Eq)]
+pub struct Scrolling {
+ pub multiplier: u8,
+
+ history: ScrollingHistory,
+}
+
+impl Default for Scrolling {
+ fn default() -> Self {
+ Self { multiplier: 3, history: Default::default() }
+ }
+}
+
+impl Scrolling {
+ pub fn history(self) -> u32 {
+ self.history.0
+ }
+}
+
+#[derive(SerdeReplace, Copy, Clone, Debug, PartialEq, Eq)]
+struct ScrollingHistory(u32);
+
+impl Default for ScrollingHistory {
+ fn default() -> Self {
+ Self(10_000)
+ }
+}
+
+impl<'de> Deserialize<'de> for ScrollingHistory {
+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ let lines = u32::deserialize(deserializer)?;
+
+ if lines > MAX_SCROLLBACK_LINES {
+ Err(SerdeError::custom(format!(
+ "exceeded maximum scrolling history ({lines}/{MAX_SCROLLBACK_LINES})"
+ )))
+ } else {
+ Ok(Self(lines))
+ }
+ }
+}