nixos-dotfiles

nixos-dotfiles

https://git.tonybtw.com/nixos-dotfiles.git git://git.tonybtw.com/nixos-dotfiles.git
3,699 bytes raw
1
diff --git a/config.def.h b/config.def.h
2
index 2cd740a..019a4e1 100644
3
--- a/config.def.h
4
+++ b/config.def.h
5
@@ -93,6 +93,9 @@ char *termname = "st-256color";
6
  */
7
 unsigned int tabspaces = 8;
8
 
9
+/* bg opacity */
10
+float alpha = 0.8;
11
+
12
 /* Terminal colors (16 first used in escape sequence) */
13
 static const char *colorname[] = {
14
 	/* 8 normal colors */
15
diff --git a/x.c b/x.c
16
index d73152b..f32fd6c 100644
17
--- a/x.c
18
+++ b/x.c
19
@@ -105,6 +105,7 @@ typedef struct {
20
 	XSetWindowAttributes attrs;
21
 	int scr;
22
 	int isfixed; /* is fixed geometry? */
23
+	int depth; /* bit depth */
24
 	int l, t; /* left and top offset */
25
 	int gm; /* geometry mask */
26
 } XWindow;
27
@@ -752,7 +753,7 @@ xresize(int col, int row)
28
 
29
 	XFreePixmap(xw.dpy, xw.buf);
30
 	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
31
-			DefaultDepth(xw.dpy, xw.scr));
32
+			xw.depth);
33
 	XftDrawChange(xw.draw, xw.buf);
34
 	xclear(0, 0, win.w, win.h);
35
 
36
@@ -812,6 +813,10 @@ xloadcols(void)
37
 			else
38
 				die("could not allocate color %d\n", i);
39
 		}
40
+
41
+	dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * alpha);
42
+	dc.col[defaultbg].pixel &= 0x00FFFFFF;
43
+	dc.col[defaultbg].pixel |= (unsigned char)(0xff * alpha) << 24;
44
 	loaded = 1;
45
 }
46
 
47
@@ -842,6 +847,12 @@ xsetcolorname(int x, const char *name)
48
 	XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]);
49
 	dc.col[x] = ncolor;
50
 
51
+	if (x == defaultbg) {
52
+		dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * alpha);
53
+		dc.col[defaultbg].pixel &= 0x00FFFFFF;
54
+		dc.col[defaultbg].pixel |= (unsigned char)(0xff * alpha) << 24;
55
+	}
56
+
57
 	return 0;
58
 }
59
 
60
@@ -1134,11 +1145,25 @@ xinit(int cols, int rows)
61
 	Window parent, root;
62
 	pid_t thispid = getpid();
63
 	XColor xmousefg, xmousebg;
64
+	XWindowAttributes attr;
65
+	XVisualInfo vis;
66
 
67
 	if (!(xw.dpy = XOpenDisplay(NULL)))
68
 		die("can't open display\n");
69
 	xw.scr = XDefaultScreen(xw.dpy);
70
-	xw.vis = XDefaultVisual(xw.dpy, xw.scr);
71
+
72
+	root = XRootWindow(xw.dpy, xw.scr);
73
+	if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0))))
74
+		parent = root;
75
+
76
+	if (XMatchVisualInfo(xw.dpy, xw.scr, 32, TrueColor, &vis) != 0) {
77
+		xw.vis = vis.visual;
78
+		xw.depth = vis.depth;
79
+	} else {
80
+		XGetWindowAttributes(xw.dpy, parent, &attr);
81
+		xw.vis = attr.visual;
82
+		xw.depth = attr.depth;
83
+	}
84
 
85
 	/* font */
86
 	if (!FcInit())
87
@@ -1148,7 +1173,7 @@ xinit(int cols, int rows)
88
 	xloadfonts(usedfont, 0);
89
 
90
 	/* colors */
91
-	xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
92
+	xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None);
93
 	xloadcols();
94
 
95
 	/* adjust fixed window geometry */
96
@@ -1168,11 +1193,8 @@ xinit(int cols, int rows)
97
 		| ButtonMotionMask | ButtonPressMask | ButtonReleaseMask;
98
 	xw.attrs.colormap = xw.cmap;
99
 
100
-	root = XRootWindow(xw.dpy, xw.scr);
101
-	if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0))))
102
-		parent = root;
103
-	xw.win = XCreateWindow(xw.dpy, root, xw.l, xw.t,
104
-			win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput,
105
+	xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t,
106
+			win.w, win.h, 0, xw.depth, InputOutput,
107
 			xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity
108
 			| CWEventMask | CWColormap, &xw.attrs);
109
 	if (parent != root)
110
@@ -1183,7 +1205,7 @@ xinit(int cols, int rows)
111
 	dc.gc = XCreateGC(xw.dpy, xw.win, GCGraphicsExposures,
112
 			&gcvalues);
113
 	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
114
-			DefaultDepth(xw.dpy, xw.scr));
115
+			xw.depth);
116
 	XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel);
117
 	XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h);
118
 
119
@@ -2047,6 +2069,10 @@ main(int argc, char *argv[])
120
 	case 'a':
121
 		allowaltscreen = 0;
122
 		break;
123
+	case 'A':
124
+		alpha = strtof(EARGF(usage()), NULL);
125
+		LIMIT(alpha, 0.0, 1.0);
126
+		break;
127
 	case 'c':
128
 		opt_class = EARGF(usage());
129
 		break;