st-xresources-signal-reloading-20220407-ef05519.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
st-xresources-signal-reloading-20220407-ef05519.diff (3685B)
---
1 From b2a9c96cc3c9152c4e8188f341606c914741cb50 Mon Sep 17 00:00:00 2001
2 From: wael <40663@protonmail.com>
3 Date: Thu, 7 Apr 2022 17:14:02 +0300
4 Subject: [PATCH] fix xresources with signal reloading removing arg.h and st.h
5 & remove unneccesary xresources variables(?)
6
7 ---
8 x.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9 1 file changed, 115 insertions(+)
10
11 diff --git a/x.c b/x.c
12 index 2a3bd38..e8fe7ad 100644
13 --- a/x.c
14 +++ b/x.c
15 @@ -14,6 +14,7 @@
16 #include <X11/keysym.h>
17 #include <X11/Xft/Xft.h>
18 #include <X11/XKBlib.h>
19 +#include <X11/Xresource.h>
20
21 char *argv0;
22 #include "arg.h"
23 @@ -2011,6 +2012,118 @@ run(void)
24 }
25 }
26
27 +
28 +#define XRESOURCE_LOAD_META(NAME) \
29 + if(!XrmGetResource(xrdb, "st." NAME, "st." NAME, &type, &ret)) \
30 + XrmGetResource(xrdb, "*." NAME, "*." NAME, &type, &ret); \
31 + if (ret.addr != NULL && !strncmp("String", type, 64))
32 +
33 +#define XRESOURCE_LOAD_STRING(NAME, DST) \
34 + XRESOURCE_LOAD_META(NAME) \
35 + DST = ret.addr;
36 +
37 +#define XRESOURCE_LOAD_CHAR(NAME, DST) \
38 + XRESOURCE_LOAD_META(NAME) \
39 + DST = ret.addr[0];
40 +
41 +#define XRESOURCE_LOAD_INTEGER(NAME, DST) \
42 + XRESOURCE_LOAD_META(NAME) \
43 + DST = strtoul(ret.addr, NULL, 10);
44 +
45 +#define XRESOURCE_LOAD_FLOAT(NAME, DST) \
46 + XRESOURCE_LOAD_META(NAME) \
47 + DST = strtof(ret.addr, NULL);
48 +
49 +void
50 +xrdb_load(void)
51 +{
52 + /* XXX */
53 + char *xrm;
54 + char *type;
55 + XrmDatabase xrdb;
56 + XrmValue ret;
57 + Display *dpy;
58 +
59 + if(!(dpy = XOpenDisplay(NULL)))
60 + die("Can't open display\n");
61 +
62 + XrmInitialize();
63 + xrm = XResourceManagerString(dpy);
64 +
65 + if (xrm != NULL) {
66 + xrdb = XrmGetStringDatabase(xrm);
67 +
68 + /* handling colors here without macros to do via loop. */
69 + int i = 0;
70 + char loadValue[12] = "";
71 + for (i = 0; i < 256; i++)
72 + {
73 + sprintf(loadValue, "%s%d", "st.color", i);
74 +
75 + if(!XrmGetResource(xrdb, loadValue, loadValue, &type, &ret))
76 + {
77 + sprintf(loadValue, "%s%d", "*.color", i);
78 + if (!XrmGetResource(xrdb, loadValue, loadValue, &type, &ret))
79 + /* reset if not found (unless in range for defaults). */
80 + if (i > 15)
81 + colorname[i] = NULL;
82 + }
83 +
84 + if (ret.addr != NULL && !strncmp("String", type, 64))
85 + colorname[i] = ret.addr;
86 + }
87 +
88 + XRESOURCE_LOAD_STRING("foreground", colorname[defaultfg]);
89 + XRESOURCE_LOAD_STRING("background", colorname[defaultbg]);
90 + XRESOURCE_LOAD_STRING("cursorColor", colorname[defaultcs])
91 + else {
92 + // this looks confusing because we are chaining off of the if
93 + // in the macro. probably we should be wrapping everything blocks
94 + // so this isn't possible...
95 + defaultcs = defaultfg;
96 + }
97 + XRESOURCE_LOAD_STRING("reverse-cursor", colorname[defaultrcs])
98 + else {
99 + // see above.
100 + defaultrcs = defaultbg;
101 + }
102 +
103 + XRESOURCE_LOAD_STRING("font", font);
104 + XRESOURCE_LOAD_STRING("termname", termname);
105 +
106 + XRESOURCE_LOAD_INTEGER("blinktimeout", blinktimeout);
107 + XRESOURCE_LOAD_INTEGER("bellvolume", bellvolume);
108 + XRESOURCE_LOAD_INTEGER("borderpx", borderpx);
109 + XRESOURCE_LOAD_INTEGER("cursorshape", cursorshape);
110 +
111 + XRESOURCE_LOAD_FLOAT("cwscale", cwscale);
112 + XRESOURCE_LOAD_FLOAT("chscale", chscale);
113 + }
114 + XFlush(dpy);
115 +}
116 +
117 +void
118 +reload(int sig)
119 +{
120 + xrdb_load();
121 +
122 + /* colors, fonts */
123 + xloadcols();
124 + xunloadfonts();
125 + xloadfonts(font, 0);
126 +
127 + /* pretend the window just got resized */
128 + cresize(win.w, win.h);
129 +
130 + redraw();
131 +
132 + /* triggers re-render if we're visible. */
133 + ttywrite("\033[O", 3, 1);
134 +
135 + signal(SIGUSR1, reload);
136 +}
137 +
138 +
139 void
140 usage(void)
141 {
142 @@ -2084,6 +2197,8 @@ run:
143
144 setlocale(LC_CTYPE, "");
145 XSetLocaleModifiers("");
146 + xrdb_load();
147 + signal(SIGUSR1, reload);
148 cols = MAX(cols, 1);
149 rows = MAX(rows, 1);
150 tnew(cols, rows);
151 --
152 2.35.1
153