Introduction
Introduction Statistics Contact Development Disclaimer Help
slock-squares-1.5.diff - sites - public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log
Files
Refs
---
slock-squares-1.5.diff (5088B)
---
1 From 2f6938b87a09abcd41fd6792a40b0bd7b088f41a Mon Sep 17 00:00:00 2001
2 From: bsuth <[email protected]>
3 Date: Tue, 27 Dec 2022 12:44:23 +0900
4 Subject: [PATCH] Use centered squares to indicate lock state
5
6 Instead of changing the color of the entire screen to indicate the
7 current lock state, draw centered squares on each monitor and change the
8 square colors.
9
10 This patch requires xrandr to be active and otherwise defaults to the
11 original slock behavior.
12 ---
13 config.def.h | 6 +++++-
14 slock.c | 58 +++++++++++++++++++++++++++++++++++++++++++++-------
15 2 files changed, 56 insertions(+), 8 deletions(-)
16
17 diff --git a/config.def.h b/config.def.h
18 index 9855e21..e7106fb 100644
19 --- a/config.def.h
20 +++ b/config.def.h
21 @@ -3,10 +3,14 @@ static const char *user = "nobody";
22 static const char *group = "nogroup";
23
24 static const char *colorname[NUMCOLS] = {
25 - [INIT] = "black", /* after initialization */
26 + [BG] = "black", /* background */
27 + [INIT] = "#4f525c", /* after initialization */
28 [INPUT] = "#005577", /* during input */
29 [FAILED] = "#CC3333", /* wrong password */
30 };
31
32 /* treat a cleared input like a wrong password (color) */
33 static const int failonclear = 1;
34 +
35 +/* size of square in px */
36 +static const int squaresize = 50;
37 diff --git a/slock.c b/slock.c
38 index 5ae738c..0750768 100644
39 --- a/slock.c
40 +++ b/slock.c
41 @@ -25,6 +25,7 @@
42 char *argv0;
43
44 enum {
45 + BG,
46 INIT,
47 INPUT,
48 FAILED,
49 @@ -36,6 +37,8 @@ struct lock {
50 Window root, win;
51 Pixmap pmap;
52 unsigned long colors[NUMCOLS];
53 + GC gc;
54 + XRRScreenResources *rrsr;
55 };
56
57 struct xrandr {
58 @@ -124,6 +127,44 @@ gethash(void)
59 return hash;
60 }
61
62 +static void
63 +draw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
64 + unsigned int color)
65 +{
66 + int screen, crtc;
67 + XRRCrtcInfo* rrci;
68 +
69 + if (rr->active) {
70 + for (screen = 0; screen < nscreens; screen++) {
71 + XSetWindowBackground(dpy, locks[screen]->win,lo…
72 + XClearWindow(dpy, locks[screen]->win);
73 + XSetForeground(dpy, locks[screen]->gc, locks[sc…
74 + for (crtc = 0; crtc < locks[screen]->rrsr->ncrt…
75 + rrci = XRRGetCrtcInfo(dpy,
76 + locks[screen]->rr…
77 + locks[screen]->rr…
78 + /* skip disabled crtc */
79 + if (rrci->noutput > 0)
80 + XFillRectangle(dpy,
81 + locks[screen]->w…
82 + locks[screen]->g…
83 + rrci->x + (rrci-…
84 + rrci->y + (rrci-…
85 + squaresize,
86 + squaresize);
87 + XRRFreeCrtcInfo(rrci);
88 + }
89 + }
90 + } else {
91 + for (screen = 0; screen < nscreens; screen++) {
92 + XSetWindowBackground(dpy,
93 + locks[screen]->win,
94 + locks[screen]->colors[colo…
95 + XClearWindow(dpy, locks[screen]->win);
96 + }
97 + }
98 +}
99 +
100 static void
101 readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscree…
102 const char *hash)
103 @@ -189,12 +230,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock…
104 }
105 color = len ? INPUT : ((failure || failonclear)…
106 if (running && oldc != color) {
107 - for (screen = 0; screen < nscreens; scr…
108 - XSetWindowBackground(dpy,
109 - locks[scre…
110 - locks[scre…
111 - XClearWindow(dpy, locks[screen]…
112 - }
113 + draw(dpy, rr, locks, nscreens, color);
114 oldc = color;
115 }
116 } else if (rr->active && ev.type == rr->evbase + RRScre…
117 @@ -228,6 +264,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int scre…
118 XColor color, dummy;
119 XSetWindowAttributes wa;
120 Cursor invisible;
121 + XGCValues gcvalues;
122
123 if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct …
124 return NULL;
125 @@ -243,7 +280,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int scre…
126
127 /* init */
128 wa.override_redirect = 1;
129 - wa.background_pixel = lock->colors[INIT];
130 + wa.background_pixel = lock->colors[BG];
131 lock->win = XCreateWindow(dpy, lock->root, 0, 0,
132 DisplayWidth(dpy, lock->screen),
133 DisplayHeight(dpy, lock->screen),
134 @@ -255,6 +292,10 @@ lockscreen(Display *dpy, struct xrandr *rr, int scr…
135 invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap,
136 &color, &color, 0, 0);
137 XDefineCursor(dpy, lock->win, invisible);
138 + lock->gc = XCreateGC(dpy, lock->win, 0, &gcvalues);
139 + XSetForeground(dpy, lock->gc, lock->colors[INIT]);
140 + if (rr->active)
141 + lock->rrsr = XRRGetScreenResourcesCurrent(dpy, lock->ro…
142
143 /* Try to grab mouse pointer *and* keyboard for 600ms, else fai…
144 for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) {
145 @@ -388,6 +429,9 @@ main(int argc, char **argv) {
146 }
147 }
148
149 + /* draw the initial rectangle */
150 + draw(dpy, &rr, locks, nscreens, INIT);
151 +
152 /* everything is now blank. Wait for the correct password */
153 readpw(dpy, &rr, locks, nscreens, hash);
154
155 --
156 2.39.0
157
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.