tabbed-xresources-20230128-41e2b8f.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
tabbed-xresources-20230128-41e2b8f.diff (6210B)
---
1 From 46115eedb8ba1da17ea6fb76eb9ffba806faa828 Mon Sep 17 00:00:00 2001
2 From: Casey Fitzpatrick <kcghost@gmail.com>
3 Date: Sat, 28 Jan 2023 10:13:45 -0500
4 Subject: [PATCH] xresources support
5
6 Rename foreground to focusnew to avoid conflict with common usage in Xresources
7 ---
8 config.def.h | 51 +++++++++++++++++++++++++-----------
9 tabbed.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++--
10 2 files changed, 107 insertions(+), 17 deletions(-)
11
12 diff --git a/config.def.h b/config.def.h
13 index 51bb13d..76059d3 100644
14 --- a/config.def.h
15 +++ b/config.def.h
16 @@ -1,27 +1,27 @@
17 /* See LICENSE file for copyright and license details. */
18
19 /* appearance */
20 -static const char font[] = "monospace:size=9";
21 -static const char* normbgcolor = "#222222";
22 -static const char* normfgcolor = "#cccccc";
23 -static const char* selbgcolor = "#555555";
24 -static const char* selfgcolor = "#ffffff";
25 -static const char* urgbgcolor = "#111111";
26 -static const char* urgfgcolor = "#cc0000";
27 -static const char before[] = "<";
28 -static const char after[] = ">";
29 -static const char titletrim[] = "...";
30 -static const int tabwidth = 200;
31 -static const Bool foreground = True;
32 -static Bool urgentswitch = False;
33 +static char* font = "monospace:size=9";
34 +static char* normbgcolor = "#222222";
35 +static char* normfgcolor = "#cccccc";
36 +static char* selbgcolor = "#555555";
37 +static char* selfgcolor = "#ffffff";
38 +static char* urgbgcolor = "#111111";
39 +static char* urgfgcolor = "#cc0000";
40 +static char* before = "<";
41 +static char* after = ">";
42 +static char* titletrim = "...";
43 +static int tabwidth = 200;
44 +static int focusnew = 1;
45 +static int urgentswitch = 0;
46
47 /*
48 * Where to place a new tab when it is opened. When npisrelative is True,
49 * then the current position is changed + newposition. If npisrelative
50 * is False, then newposition is an absolute position.
51 */
52 -static int newposition = 0;
53 -static Bool npisrelative = False;
54 +static int newposition = 0;
55 +static int npisrelative = 0;
56
57 #define SETPROP(p) { \
58 .v = (char *[]){ "/bin/sh", "-c", \
59 @@ -33,6 +33,27 @@ static Bool npisrelative = False;
60 } \
61 }
62
63 +/*
64 + * Xresources preferences to load at startup
65 + */
66 +ResourcePref resources[] = {
67 + { "font", STRING, &font},
68 + { "normbgcolor", STRING, &normbgcolor},
69 + { "normfgcolor", STRING, &normfgcolor},
70 + { "selbgcolor", STRING, &selbgcolor},
71 + { "selfgcolor", STRING, &selfgcolor},
72 + { "urgbgcolor", STRING, &urgbgcolor},
73 + { "urgfgcolor", STRING, &urgfgcolor},
74 + { "before", STRING, &before},
75 + { "after", STRING, &after},
76 + { "titletrim", STRING, &titletrim},
77 + { "tabwidth", INTEGER, &tabwidth},
78 + { "focusnew", INTEGER, &focusnew},
79 + { "urgentswitch", INTEGER, &urgentswitch},
80 + { "newposition", INTEGER, &newposition},
81 + { "npisrelative", INTEGER, &npisrelative},
82 +};
83 +
84 #define MODKEY ControlMask
85 static const Key keys[] = {
86 /* modifier key function argument */
87 diff --git a/tabbed.c b/tabbed.c
88 index eafe28a..6ca3454 100644
89 --- a/tabbed.c
90 +++ b/tabbed.c
91 @@ -13,6 +13,7 @@
92 #include <X11/Xatom.h>
93 #include <X11/Xlib.h>
94 #include <X11/Xproto.h>
95 +#include <X11/Xresource.h>
96 #include <X11/Xutil.h>
97 #include <X11/XKBlib.h>
98 #include <X11/Xft/Xft.h>
99 @@ -85,11 +86,26 @@ typedef struct {
100 Bool urgent;
101 Bool closed;
102 } Client;
103 +
104 +/* Xresources preferences */
105 +enum resource_type {
106 + STRING = 0,
107 + INTEGER = 1,
108 + FLOAT = 2
109 +};
110 +
111 +typedef struct {
112 + char *name;
113 + enum resource_type type;
114 + void *dst;
115 +} ResourcePref;
116 +
117
118 /* function declarations */
119 static void buttonpress(const XEvent *e);
120 static void cleanup(void);
121 static void clientmessage(const XEvent *e);
122 +static void config_init(void);
123 static void configurenotify(const XEvent *e);
124 static void configurerequest(const XEvent *e);
125 static void createnotify(const XEvent *e);
126 @@ -120,6 +136,7 @@ static void move(const Arg *arg);
127 static void movetab(const Arg *arg);
128 static void propertynotify(const XEvent *e);
129 static void resize(int c, int w, int h);
130 +static int resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst);
131 static void rotate(const Arg *arg);
132 static void run(void);
133 static void sendxembed(int c, long msg, long detail, long d1, long d2);
134 @@ -245,6 +262,23 @@ clientmessage(const XEvent *e)
135 }
136 }
137
138 +void
139 +config_init(void)
140 +{
141 + char *resm;
142 + XrmDatabase db;
143 + ResourcePref *p;
144 +
145 + XrmInitialize();
146 + resm = XResourceManagerString(dpy);
147 + if (!resm)
148 + return;
149 +
150 + db = XrmGetStringDatabase(resm);
151 + for (p = resources; p < resources + LENGTH(resources); p++)
152 + resource_load(db, p->name, p->type, p->dst);
153 +}
154 +
155 void
156 configurenotify(const XEvent *e)
157 {
158 @@ -771,7 +805,7 @@ manage(Window w)
159 focus(nextfocus ? nextpos :
160 sel < 0 ? 0 :
161 sel);
162 - nextfocus = foreground;
163 + nextfocus = focusnew;
164 }
165 }
166
167 @@ -897,6 +931,40 @@ resize(int c, int w, int h)
168 (XEvent *)&ce);
169 }
170
171 +int
172 +resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst)
173 +{
174 + char **sdst = dst;
175 + int *idst = dst;
176 + float *fdst = dst;
177 +
178 + char fullname[256];
179 + char fullclass[256];
180 + char *type;
181 + XrmValue ret;
182 +
183 + snprintf(fullname, sizeof(fullname), "%s.%s", "tabbed", name);
184 + snprintf(fullclass, sizeof(fullclass), "%s.%s", "tabbed", name);
185 + fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0';
186 +
187 + XrmGetResource(db, fullname, fullclass, &type, &ret);
188 + if (ret.addr == NULL || strncmp("String", type, 64))
189 + return 1;
190 +
191 + switch (rtype) {
192 + case STRING:
193 + *sdst = ret.addr;
194 + break;
195 + case INTEGER:
196 + *idst = strtoul(ret.addr, NULL, 10);
197 + break;
198 + case FLOAT:
199 + *fdst = strtof(ret.addr, NULL);
200 + break;
201 + }
202 + return 0;
203 +}
204 +
205 void
206 rotate(const Arg *arg)
207 {
208 @@ -1074,7 +1142,7 @@ setup(void)
209 snprintf(winid, sizeof(winid), "%lu", win);
210 setenv("XEMBED", winid, 1);
211
212 - nextfocus = foreground;
213 + nextfocus = focusnew;
214 focus(-1);
215 }
216
217 @@ -1354,6 +1422,7 @@ main(int argc, char *argv[])
218 if (!(dpy = XOpenDisplay(NULL)))
219 die("%s: cannot open display\n", argv0);
220
221 + config_init();
222 setup();
223 printf("0x%lx\n", win);
224 fflush(NULL);
225 --
226 2.25.1
227