diff --git a/SOURCES/screen-bracketed_paste.patch b/SOURCES/screen-bracketed_paste.patch new file mode 100644 index 0000000..82f3cac --- /dev/null +++ b/SOURCES/screen-bracketed_paste.patch @@ -0,0 +1,286 @@ +From 068ee32fa7919a93026dc11b61ff92cc6ce06b98 Mon Sep 17 00:00:00 2001 +From: Vaclav Dolezal +Date: Fri, 17 Jan 2020 15:12:00 +0100 +Subject: [PATCH] Backport support for bracketed-paste and DECSCUSR +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Backported commit c389013e89e7b04ce43872f2e72d43f77461a3c0 +Applied fix from d2d33f664132e9473c62f37a4758a047fa83eb7a + +Reference: https://lists.gnu.org/archive/html/screen-devel/2013-03/msg00000.html +Authored-by: Hayaki Saito +Backported-by: Václav Doležal +Signed-off-by: Václav Doležal +--- + src/ansi.c | 12 ++++++++++++ + src/display.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ + src/display.h | 4 ++++ + src/extern.h | 4 ++++ + src/layer.c | 26 +++++++++++++++++++++++++ + src/window.c | 2 ++ + src/window.h | 2 ++ + 7 files changed, 104 insertions(+) + +diff --git a/src/ansi.c b/src/ansi.c +index 8df79b2..5a251bf 100644 +--- a/src/ansi.c ++++ b/src/ansi.c +@@ -193,6 +193,8 @@ register struct win *p; + p->w_insert = 0; + p->w_revvid = 0; + p->w_mouse = 0; ++ p->w_bracketed = 0; ++ p->w_cursorstyle = 0; + p->w_curinv = 0; + p->w_curvvis = 0; + p->w_autolf = 0; +@@ -1340,6 +1342,12 @@ int c, intermediate; + break; + } + break; ++ case ' ': ++ if (c == 'q') { ++ curr->w_cursorstyle = a1; ++ LCursorStyle(&curr->w_layer, curr->w_cursorstyle); ++ } ++ break; + case '?': + for (a2 = 0; a2 < curr->w_NumArgs; a2++) + { +@@ -1462,6 +1470,10 @@ int c, intermediate; + curr->w_mouse = i ? a1 : 0; + LMouseMode(&curr->w_layer, curr->w_mouse); + break; ++ case 2004: /* bracketed paste mode */ ++ curr->w_bracketed = i ? 1 : 0; ++ LBracketedPasteMode(&curr->w_layer, curr->w_bracketed); ++ break; + } + } + break; +diff --git a/src/display.c b/src/display.c +index bcf914b..915d9b3 100644 +--- a/src/display.c ++++ b/src/display.c +@@ -121,6 +121,8 @@ struct display TheDisplay; + int defobuflimit = OBUF_MAX; + int defnonblock = -1; + int defmousetrack = 0; ++int defbracketed = 0; ++int defcursorstyle = 0; + #ifdef AUTO_NUKE + int defautonuke = 0; + #endif +@@ -183,6 +185,8 @@ DefRestore() + LCursorkeysMode(flayer, 0); + LCursorVisibility(flayer, 0); + LMouseMode(flayer, 0); ++ LBracketedPasteMode(flayer, 0); ++ LCursorStyle(flayer, 0); + LSetRendition(flayer, &mchar_null); + LSetFlow(flayer, nwin_default.flowflag & FLOW_NOW); + } +@@ -314,6 +318,8 @@ struct mode *Mode; + D_user = *u; + D_processinput = ProcessInput; + D_mousetrack = defmousetrack; ++ D_bracketed = defbracketed; ++ D_cursorstyle = defcursorstyle; + return display; + } + +@@ -487,6 +493,8 @@ FinitTerm() + if (D_mousetrack) + D_mousetrack = 0; + MouseMode(0); ++ BracketedPasteMode(0); ++ CursorStyle(0); + SetRendition(&mchar_null); + SetFlow(FLOW_NOW); + #ifdef MAPKEYS +@@ -836,6 +844,46 @@ int mode; + } + } + ++void ++BracketedPasteMode(mode) ++int mode; ++{ ++ if (!display) ++ return; ++ ++ if (D_bracketed != mode) { ++ if (!D_CXT) ++ return; ++ if (D_bracketed) { ++ AddStr("\033[?2004l"); ++ } ++ if (mode) { ++ AddStr("\033[?2004h"); ++ } ++ D_bracketed = mode; ++ } ++} ++ ++void ++CursorStyle(mode) ++int mode; ++{ ++ char buf[32]; ++ ++ if (!display) ++ return; ++ ++ if (D_cursorstyle != mode) { ++ if (!D_CXT) ++ return; ++ if (mode < 0) ++ return; ++ sprintf(buf, "\033[%d q", mode); ++ AddStr(buf); ++ D_cursorstyle = mode; ++ } ++} ++ + static int StrCost; + + /* ARGSUSED */ +@@ -1261,6 +1309,8 @@ int cur_only; + CursorkeysMode(0); + CursorVisibility(0); + MouseMode(0); ++ BracketedPasteMode(0); ++ CursorStyle(0); + SetRendition(&mchar_null); + SetFlow(FLOW_NOW); + +@@ -3121,6 +3171,8 @@ NukePending() + int oldkeypad = D_keypad, oldcursorkeys = D_cursorkeys; + int oldcurvis = D_curvis; + int oldmouse = D_mouse; ++ int oldbracketed = D_bracketed; ++ int oldcursorstyle = D_cursorstyle; + + oldrend = D_rend; + len = D_obufp - D_obuf; +@@ -3183,6 +3235,8 @@ NukePending() + CursorkeysMode(oldcursorkeys); + CursorVisibility(oldcurvis); + MouseMode(oldmouse); ++ BracketedPasteMode(oldbracketed); ++ CursorStyle(oldcursorstyle); + if (D_CWS) + { + debug("ResizeDisplay: using WS\n"); +diff --git a/src/display.h b/src/display.h +index a433e6d..4fbfe27 100644 +--- a/src/display.h ++++ b/src/display.h +@@ -102,6 +102,8 @@ struct display + int d_mouse; /* mouse mode */ + int d_mousetrack; /* set when user wants to use mouse even when the window + does not */ ++ int d_bracketed; /* bracketed paste mode */ ++ int d_cursorstyle; /* cursor style */ + #ifdef RXVT_OSC + int d_xtermosc[4]; /* osc used */ + #endif +@@ -189,6 +191,8 @@ extern struct display TheDisplay; + + #define D_user DISPLAY(d_user) + #define D_username (DISPLAY(d_user) ? DISPLAY(d_user)->u_name : 0) ++#define D_bracketed DISPLAY(d_bracketed) ++#define D_cursorstyle DISPLAY(d_cursorstyle) + #define D_canvas DISPLAY(d_canvas) + #define D_cvlist DISPLAY(d_cvlist) + #define D_layout DISPLAY(d_layout) +diff --git a/src/extern.h b/src/extern.h +index 8690821..be5190e 100644 +--- a/src/extern.h ++++ b/src/extern.h +@@ -287,6 +287,8 @@ extern void CursorkeysMode __P((int)); + extern void ReverseVideo __P((int)); + extern void CursorVisibility __P((int)); + extern void MouseMode __P((int)); ++extern void BracketedPasteMode __P((int)); ++extern void CursorStyle __P((int)); + extern void SetFont __P((int)); + extern void SetAttr __P((int)); + extern void SetColor __P((int, int)); +@@ -447,6 +449,8 @@ extern void LSetFlow __P((struct layer *, int)); + extern void LKeypadMode __P((struct layer *, int)); + extern void LCursorkeysMode __P((struct layer *, int)); + extern void LMouseMode __P((struct layer *, int)); ++extern void LBracketedPasteMode __P((struct layer *, int)); ++extern void LCursorStyle __P((struct layer *, int)); + #ifdef USEVARARGS + extern void LMsg __P((int, const char *, ...)) __attribute__((format(printf, 2, 3))); + #else +diff --git a/src/layer.c b/src/layer.c +index 1ae7972..b1ced76 100644 +--- a/src/layer.c ++++ b/src/layer.c +@@ -910,6 +910,32 @@ int on; + } + } + ++void LBracketedPasteMode(struct layer *l, int on) ++{ ++ struct canvas *cv; ++ for (cv = l->l_cvlist; cv; cv = cv->c_lnext) { ++ display = cv->c_display; ++ if (D_blocked) ++ continue; ++ if (cv != D_forecv) ++ continue; ++ BracketedPasteMode(on); ++ } ++} ++ ++void LCursorStyle(struct layer *l, int style) ++{ ++ struct canvas *cv; ++ for (cv = l->l_cvlist; cv; cv = cv->c_lnext) { ++ display = cv->c_display; ++ if (D_blocked) ++ continue; ++ if (cv != D_forecv) ++ continue; ++ CursorStyle(style); ++ } ++} ++ + void + LClearAll(l, uself) + struct layer *l; +diff --git a/src/window.c b/src/window.c +index f5e30a9..f596f92 100644 +--- a/src/window.c ++++ b/src/window.c +@@ -498,6 +498,8 @@ WinRestore() + ReverseVideo(fore->w_revvid); + CursorVisibility(fore->w_curinv ? -1 : fore->w_curvvis); + MouseMode(fore->w_mouse); ++ BracketedPasteMode(fore->w_bracketed); ++ CursorStyle(fore->w_cursorstyle); + } + } + +diff --git a/src/window.h b/src/window.h +index 7fc7c72..a91467b 100644 +--- a/src/window.h ++++ b/src/window.h +@@ -235,6 +235,8 @@ struct win + char w_xtermosc[4][MAXSTR]; /* special xterm/rxvt escapes */ + #endif + int w_mouse; /* mouse mode 0,9,1000 */ ++ int w_bracketed; /* bracketed paste mode */ ++ int w_cursorstyle; /* cursor style */ + #ifdef HAVE_BRAILLE + int w_bd_x, w_bd_y; /* Braille cursor position */ + #endif +-- +2.20.1 + diff --git a/SPECS/screen.spec b/SPECS/screen.spec index 5c1092e..f146d77 100644 --- a/SPECS/screen.spec +++ b/SPECS/screen.spec @@ -4,7 +4,7 @@ Summary: A screen manager that supports multiple logins on one terminal Name: screen Version: 4.1.0 -Release: 0.25.20120314git3c2946%{?dist} +Release: 0.26.20120314git3c2946%{?dist} License: GPLv2+ Group: Applications/System URL: http://www.gnu.org/software/screen @@ -37,6 +37,7 @@ Patch12: screen-fix-term.patch Patch13: screen-reattach.patch Patch14: screen-STIG-GEN003660.patch Patch15: screen-4.1.0-caption-padding.patch +Patch16: screen-bracketed_paste.patch %description The screen utility allows you to have multiple logins on just one @@ -65,6 +66,7 @@ support multiple logins on one terminal. %patch13 -p2 -b .cannot-reattach %patch14 -p2 -b .STIG-GEN003660 %patch15 -p2 -b .caption-padding +%patch16 -p2 -b .bracketed-paste %build @@ -161,7 +163,10 @@ fi %endif %changelog -* Tue Oct 04 2017 Josef Ridky - 4.1.0-0.25.2012314git3c2946 +* Tue Feb 04 2020 Václav Doležal - 4.1.0-0.26.2012314git3c2946 +- Resolves: #1791793 - backport Bracketed Past Mode support + +* Wed Oct 04 2017 Josef Ridky - 4.1.0-0.25.2012314git3c2946 - Resolves: #1423036 - fix issue with coloring when using caption padding * Thu Jun 30 2016 Petr Hracek - 4.1.0-0.24.20120314git3c2946