Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -ruN slock-1.6_vanilla/config.def.h slock-1.6/config.def.h
- --- slock-1.6_vanilla/config.def.h 2025-08-09 16:01:01.880269593 +0300
- +++ slock-1.6/config.def.h 2025-09-07 11:45:56.007236114 +0300
- @@ -2,11 +2,21 @@
- static const char *user = "nobody";
- static const char *group = "nogroup";
- -static const char *colorname[NUMCOLS] = {
- - [INIT] = "black", /* after initialization */
- - [INPUT] = "#005577", /* during input */
- - [FAILED] = "#CC3333", /* wrong password */
- +static const char *fonts[] = { "monospace:size=10" };
- +static const char col_wht[] = "#FFFFFF";
- +static const char col_blk[] = "#000000";
- +static const char col_blu[] = "#005577";
- +static const char col_red[] = "#CC3333";
- +static const char col_gry[] = "#CCCCCC";
- +static const char *colors[][3] = {
- + /* fg bg border */
- + [SchemeInit] = { col_wht, col_blk, col_blk },
- + [SchemeInput] = { col_wht, col_blu, col_blu },
- + [SchemeFail] = { col_wht, col_red, col_red },
- + [SchemeNorm] = { col_wht, col_blk, col_blk },
- + [SchemeDark] = { col_gry, col_blk, col_blk },
- };
- +
- /* treat a cleared input like a wrong password (color) */
- static const int failonclear = 1;
- diff -ruN slock-1.6_vanilla/config.mk slock-1.6/config.mk
- --- slock-1.6_vanilla/config.mk 2025-08-09 16:01:01.880269593 +0300
- +++ slock-1.6/config.mk 2025-09-07 11:28:49.588357082 +0300
- @@ -11,14 +11,14 @@
- 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
- +INCS = -I. -I/usr/include -I${X11INC} -I/usr/include/freetype2
- +LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lfontconfig -lXft
- # flags
- CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
- CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
- LDFLAGS = -s ${LIBS}
- -COMPATSRC = explicit_bzero.c
- +COMPATSRC = explicit_bzero.c drw.c util.c
- # On OpenBSD and Darwin remove -lcrypt from LIBS
- #LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXext -lXrandr
- diff -ruN slock-1.6_vanilla/drw.c slock-1.6/drw.c
- --- slock-1.6_vanilla/drw.c 1970-01-01 03:00:00.000000000 +0300
- +++ slock-1.6/drw.c 2025-08-09 16:00:55.740267680 +0300
- @@ -0,0 +1,448 @@
- +/* See LICENSE file for copyright and license details. */
- +#include <stdio.h>
- +#include <stdlib.h>
- +#include <string.h>
- +#include <X11/Xlib.h>
- +#include <X11/Xft/Xft.h>
- +
- +#include "drw.h"
- +#include "util.h"
- +
- +#define UTF_INVALID 0xFFFD
- +
- +static int
- +utf8decode(const char *s_in, long *u, int *err)
- +{
- + static const unsigned char lens[] = {
- + /* 0XXXX */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- + /* 10XXX */ 0, 0, 0, 0, 0, 0, 0, 0, /* invalid */
- + /* 110XX */ 2, 2, 2, 2,
- + /* 1110X */ 3, 3,
- + /* 11110 */ 4,
- + /* 11111 */ 0, /* invalid */
- + };
- + static const unsigned char leading_mask[] = { 0x7F, 0x1F, 0x0F, 0x07 };
- + static const unsigned int overlong[] = { 0x0, 0x80, 0x0800, 0x10000 };
- +
- + const unsigned char *s = (const unsigned char *)s_in;
- + int len = lens[*s >> 3];
- + *u = UTF_INVALID;
- + *err = 1;
- + if (len == 0)
- + return 1;
- +
- + long cp = s[0] & leading_mask[len - 1];
- + for (int i = 1; i < len; ++i) {
- + if (s[i] == '\0' || (s[i] & 0xC0) != 0x80)
- + return i;
- + cp = (cp << 6) | (s[i] & 0x3F);
- + }
- + /* out of range, surrogate, overlong encoding */
- + if (cp > 0x10FFFF || (cp >> 11) == 0x1B || cp < overlong[len - 1])
- + return len;
- +
- + *err = 0;
- + *u = cp;
- + return len;
- +}
- +
- +Drw *
- +drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
- +{
- + Drw *drw = ecalloc(1, sizeof(Drw));
- +
- + drw->dpy = dpy;
- + drw->screen = screen;
- + drw->root = root;
- + drw->w = w;
- + drw->h = h;
- + drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
- + drw->gc = XCreateGC(dpy, root, 0, NULL);
- + XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
- +
- + return drw;
- +}
- +
- +void
- +drw_resize(Drw *drw, unsigned int w, unsigned int h)
- +{
- + if (!drw)
- + return;
- +
- + drw->w = w;
- + drw->h = h;
- + if (drw->drawable)
- + XFreePixmap(drw->dpy, drw->drawable);
- + drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
- +}
- +
- +void
- +drw_free(Drw *drw)
- +{
- + XFreePixmap(drw->dpy, drw->drawable);
- + XFreeGC(drw->dpy, drw->gc);
- + drw_fontset_free(drw->fonts);
- + free(drw);
- +}
- +
- +/* This function is an implementation detail. Library users should use
- + * drw_fontset_create instead.
- + */
- +static Fnt *
- +xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
- +{
- + Fnt *font;
- + XftFont *xfont = NULL;
- + FcPattern *pattern = NULL;
- +
- + if (fontname) {
- + /* Using the pattern found at font->xfont->pattern does not yield the
- + * same substitution results as using the pattern returned by
- + * FcNameParse; using the latter results in the desired fallback
- + * behaviour whereas the former just results in missing-character
- + * rectangles being drawn, at least with some fonts. */
- + if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) {
- + fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname);
- + return NULL;
- + }
- + if (!(pattern = FcNameParse((FcChar8 *) fontname))) {
- + fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname);
- + XftFontClose(drw->dpy, xfont);
- + return NULL;
- + }
- + } else if (fontpattern) {
- + if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
- + fprintf(stderr, "error, cannot load font from pattern.\n");
- + return NULL;
- + }
- + } else {
- + die("no font specified.");
- + }
- +
- + font = ecalloc(1, sizeof(Fnt));
- + font->xfont = xfont;
- + font->pattern = pattern;
- + font->h = xfont->ascent + xfont->descent;
- + font->dpy = drw->dpy;
- +
- + return font;
- +}
- +
- +static void
- +xfont_free(Fnt *font)
- +{
- + if (!font)
- + return;
- + if (font->pattern)
- + FcPatternDestroy(font->pattern);
- + XftFontClose(font->dpy, font->xfont);
- + free(font);
- +}
- +
- +Fnt*
- +drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
- +{
- + Fnt *cur, *ret = NULL;
- + size_t i;
- +
- + if (!drw || !fonts)
- + return NULL;
- +
- + for (i = 1; i <= fontcount; i++) {
- + if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) {
- + cur->next = ret;
- + ret = cur;
- + }
- + }
- + return (drw->fonts = ret);
- +}
- +
- +void
- +drw_fontset_free(Fnt *font)
- +{
- + if (font) {
- + drw_fontset_free(font->next);
- + xfont_free(font);
- + }
- +}
- +
- +void
- +drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
- +{
- + if (!drw || !dest || !clrname)
- + return;
- +
- + if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
- + DefaultColormap(drw->dpy, drw->screen),
- + clrname, dest))
- + die("error, cannot allocate color '%s'", clrname);
- +}
- +
- +/* Wrapper to create color schemes. The caller has to call free(3) on the
- + * returned color scheme when done using it. */
- +Clr *
- +drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
- +{
- + size_t i;
- + Clr *ret;
- +
- + /* need at least two colors for a scheme */
- + if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor))))
- + return NULL;
- +
- + for (i = 0; i < clrcount; i++)
- + drw_clr_create(drw, &ret[i], clrnames[i]);
- + return ret;
- +}
- +
- +void
- +drw_setfontset(Drw *drw, Fnt *set)
- +{
- + if (drw)
- + drw->fonts = set;
- +}
- +
- +void
- +drw_setscheme(Drw *drw, Clr *scm)
- +{
- + if (drw)
- + drw->scheme = scm;
- +}
- +
- +void
- +drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert)
- +{
- + if (!drw || !drw->scheme)
- + return;
- + XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel);
- + if (filled)
- + XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
- + else
- + XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
- +}
- +
- +int
- +drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
- +{
- + int ty, ellipsis_x = 0;
- + unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len, hash, h0, h1;
- + XftDraw *d = NULL;
- + Fnt *usedfont, *curfont, *nextfont;
- + int utf8strlen, utf8charlen, utf8err, render = x || y || w || h;
- + long utf8codepoint = 0;
- + const char *utf8str;
- + FcCharSet *fccharset;
- + FcPattern *fcpattern;
- + FcPattern *match;
- + XftResult result;
- + int charexists = 0, overflow = 0;
- + /* keep track of a couple codepoints for which we have no match. */
- + static unsigned int nomatches[128], ellipsis_width, invalid_width;
- + static const char invalid[] = "�";
- +
- + if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts)
- + return 0;
- +
- + if (!render) {
- + w = invert ? invert : ~invert;
- + } else {
- + XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
- + XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
- + if (w < lpad)
- + return x + w;
- + d = XftDrawCreate(drw->dpy, drw->drawable,
- + DefaultVisual(drw->dpy, drw->screen),
- + DefaultColormap(drw->dpy, drw->screen));
- + x += lpad;
- + w -= lpad;
- + }
- +
- + usedfont = drw->fonts;
- + if (!ellipsis_width && render)
- + ellipsis_width = drw_fontset_getwidth(drw, "...");
- + if (!invalid_width && render)
- + invalid_width = drw_fontset_getwidth(drw, invalid);
- + while (1) {
- + ew = ellipsis_len = utf8err = utf8charlen = utf8strlen = 0;
- + utf8str = text;
- + nextfont = NULL;
- + while (*text) {
- + utf8charlen = utf8decode(text, &utf8codepoint, &utf8err);
- + for (curfont = drw->fonts; curfont; curfont = curfont->next) {
- + charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
- + if (charexists) {
- + drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL);
- + if (ew + ellipsis_width <= w) {
- + /* keep track where the ellipsis still fits */
- + ellipsis_x = x + ew;
- + ellipsis_w = w - ew;
- + ellipsis_len = utf8strlen;
- + }
- +
- + if (ew + tmpw > w) {
- + overflow = 1;
- + /* called from drw_fontset_getwidth_clamp():
- + * it wants the width AFTER the overflow
- + */
- + if (!render)
- + x += tmpw;
- + else
- + utf8strlen = ellipsis_len;
- + } else if (curfont == usedfont) {
- + text += utf8charlen;
- + utf8strlen += utf8err ? 0 : utf8charlen;
- + ew += utf8err ? 0 : tmpw;
- + } else {
- + nextfont = curfont;
- + }
- + break;
- + }
- + }
- +
- + if (overflow || !charexists || nextfont || utf8err)
- + break;
- + else
- + charexists = 0;
- + }
- +
- + if (utf8strlen) {
- + if (render) {
- + ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent;
- + XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg],
- + usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen);
- + }
- + x += ew;
- + w -= ew;
- + }
- + if (utf8err && (!render || invalid_width < w)) {
- + if (render)
- + drw_text(drw, x, y, w, h, 0, invalid, invert);
- + x += invalid_width;
- + w -= invalid_width;
- + }
- + if (render && overflow)
- + drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert);
- +
- + if (!*text || overflow) {
- + break;
- + } else if (nextfont) {
- + charexists = 0;
- + usedfont = nextfont;
- + } else {
- + /* Regardless of whether or not a fallback font is found, the
- + * character must be drawn. */
- + charexists = 1;
- +
- + hash = (unsigned int)utf8codepoint;
- + hash = ((hash >> 16) ^ hash) * 0x21F0AAAD;
- + hash = ((hash >> 15) ^ hash) * 0xD35A2D97;
- + h0 = ((hash >> 15) ^ hash) % LENGTH(nomatches);
- + h1 = (hash >> 17) % LENGTH(nomatches);
- + /* avoid expensive XftFontMatch call when we know we won't find a match */
- + if (nomatches[h0] == utf8codepoint || nomatches[h1] == utf8codepoint)
- + goto no_match;
- +
- + fccharset = FcCharSetCreate();
- + FcCharSetAddChar(fccharset, utf8codepoint);
- +
- + if (!drw->fonts->pattern) {
- + /* Refer to the comment in xfont_create for more information. */
- + die("the first font in the cache must be loaded from a font string.");
- + }
- +
- + fcpattern = FcPatternDuplicate(drw->fonts->pattern);
- + FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
- + FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
- +
- + FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
- + FcDefaultSubstitute(fcpattern);
- + match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result);
- +
- + FcCharSetDestroy(fccharset);
- + FcPatternDestroy(fcpattern);
- +
- + if (match) {
- + usedfont = xfont_create(drw, NULL, match);
- + if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) {
- + for (curfont = drw->fonts; curfont->next; curfont = curfont->next)
- + ; /* NOP */
- + curfont->next = usedfont;
- + } else {
- + xfont_free(usedfont);
- + nomatches[nomatches[h0] ? h1 : h0] = utf8codepoint;
- +no_match:
- + usedfont = drw->fonts;
- + }
- + }
- + }
- + }
- + if (d)
- + XftDrawDestroy(d);
- +
- + return x + (render ? w : 0);
- +}
- +
- +void
- +drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
- +{
- + if (!drw)
- + return;
- +
- + XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y);
- + XSync(drw->dpy, False);
- +}
- +
- +unsigned int
- +drw_fontset_getwidth(Drw *drw, const char *text)
- +{
- + if (!drw || !drw->fonts || !text)
- + return 0;
- + return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
- +}
- +
- +unsigned int
- +drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n)
- +{
- + unsigned int tmp = 0;
- + if (drw && drw->fonts && text && n)
- + tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n);
- + return MIN(n, tmp);
- +}
- +
- +void
- +drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
- +{
- + XGlyphInfo ext;
- +
- + if (!font || !text)
- + return;
- +
- + XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
- + if (w)
- + *w = ext.xOff;
- + if (h)
- + *h = font->h;
- +}
- +
- +Cur *
- +drw_cur_create(Drw *drw, int shape)
- +{
- + Cur *cur;
- +
- + if (!drw || !(cur = ecalloc(1, sizeof(Cur))))
- + return NULL;
- +
- + cur->cursor = XCreateFontCursor(drw->dpy, shape);
- +
- + return cur;
- +}
- +
- +void
- +drw_cur_free(Drw *drw, Cur *cursor)
- +{
- + if (!cursor)
- + return;
- +
- + XFreeCursor(drw->dpy, cursor->cursor);
- + free(cursor);
- +}
- diff -ruN slock-1.6_vanilla/drw.h slock-1.6/drw.h
- --- slock-1.6_vanilla/drw.h 1970-01-01 03:00:00.000000000 +0300
- +++ slock-1.6/drw.h 2025-08-09 16:00:55.740267680 +0300
- @@ -0,0 +1,58 @@
- +/* See LICENSE file for copyright and license details. */
- +
- +typedef struct {
- + Cursor cursor;
- +} Cur;
- +
- +typedef struct Fnt {
- + Display *dpy;
- + unsigned int h;
- + XftFont *xfont;
- + FcPattern *pattern;
- + struct Fnt *next;
- +} Fnt;
- +
- +enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
- +typedef XftColor Clr;
- +
- +typedef struct {
- + unsigned int w, h;
- + Display *dpy;
- + int screen;
- + Window root;
- + Drawable drawable;
- + GC gc;
- + Clr *scheme;
- + Fnt *fonts;
- +} Drw;
- +
- +/* Drawable abstraction */
- +Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
- +void drw_resize(Drw *drw, unsigned int w, unsigned int h);
- +void drw_free(Drw *drw);
- +
- +/* Fnt abstraction */
- +Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
- +void drw_fontset_free(Fnt* set);
- +unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
- +unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n);
- +void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
- +
- +/* Colorscheme abstraction */
- +void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
- +Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
- +
- +/* Cursor abstraction */
- +Cur *drw_cur_create(Drw *drw, int shape);
- +void drw_cur_free(Drw *drw, Cur *cursor);
- +
- +/* Drawing context manipulation */
- +void drw_setfontset(Drw *drw, Fnt *set);
- +void drw_setscheme(Drw *drw, Clr *scm);
- +
- +/* Drawing functions */
- +void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
- +int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
- +
- +/* Map functions */
- +void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);
- diff -ruN slock-1.6_vanilla/Makefile slock-1.6/Makefile
- --- slock-1.6_vanilla/Makefile 2025-08-09 16:01:01.880269593 +0300
- +++ slock-1.6/Makefile 2025-09-07 11:25:35.017045470 +0300
- @@ -25,7 +25,7 @@
- dist: clean
- mkdir -p slock-${VERSION}
- cp -R LICENSE Makefile README slock.1 config.mk \
- - ${SRC} config.def.h arg.h util.h slock-${VERSION}
- + ${SRC} config.def.h arg.h drw.h util.h slock-${VERSION}
- tar -cf slock-${VERSION}.tar slock-${VERSION}
- gzip slock-${VERSION}.tar
- rm -rf slock-${VERSION}
- diff -ruN slock-1.6_vanilla/slock.c slock-1.6/slock.c
- --- slock-1.6_vanilla/slock.c 2025-08-09 16:01:01.880269593 +0300
- +++ slock-1.6/slock.c 2025-09-07 12:49:33.112322994 +0300
- @@ -19,24 +19,22 @@
- #include <X11/keysym.h>
- #include <X11/Xlib.h>
- #include <X11/Xutil.h>
- +#include <X11/Xft/Xft.h>
- #include "arg.h"
- +#include "drw.h"
- #include "util.h"
- char *argv0;
- -enum {
- - INIT,
- - INPUT,
- - FAILED,
- - NUMCOLS
- -};
- +#define TEXTW(X) (drw_fontset_getwidth(drw, (X)))
- +enum { SchemeInit, SchemeInput, SchemeFail, SchemeNorm, SchemeDark }; /* color schemes */
- +enum { FGCOL, BGCOL, BRCOL }; /* colors in color scheme */
- struct lock {
- - int screen;
- - Window root, win;
- - Pixmap pmap;
- - unsigned long colors[NUMCOLS];
- + Drw *drw;
- + Clr **scheme;
- + Window win;
- };
- struct xrandr {
- @@ -47,17 +45,6 @@
- #include "config.h"
- -static void
- -die(const char *errstr, ...)
- -{
- - va_list ap;
- -
- - va_start(ap, errstr);
- - vfprintf(stderr, errstr, ap);
- - va_end(ap);
- - exit(1);
- -}
- -
- #ifdef __linux__
- #include <fcntl.h>
- #include <linux/oom.h>
- @@ -139,7 +126,7 @@
- len = 0;
- running = 1;
- failure = 0;
- - oldc = INIT;
- + oldc = SchemeInit;
- while (running && !XNextEvent(dpy, &ev)) {
- if (ev.type == KeyPress) {
- @@ -188,13 +175,18 @@
- }
- break;
- }
- - color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT);
- + color = len ? SchemeInput : ((failure || failonclear) ? SchemeFail : SchemeInit);
- if (running && oldc != color) {
- for (screen = 0; screen < nscreens; screen++) {
- - XSetWindowBackground(dpy,
- + XSetWindowBackground(dpy,
- locks[screen]->win,
- - locks[screen]->colors[color]);
- + locks[screen]->drw->scheme[BGCOL].pixel);
- XClearWindow(dpy, locks[screen]->win);
- + //drw_setscheme(locks[screen]->drw, locks[screen]->scheme[color]);
- + //drw_rect(locks[screen]->drw, 0, 0, locks[screen]->drw->w, locks[screen]->drw->h, 1, 1);
- + //drw_setscheme(locks[screen]->drw, locks[screen]->scheme[SchemeNorm]);
- + //drw_text(locks[screen]->drw, 100, 150, drw_fontset_getwidth(locks[screen]->drw,"Hello, drw!"), locks[screen]->drw->fonts->h, 0, "Hello, drw!", 0);
- + //drw_map(locks[screen]->drw, locks[screen]->win, 0, 0, locks[screen]->drw->w,locks[screen]->drw->h);
- }
- oldc = color;
- }
- @@ -224,49 +216,51 @@
- lockscreen(Display *dpy, struct xrandr *rr, int screen)
- {
- char curs[] = {0, 0, 0, 0, 0, 0, 0, 0};
- - int i, ptgrab, kbgrab;
- + int i, ptgrab, kbgrab, w, h;
- + Window root;
- + Pixmap pmap;
- struct lock *lock;
- - XColor color, dummy;
- + XColor color = {0, 0, 0, DoRed | DoGreen | DoBlue};
- XSetWindowAttributes wa;
- Cursor invisible;
- if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock))))
- return NULL;
- - lock->screen = screen;
- - lock->root = RootWindow(dpy, lock->screen);
- -
- - for (i = 0; i < NUMCOLS; i++) {
- - XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen),
- - colorname[i], &color, &dummy);
- - lock->colors[i] = color.pixel;
- - }
- + root = RootWindow(dpy, screen);
- + w = DisplayWidth(dpy, screen);
- + h = DisplayHeight(dpy, screen);
- + lock->drw = drw_create(dpy, screen, root, w, h);
- + lock->drw->fonts = drw_fontset_create(lock->drw, fonts, LENGTH(fonts));
- +
- + lock->scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
- + for (i = 0; i < LENGTH(colors); i++) {
- + lock->scheme[i] = drw_scm_create(lock->drw, colors[i], 3);
- + };
- /* init */
- wa.override_redirect = 1;
- - wa.background_pixel = lock->colors[INIT];
- - lock->win = XCreateWindow(dpy, lock->root, 0, 0,
- - DisplayWidth(dpy, lock->screen),
- - DisplayHeight(dpy, lock->screen),
- - 0, DefaultDepth(dpy, lock->screen),
- + wa.background_pixel = lock->scheme[SchemeInit][BGCOL].pixel;
- + lock->win = XCreateWindow(dpy, lock->drw->root, 0, 0, w, h,
- + 0, DefaultDepth(dpy, lock->drw->screen),
- CopyFromParent,
- - DefaultVisual(dpy, lock->screen),
- + DefaultVisual(dpy, lock->drw->screen),
- CWOverrideRedirect | CWBackPixel, &wa);
- - lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8);
- - invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap,
- + pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8);
- + invisible = XCreatePixmapCursor(dpy, pmap, pmap,
- &color, &color, 0, 0);
- XDefineCursor(dpy, lock->win, invisible);
- /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */
- for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) {
- if (ptgrab != GrabSuccess) {
- - ptgrab = XGrabPointer(dpy, lock->root, False,
- + ptgrab = XGrabPointer(dpy, lock->drw->root, False,
- ButtonPressMask | ButtonReleaseMask |
- PointerMotionMask, GrabModeAsync,
- - GrabModeAsync, None, invisible, CurrentTime);
- + GrabModeAsync, None, None, CurrentTime);
- }
- if (kbgrab != GrabSuccess) {
- - kbgrab = XGrabKeyboard(dpy, lock->root, True,
- + kbgrab = XGrabKeyboard(dpy, lock->drw->root, True,
- GrabModeAsync, GrabModeAsync, CurrentTime);
- }
- @@ -276,7 +270,7 @@
- if (rr->active)
- XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask);
- - XSelectInput(dpy, lock->root, SubstructureNotifyMask);
- + XSelectInput(dpy, lock->drw->root, SubstructureNotifyMask);
- return lock;
- }
- diff -ruN slock-1.6_vanilla/util.c slock-1.6/util.c
- --- slock-1.6_vanilla/util.c 1970-01-01 03:00:00.000000000 +0300
- +++ slock-1.6/util.c 2025-09-07 11:33:50.282776242 +0300
- @@ -0,0 +1,28 @@
- +#include <stdarg.h>
- +#include <stdio.h>
- +#include <stdlib.h>
- +#include <string.h>
- +
- +#include "util.h"
- +
- +void
- +die(const char *errstr, ...)
- +{
- + va_list ap;
- +
- + va_start(ap, errstr);
- + vfprintf(stderr, errstr, ap);
- + va_end(ap);
- + exit(1);
- +}
- +
- +void *
- +ecalloc(size_t nmemb, size_t size)
- +{
- + void *p;
- +
- + if (!(p = calloc(nmemb, size)))
- + die("calloc:");
- + return p;
- +}
- +
- diff -ruN slock-1.6_vanilla/util.h slock-1.6/util.h
- --- slock-1.6_vanilla/util.h 2025-08-09 16:01:01.880269593 +0300
- +++ slock-1.6/util.h 2025-09-07 11:33:55.697781967 +0300
- @@ -1,2 +1,9 @@
- #undef explicit_bzero
- void explicit_bzero(void *, size_t);
- +void die(const char *errstr, ...);
- +void *ecalloc(size_t nmemb, size_t size);
- +
- +#define MAX(A, B) ((A) > (B) ? (A) : (B))
- +#define MIN(A, B) ((A) < (B) ? (A) : (B))
- +#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B))
- +#define LENGTH(X) (sizeof (X) / sizeof (X)[0])
Advertisement
Add Comment
Please, Sign In to add comment