tabbed-xresources-20230128-41e2b8f.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       tabbed-xresources-20230128-41e2b8f.diff (6210B)
       ---
            1 From 46115eedb8ba1da17ea6fb76eb9ffba806faa828 Mon Sep 17 00:00:00 2001
            2 From: Casey Fitzpatrick <kcghost@gmail.com>
            3 Date: Sat, 28 Jan 2023 10:13:45 -0500
            4 Subject: [PATCH] xresources support
            5 
            6 Rename foreground to focusnew to avoid conflict with common usage in Xresources
            7 ---
            8  config.def.h | 51 +++++++++++++++++++++++++-----------
            9  tabbed.c     | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++--
           10  2 files changed, 107 insertions(+), 17 deletions(-)
           11 
           12 diff --git a/config.def.h b/config.def.h
           13 index 51bb13d..76059d3 100644
           14 --- a/config.def.h
           15 +++ b/config.def.h
           16 @@ -1,27 +1,27 @@
           17  /* See LICENSE file for copyright and license details. */
           18  
           19  /* appearance */
           20 -static const char font[]        = "monospace:size=9";
           21 -static const char* normbgcolor  = "#222222";
           22 -static const char* normfgcolor  = "#cccccc";
           23 -static const char* selbgcolor   = "#555555";
           24 -static const char* selfgcolor   = "#ffffff";
           25 -static const char* urgbgcolor   = "#111111";
           26 -static const char* urgfgcolor   = "#cc0000";
           27 -static const char before[]      = "<";
           28 -static const char after[]       = ">";
           29 -static const char titletrim[]   = "...";
           30 -static const int  tabwidth      = 200;
           31 -static const Bool foreground    = True;
           32 -static       Bool urgentswitch  = False;
           33 +static char* font         = "monospace:size=9";
           34 +static char* normbgcolor  = "#222222";
           35 +static char* normfgcolor  = "#cccccc";
           36 +static char* selbgcolor   = "#555555";
           37 +static char* selfgcolor   = "#ffffff";
           38 +static char* urgbgcolor   = "#111111";
           39 +static char* urgfgcolor   = "#cc0000";
           40 +static char* before       = "<";
           41 +static char* after        = ">";
           42 +static char* titletrim    = "...";
           43 +static int tabwidth       = 200;
           44 +static int focusnew       = 1;
           45 +static int urgentswitch   = 0;
           46  
           47  /*
           48   * Where to place a new tab when it is opened. When npisrelative is True,
           49   * then the current position is changed + newposition. If npisrelative
           50   * is False, then newposition is an absolute position.
           51   */
           52 -static int  newposition   = 0;
           53 -static Bool npisrelative  = False;
           54 +static int newposition   = 0;
           55 +static int npisrelative  = 0;
           56  
           57  #define SETPROP(p) { \
           58          .v = (char *[]){ "/bin/sh", "-c", \
           59 @@ -33,6 +33,27 @@ static Bool npisrelative  = False;
           60          } \
           61  }
           62  
           63 +/*
           64 + * Xresources preferences to load at startup
           65 + */
           66 +ResourcePref resources[] = {
           67 +        { "font",         STRING,  &font},
           68 +        { "normbgcolor",  STRING,  &normbgcolor},
           69 +        { "normfgcolor",  STRING,  &normfgcolor},
           70 +        { "selbgcolor",   STRING,  &selbgcolor},
           71 +        { "selfgcolor",   STRING,  &selfgcolor},
           72 +        { "urgbgcolor",   STRING,  &urgbgcolor},
           73 +        { "urgfgcolor",   STRING,  &urgfgcolor},
           74 +        { "before",       STRING,  &before},
           75 +        { "after",        STRING,  &after},
           76 +        { "titletrim",    STRING,  &titletrim},
           77 +        { "tabwidth",     INTEGER, &tabwidth},
           78 +        { "focusnew",     INTEGER, &focusnew},
           79 +        { "urgentswitch", INTEGER, &urgentswitch},
           80 +        { "newposition",  INTEGER, &newposition},
           81 +        { "npisrelative", INTEGER, &npisrelative},
           82 +};
           83 +
           84  #define MODKEY ControlMask
           85  static const Key keys[] = {
           86          /* modifier             key        function     argument */
           87 diff --git a/tabbed.c b/tabbed.c
           88 index eafe28a..6ca3454 100644
           89 --- a/tabbed.c
           90 +++ b/tabbed.c
           91 @@ -13,6 +13,7 @@
           92  #include <X11/Xatom.h>
           93  #include <X11/Xlib.h>
           94  #include <X11/Xproto.h>
           95 +#include <X11/Xresource.h>
           96  #include <X11/Xutil.h>
           97  #include <X11/XKBlib.h>
           98  #include <X11/Xft/Xft.h>
           99 @@ -85,11 +86,26 @@ typedef struct {
          100          Bool urgent;
          101          Bool closed;
          102  } Client;
          103 + 
          104 +/* Xresources preferences */
          105 +enum resource_type {
          106 +        STRING = 0,
          107 +        INTEGER = 1,
          108 +        FLOAT = 2
          109 +};
          110 +
          111 +typedef struct {
          112 +        char *name;
          113 +        enum resource_type type;
          114 +        void *dst;
          115 +} ResourcePref;
          116 + 
          117  
          118  /* function declarations */
          119  static void buttonpress(const XEvent *e);
          120  static void cleanup(void);
          121  static void clientmessage(const XEvent *e);
          122 +static void config_init(void);
          123  static void configurenotify(const XEvent *e);
          124  static void configurerequest(const XEvent *e);
          125  static void createnotify(const XEvent *e);
          126 @@ -120,6 +136,7 @@ static void move(const Arg *arg);
          127  static void movetab(const Arg *arg);
          128  static void propertynotify(const XEvent *e);
          129  static void resize(int c, int w, int h);
          130 +static int resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst);
          131  static void rotate(const Arg *arg);
          132  static void run(void);
          133  static void sendxembed(int c, long msg, long detail, long d1, long d2);
          134 @@ -245,6 +262,23 @@ clientmessage(const XEvent *e)
          135          }
          136  }
          137  
          138 +void
          139 +config_init(void)
          140 +{
          141 +        char *resm;
          142 +        XrmDatabase db;
          143 +        ResourcePref *p;
          144 +
          145 +        XrmInitialize();
          146 +        resm = XResourceManagerString(dpy);
          147 +        if (!resm)
          148 +                return;
          149 +
          150 +        db = XrmGetStringDatabase(resm);
          151 +        for (p = resources; p < resources + LENGTH(resources); p++)
          152 +                resource_load(db, p->name, p->type, p->dst);
          153 +}
          154 +
          155  void
          156  configurenotify(const XEvent *e)
          157  {
          158 @@ -771,7 +805,7 @@ manage(Window w)
          159                  focus(nextfocus ? nextpos :
          160                        sel < 0 ? 0 :
          161                        sel);
          162 -                nextfocus = foreground;
          163 +                nextfocus = focusnew;
          164          }
          165  }
          166  
          167 @@ -897,6 +931,40 @@ resize(int c, int w, int h)
          168                     (XEvent *)&ce);
          169  }
          170  
          171 +int
          172 +resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst)
          173 +{
          174 +        char **sdst = dst;
          175 +        int *idst = dst;
          176 +        float *fdst = dst;
          177 +
          178 +        char fullname[256];
          179 +        char fullclass[256];
          180 +        char *type;
          181 +        XrmValue ret;
          182 +
          183 +        snprintf(fullname, sizeof(fullname), "%s.%s", "tabbed", name);
          184 +        snprintf(fullclass, sizeof(fullclass), "%s.%s", "tabbed", name);
          185 +        fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0';
          186 +
          187 +        XrmGetResource(db, fullname, fullclass, &type, &ret);
          188 +        if (ret.addr == NULL || strncmp("String", type, 64))
          189 +                return 1;
          190 +
          191 +        switch (rtype) {
          192 +        case STRING:
          193 +                *sdst = ret.addr;
          194 +                break;
          195 +        case INTEGER:
          196 +                *idst = strtoul(ret.addr, NULL, 10);
          197 +                break;
          198 +        case FLOAT:
          199 +                *fdst = strtof(ret.addr, NULL);
          200 +                break;
          201 +        }
          202 +        return 0;
          203 +}
          204 +
          205  void
          206  rotate(const Arg *arg)
          207  {
          208 @@ -1074,7 +1142,7 @@ setup(void)
          209          snprintf(winid, sizeof(winid), "%lu", win);
          210          setenv("XEMBED", winid, 1);
          211  
          212 -        nextfocus = foreground;
          213 +        nextfocus = focusnew;
          214          focus(-1);
          215  }
          216  
          217 @@ -1354,6 +1422,7 @@ main(int argc, char *argv[])
          218          if (!(dpy = XOpenDisplay(NULL)))
          219                  die("%s: cannot open display\n", argv0);
          220  
          221 +        config_init();
          222          setup();
          223          printf("0x%lx\n", win);
          224          fflush(NULL);
          225 -- 
          226 2.25.1
          227