Blob Blame History Raw
From 068ee32fa7919a93026dc11b61ff92cc6ce06b98 Mon Sep 17 00:00:00 2001
From: Vaclav Dolezal <vdolezal@redhat.com>
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 <user@zuse.jp>
Backported-by: Václav Doležal <vdolezal@redhat.com>
Signed-off-by: Václav Doležal <vdolezal@redhat.com>
---
 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