summaryrefslogtreecommitdiff
path: root/slock
diff options
context:
space:
mode:
authorShubham Saini <shubham6405@gmail.com>2020-05-16 17:43:31 +0000
committerShubham Saini <shubham6405@gmail.com>2020-05-16 17:43:31 +0000
commit16d45c32c20d7b3db8ba2533ca9d414d8cd308f2 (patch)
treef829957546b740e6897eba24c8f49bb4c170044e /slock
gone full suckless
Diffstat (limited to 'slock')
-rw-r--r--slock/config.h24
-rw-r--r--slock/patches/slock-dpms-1.4.diff62
-rw-r--r--slock/patches/slock-message-20191002-b46028b.diff250
3 files changed, 336 insertions, 0 deletions
diff --git a/slock/config.h b/slock/config.h
new file mode 100644
index 0000000..6f12b0d
--- /dev/null
+++ b/slock/config.h
@@ -0,0 +1,24 @@
1/* user and group to drop privileges to */
2static const char *user = "nobody";
3static const char *group = "nogroup";
4
5static const char *colorname[NUMCOLS] = {
6 [INIT] = "black", /* after initialization */
7 [INPUT] = "black", /* during input */
8 [FAILED] = "#CC3333", /* wrong password */
9};
10
11/* treat a cleared input like a wrong password (color) */
12static const int failonclear = 1;
13
14/* default message */
15static const char * message = "Locked";
16
17/* text color */
18static const char * text_color = "#a8fffe";
19
20/* text size (must be a valid size) */
21static const char * font_name = "fixed";
22
23/* time in seconds before the monitor shuts down */
24static const int monitortime = 5;
diff --git a/slock/patches/slock-dpms-1.4.diff b/slock/patches/slock-dpms-1.4.diff
new file mode 100644
index 0000000..027bbf7
--- /dev/null
+++ b/slock/patches/slock-dpms-1.4.diff
@@ -0,0 +1,62 @@
1diff --git a/config.def.h b/config.def.h
2index 9855e21..d01bd38 100644
3--- a/config.def.h
4+++ b/config.def.h
5@@ -10,3 +10,6 @@ static const char *colorname[NUMCOLS] = {
6
7 /* treat a cleared input like a wrong password (color) */
8 static const int failonclear = 1;
9+
10+/* time in seconds before the monitor shuts down */
11+static const int monitortime = 5;
12diff --git a/slock.c b/slock.c
13index d2f0886..f65a43b 100644
14--- a/slock.c
15+++ b/slock.c
16@@ -15,6 +15,7 @@
17 #include <unistd.h>
18 #include <sys/types.h>
19 #include <X11/extensions/Xrandr.h>
20+#include <X11/extensions/dpms.h>
21 #include <X11/keysym.h>
22 #include <X11/Xlib.h>
23 #include <X11/Xutil.h>
24@@ -306,6 +307,7 @@ main(int argc, char **argv) {
25 const char *hash;
26 Display *dpy;
27 int s, nlocks, nscreens;
28+ CARD16 standby, suspend, off;
29
30 ARGBEGIN {
31 case 'v':
32@@ -366,6 +368,20 @@ main(int argc, char **argv) {
33 if (nlocks != nscreens)
34 return 1;
35
36+ /* DPMS magic to disable the monitor */
37+ if (!DPMSCapable(dpy))
38+ die("slock: DPMSCapable failed\n");
39+ if (!DPMSEnable(dpy))
40+ die("slock: DPMSEnable failed\n");
41+ if (!DPMSGetTimeouts(dpy, &standby, &suspend, &off))
42+ die("slock: DPMSGetTimeouts failed\n");
43+ if (!standby || !suspend || !off)
44+ die("slock: at least one DPMS variable is zero\n");
45+ if (!DPMSSetTimeouts(dpy, monitortime, monitortime, monitortime))
46+ die("slock: DPMSSetTimeouts failed\n");
47+
48+ XSync(dpy, 0);
49+
50 /* run post-lock command */
51 if (argc > 0) {
52 switch (fork()) {
53@@ -383,5 +399,9 @@ main(int argc, char **argv) {
54 /* everything is now blank. Wait for the correct password */
55 readpw(dpy, &rr, locks, nscreens, hash);
56
57+ /* reset DPMS values to inital ones */
58+ DPMSSetTimeouts(dpy, standby, suspend, off);
59+ XSync(dpy, 0);
60+
61 return 0;
62 }
diff --git a/slock/patches/slock-message-20191002-b46028b.diff b/slock/patches/slock-message-20191002-b46028b.diff
new file mode 100644
index 0000000..54b17e6
--- /dev/null
+++ b/slock/patches/slock-message-20191002-b46028b.diff
@@ -0,0 +1,250 @@
1From b46028b2797b886154258dcafe71c349cdc68b43 Mon Sep 17 00:00:00 2001
2From: Blair Drummond <blair.robert.drummond@gmail.com>
3Date: Wed, 2 Oct 2019 14:59:00 -0400
4Subject: [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
13diff --git a/config.def.h b/config.def.h
14index 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";
30diff --git a/config.mk b/config.mk
31index 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 -lXinerama
40
41 # flags
42 CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
43diff --git a/slock.1 b/slock.1
44index 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
68diff --git a/slock.c b/slock.c
69index 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, tab_replace, tab_size;
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 \"%s\"\n", font_name);
108+ fprintf(stderr, "slock: Try listing fonts with 'slock -f'\n");
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_replace, height + 20*k, message + j, i - j);
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 be safe */
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 **locks, int nscreens,
190 locks[screen]->win,
191 locks[screen]->colors[color]);
192 XClearWindow(dpy, locks[screen]->win);
193+ writemessage(dpy, locks[screen]->win, screen);
194 }
195 oldc = color;
196 }
197@@ -300,7 +397,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
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 fonts*/, &count_fonts);
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--
2492.20.1
250