1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
#version 330
// ── Gradient border shader for picom ─────────────────────────────────────────
// Blends a diagonal gradient (top-left → bottom-right) over the window border.
//
// COLOR_A : top-left colour — #7B2FBE (purple)
// COLOR_B : bottom-right — #2FB8BE (teal)
//
// To change colours: convert hex → float by dividing each channel by 255.
// ── Tuneable constants ────────────────────────────────────────────────────────
const float BORDER_WIDTH = 4.0; // Border band thickness in pixels
const float BORDER_OPACITY = 0.95; // How strongly the gradient is applied
// COLOR_A: #7B2FBE (vibrant purple)
const vec3 COLOR_A = vec3(0.106, 0.992, 0.612);
// COLOR_B: #2FB8BE (cyan-teal)
const vec3 COLOR_B = vec3(0.651, 1.0, 0.788);
// ── Picom-provided ────────────────────────────────────────────────────────────
in vec2 texcoord; // Fragment texture coordinate (in pixels)
uniform sampler2D tex; // Window texture
// Picom's built-in post-processing (opacity, rounded corners, etc.)
vec4 default_post_processing(vec4 c);
// ── Entry point ───────────────────────────────────────────────────────────────
vec4 window_shader() {
// Sample the original window pixel
vec4 c = texelFetch(tex, ivec2(texcoord), 0);
// Derive texture size from the sampler
vec2 size = vec2(textureSize(tex, 0));
// Normalised UV (0,0) top-left → (1,1) bottom-right
vec2 uv = texcoord / size;
// Diagonal gradient factor
float t = (uv.x + uv.y) * 0.5;
vec3 gradient = mix(COLOR_A, COLOR_B, t);
// Border mask: 1.0 on the edge band, 0.0 in the interior
float left = smoothstep(0.0, BORDER_WIDTH, texcoord.x);
float right = smoothstep(0.0, BORDER_WIDTH, size.x - texcoord.x);
float top = smoothstep(0.0, BORDER_WIDTH, texcoord.y);
float bottom = smoothstep(0.0, BORDER_WIDTH, size.y - texcoord.y);
float mask = 1.0 - (left * right * top * bottom);
// Blend gradient onto border region only
c.rgb = mix(c.rgb, gradient, mask * BORDER_OPACITY);
// Let picom handle opacity, rounded corners, etc.
return default_post_processing(c);
}
|