dwm-fancybar-5.6.1.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-fancybar-5.6.1.diff (2771B)
       ---
            1 diff -r e47a47bd3ed4 dwm.c
            2 --- a/dwm.c        Tue Jul 21 10:57:54 2009 +0100
            3 +++ b/dwm.c        Mon Aug 24 18:28:57 2009 +0200
            4 @@ -169,6 +169,7 @@
            5  static Monitor *dirtomon(int dir);
            6  static void drawbar(Monitor *m);
            7  static void drawbars(void);
            8 +static void drawvline(unsigned long col[ColLast]);
            9  static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
           10  static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
           11  static void enternotify(XEvent *e);
           12 @@ -648,10 +649,11 @@
           13  
           14  void
           15  drawbar(Monitor *m) {
           16 -        int x;
           17 +        int x, ow, mw = 0, extra, tw;
           18          unsigned int i, n = 0, occ = 0, urg = 0;
           19          unsigned long *col;
           20 -        Client *c;
           21 +        Client *c, *firstvis, *lastvis = NULL;
           22 +        DC seldc;
           23  
           24          for(c = m->clients; c; c = c->next) {
           25                  if(ISVISIBLE(c))
           26 @@ -689,16 +691,62 @@
           27          }
           28          else
           29                  dc.x = m->ww;
           30 -        if((dc.w = dc.x - x) > bh) {
           31 -                dc.x = x;
           32 -                if(m->sel) {
           33 -                        col = m == selmon ? dc.sel : dc.norm;
           34 -                        drawtext(m->sel->name, col, False);
           35 -                        drawsquare(m->sel->isfixed, m->sel->isfloating, False, col);
           36 +
           37 +        for(c = m->clients; c && !ISVISIBLE(c); c = c->next);
           38 +        firstvis = c;
           39 +
           40 +        col = m == selmon ? dc.sel : dc.norm;
           41 +        dc.w = dc.x - x;
           42 +        dc.x = x;
           43 +
           44 +        if(n > 0) {
           45 +                mw = dc.w / n;
           46 +                extra = 0;
           47 +                seldc = dc;
           48 +                i = 0;
           49 +
           50 +                while(c) {
           51 +                        lastvis = c;
           52 +                        tw = TEXTW(c->name);
           53 +                        if(tw < mw) extra += (mw - tw); else i++;
           54 +                        for(c = c->next; c && !ISVISIBLE(c); c = c->next);
           55                  }
           56 -                else
           57 +
           58 +                if(i > 0) mw += extra / i;
           59 +
           60 +                c = firstvis;
           61 +                x = dc.x;
           62 +        }
           63 +
           64 +        while(dc.w > bh) {
           65 +                if(c) {
           66 +                        ow = dc.w;
           67 +                        tw = TEXTW(c->name);
           68 +                        dc.w = MIN(ow, tw);
           69 +
           70 +                        if(dc.w > mw) dc.w = mw;
           71 +                        if(m->sel == c) seldc = dc;
           72 +                        if(c == lastvis) dc.w = ow;
           73 +
           74 +                        drawtext(c->name, col, False);
           75 +                        if(c != firstvis) drawvline(col);
           76 +                        drawsquare(c->isfixed, c->isfloating, False, col);
           77 +
           78 +                        dc.x += dc.w;
           79 +                        dc.w = ow - dc.w;
           80 +                        for(c = c->next; c && !ISVISIBLE(c); c = c->next);
           81 +                } else {
           82                          drawtext(NULL, dc.norm, False);
           83 +                        break;
           84 +                }
           85          }
           86 +
           87 +        if(m == selmon && m->sel && ISVISIBLE(m->sel)) {
           88 +                dc = seldc;
           89 +                drawtext(m->sel->name, col, True);
           90 +                drawsquare(m->sel->isfixed, m->sel->isfloating, True, col);
           91 +        }
           92 +
           93          XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0);
           94          XSync(dpy, False);
           95  }
           96 @@ -709,6 +757,15 @@
           97  
           98          for(m = mons; m; m = m->next)
           99                  drawbar(m);
          100 +}
          101 +
          102 +void
          103 +drawvline(unsigned long col[ColLast]) {
          104 +        XGCValues gcv;
          105 +
          106 +        gcv.foreground = col[ColFG];
          107 +        XChangeGC(dpy, dc.gc, GCForeground, &gcv);
          108 +        XDrawLine(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.x, dc.y + (dc.font.ascent + dc.font.descent + 2));
          109  }
          110  
          111  void
          112 @@ -1235,8 +1292,7 @@
          113                  }
          114                  if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
          115                          updatetitle(c);
          116 -                        if(c == selmon->sel)
          117 -                                drawbars();
          118 +                        drawbars();
          119                  }
          120          }
          121  }