diff -ruNp screen-4.8.0.orig/ansi.c screen-4.8.0/ansi.c --- screen-4.8.0.orig/ansi.c 2020-02-05 21:09:38.000000000 +0100 +++ screen-4.8.0/ansi.c 2020-11-01 19:13:54.023721138 +0100 @@ -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 -ruNp screen-4.8.0.orig/display.c screen-4.8.0/display.c --- screen-4.8.0.orig/display.c 2020-02-05 21:09:38.000000000 +0100 +++ screen-4.8.0/display.c 2020-11-01 19:20:51.953148789 +0100 @@ -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,42 @@ ExtMouseMode(mode) } } +void BracketedPasteMode(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(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 +1341,8 @@ int cur_only; CursorVisibility(0); MouseMode(0); ExtMouseMode(0); + BracketedPasteMode(0); + CursorStyle(0); SetRendition(&mchar_null); SetFlow(FLOW_NOW); @@ -3198,6 +3244,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 +3309,8 @@ NukePending() CursorVisibility(oldcurvis); MouseMode(oldmouse); ExtMouseMode(oldextmouse); + BracketedPasteMode(oldbracketed); + CursorStyle(oldcursorstyle); if (D_CWS) { debug("ResizeDisplay: using WS\n"); diff -ruNp screen-4.8.0.orig/display.h screen-4.8.0/display.h --- screen-4.8.0.orig/display.h 2020-02-05 21:09:38.000000000 +0100 +++ screen-4.8.0/display.h 2020-11-01 19:21:49.009918688 +0100 @@ -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[5]; /* 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 -ruNp screen-4.8.0.orig/extern.h screen-4.8.0/extern.h --- screen-4.8.0.orig/extern.h 2020-02-05 21:09:38.000000000 +0100 +++ screen-4.8.0/extern.h 2020-11-01 19:22:46.794689164 +0100 @@ -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 (int); +extern void CursorStyle (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 lay extern void LCursorkeysMode __P((struct layer *, int)); extern void LMouseMode __P((struct layer *, int)); extern void LExtMouseMode __P((struct layer *, int)); +extern void LBracketedPasteMode (struct layer *, int); +extern void LCursorStyle (struct layer *, int); #if defined(USEVARARGS) extern void LMsg __P((int, const char *, ...)) __attribute__((format(printf, 2, 3))); #else diff -ruNp screen-4.8.0.orig/layer.c screen-4.8.0/layer.c --- screen-4.8.0.orig/layer.c 2020-02-05 21:09:38.000000000 +0100 +++ screen-4.8.0/layer.c 2020-11-01 19:23:49.096422746 +0100 @@ -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 -ruNp screen-4.8.0.orig/window.c screen-4.8.0/window.c --- screen-4.8.0.orig/window.c 2020-02-05 21:09:38.000000000 +0100 +++ screen-4.8.0/window.c 2020-11-01 19:25:26.665004901 +0100 @@ -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 -ruNp screen-4.8.0.orig/window.h screen-4.8.0/window.h --- screen-4.8.0.orig/window.h 2020-02-05 21:09:38.000000000 +0100 +++ screen-4.8.0/window.h 2020-11-01 19:26:23.990767940 +0100 @@ -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