xresources patch
[st.git] / x.c
diff --git a/x.c b/x.c
index 7bfc36f..76f167f 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
@@ -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);
 
@@ -1526,8 +1538,9 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
        /* draw the new one */
        if (IS_SET(MODE_FOCUSED)) {
                switch (win.cursor) {
-               case 7: /* st extension: snowman (U+2603) */
-                       g.u = 0x2603;
+               case 7: /* st extension */
+                       g.u = 0x2603; /* snowman (U+2603) */
+                       /* FALLTHROUGH */
                case 0: /* Blinking Block */
                case 1: /* Blinking Block (Default) */
                case 2: /* Steady Block */
@@ -1689,8 +1702,7 @@ xsetmode(int set, unsigned int flags)
 int
 xsetcursor(int cursor)
 {
-       DEFAULT(cursor, 1);
-       if (!BETWEEN(cursor, 0, 6))
+       if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */
                return 1;
        win.cursor = cursor;
        return 0;
@@ -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)
 {
@@ -1982,7 +2047,7 @@ main(int argc, char *argv[])
 {
        xw.l = xw.t = 0;
        xw.isfixed = False;
-       win.cursor = cursorshape;
+       xsetcursor(cursorshape);
 
        ARGBEGIN {
        case 'a':
@@ -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);