st-focus-20200530-43a395a.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
st-focus-20200530-43a395a.diff (6927B)
---
1 From dfbb24bf5e02c9e365d4c0fe46aa8cbe27aed92f Mon Sep 17 00:00:00 2001
2 From: Julius Huelsmann <juliusHuelsmann@gmail.com>
3 Date: Sat, 6 Jun 2020 13:12:28 +0200
4 Subject: [PATCH] patch: focus
5
6 ---
7 config.def.h | 5 ++++
8 config.mk | 2 +-
9 st.h | 1 +
10 x.c | 72 +++++++++++++++++++++++++++++++++++++++-------------
11 4 files changed, 61 insertions(+), 19 deletions(-)
12
13 diff --git a/config.def.h b/config.def.h
14 index 0895a1f..577d1f1 100644
15 --- a/config.def.h
16 +++ b/config.def.h
17 @@ -84,6 +84,9 @@ char *termname = "st-256color";
18 */
19 unsigned int tabspaces = 8;
20
21 +/* bg opacity */
22 +float alpha = 0.8, alphaUnfocused = 0.6;
23 +
24 /* Terminal colors (16 first used in escape sequence) */
25 static const char *colorname[] = {
26 /* 8 normal colors */
27 @@ -111,6 +114,7 @@ static const char *colorname[] = {
28 /* more colors can be added after 255 to use with DefaultXX */
29 "#cccccc",
30 "#555555",
31 + "black",
32 };
33
34
35 @@ -122,6 +126,7 @@ unsigned int defaultfg = 7;
36 unsigned int defaultbg = 0;
37 static unsigned int defaultcs = 256;
38 static unsigned int defaultrcs = 257;
39 +unsigned int bg = 17, bgUnfocused = 16;
40
41 /*
42 * Default shape of cursor
43 diff --git a/config.mk b/config.mk
44 index beafc35..ddc65ae 100644
45 --- a/config.mk
46 +++ b/config.mk
47 @@ -16,7 +16,7 @@ PKG_CONFIG = pkg-config
48 INCS = -I$(X11INC) \
49 `$(PKG_CONFIG) --cflags fontconfig` \
50 `$(PKG_CONFIG) --cflags freetype2`
51 -LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \
52 +LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender\
53 `$(PKG_CONFIG) --libs fontconfig` \
54 `$(PKG_CONFIG) --libs freetype2`
55
56 diff --git a/st.h b/st.h
57 index d978458..b5f1cf6 100644
58 --- a/st.h
59 +++ b/st.h
60 @@ -122,3 +122,4 @@ extern char *termname;
61 extern unsigned int tabspaces;
62 extern unsigned int defaultfg;
63 extern unsigned int defaultbg;
64 +extern float alpha, alphaUnfocused;
65 diff --git a/x.c b/x.c
66 index e5f1737..a0c3223 100644
67 --- a/x.c
68 +++ b/x.c
69 @@ -105,6 +105,7 @@ typedef struct {
70 XSetWindowAttributes attrs;
71 int scr;
72 int isfixed; /* is fixed geometry? */
73 + int depth; /* bit depth */
74 int l, t; /* left and top offset */
75 int gm; /* geometry mask */
76 } XWindow;
77 @@ -243,6 +244,7 @@ static char *usedfont = NULL;
78 static double usedfontsize = 0;
79 static double defaultfontsize = 0;
80
81 +static char *opt_alpha = NULL;
82 static char *opt_class = NULL;
83 static char **opt_cmd = NULL;
84 static char *opt_embed = NULL;
85 @@ -252,6 +254,8 @@ static char *opt_line = NULL;
86 static char *opt_name = NULL;
87 static char *opt_title = NULL;
88
89 +static int focused = 0;
90 +
91 static int oldbutton = 3; /* button event on startup: 3 = release */
92
93 void
94 @@ -734,7 +738,7 @@ xresize(int col, int row)
95
96 XFreePixmap(xw.dpy, xw.buf);
97 xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
98 - DefaultDepth(xw.dpy, xw.scr));
99 + xw.depth);
100 XftDrawChange(xw.draw, xw.buf);
101 xclear(0, 0, win.w, win.h);
102
103 @@ -772,28 +776,38 @@ xloadcolor(int i, const char *name, Color *ncolor)
104 return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor);
105 }
106
107 +void
108 +xloadalpha(void)
109 +{
110 + float const usedAlpha = focused ? alpha : alphaUnfocused;
111 + if (opt_alpha) alpha = strtof(opt_alpha, NULL);
112 + dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * usedAlpha);
113 + dc.col[defaultbg].pixel &= 0x00FFFFFF;
114 + dc.col[defaultbg].pixel |= (unsigned char)(0xff * usedAlpha) << 24;
115 +}
116 +
117 void
118 xloadcols(void)
119 {
120 - int i;
121 static int loaded;
122 Color *cp;
123
124 - if (loaded) {
125 - for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp)
126 - XftColorFree(xw.dpy, xw.vis, xw.cmap, cp);
127 - } else {
128 - dc.collen = MAX(LEN(colorname), 256);
129 - dc.col = xmalloc(dc.collen * sizeof(Color));
130 + if (!loaded) {
131 + dc.collen = 1 + (defaultbg = MAX(LEN(colorname), 256));
132 + dc.col = xmalloc((dc.collen) * sizeof(Color));
133 }
134
135 - for (i = 0; i < dc.collen; i++)
136 + for (int i = 0; i+1 < dc.collen; ++i)
137 if (!xloadcolor(i, NULL, &dc.col[i])) {
138 if (colorname[i])
139 die("could not allocate color '%s'\n", colorname[i]);
140 else
141 die("could not allocate color %d\n", i);
142 }
143 + if (dc.collen) // cannot die, as the color is already loaded.
144 + xloadcolor(focused ?bg :bgUnfocused, NULL, &dc.col[defaultbg]);
145 +
146 + xloadalpha();
147 loaded = 1;
148 }
149
150 @@ -1103,11 +1117,23 @@ xinit(int cols, int rows)
151 Window parent;
152 pid_t thispid = getpid();
153 XColor xmousefg, xmousebg;
154 + XWindowAttributes attr;
155 + XVisualInfo vis;
156
157 if (!(xw.dpy = XOpenDisplay(NULL)))
158 die("can't open display\n");
159 xw.scr = XDefaultScreen(xw.dpy);
160 - xw.vis = XDefaultVisual(xw.dpy, xw.scr);
161 +
162 + if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) {
163 + parent = XRootWindow(xw.dpy, xw.scr);
164 + xw.depth = 32;
165 + } else {
166 + XGetWindowAttributes(xw.dpy, parent, &attr);
167 + xw.depth = attr.depth;
168 + }
169 +
170 + XMatchVisualInfo(xw.dpy, xw.scr, xw.depth, TrueColor, &vis);
171 + xw.vis = vis.visual;
172
173 /* font */
174 if (!FcInit())
175 @@ -1117,7 +1143,7 @@ xinit(int cols, int rows)
176 xloadfonts(usedfont, 0);
177
178 /* colors */
179 - xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
180 + xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None);
181 xloadcols();
182
183 /* adjust fixed window geometry */
184 @@ -1137,19 +1163,15 @@ xinit(int cols, int rows)
185 | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask;
186 xw.attrs.colormap = xw.cmap;
187
188 - if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0))))
189 - parent = XRootWindow(xw.dpy, xw.scr);
190 xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t,
191 - win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput,
192 + win.w, win.h, 0, xw.depth, InputOutput,
193 xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity
194 | CWEventMask | CWColormap, &xw.attrs);
195
196 memset(&gcvalues, 0, sizeof(gcvalues));
197 gcvalues.graphics_exposures = False;
198 - dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures,
199 - &gcvalues);
200 - xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
201 - DefaultDepth(xw.dpy, xw.scr));
202 + xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, xw.depth);
203 + dc.gc = XCreateGC(xw.dpy, xw.buf, GCGraphicsExposures, &gcvalues);
204 XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel);
205 XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h);
206
207 @@ -1730,12 +1752,22 @@ focus(XEvent *ev)
208 xseturgency(0);
209 if (IS_SET(MODE_FOCUS))
210 ttywrite("\033[I", 3, 0);
211 + if (!focused) {
212 + focused = 1;
213 + xloadcols();
214 + redraw();
215 + }
216 } else {
217 if (xw.ime.xic)
218 XUnsetICFocus(xw.ime.xic);
219 win.mode &= ~MODE_FOCUSED;
220 if (IS_SET(MODE_FOCUS))
221 ttywrite("\033[O", 3, 0);
222 + if (focused) {
223 + focused = 0;
224 + xloadcols();
225 + redraw();
226 + }
227 }
228 }
229
230 @@ -1994,6 +2026,9 @@ main(int argc, char *argv[])
231 case 'a':
232 allowaltscreen = 0;
233 break;
234 + case 'A':
235 + opt_alpha = EARGF(usage());
236 + break;
237 case 'c':
238 opt_class = EARGF(usage());
239 break;
240 @@ -2045,6 +2080,7 @@ run:
241 XSetLocaleModifiers("");
242 cols = MAX(cols, 1);
243 rows = MAX(rows, 1);
244 + defaultbg = MAX(LEN(colorname), 256);
245 tnew(cols, rows);
246 xinit(cols, rows);
247 xsetenv();
248 --
249 2.27.0
250