st-xresources-20181018-g30ec9a3.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) 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);