dwm-bstackmfact-6.6.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-bstackmfact-6.6.diff (7218B)
       ---
            1 diff --git a/config.def.h b/config.def.h
            2 index 9efa774..c0bfede 100644
            3 --- a/config.def.h
            4 +++ b/config.def.h
            5 @@ -3,6 +3,7 @@
            6  /* appearance */
            7  static const unsigned int borderpx  = 1;        /* border pixel of windows */
            8  static const unsigned int snap      = 32;       /* snap pixel */
            9 +static const unsigned int minwsz    = 20;       /* Minimal heigt of a client for smfact */
           10  static const int showbar            = 1;        /* 0 means no bar */
           11  static const int topbar             = 1;        /* 0 means bottom bar */
           12  static const char *fonts[]          = { "monospace:size=10" };
           13 @@ -33,6 +34,7 @@ static const Rule rules[] = {
           14  
           15  /* layout(s) */
           16  static const float mfact     = 0.55; /* factor of master area size [0.05..0.95] */
           17 +static const float smfact     = 0.00; /* factor of tiled clients [0.00..0.95] */
           18  static const int nmaster     = 1;    /* number of clients in master area */
           19  static const int resizehints = 1;    /* 1 means respect size hints in tiled resizals */
           20  static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
           21 @@ -42,6 +44,8 @@ static const Layout layouts[] = {
           22          { "[]=",      tile },    /* first entry is default */
           23          { "><>",      NULL },    /* no layout function means floating behavior */
           24          { "[M]",      monocle },
           25 +        { "TTT",      bstack },
           26 +        { "===",      bstackhoriz },
           27  };
           28  
           29  /* key definitions */
           30 @@ -71,12 +75,16 @@ static const Key keys[] = {
           31          { MODKEY,                       XK_d,      incnmaster,     {.i = -1 } },
           32          { MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
           33          { MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
           34 +        { MODKEY|ShiftMask,             XK_h,      setsmfact,      {.f = +0.05} },
           35 +        { MODKEY|ShiftMask,             XK_l,      setsmfact,      {.f = -0.05} },
           36          { MODKEY,                       XK_Return, zoom,           {0} },
           37          { MODKEY,                       XK_Tab,    view,           {0} },
           38          { MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
           39          { MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
           40          { MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
           41          { MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
           42 +        { MODKEY,                       XK_s,      setlayout,      {.v = &layouts[3]} },
           43 +        { MODKEY,                       XK_z,      setlayout,      {.v = &layouts[4]} },
           44          { MODKEY,                       XK_space,  setlayout,      {0} },
           45          { MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
           46          { MODKEY,                       XK_0,      view,           {.ui = ~0 } },
           47 diff --git a/dwm.c b/dwm.c
           48 index 1443802..1f829b8 100644
           49 --- a/dwm.c
           50 +++ b/dwm.c
           51 @@ -70,6 +70,7 @@ typedef union {
           52          int i;
           53          unsigned int ui;
           54          float f;
           55 +        float sf;
           56          const void *v;
           57  } Arg;
           58  
           59 @@ -113,6 +114,7 @@ typedef struct {
           60  struct Monitor {
           61          char ltsymbol[16];
           62          float mfact;
           63 +        float smfact;
           64          int nmaster;
           65          int num;
           66          int by;               /* bar geometry */
           67 @@ -201,6 +203,7 @@ static void setfocus(Client *c);
           68  static void setfullscreen(Client *c, int fullscreen);
           69  static void setlayout(const Arg *arg);
           70  static void setmfact(const Arg *arg);
           71 +static void setsmfact(const Arg *arg);
           72  static void setup(void);
           73  static void seturgent(Client *c, int urg);
           74  static void showhide(Client *c);
           75 @@ -232,6 +235,8 @@ static int xerror(Display *dpy, XErrorEvent *ee);
           76  static int xerrordummy(Display *dpy, XErrorEvent *ee);
           77  static int xerrorstart(Display *dpy, XErrorEvent *ee);
           78  static void zoom(const Arg *arg);
           79 +static void bstack(Monitor *m);
           80 +static void bstackhoriz(Monitor *m);
           81  
           82  /* variables */
           83  static const char broken[] = "broken";
           84 @@ -633,10 +638,10 @@ Monitor *
           85  createmon(void)
           86  {
           87          Monitor *m;
           88 -
           89          m = ecalloc(1, sizeof(Monitor));
           90          m->tagset[0] = m->tagset[1] = 1;
           91          m->mfact = mfact;
           92 +        m->smfact = smfact;
           93          m->nmaster = nmaster;
           94          m->showbar = showbar;
           95          m->topbar = topbar;
           96 @@ -1535,6 +1540,20 @@ setmfact(const Arg *arg)
           97          arrange(selmon);
           98  }
           99  
          100 + void
          101 +setsmfact(const Arg *arg) {
          102 +        float sf;
          103 +
          104 +        if(!arg || !selmon->lt[selmon->sellt]->arrange)
          105 +                return;
          106 +        sf = arg->sf < 1.0 ? arg->sf + selmon->smfact : arg->sf - 1.0;
          107 +        if(sf < 0 || sf > 0.9)
          108 +                return;
          109 +        selmon->smfact = sf;
          110 +        arrange(selmon);
          111 +}
          112 +
          113 +
          114  void
          115  setup(void)
          116  {
          117 @@ -1686,7 +1705,7 @@ tagmon(const Arg *arg)
          118  void
          119  tile(Monitor *m)
          120  {
          121 -        unsigned int i, n, h, mw, my, ty;
          122 +        unsigned int i, n, h, smh, mw, my, ty;
          123          Client *c;
          124  
          125          for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
          126 @@ -1704,9 +1723,22 @@ tile(Monitor *m)
          127                          if (my + HEIGHT(c) < m->wh)
          128                                  my += HEIGHT(c);
          129                  } else {
          130 -                        h = (m->wh - ty) / (n - i);
          131 -                        resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
          132 -                        if (ty + HEIGHT(c) < m->wh)
          133 +                        smh = m->mh * m->smfact;
          134 +                        if(!(nexttiled(c->next)))
          135 +                                h = (m->wh - ty) / (n - i);
          136 +                        else
          137 +                                h = (m->wh - smh - ty) / (n - i);
          138 +                        if(h < minwsz) {
          139 +                                c->isfloating = True;
          140 +                                XRaiseWindow(dpy, c->win);
          141 +                                resize(c, m->mx + (m->mw / 2 - WIDTH(c) / 2), m->my + (m->mh / 2 - HEIGHT(c) / 2), m->ww - mw - (2*c->bw), h - (2*c->bw), False);
          142 +                                ty -= HEIGHT(c);
          143 +                        }
          144 +                        else
          145 +                                resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), False);
          146 +                        if(!(nexttiled(c->next)))
          147 +                                ty += HEIGHT(c) + smh;
          148 +                        else
          149                                  ty += HEIGHT(c);
          150                  }
          151  }
          152 @@ -2162,3 +2194,69 @@ main(int argc, char *argv[])
          153          XCloseDisplay(dpy);
          154          return EXIT_SUCCESS;
          155  }
          156 +
          157 +static void
          158 +bstack(Monitor *m) {
          159 +        int w, h, mh, mx, tx, ty, tw, tws;
          160 +        unsigned int i, n;
          161 +        Client *c;
          162 +
          163 +        for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
          164 +        if (n == 0)
          165 +                return;
          166 +        if (n > m->nmaster) {
          167 +                mh = m->nmaster ? m->mfact * m->wh : 0;
          168 +                tw = m->ww / (n - m->nmaster);
          169 +                ty = m->wy + mh;
          170 +        } else {
          171 +                mh = m->wh;
          172 +                tw = m->ww;
          173 +                ty = m->wy;
          174 +        }
          175 +        for (i = mx = 0, tx = m->wx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
          176 +                if (i < m->nmaster) {
          177 +                        w = (m->ww - mx) / (MIN(n, m->nmaster) - i);
          178 +                   resize(c, m->wx + mx, m->wy, w - (2 * c->bw), mh - (2 * c->bw), 0);
          179 +                        mx += WIDTH(c);
          180 +                } else {
          181 +                        h = m->wh - mh;
          182 +            if (i == m->nmaster) {
          183 +                tws = (n > 2) ? tw + m->mw * m->smfact / 2: tw;} 
          184 +            else {
          185 +                tws = tw - m->mw * m->smfact/MAX(n-2, 1) / 2;}
          186 +            resize(c, tx, ty, tws - (2 * c->bw), h - (2 * c->bw), 0);
          187 +                        if (tw != m->ww)
          188 +                                tx += WIDTH(c);
          189 +                }
          190 +        }
          191 +}
          192 +
          193 +static void
          194 +bstackhoriz(Monitor *m) {
          195 +        int w, mh, mx, tx, ty, th;
          196 +        unsigned int i, n;
          197 +        Client *c;
          198 +
          199 +        for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
          200 +        if (n == 0)
          201 +                return;
          202 +        if (n > m->nmaster) {
          203 +                mh = m->nmaster ? m->mfact * m->wh : 0;
          204 +                th = (m->wh - mh) / (n - m->nmaster);
          205 +                ty = m->wy + mh;
          206 +        } else {
          207 +                th = mh = m->wh;
          208 +                ty = m->wy;
          209 +        }
          210 +        for (i = mx = 0, tx = m->wx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
          211 +                if (i < m->nmaster) {
          212 +                        w = (m->ww - mx) / (MIN(n, m->nmaster) - i);
          213 +                        resize(c, m->wx + mx, m->wy, w - (2 * c->bw), mh - (2 * c->bw), 0);
          214 +                        mx += WIDTH(c);
          215 +                } else {
          216 +                        resize(c, tx, ty, m->ww - (2 * c->bw), th - (2 * c->bw), 0);
          217 +                        if (th != m->wh)
          218 +                                ty += HEIGHT(c);
          219 +                }
          220 +        }
          221 +}