Adding xresources patch

This commit is contained in:
bakkeby 2019-09-16 14:21:09 +02:00
parent 7615c2f0aa
commit 4bd0ed3327
7 changed files with 131 additions and 0 deletions

View File

@ -162,6 +162,44 @@ static unsigned int mousebg = 0;
*/
static unsigned int defaultattr = 11;
#if XRESOURCES_PATCH
/*
* Xresources preferences to load at startup
*/
ResourcePref resources[] = {
{ "font", STRING, &font },
{ "color0", STRING, &colorname[0] },
{ "color1", STRING, &colorname[1] },
{ "color2", STRING, &colorname[2] },
{ "color3", STRING, &colorname[3] },
{ "color4", STRING, &colorname[4] },
{ "color5", STRING, &colorname[5] },
{ "color6", STRING, &colorname[6] },
{ "color7", STRING, &colorname[7] },
{ "color8", STRING, &colorname[8] },
{ "color9", STRING, &colorname[9] },
{ "color10", STRING, &colorname[10] },
{ "color11", STRING, &colorname[11] },
{ "color12", STRING, &colorname[12] },
{ "color13", STRING, &colorname[13] },
{ "color14", STRING, &colorname[14] },
{ "color15", STRING, &colorname[15] },
{ "background", STRING, &colorname[256] },
{ "foreground", STRING, &colorname[257] },
{ "cursorColor", STRING, &colorname[258] },
{ "termname", STRING, &termname },
{ "shell", STRING, &shell },
{ "xfps", INTEGER, &xfps },
{ "actionfps", INTEGER, &actionfps },
{ "blinktimeout", INTEGER, &blinktimeout },
{ "bellvolume", INTEGER, &bellvolume },
{ "tabspaces", INTEGER, &tabspaces },
{ "borderpx", INTEGER, &borderpx },
{ "cwscale", FLOAT, &cwscale },
{ "chscale", FLOAT, &chscale },
};
#endif // XRESOURCES_PATCH
/*
* Internal mouse shortcuts.
* Beware that overloading Button1 will disable the selection.

View File

@ -6,4 +6,8 @@
#if FIXIME_PATCH
#include "fixime.c"
#endif
#if XRESOURCES_PATCH
#include "xresources.c"
#endif

View File

@ -6,4 +6,8 @@
#if FIXIME_PATCH
#include "fixime.h"
#endif
#if XRESOURCES_PATCH
#include "xresources.h"
#endif

52
patch/xresources.c Normal file
View File

@ -0,0 +1,52 @@
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",
opt_name ? opt_name : "st", name);
snprintf(fullclass, sizeof(fullclass), "%s.%s",
opt_class ? opt_class : "St", 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(void)
{
char *resm;
XrmDatabase db;
ResourcePref *p;
XrmInitialize();
resm = XResourceManagerString(xw.dpy);
if (!resm)
return;
db = XrmGetStringDatabase(resm);
for (p = resources; p < resources + LEN(resources); p++)
resource_load(db, p->name, p->type, p->dst);
}

17
patch/xresources.h Normal file
View File

@ -0,0 +1,17 @@
#include <X11/Xresource.h>
/* Xresources preferences */
enum resource_type {
STRING = 0,
INTEGER = 1,
FLOAT = 2
};
typedef struct {
char *name;
enum resource_type type;
void *dst;
} ResourcePref;
int resource_load(XrmDatabase, char *, enum resource_type, void *);
void config_init(void);

View File

@ -80,3 +80,8 @@
*/
#define OPENCOPIED_PATCH 1
/* This patch adds the ability to configure st via Xresources. At startup, st will read and
* apply the resources named in the resources[] array in config.h.
* https://st.suckless.org/patches/xresources/
*/
#define XRESOURCES_PATCH 1

11
x.c
View File

@ -847,8 +847,13 @@ xclear(int x1, int y1, int x2, int y2)
void
xhints(void)
{
#if XRESOURCES_PATCH
XClassHint class = {opt_name ? opt_name : "st",
opt_class ? opt_class : "St"};
#else
XClassHint class = {opt_name ? opt_name : termname,
opt_class ? opt_class : termname};
#endif // XRESOURCES_PATCH
XWMHints wm = {.flags = InputHint, .input = 1};
XSizeHints *sizeh;
@ -2157,6 +2162,12 @@ run:
setlocale(LC_CTYPE, "");
XSetLocaleModifiers("");
#if XRESOURCES_PATCH
if (!(xw.dpy = XOpenDisplay(NULL)))
die("Can't open display\n");
config_init();
#endif // XRESOURCES_PATCH
cols = MAX(cols, 1);
rows = MAX(rows, 1);
tnew(cols, rows);