slock-message-20191002-b46028b.diff - sites - public wiki contents of suckless.… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
slock-message-20191002-b46028b.diff (6269B) | |
--- | |
1 From b46028b2797b886154258dcafe71c349cdc68b43 Mon Sep 17 00:00:00 2001 | |
2 From: Blair Drummond <[email protected]> | |
3 Date: Wed, 2 Oct 2019 14:59:00 -0400 | |
4 Subject: [PATCH] Add a message command. Fixes old version's bugs. | |
5 | |
6 --- | |
7 config.def.h | 9 ++++ | |
8 config.mk | 2 +- | |
9 slock.1 | 7 +++ | |
10 slock.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++-- | |
11 4 files changed, 133 insertions(+), 5 deletions(-) | |
12 | |
13 diff --git a/config.def.h b/config.def.h | |
14 index 9855e21..c2a0ab2 100644 | |
15 --- a/config.def.h | |
16 +++ b/config.def.h | |
17 @@ -10,3 +10,12 @@ static const char *colorname[NUMCOLS] = { | |
18 | |
19 /* treat a cleared input like a wrong password (color) */ | |
20 static const int failonclear = 1; | |
21 + | |
22 +/* default message */ | |
23 +static const char * message = "Suckless: Software that sucks less."; | |
24 + | |
25 +/* text color */ | |
26 +static const char * text_color = "#ffffff"; | |
27 + | |
28 +/* text size (must be a valid size) */ | |
29 +static const char * font_name = "6x10"; | |
30 diff --git a/config.mk b/config.mk | |
31 index 74429ae..c4ccf66 100644 | |
32 --- a/config.mk | |
33 +++ b/config.mk | |
34 @@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib | |
35 | |
36 # includes and libs | |
37 INCS = -I. -I/usr/include -I${X11INC} | |
38 -LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr | |
39 +LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lXiner… | |
40 | |
41 # flags | |
42 CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H | |
43 diff --git a/slock.1 b/slock.1 | |
44 index 82cdcd6..946165f 100644 | |
45 --- a/slock.1 | |
46 +++ b/slock.1 | |
47 @@ -6,6 +6,8 @@ | |
48 .Sh SYNOPSIS | |
49 .Nm | |
50 .Op Fl v | |
51 +.Op Fl f | |
52 +.Op Fl m Ar message | |
53 .Op Ar cmd Op Ar arg ... | |
54 .Sh DESCRIPTION | |
55 .Nm | |
56 @@ -16,6 +18,11 @@ is executed after the screen has been locked. | |
57 .Bl -tag -width Ds | |
58 .It Fl v | |
59 Print version information to stdout and exit. | |
60 +.It Fl f | |
61 +List all valid X fonts and exit. | |
62 +.It Fl m Ar message | |
63 +Overrides default slock lock message. | |
64 +.TP | |
65 .El | |
66 .Sh SECURITY CONSIDERATIONS | |
67 To make sure a locked screen can not be bypassed by switching VTs | |
68 diff --git a/slock.c b/slock.c | |
69 index 5ae738c..610929b 100644 | |
70 --- a/slock.c | |
71 +++ b/slock.c | |
72 @@ -15,6 +15,7 @@ | |
73 #include <unistd.h> | |
74 #include <sys/types.h> | |
75 #include <X11/extensions/Xrandr.h> | |
76 +#include <X11/extensions/Xinerama.h> | |
77 #include <X11/keysym.h> | |
78 #include <X11/Xlib.h> | |
79 #include <X11/Xutil.h> | |
80 @@ -24,6 +25,9 @@ | |
81 | |
82 char *argv0; | |
83 | |
84 +/* global count to prevent repeated error messages */ | |
85 +int count_error = 0; | |
86 + | |
87 enum { | |
88 INIT, | |
89 INPUT, | |
90 @@ -83,6 +87,98 @@ dontkillme(void) | |
91 } | |
92 #endif | |
93 | |
94 +static void | |
95 +writemessage(Display *dpy, Window win, int screen) | |
96 +{ | |
97 + int len, line_len, width, height, s_width, s_height, i, j, k, t… | |
98 + XGCValues gr_values; | |
99 + XFontStruct *fontinfo; | |
100 + XColor color, dummy; | |
101 + XineramaScreenInfo *xsi; | |
102 + GC gc; | |
103 + fontinfo = XLoadQueryFont(dpy, font_name); | |
104 + | |
105 + if (fontinfo == NULL) { | |
106 + if (count_error == 0) { | |
107 + fprintf(stderr, "slock: Unable to load font \"%… | |
108 + fprintf(stderr, "slock: Try listing fonts with … | |
109 + count_error++; | |
110 + } | |
111 + return; | |
112 + } | |
113 + | |
114 + tab_size = 8 * XTextWidth(fontinfo, " ", 1); | |
115 + | |
116 + XAllocNamedColor(dpy, DefaultColormap(dpy, screen), | |
117 + text_color, &color, &dummy); | |
118 + | |
119 + gr_values.font = fontinfo->fid; | |
120 + gr_values.foreground = color.pixel; | |
121 + gc=XCreateGC(dpy,win,GCFont+GCForeground, &gr_values); | |
122 + | |
123 + /* To prevent "Uninitialized" warnings. */ | |
124 + xsi = NULL; | |
125 + | |
126 + /* | |
127 + * Start formatting and drawing text | |
128 + */ | |
129 + | |
130 + len = strlen(message); | |
131 + | |
132 + /* Max max line length (cut at '\n') */ | |
133 + line_len = 0; | |
134 + k = 0; | |
135 + for (i = j = 0; i < len; i++) { | |
136 + if (message[i] == '\n') { | |
137 + if (i - j > line_len) | |
138 + line_len = i - j; | |
139 + k++; | |
140 + i++; | |
141 + j = i; | |
142 + } | |
143 + } | |
144 + /* If there is only one line */ | |
145 + if (line_len == 0) | |
146 + line_len = len; | |
147 + | |
148 + if (XineramaIsActive(dpy)) { | |
149 + xsi = XineramaQueryScreens(dpy, &i); | |
150 + s_width = xsi[0].width; | |
151 + s_height = xsi[0].height; | |
152 + } else { | |
153 + s_width = DisplayWidth(dpy, screen); | |
154 + s_height = DisplayHeight(dpy, screen); | |
155 + } | |
156 + | |
157 + height = s_height*3/7 - (k*20)/3; | |
158 + width = (s_width - XTextWidth(fontinfo, message, line_len))/2; | |
159 + | |
160 + /* Look for '\n' and print the text between them. */ | |
161 + for (i = j = k = 0; i <= len; i++) { | |
162 + /* i == len is the special case for the last line */ | |
163 + if (i == len || message[i] == '\n') { | |
164 + tab_replace = 0; | |
165 + while (message[j] == '\t' && j < i) { | |
166 + tab_replace++; | |
167 + j++; | |
168 + } | |
169 + | |
170 + XDrawString(dpy, win, gc, width + tab_size*tab_… | |
171 + while (i < len && message[i] == '\n') { | |
172 + i++; | |
173 + j = i; | |
174 + k++; | |
175 + } | |
176 + } | |
177 + } | |
178 + | |
179 + /* xsi should not be NULL anyway if Xinerama is active, but to … | |
180 + if (XineramaIsActive(dpy) && xsi != NULL) | |
181 + XFree(xsi); | |
182 +} | |
183 + | |
184 + | |
185 + | |
186 static const char * | |
187 gethash(void) | |
188 { | |
189 @@ -194,6 +290,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock … | |
190 locks[scre… | |
191 locks[scre… | |
192 XClearWindow(dpy, locks[screen]… | |
193 + writemessage(dpy, locks[screen]… | |
194 } | |
195 oldc = color; | |
196 } | |
197 @@ -300,7 +397,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int scre… | |
198 static void | |
199 usage(void) | |
200 { | |
201 - die("usage: slock [-v] [cmd [arg ...]]\n"); | |
202 + die("usage: slock [-v] [-f] [-m message] [cmd [arg ...]]\n"); | |
203 } | |
204 | |
205 int | |
206 @@ -313,12 +410,25 @@ main(int argc, char **argv) { | |
207 gid_t dgid; | |
208 const char *hash; | |
209 Display *dpy; | |
210 - int s, nlocks, nscreens; | |
211 + int i, s, nlocks, nscreens; | |
212 + int count_fonts; | |
213 + char **font_names; | |
214 | |
215 ARGBEGIN { | |
216 case 'v': | |
217 fprintf(stderr, "slock-"VERSION"\n"); | |
218 return 0; | |
219 + case 'm': | |
220 + message = EARGF(usage()); | |
221 + break; | |
222 + case 'f': | |
223 + if (!(dpy = XOpenDisplay(NULL))) | |
224 + die("slock: cannot open display\n"); | |
225 + font_names = XListFonts(dpy, "*", 10000 /* list 10000 f… | |
226 + for (i=0; i<count_fonts; i++) { | |
227 + fprintf(stderr, "%s\n", *(font_names+i)); | |
228 + } | |
229 + return 0; | |
230 default: | |
231 usage(); | |
232 } ARGEND | |
233 @@ -363,10 +473,12 @@ main(int argc, char **argv) { | |
234 if (!(locks = calloc(nscreens, sizeof(struct lock *)))) | |
235 die("slock: out of memory\n"); | |
236 for (nlocks = 0, s = 0; s < nscreens; s++) { | |
237 - if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL) | |
238 + if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL) { | |
239 + writemessage(dpy, locks[s]->win, s); | |
240 nlocks++; | |
241 - else | |
242 + } else { | |
243 break; | |
244 + } | |
245 } | |
246 XSync(dpy, 0); | |
247 | |
248 -- | |
249 2.20.1 | |
250 |