sites

public wiki contents of suckless.org
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 <blair.robert.drummond@gmail.com>
      3 Date: Tue, 26 Jun 2018 15:09:13 -0400
      4 Subject: [PATCH] Adds [-m message] option to leave a message on the lockscreen
      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_size;
     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, message, line_len))/2;
    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_replace, height + 20*k, message + j, i - j);
    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 **locks, int nscreens,
    128  					                     locks[screen]->win,
    129  					                     locks[screen]->colors[color]);
    130  					XClearWindow(dpy, locks[screen]->win);
    131 +					writemessage(dpy, locks[screen]->win, screen);
    132  				}
    133  				oldc = color;
    134  			}
    135 @@ -300,7 +366,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
    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