Hello everybody, this is my first PKGBUILD patch script post, along with patches.
It's a slock color message PKGBUILD script with patches. It will download source code (from its repository) and modify it with patches (found here). Program with default settings can be run after packaging. You will have to compile the script modified source code in order to install slock with color messages as command. Post-compilation configuration required for color message operation. Details and instructions included in PKGBUILD.
I would vouch for certain tweaks that makes a representative slock variant for the OS repository. However, libre and simplicity are OS repository goals, plus we have the freedom to share code and patches on this topic. Wouldn't hurt to host them on mirrors. Discussions about packages and patches is a different story.
Package slock
Patch slock-colormessage
Patch backspace or slock-backspace
PKGBUILD
# Maintainer (Arch): Sergej Pupykin <pupykin.s+arch@gmail.com>
# Contributor (Arch): Sebastian A. Liem <sebastian at liem dot se>
# Maintainer: Tobias Dausend <throgh@hyperbola.info>
# Contributor: rachad
#
# Author (slock-colormessage-#-*-#-#-#.patch): Guy Shefy <guyshefyb@gmail.com>
# Contributor (patched slock-colormessage-#-*-#-#-#.patch): Ribby
pkgname=slock
pkgver=1.4
pkgrel=6
pkgdesc="A simple screen locker for X"
pkgdesc="Ribby patched Guy Shefy's color message patch for slock."
pkgdesc="That includes source parameter, patch command of prepare() script, sha512sums parameter, and of course, Contributor parameter crediting me and Guy Shefy."
pkgdesc="It appears that you do not have to patch things."
pkgdesc="All you have to do is 'cd ~/* of PKGBUILD and patches/', 'doas makepkg', 'cd ~/* of PKGBUILD and patches/src/slock-#.#/', and 'doas make clean install'."
pkgdesc="Still, slock's default config renders it inoperable."
pkgdesc="Therefore, I will spell out the config changes for operation."
pkgdesc="Make sure to change config.h in '~/* of PKGBUILD and patches/src/slock-#.#/' directory path."
pkgdesc="'*group = ''nogroup/nobody'';' variable should have a valid user group name (but I could be wrong since I was compiling source code at that time, not making a package)."
pkgdesc="'font_name = ''6x10'';' variable should be a valid value from 'slock -f' command."
pkgdesc="You may set '[INIT]', '[INPUT]', '[FAILED]', 'message', and 'text_color' variable values as permitted by their constraints."
pkgdesc="Custom slock color message command as 'slock -m ''$(printf ''1st line\n2nd line'')'''."
pkgdesc="Afterword, there are other slock patches, but they are currently incompatible by dependency conflict. We will have to wait and see what other patch possibilities could be made, after modular compatibilty."
arch=('i686' 'x86_64')
url='https://tools.suckless.org/slock'
license=('X11')
depends=('libxext' 'libxrandr' 'libxinerama')
source=("https://dl.suckless.org/tools/$pkgname-$pkgver.tar.gz"
"backspace.patch"
"slock-colormessage-20200210-35633d4-1-1-1.patch")
sha512sums=('ad285360dd3f16a225159abaf2f82fabf2c675bd74478cf717f68cbe5941a6c620e3c88544ce675ce3ff19af4bb0675c9405685e0f74ee4e84f7d34c61a0532f'
'da6577a26b488d5f5074786794bad0314bdaf04c738e8fa982d13ee339d3e65330feec125802efd692f3e6a0ec8131d0e9f0deb6f9459bd271d6840bb9a7c311'
'bcaa694aad74a337b1e717509c9cb6499395971bd008019755721803ae881abffbb1fa568d6c2116f8fa66f04b748b9a682039c4ec924e70f189055eedde992f')
prepare() {
cd "$srcdir/slock-$pkgver"
sed -i 's|static const char \*group = "nogroup";|static const char *group = "nobody";|' config.def.h
sed -ri 's/((CPP|C|LD)FLAGS) =/\1 +=/g' config.mk
patch -p1 < $srcdir/backspace.patch
patch -p1 < $srcdir/slock-colormessage-20200210-35633d4-1-1-1.patch
}
build() {
cd "$srcdir/slock-$pkgver"
make X11INC=/usr/include/X11 X11LIB=/usr/lib/X11
}
package() {
cd "$srcdir/slock-$pkgver"
make PREFIX=/usr DESTDIR="$pkgdir" install
install -m644 -D LICENSE -t "$pkgdir/usr/share/licenses/$pkgname"
}
slock-colormessage-20200210-35633d4-1-1-1.patch
From 53ba5a8d3608ca9c9c406b12c51c2bfdfb3e01d3 Mon Sep 17 00:00:00 2001
From: Guy Shefy <guyshefyb@gmail.com>
Date: Wed, 10 Feb 2021 00:17:46 +0200
Subject: [PATCH] Add a message command with 24 bit color support
---
config.def.h | 9 +++
config.mk | 2 +-
slock.1 | 7 +++
slock.c | 154 +++++++++++++++++++++++++++++++++++++++++++++++++--
4 files changed, 167 insertions(+), 5 deletions(-)
diff --git a/config.def.h b/config.def.h
index 9855e21..c2a0ab2 100644
--- a/config.def.h
+++ b/config.def.h
@@ -10,3 +10,12 @@ static const char *colorname[NUMCOLS] = {
/* treat a cleared input like a wrong password (color) */
static const int failonclear = 1;
+
+/* default message */
+static const char * message = "Suckless: Software that sucks less.";
+
+/* text color */
+static const char * text_color = "#ffffff";
+
+/* text size (must be a valid size) */
+static const char * font_name = "6x10";
diff --git a/config.mk b/config.mk
index 74429ae..c4ccf66 100644
--- a/config.mk
+++ b/config.mk
@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib
# includes and libs
INCS = -I. -I/usr/include -I${X11INC}
-LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr
+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lXinerama
# flags
CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
diff --git a/slock.1 b/slock.1
index 82cdcd6..946165f 100644
--- a/slock.1
+++ b/slock.1
@@ -6,6 +6,8 @@
.Sh SYNOPSIS
.Nm
.Op Fl v
+.Op Fl f
+.Op Fl m Ar message
.Op Ar cmd Op Ar arg ...
.Sh DESCRIPTION
.Nm
@@ -16,6 +18,11 @@ is executed after the screen has been locked.
.Bl -tag -width Ds
.It Fl v
Print version information to stdout and exit.
+.It Fl f
+List all valid X fonts and exit.
+.It Fl m Ar message
+Overrides default slock lock message.
+.TP
.El
.Sh SECURITY CONSIDERATIONS
To make sure a locked screen can not be bypassed by switching VTs
diff --git a/slock.c b/slock.c
index 5ae738c..b8b7fe4 100644
--- a/slock.c
+++ b/slock.c
@@ -15,6 +15,7 @@
#include <unistd.h>
#include <sys/types.h>
#include <X11/extensions/Xrandr.h>
+#include <X11/extensions/Xinerama.h>
#include <X11/keysym.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
@@ -24,6 +25,9 @@
char *argv0;
+/* global count to prevent repeated error messages */
+int count_error = 0;
+
enum {
INIT,
INPUT,
@@ -83,6 +87,132 @@ dontkillme(void)
}
#endif
+static int
+readescapedint(const char *str, int *i) {
+ int n = 0;
+ if (str[*i])
+ ++*i;
+ while(str[*i] && str[*i] != ';' && str[*i] != 'm') {
+ n = 10 * n + str[*i] - '0';
+ ++*i;
+ }
+ return n;
+}
+
+static void
+writemessage(Display *dpy, Window win, int screen)
+{
+ int len, line_len, width, height, s_width, s_height, i, k, tab_size, r, g, b, escaped_int, curr_line_len;
+ XGCValues gr_values;
+ XFontStruct *fontinfo;
+ XColor color, dummy;
+ XineramaScreenInfo *xsi;
+ GC gc;
+ fontinfo = XLoadQueryFont(dpy, font_name);
+
+ if (fontinfo == NULL) {
+ if (count_error == 0) {
+ fprintf(stderr, "slock: Unable to load font \"%s\"\n", font_name);
+ fprintf(stderr, "slock: Try listing fonts with 'slock -f'\n");
+ count_error++;
+ }
+ return;
+ }
+
+ tab_size = 8 * XTextWidth(fontinfo, " ", 1);
+
+ XAllocNamedColor(dpy, DefaultColormap(dpy, screen),
+ text_color, &color, &dummy);
+
+ gr_values.font = fontinfo->fid;
+ gr_values.foreground = color.pixel;
+ gc=XCreateGC(dpy,win,GCFont+GCForeground, &gr_values);
+
+ /* To prevent "Uninitialized" warnings. */
+ xsi = NULL;
+
+ /*
+ * Start formatting and drawing text
+ */
+
+ len = strlen(message);
+
+ /* Max max line length (cut at '\n') */
+ line_len = curr_line_len = 0;
+ k = 0;
+ for (i = 0; i < len; i++) {
+ if (message[i] == '\n') {
+ curr_line_len = 0;
+ k++;
+ } else if (message[i] == 0x1b) {
+ while (i < len && message[i] != 'm') {
+ i++;
+ }
+ if (i == len)
+ die("slock: unclosed escape sequence\n");
+ } else {
+ curr_line_len += XTextWidth(fontinfo, message + i, 1);
+ if (curr_line_len > line_len)
+ line_len = curr_line_len;
+ }
+ }
+ /* If there is only one line */
+ if (line_len == 0)
+ line_len = len;
+
+ if (XineramaIsActive(dpy)) {
+ xsi = XineramaQueryScreens(dpy, &i);
+ s_width = xsi[0].width;
+ s_height = xsi[0].height;
+ } else {
+ s_width = DisplayWidth(dpy, screen);
+ s_height = DisplayHeight(dpy, screen);
+ }
+ height = s_height*3/7 - (k*20)/3;
+ width = (s_width - line_len)/2;
+
+ line_len = 0;
+ /* print the text while parsing 24 bit color ANSI escape codes*/
+ for (i = k = 0; i < len; i++) {
+ switch (message[i]) {
+ case '\n':
+ line_len = 0;
+ while (message[i + 1] == '\t') {
+ line_len += tab_size;
+ i++;
+ }
+ k++;
+ break;
+ case 0x1b:
+ i++;
+ if (message[i] == '[') {
+ escaped_int = readescapedint(message, &i);
+ if (escaped_int == 39)
+ continue;
+ if (escaped_int != 38)
+ die("slock: unknown escape sequence%d\n", escaped_int);
+ if (readescapedint(message, &i) != 2)
+ die("slock: only 24 bit color supported\n");
+ r = readescapedint(message, &i) & 0xff;
+ g = readescapedint(message, &i) & 0xff;
+ b = readescapedint(message, &i) & 0xff;
+ XSetForeground(dpy, gc, r << 16 | g << 8 | b);
+ } else
+ die("slock: unknown escape sequence\n");
+ break;
+ default:
+ XDrawString(dpy, win, gc, width + line_len, height + 20 * k, message + i, 1);
+ line_len += XTextWidth(fontinfo, message + i, 1);
+ }
+ }
+
+ /* xsi should not be NULL anyway if Xinerama is active, but to be safe */
+ if (XineramaIsActive(dpy) && xsi != NULL)
+ XFree(xsi);
+}
+
+
+
static const char *
gethash(void)
{
@@ -194,6 +324,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
locks[screen]->win,
locks[screen]->colors[color]);
XClearWindow(dpy, locks[screen]->win);
+ writemessage(dpy, locks[screen]->win, screen);
}
oldc = color;
}
@@ -300,7 +431,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
static void
usage(void)
{
- die("usage: slock [-v] [cmd [arg ...]]\n");
+ die("usage: slock [-v] [-f] [-m message] [cmd [arg ...]]\n");
}
int
@@ -313,12 +444,25 @@ main(int argc, char **argv) {
gid_t dgid;
const char *hash;
Display *dpy;
- int s, nlocks, nscreens;
+ int i, s, nlocks, nscreens;
+ int count_fonts;
+ char **font_names;
ARGBEGIN {
case 'v':
fprintf(stderr, "slock-"VERSION"\n");
return 0;
+ case 'm':
+ message = EARGF(usage());
+ break;
+ case 'f':
+ if (!(dpy = XOpenDisplay(NULL)))
+ die("slock: cannot open display\n");
+ font_names = XListFonts(dpy, "*", 10000 /* list 10000 fonts*/, &count_fonts);
+ for (i=0; i<count_fonts; i++) {
+ fprintf(stderr, "%s\n", *(font_names+i));
+ }
+ return 0;
default:
usage();
} ARGEND
@@ -363,10 +507,12 @@ main(int argc, char **argv) {
if (!(locks = calloc(nscreens, sizeof(struct lock *))))
die("slock: out of memory\n");
for (nlocks = 0, s = 0; s < nscreens; s++) {
- if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL)
+ if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL) {
+ writemessage(dpy, locks[s]->win, s);
nlocks++;
- else
+ } else {
break;
+ }
}
XSync(dpy, 0);
--
2.30.0
backspace.patch
commit 35633d45672d14bd798c478c45d1a17064701aa9
Author: Tobias Stoeckmann <tobias@stoeckmann.org>
Date: Sat Mar 25 21:16:01 2017 +0100
Properly clear the last entered character
When enter is pressed, passwd[len] will be set to '\0'. Pressing
backspace is supposed to remove the last entered character.
But currently, the clearing has an off-by-one, as in setting
passwd[len] to '\0' just like enter would do.
You can also verify it by imagining len=1 and that it's impossible to
clear passwd[0] by pressing backspace with the current code.
Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
diff --git a/slock.c b/slock.c
index d55eb3d..5ae738c 100644
--- a/slock.c
+++ b/slock.c
@@ -177,7 +177,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
break;
case XK_BackSpace:
if (len)
- passwd[len--] = '\0';
+ passwd[--len] = '\0';
break;
default:
if (num && !iscntrl((int)buf[0]) &&