slock-multi-shapes-1.5.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
slock-multi-shapes-1.5.diff (5707B)
---
1 diff --git a/config.def.h b/config.def.h
2 index 9855e21..e681e8b 100644
3 --- a/config.def.h
4 +++ b/config.def.h
5 @@ -3,10 +3,21 @@ static const char *user = "nobody";
6 static const char *group = "nogroup";
7
8 static const char *colorname[NUMCOLS] = {
9 - [INIT] = "black", /* after initialization */
10 + [BG] = "black", /* background */
11 + [INIT] = "#4f525c", /* after initialization */
12 [INPUT] = "#005577", /* during input */
13 [FAILED] = "#CC3333", /* wrong password */
14 };
15
16 /* treat a cleared input like a wrong password (color) */
17 static const int failonclear = 1;
18 +
19 +/*
20 +* Shapes:
21 +* 0: square
22 +* 1: circle
23 +*/
24 +static const int shape = 0;
25 +/* size of square in px */
26 +static const int shapesize = 50;
27 +static const int shapegap = 35;
28 diff --git a/slock.c b/slock.c
29 index b2f14e3..501b3be 100644
30 --- a/slock.c
31 +++ b/slock.c
32 @@ -25,6 +25,7 @@
33 char *argv0;
34
35 enum {
36 + BG,
37 INIT,
38 INPUT,
39 FAILED,
40 @@ -36,6 +37,8 @@ struct lock {
41 Window root, win;
42 Pixmap pmap;
43 unsigned long colors[NUMCOLS];
44 + GC gc;
45 + XRRScreenResources *rrsr;
46 };
47
48 struct xrandr {
49 @@ -124,13 +127,69 @@ gethash(void)
50 return hash;
51 }
52
53 +static void
54 +draw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
55 + unsigned int color, unsigned int len)
56 +{
57 + int screen, crtc;
58 + XRRCrtcInfo* rrci;
59 +
60 + if (rr->active) {
61 + for (screen = 0; screen < nscreens; screen++) {
62 + XSetWindowBackground(dpy, locks[screen]->win,locks[screen]->colors[BG]);
63 + XClearWindow(dpy, locks[screen]->win);
64 + XSetForeground(dpy, locks[screen]->gc, locks[screen]->colors[color]);
65 + for (crtc = 0; crtc < locks[screen]->rrsr->ncrtc; ++crtc) {
66 + rrci = XRRGetCrtcInfo(dpy,
67 + locks[screen]->rrsr,
68 + locks[screen]->rrsr->crtcs[crtc]);
69 + /* skip disabled crtc */
70 + if (rrci->noutput > 0) {
71 + int leftBound = rrci->x + (rrci->width - len * shapesize - (len - 1) * shapegap) / 2;
72 + for (int shapei = 0; shapei < len; shapei++) {
73 + int x = leftBound + shapei * (shapesize + shapegap);
74 + if (shape == 0) {
75 + XFillRectangle(dpy,
76 + locks[screen]->win,
77 + locks[screen]->gc,
78 + x,
79 + rrci->y + (rrci->height - shapesize) / 2,
80 + shapesize,
81 + shapesize);
82 + } else if (shape == 1) {
83 + XFillArc(dpy,
84 + locks[screen]->win,
85 + locks[screen]->gc,
86 + x,
87 + rrci->y + (rrci->height - shapesize) / 2,
88 + shapesize,
89 + shapesize,
90 + 0,
91 + 360 * 64);
92 + }
93 + }
94 +
95 + }
96 + XRRFreeCrtcInfo(rrci);
97 + }
98 + }
99 + } else {
100 + for (screen = 0; screen < nscreens; screen++) {
101 + XSetWindowBackground(dpy,
102 + locks[screen]->win,
103 + locks[screen]->colors[color]);
104 + XClearWindow(dpy, locks[screen]->win);
105 + }
106 + }
107 +}
108 +
109 static void
110 readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
111 const char *hash)
112 {
113 XRRScreenChangeNotifyEvent *rre;
114 char buf[32], passwd[256], *inputhash;
115 - int num, screen, running, failure, oldc;
116 + int num, screen, running, failure, oldc, oldlen;
117 unsigned int len, color;
118 KeySym ksym;
119 XEvent ev;
120 @@ -139,6 +198,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
121 running = 1;
122 failure = 0;
123 oldc = INIT;
124 + oldlen = 0;
125
126 while (running && !XNextEvent(dpy, &ev)) {
127 if (ev.type == KeyPress) {
128 @@ -188,14 +248,14 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
129 break;
130 }
131 color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT);
132 - if (running && oldc != color) {
133 - for (screen = 0; screen < nscreens; screen++) {
134 - XSetWindowBackground(dpy,
135 - locks[screen]->win,
136 - locks[screen]->colors[color]);
137 - XClearWindow(dpy, locks[screen]->win);
138 + if (running && (oldc != color || oldlen != len)) {
139 + int lenToUse = len;
140 + if (lenToUse < 1) {
141 + lenToUse = 1;
142 }
143 + draw(dpy, rr, locks, nscreens, color, lenToUse);
144 oldc = color;
145 + oldlen = len;
146 }
147 } else if (rr->active && ev.type == rr->evbase + RRScreenChangeNotify) {
148 rre = (XRRScreenChangeNotifyEvent*)&ev;
149 @@ -228,6 +288,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
150 XColor color, dummy;
151 XSetWindowAttributes wa;
152 Cursor invisible;
153 + XGCValues gcvalues;
154
155 if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock))))
156 return NULL;
157 @@ -243,7 +304,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
158
159 /* init */
160 wa.override_redirect = 1;
161 - wa.background_pixel = lock->colors[INIT];
162 + wa.background_pixel = lock->colors[BG];
163 lock->win = XCreateWindow(dpy, lock->root, 0, 0,
164 DisplayWidth(dpy, lock->screen),
165 DisplayHeight(dpy, lock->screen),
166 @@ -255,6 +316,10 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
167 invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap,
168 &color, &color, 0, 0);
169 XDefineCursor(dpy, lock->win, invisible);
170 + lock->gc = XCreateGC(dpy, lock->win, 0, &gcvalues);
171 + XSetForeground(dpy, lock->gc, lock->colors[INIT]);
172 + if (rr->active)
173 + lock->rrsr = XRRGetScreenResourcesCurrent(dpy, lock->root);
174
175 /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */
176 for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) {
177 @@ -388,6 +453,9 @@ main(int argc, char **argv) {
178 }
179 }
180
181 + /* draw the initial rectangle */
182 + draw(dpy, &rr, locks, nscreens, INIT, 1);
183 +
184 /* everything is now blank. Wait for the correct password */
185 readpw(dpy, &rr, locks, nscreens, hash);
186