slock-showtime-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-showtime-1.5.diff (6293B)
---
1 diff --git a/config.def.h b/config.def.h
2 index 9855e21..bc883ad 100644
3 --- a/config.def.h
4 +++ b/config.def.h
5 @@ -1,6 +1,11 @@
6 -/* user and group to drop privileges to */
7 -static const char *user = "nobody";
8 +/* user and group to drop privileges to */ static const char *user = "nobody";
9 static const char *group = "nogroup";
10 +/*Font settings for the time text*/
11 +static const float textsize=64.0;
12 +static const char* textfamily="serif";
13 +static const double textcolorred=255;
14 +static const double textcolorgreen=255;
15 +static const double textcolorblue=255;
16
17 static const char *colorname[NUMCOLS] = {
18 [INIT] = "black", /* after initialization */
19 diff --git a/config.mk b/config.mk
20 index 514c236..c42e301 100644
21 --- a/config.mk
22 +++ b/config.mk
23 @@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib
24
25 # includes and libs
26 INCS = -I. -I/usr/include -I${X11INC}
27 -LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr
28 +LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lcairo
29
30 # flags
31 CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
32 diff --git a/slock.c b/slock.c
33 index b2f14e3..d370a00 100644
34 --- a/slock.c
35 +++ b/slock.c
36 @@ -5,6 +5,7 @@
37 #endif
38
39 #include <ctype.h>
40 +#include <cairo/cairo-xlib.h>
41 #include <errno.h>
42 #include <grp.h>
43 #include <pwd.h>
44 @@ -18,7 +19,8 @@
45 #include <X11/keysym.h>
46 #include <X11/Xlib.h>
47 #include <X11/Xutil.h>
48 -
49 +#include <pthread.h>
50 +#include <time.h>
51 #include "arg.h"
52 #include "util.h"
53
54 @@ -44,6 +46,14 @@ struct xrandr {
55 int errbase;
56 };
57
58 +struct displayData{
59 + struct lock **locks;
60 + Display* dpy;
61 + int nscreens;
62 + cairo_t **crs;
63 + cairo_surface_t **surfaces;
64 +};
65 +static pthread_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER;
66 #include "config.h"
67
68 static void
69 @@ -123,10 +133,46 @@ gethash(void)
70
71 return hash;
72 }
73 +static void
74 +refresh(Display *dpy, Window win , int screen, struct tm time, cairo_t* cr, cairo_surface_t* sfc)
75 +{/*Function that displays given time on the given screen*/
76 + static char tm[24]="";
77 + int xpos,ypos;
78 + xpos=DisplayWidth(dpy, screen)/4;
79 + ypos=DisplayHeight(dpy, screen)/2;
80 + sprintf(tm,"%02d/%02d/%d %02d:%02d",time.tm_mday,time.tm_mon + 1,time.tm_year+1900,time.tm_hour,time.tm_min);
81 + XClearWindow(dpy, win);
82 + cairo_set_source_rgb(cr, textcolorred, textcolorgreen, textcolorblue);
83 + cairo_select_font_face(cr, textfamily, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
84 + cairo_set_font_size(cr, textsize);
85 + cairo_move_to(cr, xpos, ypos);
86 + cairo_show_text(cr, tm);
87 + cairo_surface_flush(sfc);
88 + XFlush(dpy);
89 +}
90 +static void*
91 +displayTime(void* input)
92 +{ /*Thread that keeps track of time and refreshes it every 5 seconds */
93 + struct displayData* displayData=(struct displayData*)input;
94 + while (1){
95 + pthread_mutex_lock(&mutex); /*Mutex to prevent interference with refreshing screen while typing password*/
96 + time_t rawtime;
97 + time(&rawtime);
98 + struct tm tm = *localtime(&rawtime);
99 + for (int k=0;k<displayData->nscreens;k++){
100 + refresh(displayData->dpy, displayData->locks[k]->win, displayData->locks[k]->screen, tm,displayData->crs[k],displayData->surfaces[k]);
101 + }
102 + pthread_mutex_unlock(&mutex);
103 + sleep(5);
104 + }
105 + return NULL;
106 +}
107 +
108 +
109
110 static void
111 readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
112 - const char *hash)
113 + const char *hash,cairo_t **crs,cairo_surface_t **surfaces)
114 {
115 XRRScreenChangeNotifyEvent *rre;
116 char buf[32], passwd[256], *inputhash;
117 @@ -189,16 +235,23 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
118 }
119 color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT);
120 if (running && oldc != color) {
121 + pthread_mutex_lock(&mutex); /*Stop the time refresh thread from interfering*/
122 for (screen = 0; screen < nscreens; screen++) {
123 XSetWindowBackground(dpy,
124 locks[screen]->win,
125 locks[screen]->colors[color]);
126 XClearWindow(dpy, locks[screen]->win);
127 + time_t rawtime;
128 + time(&rawtime);
129 + refresh(dpy, locks[screen]->win,locks[screen]->screen, *localtime(&rawtime),crs[screen],surfaces[screen]);
130 + /*Redraw the time after screen cleared*/
131 }
132 + pthread_mutex_unlock(&mutex);
133 oldc = color;
134 }
135 } else if (rr->active && ev.type == rr->evbase + RRScreenChangeNotify) {
136 rre = (XRRScreenChangeNotifyEvent*)&ev;
137 + pthread_mutex_lock(&mutex); /*Stop the time refresh thread from interfering.*/
138 for (screen = 0; screen < nscreens; screen++) {
139 if (locks[screen]->win == rre->window) {
140 if (rre->rotation == RR_Rotate_90 ||
141 @@ -212,6 +265,8 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
142 break;
143 }
144 }
145 +
146 + pthread_mutex_unlock(&mutex);
147 } else {
148 for (screen = 0; screen < nscreens; screen++)
149 XRaiseWindow(dpy, locks[screen]->win);
150 @@ -343,7 +398,7 @@ main(int argc, char **argv) {
151 errno = 0;
152 if (!crypt("", hash))
153 die("slock: crypt: %s\n", strerror(errno));
154 -
155 + XInitThreads();
156 if (!(dpy = XOpenDisplay(NULL)))
157 die("slock: cannot open display\n");
158
159 @@ -389,7 +444,33 @@ main(int argc, char **argv) {
160 }
161
162 /* everything is now blank. Wait for the correct password */
163 - readpw(dpy, &rr, locks, nscreens, hash);
164 + pthread_t thredid;
165 + /* Create Cairo drawables upon which the time will be shown. */
166 + struct displayData displayData;
167 + cairo_surface_t **surfaces;
168 + cairo_t **crs;
169 + if (!(surfaces=calloc(nscreens, sizeof(cairo_surface_t*)))){
170 + die("Out of memory");
171 + }
172 + if (!(crs=calloc(nscreens, sizeof(cairo_t*)))){
173 + die("Out of memory");
174 + }
175 + for (int k=0;k<nscreens;k++){
176 + Drawable win=locks[k]->win;
177 + int screen=locks[k]->screen;
178 + XMapWindow(dpy, win);
179 + surfaces[k]=cairo_xlib_surface_create(dpy, win, DefaultVisual(dpy, screen),DisplayWidth(dpy, screen) , DisplayHeight(dpy, screen));
180 + crs[k]=cairo_create(surfaces[k]);
181 + }
182 + displayData.dpy=dpy;
183 + displayData.locks=locks;
184 + displayData.nscreens=nscreens;
185 + displayData.crs=crs;
186 + displayData.surfaces=surfaces;
187 + /*Start the thread that redraws time every 5 seconds*/
188 + pthread_create(&thredid, NULL, displayTime, &displayData);
189 + /*Wait for the password*/
190 + readpw(dpy, &rr, locks, nscreens, hash,crs,surfaces);
191
192 return 0;
193 }