Xinqi Bao's Git

patch: xresources
authorXinqi Bao <[email protected]>
Mon, 4 Apr 2022 10:57:00 +0000 (18:57 +0800)
committerXinqi Bao <[email protected]>
Mon, 4 Apr 2022 10:57:00 +0000 (18:57 +0800)
config.def.h
patches/st-xresources-20200604-9ba7ecf.diff [new file with mode: 0644]
x.c

index 3b696ad..05e860f 100644 (file)
@@ -173,6 +173,43 @@ static unsigned int defaultattr = 11;
  */
 static uint forcemousemod = ShiftMask;
 
+/*
+ * Xresources preferences to load at startup
+ */
+ResourcePref resources[] = {
+               { "font",         STRING,  &font },
+               { "color0",       STRING,  &colorname[0] },
+               { "color1",       STRING,  &colorname[1] },
+               { "color2",       STRING,  &colorname[2] },
+               { "color3",       STRING,  &colorname[3] },
+               { "color4",       STRING,  &colorname[4] },
+               { "color5",       STRING,  &colorname[5] },
+               { "color6",       STRING,  &colorname[6] },
+               { "color7",       STRING,  &colorname[7] },
+               { "color8",       STRING,  &colorname[8] },
+               { "color9",       STRING,  &colorname[9] },
+               { "color10",      STRING,  &colorname[10] },
+               { "color11",      STRING,  &colorname[11] },
+               { "color12",      STRING,  &colorname[12] },
+               { "color13",      STRING,  &colorname[13] },
+               { "color14",      STRING,  &colorname[14] },
+               { "color15",      STRING,  &colorname[15] },
+               { "background",   STRING,  &colorname[256] },
+               { "foreground",   STRING,  &colorname[257] },
+               { "cursorColor",  STRING,  &colorname[258] },
+               { "termname",     STRING,  &termname },
+               { "shell",        STRING,  &shell },
+               { "minlatency",   INTEGER, &minlatency },
+               { "maxlatency",   INTEGER, &maxlatency },
+               { "blinktimeout", INTEGER, &blinktimeout },
+               { "bellvolume",   INTEGER, &bellvolume },
+               { "tabspaces",    INTEGER, &tabspaces },
+               { "borderpx",     INTEGER, &borderpx },
+               { "cwscale",      FLOAT,   &cwscale },
+               { "chscale",      FLOAT,   &chscale },
+               { "alpha",        FLOAT,   &alpha },
+};
+
 /*
  * Internal mouse shortcuts.
  * Beware that overloading Button1 will disable the selection.
diff --git a/patches/st-xresources-20200604-9ba7ecf.diff b/patches/st-xresources-20200604-9ba7ecf.diff
new file mode 100644 (file)
index 0000000..78ba00a
--- /dev/null
@@ -0,0 +1,184 @@
+From 2752a599ee01305a435729bfacf43b1dde7cf0ef Mon Sep 17 00:00:00 2001
+From: Benji Encalada Mora <[email protected]>
+Date: Thu, 4 Jun 2020 00:41:10 -0500
+Subject: [PATCH] fix: replace xfps and actionfps variables
+
+---
+ config.def.h | 36 ++++++++++++++++++++++++
+ x.c          | 78 +++++++++++++++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 110 insertions(+), 4 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 6f05dce..9b99782 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -168,6 +168,42 @@ static unsigned int defaultattr = 11;
+  */
+ static uint forcemousemod = ShiftMask;
++/*
++ * Xresources preferences to load at startup
++ */
++ResourcePref resources[] = {
++              { "font",         STRING,  &font },
++              { "color0",       STRING,  &colorname[0] },
++              { "color1",       STRING,  &colorname[1] },
++              { "color2",       STRING,  &colorname[2] },
++              { "color3",       STRING,  &colorname[3] },
++              { "color4",       STRING,  &colorname[4] },
++              { "color5",       STRING,  &colorname[5] },
++              { "color6",       STRING,  &colorname[6] },
++              { "color7",       STRING,  &colorname[7] },
++              { "color8",       STRING,  &colorname[8] },
++              { "color9",       STRING,  &colorname[9] },
++              { "color10",      STRING,  &colorname[10] },
++              { "color11",      STRING,  &colorname[11] },
++              { "color12",      STRING,  &colorname[12] },
++              { "color13",      STRING,  &colorname[13] },
++              { "color14",      STRING,  &colorname[14] },
++              { "color15",      STRING,  &colorname[15] },
++              { "background",   STRING,  &colorname[256] },
++              { "foreground",   STRING,  &colorname[257] },
++              { "cursorColor",  STRING,  &colorname[258] },
++              { "termname",     STRING,  &termname },
++              { "shell",        STRING,  &shell },
++              { "minlatency",   INTEGER, &minlatency },
++              { "maxlatency",   INTEGER, &maxlatency },
++              { "blinktimeout", INTEGER, &blinktimeout },
++              { "bellvolume",   INTEGER, &bellvolume },
++              { "tabspaces",    INTEGER, &tabspaces },
++              { "borderpx",     INTEGER, &borderpx },
++              { "cwscale",      FLOAT,   &cwscale },
++              { "chscale",      FLOAT,   &chscale },
++};
++
+ /*
+  * Internal mouse shortcuts.
+  * Beware that overloading Button1 will disable the selection.
+diff --git a/x.c b/x.c
+index 210f184..76f167f 100644
+--- a/x.c
++++ b/x.c
+@@ -14,6 +14,7 @@
+ #include <X11/keysym.h>
+ #include <X11/Xft/Xft.h>
+ #include <X11/XKBlib.h>
++#include <X11/Xresource.h>
+ char *argv0;
+ #include "arg.h"
+@@ -45,6 +46,19 @@ typedef struct {
+       signed char appcursor; /* application cursor */
+ } Key;
++/* Xresources preferences */
++enum resource_type {
++      STRING = 0,
++      INTEGER = 1,
++      FLOAT = 2
++};
++
++typedef struct {
++      char *name;
++      enum resource_type type;
++      void *dst;
++} ResourcePref;
++
+ /* X modifiers */
+ #define XK_ANY_MOD    UINT_MAX
+ #define XK_NO_MOD     0
+@@ -828,8 +842,8 @@ xclear(int x1, int y1, int x2, int y2)
+ void
+ xhints(void)
+ {
+-      XClassHint class = {opt_name ? opt_name : termname,
+-                          opt_class ? opt_class : termname};
++      XClassHint class = {opt_name ? opt_name : "st",
++                          opt_class ? opt_class : "St"};
+       XWMHints wm = {.flags = InputHint, .input = 1};
+       XSizeHints *sizeh;
+@@ -1104,8 +1118,6 @@ xinit(int cols, int rows)
+       pid_t thispid = getpid();
+       XColor xmousefg, xmousebg;
+-      if (!(xw.dpy = XOpenDisplay(NULL)))
+-              die("can't open display\n");
+       xw.scr = XDefaultScreen(xw.dpy);
+       xw.vis = XDefaultVisual(xw.dpy, xw.scr);
+@@ -1964,6 +1976,59 @@ run(void)
+       }
+ }
++int
++resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst)
++{
++      char **sdst = dst;
++      int *idst = dst;
++      float *fdst = dst;
++
++      char fullname[256];
++      char fullclass[256];
++      char *type;
++      XrmValue ret;
++
++      snprintf(fullname, sizeof(fullname), "%s.%s",
++                      opt_name ? opt_name : "st", name);
++      snprintf(fullclass, sizeof(fullclass), "%s.%s",
++                      opt_class ? opt_class : "St", name);
++      fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0';
++
++      XrmGetResource(db, fullname, fullclass, &type, &ret);
++      if (ret.addr == NULL || strncmp("String", type, 64))
++              return 1;
++
++      switch (rtype) {
++      case STRING:
++              *sdst = ret.addr;
++              break;
++      case INTEGER:
++              *idst = strtoul(ret.addr, NULL, 10);
++              break;
++      case FLOAT:
++              *fdst = strtof(ret.addr, NULL);
++              break;
++      }
++      return 0;
++}
++
++void
++config_init(void)
++{
++      char *resm;
++      XrmDatabase db;
++      ResourcePref *p;
++
++      XrmInitialize();
++      resm = XResourceManagerString(xw.dpy);
++      if (!resm)
++              return;
++
++      db = XrmGetStringDatabase(resm);
++      for (p = resources; p < resources + LEN(resources); p++)
++              resource_load(db, p->name, p->type, p->dst);
++}
++
+ void
+ usage(void)
+ {
+@@ -2037,6 +2102,11 @@ run:
+       setlocale(LC_CTYPE, "");
+       XSetLocaleModifiers("");
++
++      if(!(xw.dpy = XOpenDisplay(NULL)))
++              die("Can't open display\n");
++
++      config_init();
+       cols = MAX(cols, 1);
+       rows = MAX(rows, 1);
+       tnew(cols, rows);
+-- 
+2.26.2
+
diff --git a/x.c b/x.c
index 752348f..b5acc4c 100644 (file)
--- a/x.c
+++ b/x.c
@@ -14,6 +14,7 @@
 #include <X11/keysym.h>
 #include <X11/Xft/Xft.h>
 #include <X11/XKBlib.h>
+#include <X11/Xresource.h>
 
 char *argv0;
 #include "arg.h"
@@ -45,6 +46,19 @@ typedef struct {
        signed char appcursor; /* application cursor */
 } Key;
 
+/* Xresources preferences */
+enum resource_type {
+       STRING = 0,
+       INTEGER = 1,
+       FLOAT = 2
+};
+
+typedef struct {
+       char *name;
+       enum resource_type type;
+       void *dst;
+} ResourcePref;
+
 /* X modifiers */
 #define XK_ANY_MOD    UINT_MAX
 #define XK_NO_MOD     0
@@ -872,8 +886,8 @@ xclear(int x1, int y1, int x2, int y2)
 void
 xhints(void)
 {
-       XClassHint class = {opt_name ? opt_name : termname,
-                           opt_class ? opt_class : termname};
+       XClassHint class = {opt_name ? opt_name : "st",
+                           opt_class ? opt_class : "St"};
        XWMHints wm = {.flags = InputHint, .input = 1};
        XSizeHints *sizeh;
 
@@ -1150,8 +1164,6 @@ xinit(int cols, int rows)
        XWindowAttributes attr;
        XVisualInfo vis;
 
-       if (!(xw.dpy = XOpenDisplay(NULL)))
-               die("can't open display\n");
        xw.scr = XDefaultScreen(xw.dpy);
 
        if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) {
@@ -2032,6 +2044,59 @@ run(void)
        }
 }
 
+int
+resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst)
+{
+       char **sdst = dst;
+       int *idst = dst;
+       float *fdst = dst;
+
+       char fullname[256];
+       char fullclass[256];
+       char *type;
+       XrmValue ret;
+
+       snprintf(fullname, sizeof(fullname), "%s.%s",
+                       opt_name ? opt_name : "st", name);
+       snprintf(fullclass, sizeof(fullclass), "%s.%s",
+                       opt_class ? opt_class : "St", name);
+       fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0';
+
+       XrmGetResource(db, fullname, fullclass, &type, &ret);
+       if (ret.addr == NULL || strncmp("String", type, 64))
+               return 1;
+
+       switch (rtype) {
+       case STRING:
+               *sdst = ret.addr;
+               break;
+       case INTEGER:
+               *idst = strtoul(ret.addr, NULL, 10);
+               break;
+       case FLOAT:
+               *fdst = strtof(ret.addr, NULL);
+               break;
+       }
+       return 0;
+}
+
+void
+config_init(void)
+{
+       char *resm;
+       XrmDatabase db;
+       ResourcePref *p;
+
+       XrmInitialize();
+       resm = XResourceManagerString(xw.dpy);
+       if (!resm)
+               return;
+
+       db = XrmGetStringDatabase(resm);
+       for (p = resources; p < resources + LEN(resources); p++)
+               resource_load(db, p->name, p->type, p->dst);
+}
+
 void
 usage(void)
 {
@@ -2108,6 +2173,11 @@ run:
 
        setlocale(LC_CTYPE, "");
        XSetLocaleModifiers("");
+
+       if(!(xw.dpy = XOpenDisplay(NULL)))
+               die("Can't open display\n");
+
+       config_init();
        cols = MAX(cols, 1);
        rows = MAX(rows, 1);
        tnew(cols, rows);