aboutsummaryrefslogtreecommitdiff
path: root/alacritty_terminal
diff options
context:
space:
mode:
authorKirill Chibisov <contact@kchibisov.com>2023-07-22 18:31:35 +0000
committerGitHub <noreply@github.com>2023-07-22 18:31:35 +0000
commit0c94e4ae7b413a8ae4e37882f0d483d2e259bd44 (patch)
treee689b92d23d0b61b6c83d00d329581d51ecd296a /alacritty_terminal
parentf2e543880f75f92421e34a186ea44d8f32cbd52a (diff)
downloadalacritty-0c94e4ae7b413a8ae4e37882f0d483d2e259bd44.tar.gz
alacritty-0c94e4ae7b413a8ae4e37882f0d483d2e259bd44.zip
Add `terminal` config section to control OSCs
Some environments demand certain OSC sequences to be disabled or some escape sequence could require handling which is out of scope of alacritty, but could be done by external script (OSC 777). Added section for now just handles the `OSC 52` sequence and changes its default to be `OnlyCopy`, which is handy for remote copy, but `Paste` is redundant because normal `Paste` hotkey could be used as well. Fixes #3386. Co-authored-by: Christian Duerr <contact@christianduerr.com>
Diffstat (limited to 'alacritty_terminal')
-rw-r--r--alacritty_terminal/Cargo.toml2
-rw-r--r--alacritty_terminal/src/config/mod.rs25
-rw-r--r--alacritty_terminal/src/term/mod.rs18
3 files changed, 43 insertions, 2 deletions
diff --git a/alacritty_terminal/Cargo.toml b/alacritty_terminal/Cargo.toml
index 5782a8fb..2f5e930a 100644
--- a/alacritty_terminal/Cargo.toml
+++ b/alacritty_terminal/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "alacritty_terminal"
-version = "0.19.2-dev"
+version = "0.20.0-dev"
authors = ["Christian Duerr <contact@christianduerr.com>", "Joe Wilm <joe@jwilm.com>"]
license = "Apache-2.0"
description = "Library for writing terminal emulators"
diff --git a/alacritty_terminal/src/config/mod.rs b/alacritty_terminal/src/config/mod.rs
index 80be4d16..e70389ec 100644
--- a/alacritty_terminal/src/config/mod.rs
+++ b/alacritty_terminal/src/config/mod.rs
@@ -31,11 +31,36 @@ pub struct Config {
/// Cursor configuration.
pub cursor: Cursor,
+ /// Terminal specific settings.
+ pub terminal: Terminal,
+
#[config(flatten)]
pub pty_config: PtyConfig,
}
#[derive(ConfigDeserialize, Clone, Debug, PartialEq, Eq, Default)]
+pub struct Terminal {
+ // OSC 52 handling (clipboard handling).
+ pub osc52: Osc52,
+}
+
+#[derive(ConfigDeserialize, Clone, Debug, PartialEq, Eq, Default)]
+pub enum Osc52 {
+ /// The handling of the escape sequence is disabled.
+ Disabled,
+ /// Only copy sequence is accepted.
+ ///
+ /// This option is the default as a compromiss between entirely
+ /// disabling it (the most secure) and allowing `paste` (the less secure).
+ #[default]
+ OnlyCopy,
+ /// Only paste sequence is accepted.
+ OnlyPaste,
+ /// Both are accepted.
+ CopyPaste,
+}
+
+#[derive(ConfigDeserialize, Clone, Debug, PartialEq, Eq, Default)]
pub struct PtyConfig {
/// Path to a shell program to run on startup.
pub shell: Option<Program>,
diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs
index 7c4abb57..2e66b402 100644
--- a/alacritty_terminal/src/term/mod.rs
+++ b/alacritty_terminal/src/term/mod.rs
@@ -12,7 +12,7 @@ use vte::ansi::{Hyperlink as VteHyperlink, Rgb as VteRgb};
use crate::ansi::{
self, Attr, CharsetIndex, Color, CursorShape, CursorStyle, Handler, NamedColor, StandardCharset,
};
-use crate::config::Config;
+use crate::config::{Config, Osc52, Terminal};
use crate::event::{Event, EventListener};
use crate::grid::{Dimensions, Grid, GridIterator, Scroll};
use crate::index::{self, Boundary, Column, Direction, Line, Point, Side};
@@ -304,6 +304,9 @@ pub struct Term<T> {
/// Information about damaged cells.
damage: TermDamageState,
+
+ /// Config directly for the terminal.
+ config: Terminal,
}
impl<T> Term<T> {
@@ -363,6 +366,7 @@ impl<T> Term<T> {
title_stack: Vec::new(),
selection: None,
damage,
+ config: config.terminal.clone(),
}
}
@@ -461,6 +465,8 @@ impl<T> Term<T> {
self.grid.update_history(config.scrolling.history() as usize);
}
+ self.config = config.terminal.clone();
+
// Damage everything on config updates.
self.mark_fully_damaged();
}
@@ -1539,6 +1545,11 @@ impl<T: EventListener> Handler for Term<T> {
/// Store data into clipboard.
#[inline]
fn clipboard_store(&mut self, clipboard: u8, base64: &[u8]) {
+ if !matches!(self.config.osc52, Osc52::OnlyCopy | Osc52::CopyPaste) {
+ debug!("Denied osc52 store");
+ return;
+ }
+
let clipboard_type = match clipboard {
b'c' => ClipboardType::Clipboard,
b'p' | b's' => ClipboardType::Selection,
@@ -1555,6 +1566,11 @@ impl<T: EventListener> Handler for Term<T> {
/// Load data from clipboard.
#[inline]
fn clipboard_load(&mut self, clipboard: u8, terminator: &str) {
+ if !matches!(self.config.osc52, Osc52::OnlyPaste | Osc52::CopyPaste) {
+ debug!("Denied osc52 load");
+ return;
+ }
+
let clipboard_type = match clipboard {
b'c' => ClipboardType::Clipboard,
b'p' | b's' => ClipboardType::Selection,