tabbed-xresources-20210317-dabf6a2.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
tabbed-xresources-20210317-dabf6a2.diff (4725B)
---
1 From 8c48f1564c555bbd21758a3a70a9984e61c34a35 Mon Sep 17 00:00:00 2001
2 From: 6d6f7274686f6e <4648531+6d6f7274686f6e@users.noreply.github.com>
3 Date: Wed, 17 Mar 2021 10:59:18 +0100
4 Subject: [PATCH] xresources support
5
6 ---
7 config.def.h | 27 ++++++++++++++------
8 tabbed.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++
9 2 files changed, 89 insertions(+), 7 deletions(-)
10
11 diff --git a/config.def.h b/config.def.h
12 index defa426..244e288 100644
13 --- a/config.def.h
14 +++ b/config.def.h
15 @@ -1,13 +1,13 @@
16 /* See LICENSE file for copyright and license details. */
17
18 /* appearance */
19 -static const char font[] = "monospace:size=9";
20 -static const char* normbgcolor = "#222222";
21 -static const char* normfgcolor = "#cccccc";
22 -static const char* selbgcolor = "#555555";
23 -static const char* selfgcolor = "#ffffff";
24 -static const char* urgbgcolor = "#111111";
25 -static const char* urgfgcolor = "#cc0000";
26 +static char font[] = "monospace:size=9";
27 +static char* normbgcolor = "#222222";
28 +static char* normfgcolor = "#cccccc";
29 +static char* selbgcolor = "#555555";
30 +static char* selfgcolor = "#ffffff";
31 +static char* urgbgcolor = "#111111";
32 +static char* urgfgcolor = "#cc0000";
33 static const char before[] = "<";
34 static const char after[] = ">";
35 static const char titletrim[] = "...";
36 @@ -33,6 +33,19 @@ static Bool npisrelative = False;
37 } \
38 }
39
40 +/*
41 + * Xresources preferences to load at startup
42 + */
43 +ResourcePref resources[] = {
44 + { "font", STRING, &font },
45 + { "color0", STRING, &normbgcolor },
46 + { "color4", STRING, &normfgcolor },
47 + { "color4", STRING, &selbgcolor },
48 + { "color7", STRING, &selfgcolor },
49 + { "color2", STRING, &urgbgcolor },
50 + { "color3", STRING, &urgfgcolor },
51 +};
52 +
53 #define MODKEY ControlMask
54 static Key keys[] = {
55 /* modifier key function argument */
56 diff --git a/tabbed.c b/tabbed.c
57 index eafe28a..c5bffc7 100644
58 --- a/tabbed.c
59 +++ b/tabbed.c
60 @@ -13,6 +13,7 @@
61 #include <X11/Xatom.h>
62 #include <X11/Xlib.h>
63 #include <X11/Xproto.h>
64 +#include <X11/Xresource.h>
65 #include <X11/Xutil.h>
66 #include <X11/XKBlib.h>
67 #include <X11/Xft/Xft.h>
68 @@ -85,11 +86,26 @@ typedef struct {
69 Bool urgent;
70 Bool closed;
71 } Client;
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
87 /* function declarations */
88 static void buttonpress(const XEvent *e);
89 static void cleanup(void);
90 static void clientmessage(const XEvent *e);
91 +static void config_init(void);
92 static void configurenotify(const XEvent *e);
93 static void configurerequest(const XEvent *e);
94 static void createnotify(const XEvent *e);
95 @@ -120,6 +136,7 @@ static void move(const Arg *arg);
96 static void movetab(const Arg *arg);
97 static void propertynotify(const XEvent *e);
98 static void resize(int c, int w, int h);
99 +static int resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst);
100 static void rotate(const Arg *arg);
101 static void run(void);
102 static void sendxembed(int c, long msg, long detail, long d1, long d2);
103 @@ -245,6 +262,23 @@ clientmessage(const XEvent *e)
104 }
105 }
106
107 +void
108 +config_init(void)
109 +{
110 + char *resm;
111 + XrmDatabase db;
112 + ResourcePref *p;
113 +
114 + XrmInitialize();
115 + resm = XResourceManagerString(dpy);
116 + if (!resm)
117 + return;
118 +
119 + db = XrmGetStringDatabase(resm);
120 + for (p = resources; p < resources + LENGTH(resources); p++)
121 + resource_load(db, p->name, p->type, p->dst);
122 +}
123 +
124 void
125 configurenotify(const XEvent *e)
126 {
127 @@ -897,6 +931,40 @@ resize(int c, int w, int h)
128 (XEvent *)&ce);
129 }
130
131 +int
132 +resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst)
133 +{
134 + char **sdst = dst;
135 + int *idst = dst;
136 + float *fdst = dst;
137 +
138 + char fullname[256];
139 + char fullclass[256];
140 + char *type;
141 + XrmValue ret;
142 +
143 + snprintf(fullname, sizeof(fullname), "%s.%s", "tabbed", name);
144 + snprintf(fullclass, sizeof(fullclass), "%s.%s", "tabbed", name);
145 + fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0';
146 +
147 + XrmGetResource(db, fullname, fullclass, &type, &ret);
148 + if (ret.addr == NULL || strncmp("String", type, 64))
149 + return 1;
150 +
151 + switch (rtype) {
152 + case STRING:
153 + *sdst = ret.addr;
154 + break;
155 + case INTEGER:
156 + *idst = strtoul(ret.addr, NULL, 10);
157 + break;
158 + case FLOAT:
159 + *fdst = strtof(ret.addr, NULL);
160 + break;
161 + }
162 + return 0;
163 +}
164 +
165 void
166 rotate(const Arg *arg)
167 {
168 @@ -1354,6 +1422,7 @@ main(int argc, char *argv[])
169 if (!(dpy = XOpenDisplay(NULL)))
170 die("%s: cannot open display\n", argv0);
171
172 + config_init();
173 setup();
174 printf("0x%lx\n", win);
175 fflush(NULL);
176 --
177 2.30.2
178