apply xresources patch

master
Ryan 2023-09-20 20:50:24 -04:00
parent 81508c6538
commit 5a612138a9
Signed by: ryan
GPG Key ID: 7D7E2E94267DAD95
3 changed files with 81 additions and 0 deletions

View File

@ -9,6 +9,16 @@ static const char *colorname[NUMCOLS] = {
[FAILED] = "#CC3333", /* wrong password */
};
/*
* Xresources preferences to load at startup
*/
ResourcePref resources[] = {
{ "normbgcolor", STRING, &colorname[BACKGROUND] },
{ "normfgcolor", STRING, &colorname[INIT] },
{ "selfgcolor", STRING, &colorname[INPUT] },
{ "failfgcolor", STRING, &colorname[FAILED] },
};
/* treat a cleared input like a wrong password (color) */
static const int failonclear = 1;

68
slock.c
View File

@ -7,6 +7,7 @@
#include <ctype.h>
#include <errno.h>
#include <math.h>
#include <grp.h>
#include <pwd.h>
#include <stdarg.h>
@ -23,6 +24,7 @@
#include <X11/keysym.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xresource.h>
#include <Imlib2.h>
#include "arg.h"
@ -38,6 +40,19 @@ enum {
NUMCOLS
};
/* Xresources preferences */
enum resource_type {
STRING = 0,
INTEGER = 1,
FLOAT = 2
};
typedef struct {
char *name;
enum resource_type type;
void *dst;
} ResourcePref;
#include "config.h"
struct lock {
@ -376,6 +391,57 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
return NULL;
}
int
resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst)
{
char **sdst = dst;
int *idst = dst;
float *fdst = dst;
char fullname[256];
char fullclass[256];
char *type;
XrmValue ret;
snprintf(fullname, sizeof(fullname), "%s.%s", "slock", name);
snprintf(fullclass, sizeof(fullclass), "%s.%s", "Slock", name);
fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0';
XrmGetResource(db, fullname, fullclass, &type, &ret);
if (ret.addr == NULL || strncmp("String", type, 64))
return 1;
switch (rtype) {
case STRING:
*sdst = ret.addr;
break;
case INTEGER:
*idst = strtoul(ret.addr, NULL, 10);
break;
case FLOAT:
*fdst = strtof(ret.addr, NULL);
break;
}
return 0;
}
void
config_init(Display *dpy)
{
char *resm;
XrmDatabase db;
ResourcePref *p;
XrmInitialize();
resm = XResourceManagerString(dpy);
if (!resm)
return;
db = XrmGetStringDatabase(resm);
for (p = resources; p < resources + LEN(resources); p++)
resource_load(db, p->name, p->type, p->dst);
}
static void
usage(void)
{
@ -489,6 +555,8 @@ main(int argc, char **argv) {
#endif
config_init(dpy);
/* check for Xrandr support */
rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase);

3
util.h
View File

@ -1,2 +1,5 @@
/* macros */
#define LEN(a) (sizeof(a) / sizeof(a)[0])
#undef explicit_bzero
void explicit_bzero(void *, size_t);