[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 | |
+ |