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