slock-xresources-20191126-53e56c7.diff - sites - public wiki contents of suckle… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
slock-xresources-20191126-53e56c7.diff (3671B) | |
--- | |
1 From 53e56c751b3f2be4154760788850c51dbffc0add Mon Sep 17 00:00:00 2001 | |
2 From: Arnas Udovicius <[email protected]> | |
3 Date: Tue, 26 Nov 2019 16:16:15 +0200 | |
4 Subject: [PATCH] Read colors from Xresources | |
5 | |
6 --- | |
7 config.def.h | 14 +++++++++-- | |
8 slock.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ | |
9 util.h | 3 +++ | |
10 3 files changed, 83 insertions(+), 2 deletions(-) | |
11 | |
12 diff --git a/config.def.h b/config.def.h | |
13 index 6288856..bfc1ba0 100644 | |
14 --- a/config.def.h | |
15 +++ b/config.def.h | |
16 @@ -3,11 +3,21 @@ static const char *user = "nobody"; | |
17 static const char *group = "nogroup"; | |
18 | |
19 static const char *colorname[NUMCOLS] = { | |
20 - [INIT] = "black", /* after initialization */ | |
21 - [INPUT] = "#005577", /* during input */ | |
22 + [INIT] = "black", /* after initialization */ | |
23 + [INPUT] = "#005577", /* during input */ | |
24 [FAILED] = "#CC3333", /* wrong password */ | |
25 [CAPS] = "red", /* CapsLock on */ | |
26 }; | |
27 | |
28 +/* | |
29 + * Xresources preferences to load at startup | |
30 + */ | |
31 +ResourcePref resources[] = { | |
32 + { "color0", STRING, &colorname[INIT] }, | |
33 + { "color4", STRING, &colorname[INPUT] }, | |
34 + { "color1", STRING, &colorname[FAILED] }, | |
35 + { "color3", STRING, &colorname[CAPS] }, | |
36 +}; | |
37 + | |
38 /* treat a cleared input like a wrong password (color) */ | |
39 static const int failonclear = 1; | |
40 diff --git a/slock.c b/slock.c | |
41 index 5f4fb7a..2395547 100644 | |
42 --- a/slock.c | |
43 +++ b/slock.c | |
44 @@ -6,6 +6,7 @@ | |
45 | |
46 #include <ctype.h> | |
47 #include <errno.h> | |
48 +#include <math.h> | |
49 #include <grp.h> | |
50 #include <pwd.h> | |
51 #include <stdarg.h> | |
52 @@ -19,6 +20,7 @@ | |
53 #include <X11/Xlib.h> | |
54 #include <X11/Xutil.h> | |
55 #include <X11/XKBlib.h> | |
56 +#include <X11/Xresource.h> | |
57 | |
58 #include "arg.h" | |
59 #include "util.h" | |
60 @@ -46,6 +48,19 @@ struct xrandr { | |
61 int errbase; | |
62 }; | |
63 | |
64 +/* Xresources preferences */ | |
65 +enum resource_type { | |
66 + STRING = 0, | |
67 + INTEGER = 1, | |
68 + FLOAT = 2 | |
69 +}; | |
70 + | |
71 +typedef struct { | |
72 + char *name; | |
73 + enum resource_type type; | |
74 + void *dst; | |
75 +} ResourcePref; | |
76 + | |
77 #include "config.h" | |
78 | |
79 static void | |
80 @@ -306,6 +321,57 @@ lockscreen(Display *dpy, struct xrandr *rr, int scr… | |
81 return NULL; | |
82 } | |
83 | |
84 +int | |
85 +resource_load(XrmDatabase db, char *name, enum resource_type rtype, voi… | |
86 +{ | |
87 + char **sdst = dst; | |
88 + int *idst = dst; | |
89 + float *fdst = dst; | |
90 + | |
91 + char fullname[256]; | |
92 + char fullclass[256]; | |
93 + char *type; | |
94 + XrmValue ret; | |
95 + | |
96 + snprintf(fullname, sizeof(fullname), "%s.%s", "slock", name); | |
97 + snprintf(fullclass, sizeof(fullclass), "%s.%s", "Slock", name); | |
98 + fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - … | |
99 + | |
100 + XrmGetResource(db, fullname, fullclass, &type, &ret); | |
101 + if (ret.addr == NULL || strncmp("String", type, 64)) | |
102 + return 1; | |
103 + | |
104 + switch (rtype) { | |
105 + case STRING: | |
106 + *sdst = ret.addr; | |
107 + break; | |
108 + case INTEGER: | |
109 + *idst = strtoul(ret.addr, NULL, 10); | |
110 + break; | |
111 + case FLOAT: | |
112 + *fdst = strtof(ret.addr, NULL); | |
113 + break; | |
114 + } | |
115 + return 0; | |
116 +} | |
117 + | |
118 +void | |
119 +config_init(Display *dpy) | |
120 +{ | |
121 + char *resm; | |
122 + XrmDatabase db; | |
123 + ResourcePref *p; | |
124 + | |
125 + XrmInitialize(); | |
126 + resm = XResourceManagerString(dpy); | |
127 + if (!resm) | |
128 + return; | |
129 + | |
130 + db = XrmGetStringDatabase(resm); | |
131 + for (p = resources; p < resources + LEN(resources); p++) | |
132 + resource_load(db, p->name, p->type, p->dst); | |
133 +} | |
134 + | |
135 static void | |
136 usage(void) | |
137 { | |
138 @@ -364,6 +430,8 @@ main(int argc, char **argv) { | |
139 if (setuid(duid) < 0) | |
140 die("slock: setuid: %s\n", strerror(errno)); | |
141 | |
142 + config_init(dpy); | |
143 + | |
144 /* check for Xrandr support */ | |
145 rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase); | |
146 | |
147 diff --git a/util.h b/util.h | |
148 index 6f748b8..148dbc1 100644 | |
149 --- a/util.h | |
150 +++ b/util.h | |
151 @@ -1,2 +1,5 @@ | |
152 +/* macros */ | |
153 +#define LEN(a) (sizeof(a) / sizeof(a)[0]) | |
154 + | |
155 #undef explicit_bzero | |
156 void explicit_bzero(void *, size_t); | |
157 -- | |
158 2.24.0 | |
159 |