slock-message-20180626-35633d4.diff - sites - public wiki contents of suckless.… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
slock-message-20180626-35633d4.diff (4364B) | |
--- | |
1 From 8384a863057f024868bd8455a82013f716197ab0 Mon Sep 17 00:00:00 2001 | |
2 From: Blair Drummond <[email protected]> | |
3 Date: Tue, 26 Jun 2018 15:09:13 -0400 | |
4 Subject: [PATCH] Adds [-m message] option to leave a message on the lock… | |
5 | |
6 --- | |
7 config.def.h | 9 ++++++ | |
8 slock.1 | 4 +++ | |
9 slock.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++-- | |
10 3 files changed, 87 insertions(+), 3 deletions(-) | |
11 | |
12 diff --git a/config.def.h b/config.def.h | |
13 index 9855e21..7eb7a0d 100644 | |
14 --- a/config.def.h | |
15 +++ b/config.def.h | |
16 @@ -10,3 +10,12 @@ static const char *colorname[NUMCOLS] = { | |
17 | |
18 /* treat a cleared input like a wrong password (color) */ | |
19 static const int failonclear = 1; | |
20 + | |
21 +/* default message */ | |
22 +static const char * message = "Suckless: Software that sucks less."; | |
23 + | |
24 +/* text color */ | |
25 +static const char * text_color = "#ffffff"; | |
26 + | |
27 +/* text size (must be a valid size) */ | |
28 +static const char * text_size = "6x10"; | |
29 diff --git a/slock.1 b/slock.1 | |
30 index 82cdcd6..541a264 100644 | |
31 --- a/slock.1 | |
32 +++ b/slock.1 | |
33 @@ -6,6 +6,7 @@ | |
34 .Sh SYNOPSIS | |
35 .Nm | |
36 .Op Fl v | |
37 +.Op Fl m Ar message | |
38 .Op Ar cmd Op Ar arg ... | |
39 .Sh DESCRIPTION | |
40 .Nm | |
41 @@ -16,6 +17,9 @@ is executed after the screen has been locked. | |
42 .Bl -tag -width Ds | |
43 .It Fl v | |
44 Print version information to stdout and exit. | |
45 +.It Fl m Ar message | |
46 +Overrides default slock lock message. | |
47 +.TP | |
48 .El | |
49 .Sh SECURITY CONSIDERATIONS | |
50 To make sure a locked screen can not be bypassed by switching VTs | |
51 diff --git a/slock.c b/slock.c | |
52 index 5ae738c..6a9a03f 100644 | |
53 --- a/slock.c | |
54 +++ b/slock.c | |
55 @@ -61,6 +61,71 @@ die(const char *errstr, ...) | |
56 #include <fcntl.h> | |
57 #include <linux/oom.h> | |
58 | |
59 +static void | |
60 +writemessage(Display *dpy, Window win, int screen) | |
61 +{ | |
62 + int len, line_len, width, height, i, j, k, tab_replace, tab_siz… | |
63 + XGCValues gr_values; | |
64 + XFontStruct *fontinfo; | |
65 + XColor color, dummy; | |
66 + GC gc; | |
67 + fontinfo = XLoadQueryFont(dpy, text_size); | |
68 + tab_size = 8 * XTextWidth(fontinfo, " ", 1); | |
69 + | |
70 + XAllocNamedColor(dpy, DefaultColormap(dpy, screen), | |
71 + text_color, &color, &dummy); | |
72 + | |
73 + gr_values.font = fontinfo->fid; | |
74 + gr_values.foreground = color.pixel; | |
75 + gc=XCreateGC(dpy,win,GCFont+GCForeground, &gr_values); | |
76 + | |
77 + | |
78 + /* | |
79 + * Start formatting and drawing text | |
80 + */ | |
81 + | |
82 + len = strlen(message); | |
83 + | |
84 + /* Max max line length (cut at '\n') */ | |
85 + line_len = 0; | |
86 + k = 0; | |
87 + for (i = j = 0; i < len; i++) { | |
88 + if (message[i] == '\n') { | |
89 + if (i - j > line_len) | |
90 + line_len = i - j; | |
91 + k++; | |
92 + i++; | |
93 + j = i; | |
94 + } | |
95 + } | |
96 + /* If there is only one line */ | |
97 + if (line_len == 0) | |
98 + line_len = len; | |
99 + | |
100 + height = DisplayHeight(dpy, screen)*3/7 - (k*20)/3; | |
101 + width = (DisplayWidth(dpy, screen) - XTextWidth(fontinfo, mess… | |
102 + | |
103 + /* Look for '\n' and print the text between them. */ | |
104 + for (i = j = k = 0; i <= len; i++) { | |
105 + /* i == len is the special case for the last line */ | |
106 + if (i == len || message[i] == '\n') { | |
107 + tab_replace = 0; | |
108 + while (message[j] == '\t' && j < i) { | |
109 + tab_replace++; | |
110 + j++; | |
111 + } | |
112 + | |
113 + XDrawString(dpy, win, gc, width + tab_size*tab_… | |
114 + while (i < len && message[i] == '\n') { | |
115 + i++; | |
116 + j = i; | |
117 + k++; | |
118 + } | |
119 + } | |
120 + } | |
121 +} | |
122 + | |
123 + | |
124 static void | |
125 dontkillme(void) | |
126 { | |
127 @@ -194,6 +259,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock … | |
128 locks[scre… | |
129 locks[scre… | |
130 XClearWindow(dpy, locks[screen]… | |
131 + writemessage(dpy, locks[screen]… | |
132 } | |
133 oldc = color; | |
134 } | |
135 @@ -300,7 +366,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int scre… | |
136 static void | |
137 usage(void) | |
138 { | |
139 - die("usage: slock [-v] [cmd [arg ...]]\n"); | |
140 + die("usage: slock [-v] [-m message] [cmd [arg ...]]\n"); | |
141 } | |
142 | |
143 int | |
144 @@ -319,6 +385,9 @@ main(int argc, char **argv) { | |
145 case 'v': | |
146 fprintf(stderr, "slock-"VERSION"\n"); | |
147 return 0; | |
148 + case 'm': | |
149 + message = EARGF(usage()); | |
150 + break; | |
151 default: | |
152 usage(); | |
153 } ARGEND | |
154 @@ -363,10 +432,12 @@ main(int argc, char **argv) { | |
155 if (!(locks = calloc(nscreens, sizeof(struct lock *)))) | |
156 die("slock: out of memory\n"); | |
157 for (nlocks = 0, s = 0; s < nscreens; s++) { | |
158 - if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL) | |
159 + if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL) { | |
160 + writemessage(dpy, locks[s]->win, s); | |
161 nlocks++; | |
162 - else | |
163 + } else { | |
164 break; | |
165 + } | |
166 } | |
167 XSync(dpy, 0); | |
168 | |
169 -- | |
170 2.17.1 | |
171 |