screen-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[screen-devel] [PATCH for screen-v4] Backport support for bracketed-past


From: Václav Doležal
Subject: [screen-devel] [PATCH for screen-v4] Backport support for bracketed-paste and DECSCUSR
Date: Wed, 22 Jan 2020 14:03:42 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2

Reference: c389013e89e7b04ce43872f2e72d43f77461a3c0
Reference: https://lists.gnu.org/archive/html/screen-devel/2013-03/msg00000.html
Authored-by: Hayaki Saito <address@hidden>
Backported-by: Václav Doležal <address@hidden>
Signed-off-by: Václav Doležal <address@hidden>
---
 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 2a52edd..d624b63 100644
--- a/src/ansi.c
+++ b/src/ansi.c
@@ -195,6 +195,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;
@@ -1346,6 +1348,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++)
        {
@@ -1477,6 +1485,10 @@ int c, intermediate;
                LExtMouseMode(&curr->w_layer, curr->w_extmouse);
                 break;
         /* case 1015:     UXRVT mouse mode rejected */
+            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 d0ed6a4..b064990 100644
--- a/src/display.c
+++ b/src/display.c
@@ -130,6 +130,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
@@ -192,6 +194,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);
 }
@@ -323,6 +327,8 @@ struct mode *Mode;
   D_user = *u;
   D_processinput = ProcessInput;
   D_mousetrack = defmousetrack;
+  D_bracketed = defbracketed;
+  D_cursorstyle = defcursorstyle;
   return display;
 }
 
@@ -497,6 +503,8 @@ FinitTerm()
        D_mousetrack = 0;
       MouseMode(0);
       ExtMouseMode(0);
+      BracketedPasteMode(0);
+      CursorStyle(0);
       SetRendition(&mchar_null);
       SetFlow(FLOW_NOW);
 #ifdef MAPKEYS
@@ -871,6 +879,46 @@ ExtMouseMode(mode)
     }
 }
 
+void
+BracketedPasteMode(mode)
+int mode;
+{
+  if (!display)
+    return;
+
+  if (D_bracketed != mode) {
+    if (!D_CXT)
+      return;
+    if (D_bracketed) {
+      AddStr("\033[?2004l\a");
+    }
+    if (mode) {
+      AddStr("\033[?2004h\a");
+    }
+    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 */
@@ -1297,6 +1345,8 @@ int cur_only;
   CursorVisibility(0);
   MouseMode(0);
   ExtMouseMode(0);
+  BracketedPasteMode(0);
+  CursorStyle(0);
   SetRendition(&mchar_null);
   SetFlow(FLOW_NOW);
 
@@ -3198,6 +3248,8 @@ NukePending()
   int oldcurvis = D_curvis;
   int oldmouse = D_mouse;
   int oldextmouse = D_extmouse;
+  int oldbracketed = D_bracketed;
+  int oldcursorstyle = D_cursorstyle;
 
   oldrend = D_rend;
   len = D_obufp - D_obuf;
@@ -3261,6 +3313,8 @@ NukePending()
   CursorVisibility(oldcurvis);
   MouseMode(oldmouse);
   ExtMouseMode(oldextmouse);
+  BracketedPasteMode(oldbracketed);
+  CursorStyle(oldcursorstyle);
   if (D_CWS)
     {
       debug("ResizeDisplay: using WS\n");
diff --git a/src/display.h b/src/display.h
index 459cc5d..b5886b4 100644
--- a/src/display.h
+++ b/src/display.h
@@ -111,6 +111,8 @@ struct display
   struct mouse_parse d_mouse_parse;            /* state of mouse code parsing 
*/
   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
@@ -198,6 +200,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 d4e57df..61829b1 100644
--- a/src/extern.h
+++ b/src/extern.h
@@ -291,6 +291,8 @@ extern void  ReverseVideo __P((int));
 extern void  CursorVisibility __P((int));
 extern void  MouseMode __P((int));
 extern void  ExtMouseMode __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));
@@ -452,6 +454,8 @@ extern void  LKeypadMode __P((struct layer *, int));
 extern void  LCursorkeysMode __P((struct layer *, int));
 extern void  LMouseMode __P((struct layer *, int));
 extern void  LExtMouseMode __P((struct layer *, int));
+extern void  LBracketedPasteMode __P((struct layer *, int));
+extern void  LCursorStyle __P((struct layer *, int));
 #if defined(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 f505349..89d0fb7 100644
--- a/src/layer.c
+++ b/src/layer.c
@@ -840,6 +840,32 @@ void LMouseMode(struct layer *l, 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(struct layer *l, int uself)
 {
   LClearArea(l, 0, 0, l->l_width - 1, l->l_height - 1, 0, uself);
diff --git a/src/window.c b/src/window.c
index db03f01..62de447 100644
--- a/src/window.c
+++ b/src/window.c
@@ -509,6 +509,8 @@ WinRestore()
       CursorVisibility(fore->w_curinv ? -1 : fore->w_curvvis);
       MouseMode(fore->w_mouse);
       ExtMouseMode(fore->w_extmouse);
+      BracketedPasteMode(fore->w_bracketed);
+      CursorStyle(fore->w_cursorstyle);
     }
 }
 
diff --git a/src/window.h b/src/window.h
index fbe98dc..de4b07a 100644
--- a/src/window.h
+++ b/src/window.h
@@ -241,6 +241,8 @@ struct win
 #endif
   int    w_mouse;              /* mouse mode 0,9,1000 */
   int    w_extmouse;           /* extended mouse mode 0,1006 */
+  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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]