sites

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

st-xresources-20180309-c5ba9c0.diff (4798B)


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