sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

st-xresources-20181018-g30ec9a3.diff (4391B)


      1 diff --git a/config.def.h b/config.def.h
      2 index 823e79f..2c07b07 100644
      3 --- a/config.def.h
      4 +++ b/config.def.h
      5 @@ -150,6 +150,41 @@ static unsigned int mousebg = 0;
      6   */
      7  static unsigned int defaultattr = 11;
      8  
      9 +/*
     10 + * Xresources preferences to load at startup
     11 + */
     12 +ResourcePref resources[] = {
     13 +		{ "font",         STRING,  &font },
     14 +		{ "color0",       STRING,  &colorname[0] },
     15 +		{ "color1",       STRING,  &colorname[1] },
     16 +		{ "color2",       STRING,  &colorname[2] },
     17 +		{ "color3",       STRING,  &colorname[3] },
     18 +		{ "color4",       STRING,  &colorname[4] },
     19 +		{ "color5",       STRING,  &colorname[5] },
     20 +		{ "color6",       STRING,  &colorname[6] },
     21 +		{ "color7",       STRING,  &colorname[7] },
     22 +		{ "color8",       STRING,  &colorname[8] },
     23 +		{ "color9",       STRING,  &colorname[9] },
     24 +		{ "color10",      STRING,  &colorname[10] },
     25 +		{ "color11",      STRING,  &colorname[11] },
     26 +		{ "color12",      STRING,  &colorname[12] },
     27 +		{ "color13",      STRING,  &colorname[13] },
     28 +		{ "color14",      STRING,  &colorname[14] },
     29 +		{ "color15",      STRING,  &colorname[15] },
     30 +		{ "background",   STRING,  &colorname[256] },
     31 +		{ "foreground",   STRING,  &colorname[257] },
     32 +		{ "cursorColor",  STRING,  &colorname[258] },
     33 +		{ "termname",     STRING,  &termname },
     34 +		{ "shell",        STRING,  &shell },
     35 +		{ "xfps",         INTEGER, &xfps },
     36 +		{ "actionfps",    INTEGER, &actionfps },
     37 +		{ "blinktimeout", INTEGER, &blinktimeout },
     38 +		{ "bellvolume",   INTEGER, &bellvolume },
     39 +		{ "tabspaces",    INTEGER, &tabspaces },
     40 +		{ "cwscale",      FLOAT,   &cwscale },
     41 +		{ "chscale",      FLOAT,   &chscale },
     42 +};
     43 +
     44  /*
     45   * Internal mouse shortcuts.
     46   * Beware that overloading Button1 will disable the selection.
     47 diff --git a/x.c b/x.c
     48 index 00cb6b1..3652979 100644
     49 --- a/x.c
     50 +++ b/x.c
     51 @@ -14,6 +14,7 @@
     52  #include <X11/keysym.h>
     53  #include <X11/Xft/Xft.h>
     54  #include <X11/XKBlib.h>
     55 +#include <X11/Xresource.h>
     56  
     57  static char *argv0;
     58  #include "arg.h"
     59 @@ -43,6 +44,19 @@ typedef struct {
     60  	signed char appcursor; /* application cursor */
     61  } Key;
     62  
     63 +/* Xresources preferences */
     64 +enum resource_type {
     65 +	STRING = 0,
     66 +	INTEGER = 1,
     67 +	FLOAT = 2
     68 +};
     69 +
     70 +typedef struct {
     71 +	char *name;
     72 +	enum resource_type type;
     73 +	void *dst;
     74 +} ResourcePref;
     75 +
     76  /* X modifiers */
     77  #define XK_ANY_MOD    UINT_MAX
     78  #define XK_NO_MOD     0
     79 @@ -783,8 +797,8 @@ xclear(int x1, int y1, int x2, int y2)
     80  void
     81  xhints(void)
     82  {
     83 -	XClassHint class = {opt_name ? opt_name : termname,
     84 -	                    opt_class ? opt_class : termname};
     85 +	XClassHint class = {opt_name ? opt_name : "st",
     86 +	                    opt_class ? opt_class : "St"};
     87  	XWMHints wm = {.flags = InputHint, .input = 1};
     88  	XSizeHints *sizeh;
     89  
     90 @@ -1005,8 +1019,6 @@ xinit(int cols, int rows)
     91  	pid_t thispid = getpid();
     92  	XColor xmousefg, xmousebg;
     93  
     94 -	if (!(xw.dpy = XOpenDisplay(NULL)))
     95 -		die("can't open display\n");
     96  	xw.scr = XDefaultScreen(xw.dpy);
     97  	xw.vis = XDefaultVisual(xw.dpy, xw.scr);
     98  
     99 @@ -1870,6 +1882,59 @@ run(void)
    100  	}
    101  }
    102  
    103 +int
    104 +resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst)
    105 +{
    106 +	char **sdst = dst;
    107 +	int *idst = dst;
    108 +	float *fdst = dst;
    109 +
    110 +	char fullname[256];
    111 +	char fullclass[256];
    112 +	char *type;
    113 +	XrmValue ret;
    114 +
    115 +	snprintf(fullname, sizeof(fullname), "%s.%s",
    116 +			opt_name ? opt_name : "st", name);
    117 +	snprintf(fullclass, sizeof(fullclass), "%s.%s",
    118 +			opt_class ? opt_class : "St", name);
    119 +	fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0';
    120 +
    121 +	XrmGetResource(db, fullname, fullclass, &type, &ret);
    122 +	if (ret.addr == NULL || strncmp("String", type, 64))
    123 +		return 1;
    124 +
    125 +	switch (rtype) {
    126 +	case STRING:
    127 +		*sdst = ret.addr;
    128 +		break;
    129 +	case INTEGER:
    130 +		*idst = strtoul(ret.addr, NULL, 10);
    131 +		break;
    132 +	case FLOAT:
    133 +		*fdst = strtof(ret.addr, NULL);
    134 +		break;
    135 +	}
    136 +	return 0;
    137 +}
    138 +
    139 +void
    140 +config_init(void)
    141 +{
    142 +	char *resm;
    143 +	XrmDatabase db;
    144 +	ResourcePref *p;
    145 +
    146 +	XrmInitialize();
    147 +	resm = XResourceManagerString(xw.dpy);
    148 +	if (!resm)
    149 +		return;
    150 +
    151 +	db = XrmGetStringDatabase(resm);
    152 +	for (p = resources; p < resources + LEN(resources); p++)
    153 +		resource_load(db, p->name, p->type, p->dst);
    154 +}
    155 +
    156  void
    157  usage(void)
    158  {
    159 @@ -1943,6 +2008,11 @@ run:
    160  
    161  	setlocale(LC_CTYPE, "");
    162  	XSetLocaleModifiers("");
    163 +
    164 +	if(!(xw.dpy = XOpenDisplay(NULL)))
    165 +		die("Can't open display\n");
    166 +
    167 +	config_init();
    168  	cols = MAX(cols, 1);
    169  	rows = MAX(rows, 1);
    170  	tnew(cols, rows);