Introduction
Introduction Statistics Contact Development Disclaimer Help
[slock][patch][colormessage] Update patch - sites - public wiki contents of suc…
git clone git://git.suckless.org/sites
Log
Files
Refs
---
commit 28ebdf173efca3ce3e297d55a72d6f4be2ec552a
parent 1a0794b31a601773be6316d0867de091f5c699a6
Author: Max Schillinger <[email protected]>
Date: Wed, 26 Feb 2025 10:32:09 +0100
[slock][patch][colormessage] Update patch
Diffstat:
M tools.suckless.org/slock/patches/c… | 2 ++
A tools.suckless.org/slock/patches/c… | 284 +++++++++++++++++++++++++++…
2 files changed, 286 insertions(+), 0 deletions(-)
---
diff --git a/tools.suckless.org/slock/patches/colormessage/index.md b/tools.suc…
@@ -32,9 +32,11 @@ This adds three items to `config.h`:
Download
--------
* [slock-colormessage-20200210-35633d4.diff](slock-colormessage-20200210-35633…
+* [slock-colormessage-20250226-a34d8fb.diff](slock-colormessage-20250226-a34d8…
Authors
-------
* Guy Shefy - [email protected]
* Based on patch by Blair Drummond - [email protected]
+* Max Schillinger - [email protected] (20250226 version)
diff --git a/tools.suckless.org/slock/patches/colormessage/slock-colormessage-2…
@@ -0,0 +1,284 @@
+From 6a9553caad8c66f4a9f7adbe0f6501480af0573e Mon Sep 17 00:00:00 2001
+From: Max Schillinger <[email protected]>
+Date: Wed, 26 Feb 2025 10:23:26 +0100
+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 514c236..1421e70 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 40c15e1..85837ee 100644
+--- a/slock.1
++++ b/slock.1
+@@ -7,6 +7,8 @@
+ .Sh SYNOPSIS
+ .Nm
+ .Op Fl v
++.Op Fl f
++.Op Fl m Ar message
+ .Op Ar cmd Op Ar arg ...
+ .Sh DESCRIPTION
+ .Nm
+@@ -19,6 +21,11 @@ The options are as follows:
+ .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 EXIT STATUS
+ .Ex -std
+diff --git a/slock.c b/slock.c
+index b2f14e3..cb450be 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, …
++ 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"…
++ fprintf(stderr, "slock: Try listing fonts with 'slock…
++ 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,…
++ if (escaped_int == 39)
++ continue;
++ if (escaped_int != 38)
++ die("slock: unknown escape se…
++ if (readescapedint(message, &i) != 2)
++ die("slock: only 24 bit color…
++ r = readescapedint(message, &i) & 0xf…
++ g = readescapedint(message, &i) & 0xf…
++ b = readescapedint(message, &i) & 0xf…
++ XSetForeground(dpy, gc, r << 16 | g <…
++ } else
++ die("slock: unknown escape sequence\n…
++ break;
++ default:
++ XDrawString(dpy, win, gc, width + line_len, h…
++ line_len += XTextWidth(fontinfo, message + i,…
++ }
++ }
++
++ /* xsi should not be NULL anyway if Xinerama is active, but to be saf…
++ if (XineramaIsActive(dpy) && xsi != NULL)
++ XFree(xsi);
++}
++
++
++
+ static const char *
+ gethash(void)
+ {
+@@ -194,6 +324,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **lock…
+ locks[screen]->w…
+ locks[screen]->c…
+ XClearWindow(dpy, locks[screen]->win);
++ writemessage(dpy, locks[screen]->win,…
+ }
+ 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':
+ puts("slock-"VERSION);
+ 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*/…
++ 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.48.1
+
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.