Created
October 19, 2012 10:31
-
-
Save stfnm/3917422 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 61cc757f0b9df0437a95c039bfc3d01ef0412809 Mon Sep 17 00:00:00 2001 | |
From: simon <simon@cda61777-01e9-0310-a592-d414129be87e> | |
Date: Sun, 19 Feb 2012 10:27:18 +0000 | |
Subject: [PATCH] Patch from Matsui Nag to implement xterm's "bracketed paste | |
mode", in which text pasted into the terminal is preceded | |
and followed by special function-key-like escape sequences | |
ESC[200~ and ESC[201~ so that the application can identify | |
it and treat it specially (e.g. disabling | |
auto-indent-same-as-previous-line in text editors). Enabled | |
and disabled by ESC[?2004h and ESC[?2004l, and of course | |
off by default. | |
git-svn-id: svn://svn.tartarus.org/sgt/putty@9412 cda61777-01e9-0310-a592-d414129be87e | |
--- | |
terminal.c | 17 ++++++++++++++++- | |
terminal.h | 2 ++ | |
2 files changed, 18 insertions(+), 1 deletion(-) | |
diff --git a/terminal.c b/terminal.c | |
index d23cbe9..e3f61e9 100644 | |
--- a/terminal.c | |
+++ b/terminal.c | |
@@ -1225,6 +1225,7 @@ static void power_on(Terminal *term, int clear) | |
term_print_finish(term); | |
term->xterm_mouse = 0; | |
set_raw_mouse_mode(term->frontend, FALSE); | |
+ term->bracketed_paste = FALSE; | |
{ | |
int i; | |
for (i = 0; i < 256; i++) | |
@@ -2503,6 +2504,9 @@ static void toggle_mode(Terminal *term, int mode, int query, int state) | |
save_cursor(term, state); | |
term->disptop = 0; | |
break; | |
+ case 2004: /* xterm bracketed paste */ | |
+ term->bracketed_paste = state ? TRUE : FALSE; | |
+ break; | |
} else | |
switch (mode) { | |
case 4: /* IRM: set insert mode */ | |
@@ -5696,7 +5700,12 @@ void term_do_paste(Terminal *term) | |
if (term->paste_buffer) | |
sfree(term->paste_buffer); | |
term->paste_pos = term->paste_hold = term->paste_len = 0; | |
- term->paste_buffer = snewn(len, wchar_t); | |
+ term->paste_buffer = snewn(len + 12, wchar_t); | |
+ | |
+ if (term->bracketed_paste) { | |
+ memcpy(term->paste_buffer, L"\033[200~", 6 * sizeof(wchar_t)); | |
+ term->paste_len += 6; | |
+ } | |
p = q = data; | |
while (p < data + len) { | |
@@ -5720,6 +5729,12 @@ void term_do_paste(Terminal *term) | |
q = p; | |
} | |
+ if (term->bracketed_paste) { | |
+ memcpy(term->paste_buffer + term->paste_len, | |
+ L"\033[201~", 6 * sizeof(wchar_t)); | |
+ term->paste_len += 6; | |
+ } | |
+ | |
/* Assume a small paste will be OK in one go. */ | |
if (term->paste_len < 256) { | |
if (term->ldisc) | |
diff --git a/terminal.h b/terminal.h | |
index 42a67ed..5c9658b 100644 | |
--- a/terminal.h | |
+++ b/terminal.h | |
@@ -154,6 +154,8 @@ struct terminal_tag { | |
int xterm_mouse; /* send mouse messages to host */ | |
int mouse_is_down; /* used while tracking mouse buttons */ | |
+ int bracketed_paste; | |
+ | |
int cset_attr[2]; | |
/* | |
-- | |
1.7.10 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment