[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [screen-devel] [PATCH for screen-v4] Backport support for bracketed-paste and DECSCUSR,
Václav Doležal <=