st-csi_22_23-0.8.5.diff (4585B)
1 From c90af45228c1100377d64ad021fa3f0cff9a1df4 Mon Sep 17 00:00:00 2001 2 From: wael <40663@protonmail.com> 3 Date: Mon, 11 Apr 2022 21:28:43 +0300 4 Subject: [PATCH] [st][patch][csi 22 23] update to 0.8.5 5 6 --- 7 st.c | 36 ++++++++++++++++++++++++++++++++---- 8 st.info | 4 ++-- 9 win.h | 4 +++- 10 x.c | 41 ++++++++++++++++++++++++++++++++++++++--- 11 4 files changed, 75 insertions(+), 10 deletions(-) 12 13 diff --git a/st.c b/st.c 14 index f43cfd3..2802381 100644 15 --- a/st.c 16 +++ b/st.c 17 @@ -1801,6 +1801,33 @@ csihandle(void) 18 goto unknown; 19 } 20 break; 21 + case 't': /* title stack operations */ 22 + switch (csiescseq.arg[0]) { 23 + case 22: /* pust current title on stack */ 24 + switch (csiescseq.arg[1]) { 25 + case 0: 26 + case 1: 27 + case 2: 28 + xpushtitle(); 29 + break; 30 + default: 31 + goto unknown; 32 + } 33 + break; 34 + case 23: /* pop last title from stack */ 35 + switch (csiescseq.arg[1]) { 36 + case 0: 37 + case 1: 38 + case 2: 39 + xsettitle(NULL, 1); 40 + break; 41 + default: 42 + goto unknown; 43 + } 44 + break; 45 + default: 46 + goto unknown; 47 + } 48 } 49 } 50 51 @@ -1885,7 +1912,7 @@ strhandle(void) 52 switch (par) { 53 case 0: 54 if (narg > 1) { 55 - xsettitle(strescseq.args[1]); 56 + xsettitle(strescseq.args[1], 0); 57 xseticontitle(strescseq.args[1]); 58 } 59 return; 60 @@ -1895,7 +1922,7 @@ strhandle(void) 61 return; 62 case 2: 63 if (narg > 1) 64 - xsettitle(strescseq.args[1]); 65 + xsettitle(strescseq.args[1], 0); 66 return; 67 case 52: 68 if (narg > 2 && allowwindowops) { 69 @@ -1973,7 +2000,7 @@ strhandle(void) 70 } 71 break; 72 case 'k': /* old title set compatibility */ 73 - xsettitle(strescseq.args[0]); 74 + xsettitle(strescseq.args[0], 0); 75 return; 76 case 'P': /* DCS -- Device Control String */ 77 case '_': /* APC -- Application Program Command */ 78 @@ -2345,6 +2372,7 @@ eschandle(uchar ascii) 79 break; 80 case 'c': /* RIS -- Reset to initial state */ 81 treset(); 82 + xfreetitlestack(); 83 resettitle(); 84 xloadcols(); 85 break; 86 @@ -2631,7 +2659,7 @@ tresize(int col, int row) 87 void 88 resettitle(void) 89 { 90 - xsettitle(NULL); 91 + xsettitle(NULL, 0); 92 } 93 94 void 95 diff --git a/st.info b/st.info 96 index 8201ad6..aeef606 100644 97 --- a/st.info 98 +++ b/st.info 99 @@ -161,7 +161,7 @@ st-mono| simpleterm monocolor, 100 rin=\E[%p1%dT, 101 ritm=\E[23m, 102 rmacs=\E(B, 103 - rmcup=\E[?1049l, 104 + rmcup=\E[?1049l\E[23;0;0t, 105 rmir=\E[4l, 106 rmkx=\E[?1l\E>, 107 rmso=\E[27m, 108 @@ -172,7 +172,7 @@ st-mono| simpleterm monocolor, 109 sitm=\E[3m, 110 sgr0=\E[0m, 111 smacs=\E(0, 112 - smcup=\E[?1049h, 113 + smcup=\E[?1049h\E[22;0;0t, 114 smir=\E[4h, 115 smkx=\E[?1h\E=, 116 smso=\E[7m, 117 diff --git a/win.h b/win.h 118 index e6e4369..ef67fd6 100644 119 --- a/win.h 120 +++ b/win.h 121 @@ -31,7 +31,9 @@ void xfinishdraw(void); 122 void xloadcols(void); 123 int xsetcolorname(int, const char *); 124 void xseticontitle(char *); 125 -void xsettitle(char *); 126 +void xfreetitlestack(void); 127 +void xsettitle(char *, int); 128 +void xpushtitle(void); 129 int xsetcursor(int); 130 void xsetmode(int, unsigned int); 131 void xsetpointermotion(int); 132 diff --git a/x.c b/x.c 133 index 2a3bd38..babb04c 100644 134 --- a/x.c 135 +++ b/x.c 136 @@ -63,6 +63,9 @@ static void ttysend(const Arg *); 137 /* config.h for applying patches and the configuration. */ 138 #include "config.h" 139 140 +/* size of title stack */ 141 +#define TITLESTACKSIZE 8 142 + 143 /* XEMBED messages */ 144 #define XEMBED_FOCUS_IN 4 145 #define XEMBED_FOCUS_OUT 5 146 @@ -220,6 +223,8 @@ static DC dc; 147 static XWindow xw; 148 static XSelection xsel; 149 static TermWindow win; 150 +static int tstki; /* title stack index */ 151 +static char *titlestack[TITLESTACKSIZE]; /* title stack */ 152 153 /* Font Ring Cache */ 154 enum { 155 @@ -1626,10 +1631,30 @@ xseticontitle(char *p) 156 } 157 158 void 159 -xsettitle(char *p) 160 +xfreetitlestack(void) 161 { 162 - XTextProperty prop; 163 - DEFAULT(p, opt_title); 164 + for (int i = 0; i < LEN(titlestack); i++) { 165 + free(titlestack[i]); 166 + titlestack[i] = NULL; 167 + } 168 +} 169 + 170 +void 171 +xsettitle(char *p, int pop) 172 +{ 173 + XTextProperty prop; 174 + 175 + free(titlestack[tstki]); 176 + if (pop) { 177 + titlestack[tstki] = NULL; 178 + tstki = (tstki - 1 + TITLESTACKSIZE) % TITLESTACKSIZE; 179 + p = titlestack[tstki] ? titlestack[tstki] : opt_title; 180 + } else if (p) { 181 + titlestack[tstki] = xstrdup(p); 182 + } else { 183 + titlestack[tstki] = NULL; 184 + p = opt_title; 185 + } 186 187 if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, 188 &prop) != Success) 189 @@ -1639,6 +1664,16 @@ xsettitle(char *p) 190 XFree(prop.value); 191 } 192 193 +void 194 +xpushtitle(void) 195 +{ 196 + int tstkin = (tstki + 1) % TITLESTACKSIZE; 197 + 198 + free(titlestack[tstkin]); 199 + titlestack[tstkin] = titlestack[tstki] ? xstrdup(titlestack[tstki]) : NULL; 200 + tstki = tstkin; 201 +} 202 + 203 int 204 xstartdraw(void) 205 { 206 -- 207 2.35.1 208