You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
4.4 KiB
203 lines
4.4 KiB
3 years ago
|
From 49342f1039b41d2c95dde3f9cc26efbdc85d0272 Mon Sep 17 00:00:00 2001
|
||
|
From: Ashish Kumar Yadav <ashishkumar.yadav@students.iiserpune.ac.in>
|
||
|
Date: Wed, 11 Aug 2021 20:24:07 +0530
|
||
|
Subject: [PATCH] Implement support for CSI 22 and 23
|
||
|
|
||
|
This patch implements title stack into st.
|
||
|
---
|
||
|
st.c | 34 +++++++++++++++++++++++++++++++---
|
||
|
st.info | 4 ++--
|
||
|
win.h | 4 +++-
|
||
|
x.c | 44 +++++++++++++++++++++++++++++++++++++++-----
|
||
|
4 files changed, 75 insertions(+), 11 deletions(-)
|
||
|
|
||
|
diff --git a/st.c b/st.c
|
||
|
index 76b7e0d..092b93c 100644
|
||
|
--- a/st.c
|
||
|
+++ b/st.c
|
||
|
@@ -1806,6 +1806,33 @@ csihandle(void)
|
||
|
goto unknown;
|
||
|
}
|
||
|
break;
|
||
|
+ case 't': /* title stack operations */
|
||
|
+ switch (csiescseq.arg[0]) {
|
||
|
+ case 22: /* pust current title on stack */
|
||
|
+ switch (csiescseq.arg[1]) {
|
||
|
+ case 0:
|
||
|
+ case 1:
|
||
|
+ case 2:
|
||
|
+ xpushtitle();
|
||
|
+ break;
|
||
|
+ default:
|
||
|
+ goto unknown;
|
||
|
+ }
|
||
|
+ break;
|
||
|
+ case 23: /* pop last title from stack */
|
||
|
+ switch (csiescseq.arg[1]) {
|
||
|
+ case 0:
|
||
|
+ case 1:
|
||
|
+ case 2:
|
||
|
+ xsettitle(NULL, 1);
|
||
|
+ break;
|
||
|
+ default:
|
||
|
+ goto unknown;
|
||
|
+ }
|
||
|
+ break;
|
||
|
+ default:
|
||
|
+ goto unknown;
|
||
|
+ }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@@ -1856,7 +1883,7 @@ strhandle(void)
|
||
|
case 1:
|
||
|
case 2:
|
||
|
if (narg > 1)
|
||
|
- xsettitle(strescseq.args[1]);
|
||
|
+ xsettitle(strescseq.args[1], 0);
|
||
|
return;
|
||
|
case 52:
|
||
|
if (narg > 2 && allowwindowops) {
|
||
|
@@ -1892,7 +1919,7 @@ strhandle(void)
|
||
|
}
|
||
|
break;
|
||
|
case 'k': /* old title set compatibility */
|
||
|
- xsettitle(strescseq.args[0]);
|
||
|
+ xsettitle(strescseq.args[0], 0);
|
||
|
return;
|
||
|
case 'P': /* DCS -- Device Control String */
|
||
|
case '_': /* APC -- Application Program Command */
|
||
|
@@ -2264,6 +2291,7 @@ eschandle(uchar ascii)
|
||
|
break;
|
||
|
case 'c': /* RIS -- Reset to initial state */
|
||
|
treset();
|
||
|
+ xfreetitlestack();
|
||
|
resettitle();
|
||
|
xloadcols();
|
||
|
break;
|
||
|
@@ -2546,7 +2574,7 @@ tresize(int col, int row)
|
||
|
void
|
||
|
resettitle(void)
|
||
|
{
|
||
|
- xsettitle(NULL);
|
||
|
+ xsettitle(NULL, 0);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
diff --git a/st.info b/st.info
|
||
|
index 8201ad6..aeef606 100644
|
||
|
--- a/st.info
|
||
|
+++ b/st.info
|
||
|
@@ -161,7 +161,7 @@ st-mono| simpleterm monocolor,
|
||
|
rin=\E[%p1%dT,
|
||
|
ritm=\E[23m,
|
||
|
rmacs=\E(B,
|
||
|
- rmcup=\E[?1049l,
|
||
|
+ rmcup=\E[?1049l\E[23;0;0t,
|
||
|
rmir=\E[4l,
|
||
|
rmkx=\E[?1l\E>,
|
||
|
rmso=\E[27m,
|
||
|
@@ -172,7 +172,7 @@ st-mono| simpleterm monocolor,
|
||
|
sitm=\E[3m,
|
||
|
sgr0=\E[0m,
|
||
|
smacs=\E(0,
|
||
|
- smcup=\E[?1049h,
|
||
|
+ smcup=\E[?1049h\E[22;0;0t,
|
||
|
smir=\E[4h,
|
||
|
smkx=\E[?1h\E=,
|
||
|
smso=\E[7m,
|
||
|
diff --git a/win.h b/win.h
|
||
|
index a6ef1b9..e24337e 100644
|
||
|
--- a/win.h
|
||
|
+++ b/win.h
|
||
|
@@ -30,7 +30,9 @@ void xdrawline(Line, int, int, int);
|
||
|
void xfinishdraw(void);
|
||
|
void xloadcols(void);
|
||
|
int xsetcolorname(int, const char *);
|
||
|
-void xsettitle(char *);
|
||
|
+void xfreetitlestack(void);
|
||
|
+void xsettitle(char *, int);
|
||
|
+void xpushtitle(void);
|
||
|
int xsetcursor(int);
|
||
|
void xsetmode(int, unsigned int);
|
||
|
void xsetpointermotion(int);
|
||
|
diff --git a/x.c b/x.c
|
||
|
index 210f184..b4bebff 100644
|
||
|
--- a/x.c
|
||
|
+++ b/x.c
|
||
|
@@ -63,6 +63,9 @@ static void ttysend(const Arg *);
|
||
|
/* config.h for applying patches and the configuration. */
|
||
|
#include "config.h"
|
||
|
|
||
|
+/* size of title stack */
|
||
|
+#define TITLESTACKSIZE 8
|
||
|
+
|
||
|
/* XEMBED messages */
|
||
|
#define XEMBED_FOCUS_IN 4
|
||
|
#define XEMBED_FOCUS_OUT 5
|
||
|
@@ -220,6 +223,8 @@ static DC dc;
|
||
|
static XWindow xw;
|
||
|
static XSelection xsel;
|
||
|
static TermWindow win;
|
||
|
+static int tstki; /* title stack index */
|
||
|
+static char *titlestack[TITLESTACKSIZE]; /* title stack */
|
||
|
|
||
|
/* Font Ring Cache */
|
||
|
enum {
|
||
|
@@ -1580,18 +1585,47 @@ xsetenv(void)
|
||
|
}
|
||
|
|
||
|
void
|
||
|
-xsettitle(char *p)
|
||
|
+xfreetitlestack(void)
|
||
|
{
|
||
|
- XTextProperty prop;
|
||
|
- DEFAULT(p, opt_title);
|
||
|
+ for (int i = 0; i < LEN(titlestack); i++) {
|
||
|
+ free(titlestack[i]);
|
||
|
+ titlestack[i] = NULL;
|
||
|
+ }
|
||
|
+}
|
||
|
|
||
|
- Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
|
||
|
- &prop);
|
||
|
+void
|
||
|
+xsettitle(char *p, int pop)
|
||
|
+{
|
||
|
+ XTextProperty prop;
|
||
|
+
|
||
|
+ free(titlestack[tstki]);
|
||
|
+ if (pop) {
|
||
|
+ titlestack[tstki] = NULL;
|
||
|
+ tstki = (tstki - 1 + TITLESTACKSIZE) % TITLESTACKSIZE;
|
||
|
+ p = titlestack[tstki] ? titlestack[tstki] : opt_title;
|
||
|
+ } else if (p) {
|
||
|
+ titlestack[tstki] = xstrdup(p);
|
||
|
+ } else {
|
||
|
+ titlestack[tstki] = NULL;
|
||
|
+ p = opt_title;
|
||
|
+ }
|
||
|
+
|
||
|
+ Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, &prop);
|
||
|
XSetWMName(xw.dpy, xw.win, &prop);
|
||
|
XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname);
|
||
|
XFree(prop.value);
|
||
|
}
|
||
|
|
||
|
+void
|
||
|
+xpushtitle(void)
|
||
|
+{
|
||
|
+ int tstkin = (tstki + 1) % TITLESTACKSIZE;
|
||
|
+
|
||
|
+ free(titlestack[tstkin]);
|
||
|
+ titlestack[tstkin] = titlestack[tstki] ? xstrdup(titlestack[tstki]) : NULL;
|
||
|
+ tstki = tstkin;
|
||
|
+}
|
||
|
+
|
||
|
int
|
||
|
xstartdraw(void)
|
||
|
{
|
||
|
--
|
||
|
2.32.0
|
||
|
|