st-csi_22_23-0.8.4.diff - sites - public wiki contents of suckless.org
HTML git clone git://git.suckless.org/sites
DIR Log
DIR Files
DIR Refs
---
st-csi_22_23-0.8.4.diff (4524B)
---
1 From 49342f1039b41d2c95dde3f9cc26efbdc85d0272 Mon Sep 17 00:00:00 2001
2 From: Ashish Kumar Yadav <ashishkumar.yadav@students.iiserpune.ac.in>
3 Date: Wed, 11 Aug 2021 20:24:07 +0530
4 Subject: [PATCH] Implement support for CSI 22 and 23
5
6 This patch implements title stack into st.
7 ---
8 st.c | 34 +++++++++++++++++++++++++++++++---
9 st.info | 4 ++--
10 win.h | 4 +++-
11 x.c | 44 +++++++++++++++++++++++++++++++++++++++-----
12 4 files changed, 75 insertions(+), 11 deletions(-)
13
14 diff --git a/st.c b/st.c
15 index 76b7e0d..092b93c 100644
16 --- a/st.c
17 +++ b/st.c
18 @@ -1806,6 +1806,33 @@ csihandle(void)
19 goto unknown;
20 }
21 break;
22 + case 't': /* title stack operations */
23 + switch (csiescseq.arg[0]) {
24 + case 22: /* pust current title on stack */
25 + switch (csiescseq.arg[1]) {
26 + case 0:
27 + case 1:
28 + case 2:
29 + xpushtitle();
30 + break;
31 + default:
32 + goto unknown;
33 + }
34 + break;
35 + case 23: /* pop last title from stack */
36 + switch (csiescseq.arg[1]) {
37 + case 0:
38 + case 1:
39 + case 2:
40 + xsettitle(NULL, 1);
41 + break;
42 + default:
43 + goto unknown;
44 + }
45 + break;
46 + default:
47 + goto unknown;
48 + }
49 }
50 }
51
52 @@ -1856,7 +1883,7 @@ strhandle(void)
53 case 1:
54 case 2:
55 if (narg > 1)
56 - xsettitle(strescseq.args[1]);
57 + xsettitle(strescseq.args[1], 0);
58 return;
59 case 52:
60 if (narg > 2 && allowwindowops) {
61 @@ -1892,7 +1919,7 @@ strhandle(void)
62 }
63 break;
64 case 'k': /* old title set compatibility */
65 - xsettitle(strescseq.args[0]);
66 + xsettitle(strescseq.args[0], 0);
67 return;
68 case 'P': /* DCS -- Device Control String */
69 case '_': /* APC -- Application Program Command */
70 @@ -2264,6 +2291,7 @@ eschandle(uchar ascii)
71 break;
72 case 'c': /* RIS -- Reset to initial state */
73 treset();
74 + xfreetitlestack();
75 resettitle();
76 xloadcols();
77 break;
78 @@ -2546,7 +2574,7 @@ tresize(int col, int row)
79 void
80 resettitle(void)
81 {
82 - xsettitle(NULL);
83 + xsettitle(NULL, 0);
84 }
85
86 void
87 diff --git a/st.info b/st.info
88 index 8201ad6..aeef606 100644
89 --- a/st.info
90 +++ b/st.info
91 @@ -161,7 +161,7 @@ st-mono| simpleterm monocolor,
92 rin=\E[%p1%dT,
93 ritm=\E[23m,
94 rmacs=\E(B,
95 - rmcup=\E[?1049l,
96 + rmcup=\E[?1049l\E[23;0;0t,
97 rmir=\E[4l,
98 rmkx=\E[?1l\E>,
99 rmso=\E[27m,
100 @@ -172,7 +172,7 @@ st-mono| simpleterm monocolor,
101 sitm=\E[3m,
102 sgr0=\E[0m,
103 smacs=\E(0,
104 - smcup=\E[?1049h,
105 + smcup=\E[?1049h\E[22;0;0t,
106 smir=\E[4h,
107 smkx=\E[?1h\E=,
108 smso=\E[7m,
109 diff --git a/win.h b/win.h
110 index a6ef1b9..e24337e 100644
111 --- a/win.h
112 +++ b/win.h
113 @@ -30,7 +30,9 @@ void xdrawline(Line, int, int, int);
114 void xfinishdraw(void);
115 void xloadcols(void);
116 int xsetcolorname(int, const char *);
117 -void xsettitle(char *);
118 +void xfreetitlestack(void);
119 +void xsettitle(char *, int);
120 +void xpushtitle(void);
121 int xsetcursor(int);
122 void xsetmode(int, unsigned int);
123 void xsetpointermotion(int);
124 diff --git a/x.c b/x.c
125 index 210f184..b4bebff 100644
126 --- a/x.c
127 +++ b/x.c
128 @@ -63,6 +63,9 @@ static void ttysend(const Arg *);
129 /* config.h for applying patches and the configuration. */
130 #include "config.h"
131
132 +/* size of title stack */
133 +#define TITLESTACKSIZE 8
134 +
135 /* XEMBED messages */
136 #define XEMBED_FOCUS_IN 4
137 #define XEMBED_FOCUS_OUT 5
138 @@ -220,6 +223,8 @@ static DC dc;
139 static XWindow xw;
140 static XSelection xsel;
141 static TermWindow win;
142 +static int tstki; /* title stack index */
143 +static char *titlestack[TITLESTACKSIZE]; /* title stack */
144
145 /* Font Ring Cache */
146 enum {
147 @@ -1580,18 +1585,47 @@ xsetenv(void)
148 }
149
150 void
151 -xsettitle(char *p)
152 +xfreetitlestack(void)
153 {
154 - XTextProperty prop;
155 - DEFAULT(p, opt_title);
156 + for (int i = 0; i < LEN(titlestack); i++) {
157 + free(titlestack[i]);
158 + titlestack[i] = NULL;
159 + }
160 +}
161
162 - Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
163 - &prop);
164 +void
165 +xsettitle(char *p, int pop)
166 +{
167 + XTextProperty prop;
168 +
169 + free(titlestack[tstki]);
170 + if (pop) {
171 + titlestack[tstki] = NULL;
172 + tstki = (tstki - 1 + TITLESTACKSIZE) % TITLESTACKSIZE;
173 + p = titlestack[tstki] ? titlestack[tstki] : opt_title;
174 + } else if (p) {
175 + titlestack[tstki] = xstrdup(p);
176 + } else {
177 + titlestack[tstki] = NULL;
178 + p = opt_title;
179 + }
180 +
181 + Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, &prop);
182 XSetWMName(xw.dpy, xw.win, &prop);
183 XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname);
184 XFree(prop.value);
185 }
186
187 +void
188 +xpushtitle(void)
189 +{
190 + int tstkin = (tstki + 1) % TITLESTACKSIZE;
191 +
192 + free(titlestack[tstkin]);
193 + titlestack[tstkin] = titlestack[tstki] ? xstrdup(titlestack[tstki]) : NULL;
194 + tstki = tstkin;
195 +}
196 +
197 int
198 xstartdraw(void)
199 {
200 --
201 2.32.0
202