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