sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

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