st-xresources-signal-reloading-20220309-1bb14b1.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-20220309-1bb14b1.diff (10331B)
       ---
            1 From 1bb14b1cd5b394fb6e777fce1316d5f788b20bea Mon Sep 17 00:00:00 2001
            2 From: MahdiMirzadeh <mahdi@mirzadeh.pro>
            3 Date: Wed, 9 Mar 2022 17:19:12 +0330
            4 Subject: [PATCH] handle st settings from Xresources + reload all st instances
            5  by running 'pidof st | xargs kill -s USR1'
            6 
            7 ---
            8  arg.h |  50 -----------------------
            9  st.h  | 128 ----------------------------------------------------------
           10  win.h |  40 ------------------
           11  x.c   | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
           12  4 files changed, 126 insertions(+), 218 deletions(-)
           13  delete mode 100644 arg.h
           14  delete mode 100644 st.h
           15  delete mode 100644 win.h
           16 
           17 diff --git a/arg.h b/arg.h
           18 deleted file mode 100644
           19 index a22e019..0000000
           20 --- a/arg.h
           21 +++ /dev/null
           22 @@ -1,50 +0,0 @@
           23 -/*
           24 - * Copy me if you can.
           25 - * by 20h
           26 - */
           27 -
           28 -#ifndef ARG_H__
           29 -#define ARG_H__
           30 -
           31 -extern char *argv0;
           32 -
           33 -/* use main(int argc, char *argv[]) */
           34 -#define ARGBEGIN        for (argv0 = *argv, argv++, argc--;\
           35 -                                        argv[0] && argv[0][0] == '-'\
           36 -                                        && argv[0][1];\
           37 -                                        argc--, argv++) {\
           38 -                                char argc_;\
           39 -                                char **argv_;\
           40 -                                int brk_;\
           41 -                                if (argv[0][1] == '-' && argv[0][2] == '\0') {\
           42 -                                        argv++;\
           43 -                                        argc--;\
           44 -                                        break;\
           45 -                                }\
           46 -                                int i_;\
           47 -                                for (i_ = 1, brk_ = 0, argv_ = argv;\
           48 -                                                argv[0][i_] && !brk_;\
           49 -                                                i_++) {\
           50 -                                        if (argv_ != argv)\
           51 -                                                break;\
           52 -                                        argc_ = argv[0][i_];\
           53 -                                        switch (argc_)
           54 -
           55 -#define ARGEND                        }\
           56 -                        }
           57 -
           58 -#define ARGC()                argc_
           59 -
           60 -#define EARGF(x)        ((argv[0][i_+1] == '\0' && argv[1] == NULL)?\
           61 -                                ((x), abort(), (char *)0) :\
           62 -                                (brk_ = 1, (argv[0][i_+1] != '\0')?\
           63 -                                        (&argv[0][i_+1]) :\
           64 -                                        (argc--, argv++, argv[0])))
           65 -
           66 -#define ARGF()                ((argv[0][i_+1] == '\0' && argv[1] == NULL)?\
           67 -                                (char *)0 :\
           68 -                                (brk_ = 1, (argv[0][i_+1] != '\0')?\
           69 -                                        (&argv[0][i_+1]) :\
           70 -                                        (argc--, argv++, argv[0])))
           71 -
           72 -#endif
           73 diff --git a/st.h b/st.h
           74 deleted file mode 100644
           75 index 519b9bd..0000000
           76 --- a/st.h
           77 +++ /dev/null
           78 @@ -1,128 +0,0 @@
           79 -/* See LICENSE for license details. */
           80 -
           81 -#include <stdint.h>
           82 -#include <sys/types.h>
           83 -
           84 -/* macros */
           85 -#define MIN(a, b)                ((a) < (b) ? (a) : (b))
           86 -#define MAX(a, b)                ((a) < (b) ? (b) : (a))
           87 -#define LEN(a)                        (sizeof(a) / sizeof(a)[0])
           88 -#define BETWEEN(x, a, b)        ((a) <= (x) && (x) <= (b))
           89 -#define DIVCEIL(n, d)                (((n) + ((d) - 1)) / (d))
           90 -#define DEFAULT(a, b)                (a) = (a) ? (a) : (b)
           91 -#define LIMIT(x, a, b)                (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
           92 -#define ATTRCMP(a, b)                ((a).mode != (b).mode || (a).fg != (b).fg || \
           93 -                                (a).bg != (b).bg)
           94 -#define TIMEDIFF(t1, t2)        ((t1.tv_sec-t2.tv_sec)*1000 + \
           95 -                                (t1.tv_nsec-t2.tv_nsec)/1E6)
           96 -#define MODBIT(x, set, bit)        ((set) ? ((x) |= (bit)) : ((x) &= ~(bit)))
           97 -
           98 -#define TRUECOLOR(r,g,b)        (1 << 24 | (r) << 16 | (g) << 8 | (b))
           99 -#define IS_TRUECOL(x)                (1 << 24 & (x))
          100 -
          101 -enum glyph_attribute {
          102 -        ATTR_NULL       = 0,
          103 -        ATTR_BOLD       = 1 << 0,
          104 -        ATTR_FAINT      = 1 << 1,
          105 -        ATTR_ITALIC     = 1 << 2,
          106 -        ATTR_UNDERLINE  = 1 << 3,
          107 -        ATTR_BLINK      = 1 << 4,
          108 -        ATTR_REVERSE    = 1 << 5,
          109 -        ATTR_INVISIBLE  = 1 << 6,
          110 -        ATTR_STRUCK     = 1 << 7,
          111 -        ATTR_WRAP       = 1 << 8,
          112 -        ATTR_WIDE       = 1 << 9,
          113 -        ATTR_WDUMMY     = 1 << 10,
          114 -        ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
          115 -};
          116 -
          117 -enum selection_mode {
          118 -        SEL_IDLE = 0,
          119 -        SEL_EMPTY = 1,
          120 -        SEL_READY = 2
          121 -};
          122 -
          123 -enum selection_type {
          124 -        SEL_REGULAR = 1,
          125 -        SEL_RECTANGULAR = 2
          126 -};
          127 -
          128 -enum selection_snap {
          129 -        SNAP_WORD = 1,
          130 -        SNAP_LINE = 2
          131 -};
          132 -
          133 -typedef unsigned char uchar;
          134 -typedef unsigned int uint;
          135 -typedef unsigned long ulong;
          136 -typedef unsigned short ushort;
          137 -
          138 -typedef uint_least32_t Rune;
          139 -
          140 -#define Glyph Glyph_
          141 -typedef struct {
          142 -        Rune u;           /* character code */
          143 -        ushort mode;      /* attribute flags */
          144 -        uint32_t fg;      /* foreground  */
          145 -        uint32_t bg;      /* background  */
          146 -} Glyph;
          147 -
          148 -typedef Glyph *Line;
          149 -
          150 -typedef union {
          151 -        int i;
          152 -        uint ui;
          153 -        float f;
          154 -        const void *v;
          155 -        const char *s;
          156 -} Arg;
          157 -
          158 -void die(const char *, ...);
          159 -void redraw(void);
          160 -void draw(void);
          161 -
          162 -void printscreen(const Arg *);
          163 -void printsel(const Arg *);
          164 -void sendbreak(const Arg *);
          165 -void toggleprinter(const Arg *);
          166 -
          167 -int tattrset(int);
          168 -void tnew(int, int);
          169 -void tresize(int, int);
          170 -void tsetdirtattr(int);
          171 -void ttyhangup(void);
          172 -int ttynew(const char *, char *, const char *, char **);
          173 -size_t ttyread(void);
          174 -void ttyresize(int, int);
          175 -void ttywrite(const char *, size_t, int);
          176 -
          177 -void resettitle(void);
          178 -
          179 -void selclear(void);
          180 -void selinit(void);
          181 -void selstart(int, int, int);
          182 -void selextend(int, int, int, int);
          183 -int selected(int, int);
          184 -char *getsel(void);
          185 -
          186 -size_t utf8encode(Rune, char *);
          187 -
          188 -void *xmalloc(size_t);
          189 -void *xrealloc(void *, size_t);
          190 -char *xstrdup(const char *);
          191 -
          192 -int xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b);
          193 -
          194 -/* config.h globals */
          195 -extern char *utmp;
          196 -extern char *scroll;
          197 -extern char *stty_args;
          198 -extern char *vtiden;
          199 -extern wchar_t *worddelimiters;
          200 -extern int allowaltscreen;
          201 -extern int allowwindowops;
          202 -extern char *termname;
          203 -extern unsigned int tabspaces;
          204 -extern unsigned int defaultfg;
          205 -extern unsigned int defaultbg;
          206 -extern unsigned int defaultcs;
          207 diff --git a/win.h b/win.h
          208 deleted file mode 100644
          209 index e6e4369..0000000
          210 --- a/win.h
          211 +++ /dev/null
          212 @@ -1,40 +0,0 @@
          213 -/* See LICENSE for license details. */
          214 -
          215 -enum win_mode {
          216 -        MODE_VISIBLE     = 1 << 0,
          217 -        MODE_FOCUSED     = 1 << 1,
          218 -        MODE_APPKEYPAD   = 1 << 2,
          219 -        MODE_MOUSEBTN    = 1 << 3,
          220 -        MODE_MOUSEMOTION = 1 << 4,
          221 -        MODE_REVERSE     = 1 << 5,
          222 -        MODE_KBDLOCK     = 1 << 6,
          223 -        MODE_HIDE        = 1 << 7,
          224 -        MODE_APPCURSOR   = 1 << 8,
          225 -        MODE_MOUSESGR    = 1 << 9,
          226 -        MODE_8BIT        = 1 << 10,
          227 -        MODE_BLINK       = 1 << 11,
          228 -        MODE_FBLINK      = 1 << 12,
          229 -        MODE_FOCUS       = 1 << 13,
          230 -        MODE_MOUSEX10    = 1 << 14,
          231 -        MODE_MOUSEMANY   = 1 << 15,
          232 -        MODE_BRCKTPASTE  = 1 << 16,
          233 -        MODE_NUMLOCK     = 1 << 17,
          234 -        MODE_MOUSE       = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\
          235 -                          |MODE_MOUSEMANY,
          236 -};
          237 -
          238 -void xbell(void);
          239 -void xclipcopy(void);
          240 -void xdrawcursor(int, int, Glyph, int, int, Glyph);
          241 -void xdrawline(Line, int, int, int);
          242 -void xfinishdraw(void);
          243 -void xloadcols(void);
          244 -int xsetcolorname(int, const char *);
          245 -void xseticontitle(char *);
          246 -void xsettitle(char *);
          247 -int xsetcursor(int);
          248 -void xsetmode(int, unsigned int);
          249 -void xsetpointermotion(int);
          250 -void xsetsel(char *);
          251 -int xstartdraw(void);
          252 -void xximspot(int, int);
          253 diff --git a/x.c b/x.c
          254 index cd96575..2771033 100644
          255 --- a/x.c
          256 +++ b/x.c
          257 @@ -14,6 +14,7 @@
          258  #include <X11/keysym.h>
          259  #include <X11/Xft/Xft.h>
          260  #include <X11/XKBlib.h>
          261 +#include <X11/Xresource.h>
          262  
          263  char *argv0;
          264  #include "arg.h"
          265 @@ -2011,6 +2012,129 @@ run(void)
          266          }
          267  }
          268  
          269 +#define XRESOURCE_LOAD_META(NAME)                                        \
          270 +        if(!XrmGetResource(xrdb, "st." NAME, "st." NAME, &type, &ret))        \
          271 +                XrmGetResource(xrdb, "*." NAME, "*." NAME, &type, &ret); \
          272 +        if (ret.addr != NULL && !strncmp("String", type, 64))
          273 +
          274 +#define XRESOURCE_LOAD_STRING(NAME, DST)        \
          275 +        XRESOURCE_LOAD_META(NAME)                \
          276 +                DST = ret.addr;
          277 +
          278 +#define XRESOURCE_LOAD_CHAR(NAME, DST)                \
          279 +        XRESOURCE_LOAD_META(NAME)                \
          280 +                DST = ret.addr[0];
          281 +
          282 +#define XRESOURCE_LOAD_INTEGER(NAME, DST)                \
          283 +        XRESOURCE_LOAD_META(NAME)                        \
          284 +                DST = strtoul(ret.addr, NULL, 10);
          285 +
          286 +#define XRESOURCE_LOAD_FLOAT(NAME, DST)                \
          287 +        XRESOURCE_LOAD_META(NAME)                \
          288 +                DST = strtof(ret.addr, NULL);
          289 +
          290 +void
          291 +xrdb_load(void)
          292 +{
          293 +        /* XXX */
          294 +        char *xrm;
          295 +        char *type;
          296 +        XrmDatabase xrdb;
          297 +        XrmValue ret;
          298 +        Display *dpy;
          299 +
          300 +        if(!(dpy = XOpenDisplay(NULL)))
          301 +                die("Can't open display\n");
          302 +
          303 +        XrmInitialize();
          304 +        xrm = XResourceManagerString(dpy);
          305 +
          306 +        if (xrm != NULL) {
          307 +                xrdb = XrmGetStringDatabase(xrm);
          308 +
          309 +                /* handling colors here without macros to do via loop. */
          310 +                int i = 0;
          311 +                char loadValue[12] = "";
          312 +                for (i = 0; i < 256; i++)
          313 +                {
          314 +                        sprintf(loadValue, "%s%d", "st.color", i);
          315 +
          316 +                        if(!XrmGetResource(xrdb, loadValue, loadValue, &type, &ret))
          317 +                        {
          318 +                                sprintf(loadValue, "%s%d", "*.color", i);
          319 +                                if (!XrmGetResource(xrdb, loadValue, loadValue, &type, &ret))
          320 +                                        /* reset if not found (unless in range for defaults). */
          321 +                                        if (i > 15)
          322 +                                                colorname[i] = NULL;
          323 +                        }
          324 +
          325 +                        if (ret.addr != NULL && !strncmp("String", type, 64))
          326 +                                colorname[i] = ret.addr;
          327 +                }
          328 +
          329 +                XRESOURCE_LOAD_STRING("foreground", colorname[defaultfg]);
          330 +                XRESOURCE_LOAD_STRING("background", colorname[defaultbg]);
          331 +                XRESOURCE_LOAD_STRING("cursorfg", colorname[defaultcs])
          332 +                else {
          333 +                  // this looks confusing because we are chaining off of the if
          334 +                  // in the macro. probably we should be wrapping everything blocks
          335 +                  // so this isn't possible...
          336 +                  defaultcs = defaultfg;
          337 +                }
          338 +                XRESOURCE_LOAD_STRING("reverse-cursor", colorname[defaultrcs])
          339 +                else {
          340 +                  // see above.
          341 +                  defaultrcs = defaultbg;
          342 +                }
          343 +
          344 +                XRESOURCE_LOAD_STRING("font", font);
          345 +                XRESOURCE_LOAD_STRING("termname", termname);
          346 +
          347 +                /* XRESOURCE_LOAD_INTEGER("xfps", xfps); */
          348 +                /* XRESOURCE_LOAD_INTEGER("actionfps", actionfps); */
          349 +                XRESOURCE_LOAD_INTEGER("blinktimeout", blinktimeout);
          350 +                XRESOURCE_LOAD_INTEGER("bellvolume", bellvolume);
          351 +                XRESOURCE_LOAD_INTEGER("borderpx", borderpx);
          352 +                /* XRESOURCE_LOAD_INTEGER("borderless", borderless); */
          353 +                XRESOURCE_LOAD_INTEGER("cursorshape", cursorshape);
          354 +
          355 +                /* cursorblinkstate = 1; // in case if cursor shape was changed from a blinking one to a non-blinking */
          356 +                /* XRESOURCE_LOAD_INTEGER("cursorthickness", cursorthickness); */
          357 +                /* XRESOURCE_LOAD_INTEGER("cursorblinkstyle", cursorblinkstyle); */
          358 +                /* XRESOURCE_LOAD_INTEGER("cursorblinkontype", cursorblinkontype); */
          359 +
          360 +                /* todo: https://github.com/gnotclub/xst/commit/1e82647b0e04077e975679a4b4cf1eb02b04e6bc */
          361 +                /* XRESOURCE_LOAD_INTEGER("mouseScrollLines", mousescrolllines); */
          362 +
          363 +                XRESOURCE_LOAD_FLOAT("cwscale", cwscale);
          364 +                XRESOURCE_LOAD_FLOAT("chscale", chscale);
          365 +
          366 +                /* XRESOURCE_LOAD_CHAR("prompt_char", prompt_char); */
          367 +        }
          368 +        XFlush(dpy);
          369 +}
          370 +
          371 +void
          372 +reload(int sig)
          373 +{
          374 +        xrdb_load();
          375 +
          376 +        /* colors, fonts */
          377 +        xloadcols();
          378 +        xunloadfonts();
          379 +        xloadfonts(font, 0);
          380 +
          381 +        /* pretend the window just got resized */
          382 +        cresize(win.w, win.h);
          383 +
          384 +        redraw();
          385 +
          386 +        /* triggers re-render if we're visible. */
          387 +        ttywrite("\033[O", 3, 1);
          388 +
          389 +        signal(SIGUSR1, reload);
          390 +}
          391 +
          392  void
          393  usage(void)
          394  {
          395 @@ -2084,6 +2208,8 @@ run:
          396  
          397          setlocale(LC_CTYPE, "");
          398          XSetLocaleModifiers("");
          399 +        xrdb_load();
          400 +        signal(SIGUSR1, reload);
          401          cols = MAX(cols, 1);
          402          rows = MAX(rows, 1);
          403          tnew(cols, rows);
          404 -- 
          405 2.35.1
          406