URI: 
       dwm-statuscolors-6.1.diff - sites - public wiki contents of suckless.org
  HTML git clone git://git.suckless.org/sites
   DIR Log
   DIR Files
   DIR Refs
       ---
       dwm-statuscolors-6.1.diff (7140B)
       ---
            1 diff -up dwm/drw.c dwm-statuscolors/drw.c
            2 --- dwm/drw.c        2015-11-08 15:39:37.000000000 -0700
            3 +++ dwm-statuscolors/drw.c        2015-11-28 15:42:28.534399525 -0700
            4 @@ -206,6 +206,68 @@ drw_setscheme(Drw *drw, ClrScheme *schem
            5          drw->scheme = scheme;
            6  }
            7  
            8 +int
            9 +drw_get_width(Drw *drw, int numcolors, const char *text)
           10 +{
           11 +        int i;
           12 +        Fnt *curfont = drw->fonts[0];
           13 +        int w = drw_text(drw, 0, 0, 0, 0, text, 0) + curfont->h;
           14 +
           15 +        for (i = 0; i < strlen(text); i++) {
           16 +                if (text[i] > 0 && text[i] <= numcolors) {
           17 +                        /* we found a color code
           18 +                         * drw_text counted it as a normal character and added one character's width
           19 +                         * we aren't going to render this character, so we remove one character's width */
           20 +                        w -= curfont->xfont->max_advance_width;
           21 +
           22 +                        if (i == 0 || i + 1 == strlen(text)) {
           23 +                                /* we're on the first or the last character of the string
           24 +                                 * drw_text already added one character's height (divided by 2) as padding to the beginning and end
           25 +                                 * we don't want to double this padding, so we skip this character */
           26 +                                continue;
           27 +                        }
           28 +
           29 +                        if (text[i - 1] > 0 && text[i - 1] <= numcolors) {
           30 +                                /* the previous character was also a color code
           31 +                                 * we already added padding in the previous iteration
           32 +                                 * we don't want to double this padding, so we skip this character */
           33 +                                continue;
           34 +                        }
           35 +
           36 +                        /* we are somewhere in the middle of the string and the color has changed
           37 +                         * we want to add one character's height (divided by 2) as padding to the end of the previous colored text
           38 +                         * and to the beginning of the new colored text */
           39 +                        w += curfont->h;
           40 +                }
           41 +        }
           42 +
           43 +  return w;
           44 +}
           45 +
           46 +void
           47 +drw_colored_text(Drw *drw, ClrScheme *scheme, int numcolors, int x, int y, unsigned int w, unsigned int h, char *text)
           48 +{
           49 +        if (!drw || !drw->fontcount || !drw->scheme)
           50 +                return;
           51 +
           52 +        char *buf = text, *ptr = buf, c = 1;
           53 +        int i;
           54 +
           55 +        while (*ptr) {
           56 +                for (i = 0; *ptr < 0 || *ptr > numcolors; i++, ptr++);
           57 +                if (!*ptr)
           58 +                        break;
           59 +                c = *ptr;
           60 +                *ptr = 0;
           61 +                if (i)
           62 +                        x = drw_text(drw, x, y, w, h, buf, 0) + drw->fonts[0]->h;
           63 +                *ptr = c;
           64 +                drw_setscheme(drw, &scheme[c-1]);
           65 +                buf = ++ptr;
           66 +        }
           67 +        drw_text(drw, x, y, w, h, buf, 0);
           68 +}
           69 +
           70  void
           71  drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int empty, int invert)
           72  {
           73 diff -up dwm/drw.h dwm-statuscolors/drw.h
           74 --- dwm/drw.h        2015-11-08 15:39:37.000000000 -0700
           75 +++ dwm-statuscolors/drw.h        2015-11-28 15:39:44.427726312 -0700
           76 @@ -67,6 +67,8 @@ void drw_setfont(Drw *, Fnt *);
           77  void drw_setscheme(Drw *, ClrScheme *);
           78  
           79  /* Drawing functions */
           80 +int drw_get_width(Drw *, int, const char *);
           81 +void drw_colored_text(Drw *, ClrScheme *, int, int, int, unsigned int, unsigned int, char *);
           82  void drw_rect(Drw *, int, int, unsigned int, unsigned int, int, int, int);
           83  int drw_text(Drw *, int, int, unsigned int, unsigned int, const char *, int);
           84  
           85 diff -up dwm/dwm.c dwm-statuscolors/dwm.c
           86 --- dwm/dwm.c        2015-11-08 15:39:37.000000000 -0700
           87 +++ dwm-statuscolors/dwm.c        2015-11-28 15:45:32.134406853 -0700
           88 @@ -51,6 +51,7 @@
           89                                 * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
           90  #define ISVISIBLE(C)            ((C->tags & C->mon->tagset[C->mon->seltags]))
           91  #define LENGTH(X)               (sizeof X / sizeof X[0])
           92 +#define MAXCOLORS               9
           93  #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
           94  #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
           95  #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
           96 @@ -261,7 +262,7 @@ static void (*handler[LASTEvent]) (XEven
           97  static Atom wmatom[WMLast], netatom[NetLast];
           98  static int running = 1;
           99  static Cur *cursor[CurLast];
          100 -static ClrScheme scheme[SchemeLast];
          101 +static ClrScheme scheme[MAXCOLORS];
          102  static Display *dpy;
          103  static Drw *drw;
          104  static Monitor *mons, *selmon;
          105 @@ -718,35 +719,35 @@ drawbar(Monitor *m)
          106          x = 0;
          107          for (i = 0; i < LENGTH(tags); i++) {
          108                  w = TEXTW(tags[i]);
          109 -                drw_setscheme(drw, m->tagset[m->seltags] & 1 << i ? &scheme[SchemeSel] : &scheme[SchemeNorm]);
          110 -                drw_text(drw, x, 0, w, bh, tags[i], urg & 1 << i);
          111 +                drw_setscheme(drw, &scheme[(m->tagset[m->seltags] & 1 << i) ? 1 : (urg & 1 << i ? 2 : 0)]);
          112 +                drw_text(drw, x, 0, w, bh, tags[i], 0);
          113                  drw_rect(drw, x + 1, 1, dx, dx, m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
          114 -                           occ & 1 << i, urg & 1 << i);
          115 +                         occ & 1 << i, 0);
          116                  x += w;
          117          }
          118          w = blw = TEXTW(m->ltsymbol);
          119 -        drw_setscheme(drw, &scheme[SchemeNorm]);
          120 +        drw_setscheme(drw, &scheme[0]);
          121          drw_text(drw, x, 0, w, bh, m->ltsymbol, 0);
          122          x += w;
          123          xx = x;
          124          if (m == selmon) { /* status is only drawn on selected monitor */
          125 -                w = TEXTW(stext);
          126 +                w = drw_get_width(drw, NUMCOLORS, stext);
          127                  x = m->ww - w;
          128                  if (x < xx) {
          129                          x = xx;
          130                          w = m->ww - xx;
          131                  }
          132 -                drw_text(drw, x, 0, w, bh, stext, 0);
          133 +                drw_colored_text(drw, scheme, NUMCOLORS, x, 0, w, bh, stext);
          134          } else
          135                  x = m->ww;
          136          if ((w = x - xx) > bh) {
          137                  x = xx;
          138                  if (m->sel) {
          139 -                        drw_setscheme(drw, m == selmon ? &scheme[SchemeSel] : &scheme[SchemeNorm]);
          140 +                        drw_setscheme(drw, &scheme[m == selmon ? 1 : 0]);
          141                          drw_text(drw, x, 0, w, bh, m->sel->name, 0);
          142                          drw_rect(drw, x + 1, 1, dx, dx, m->sel->isfixed, m->sel->isfloating, 0);
          143                  } else {
          144 -                        drw_setscheme(drw, &scheme[SchemeNorm]);
          145 +                        drw_setscheme(drw, &scheme[0]);
          146                          drw_rect(drw, x, 0, w, bh, 1, 0, 1);
          147                  }
          148          }
          149 @@ -807,7 +808,7 @@ focus(Client *c)
          150                  detachstack(c);
          151                  attachstack(c);
          152                  grabbuttons(c, 1);
          153 -                XSetWindowBorder(dpy, c->win, scheme[SchemeSel].border->pix);
          154 +                XSetWindowBorder(dpy, c->win, scheme[1].border->pix);
          155                  setfocus(c);
          156          } else {
          157                  XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
          158 @@ -1065,7 +1066,7 @@ manage(Window w, XWindowAttributes *wa)
          159  
          160          wc.border_width = c->bw;
          161          XConfigureWindow(dpy, w, CWBorderWidth, &wc);
          162 -        XSetWindowBorder(dpy, w, scheme[SchemeNorm].border->pix);
          163 +        XSetWindowBorder(dpy, w, scheme[0].border->pix);
          164          configure(c); /* propagates border_width, if size doesn't change */
          165          updatewindowtype(c);
          166          updatesizehints(c);
          167 @@ -1580,12 +1581,12 @@ setup(void)
          168          cursor[CurResize] = drw_cur_create(drw, XC_sizing);
          169          cursor[CurMove] = drw_cur_create(drw, XC_fleur);
          170          /* init appearance */
          171 -        scheme[SchemeNorm].border = drw_clr_create(drw, normbordercolor);
          172 -        scheme[SchemeNorm].bg = drw_clr_create(drw, normbgcolor);
          173 -        scheme[SchemeNorm].fg = drw_clr_create(drw, normfgcolor);
          174 -        scheme[SchemeSel].border = drw_clr_create(drw, selbordercolor);
          175 -        scheme[SchemeSel].bg = drw_clr_create(drw, selbgcolor);
          176 -        scheme[SchemeSel].fg = drw_clr_create(drw, selfgcolor);
          177 +        for(int i = 0; i < NUMCOLORS; i++){
          178 +                scheme[i].border = drw_clr_create(drw, colors[i][0]);
          179 +                scheme[i].fg = drw_clr_create(drw, colors[i][1]);
          180 +                scheme[i].bg = drw_clr_create(drw, colors[i][2]);
          181 +        }
          182 +
          183          /* init bars */
          184          updatebars();
          185          updatestatus();
          186 @@ -1745,7 +1746,7 @@ unfocus(Client *c, int setfocus)
          187          if (!c)
          188                  return;
          189          grabbuttons(c, 0);
          190 -        XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->pix);
          191 +        XSetWindowBorder(dpy, c->win, scheme[0].border->pix);
          192          if (setfocus) {
          193                  XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
          194                  XDeleteProperty(dpy, root, netatom[NetActiveWindow]);