| st-xresources-signal-reloading-20220407-ef05519.diff - sites - public wiki cont… | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| st-xresources-signal-reloading-20220407-ef05519.diff (3685B) | |
| --- | |
| 1 From b2a9c96cc3c9152c4e8188f341606c914741cb50 Mon Sep 17 00:00:00 2001 | |
| 2 From: wael <[email protected]> | |
| 3 Date: Thu, 7 Apr 2022 17:14:02 +0300 | |
| 4 Subject: [PATCH] fix xresources with signal reloading removing arg.h and… | |
| 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, … | |
| 76 + { | |
| 77 + sprintf(loadValue, "%s%d", "*.color", i… | |
| 78 + if (!XrmGetResource(xrdb, loadValue, lo… | |
| 79 + /* reset if not found (unless i… | |
| 80 + if (i > 15) | |
| 81 + colorname[i] = NULL; | |
| 82 + } | |
| 83 + | |
| 84 + if (ret.addr != NULL && !strncmp("String", type… | |
| 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[defaultc… | |
| 91 + else { | |
| 92 + // this looks confusing because we are chaining off o… | |
| 93 + // in the macro. probably we should be wrapping every… | |
| 94 + // so this isn't possible... | |
| 95 + defaultcs = defaultfg; | |
| 96 + } | |
| 97 + XRESOURCE_LOAD_STRING("reverse-cursor", colorname[defau… | |
| 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 |