dwm-cfacts_centeredmaster-6.2.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-cfacts_centeredmaster-6.2.diff (5432B)
       ---
            1 diff -up a/config.def.h b/config.def.h
            2 --- a/config.def.h        2019-06-05 02:24:05.503321320 +0200
            3 +++ b/config.def.h        2019-06-05 10:46:48.099997829 +0200
            4 @@ -41,6 +41,8 @@ static const Layout layouts[] = {
            5          { "[]=",      tile },    /* first entry is default */
            6          { "><>",      NULL },    /* no layout function means floating behavior */
            7          { "[M]",      monocle },
            8 +        { "|M|",      centeredmaster },
            9 +        { ">M>",      centeredfloatingmaster },
           10  };
           11  
           12  /* key definitions */
           13 @@ -79,6 +81,8 @@ static Key keys[] = {
           14          { MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
           15          { MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
           16          { MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
           17 +        { MODKEY,                       XK_u,      setlayout,      {.v = &layouts[3]} },
           18 +        { MODKEY,                       XK_o,      setlayout,      {.v = &layouts[4]} },
           19          { MODKEY,                       XK_space,  setlayout,      {0} },
           20          { MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
           21          { MODKEY,                       XK_0,      view,           {.ui = ~0 } },
           22 Only in a: config.def.h.orig
           23 Only in b: dwm-bottomstack-20160719-56a31dc.diff
           24 diff -up a/dwm.c b/dwm.c
           25 --- a/dwm.c        2019-06-05 02:25:40.169986187 +0200
           26 +++ b/dwm.c        2019-06-05 10:48:42.443328992 +0200
           27 @@ -235,6 +235,8 @@ static int xerror(Display *dpy, XErrorEv
           28  static int xerrordummy(Display *dpy, XErrorEvent *ee);
           29  static int xerrorstart(Display *dpy, XErrorEvent *ee);
           30  static void zoom(const Arg *arg);
           31 +static void centeredmaster(Monitor *m);
           32 +static void centeredfloatingmaster(Monitor *m);
           33  
           34  /* variables */
           35  static const char broken[] = "broken";
           36 @@ -2175,3 +2177,144 @@ main(int argc, char *argv[])
           37          XCloseDisplay(dpy);
           38          return EXIT_SUCCESS;
           39  }
           40 +
           41 +void
           42 +centeredmaster(Monitor *m)
           43 +{
           44 +        unsigned int i, n, h, mw, mx, my, oty, ety, tw;
           45 +        float mfacts = 0, lfacts = 0, rfacts = 0;
           46 +        Client *c;
           47 +
           48 +        /* count number of clients in the selected monitor */
           49 +        for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
           50 +                if (n < m->nmaster)
           51 +                        mfacts += c->cfact;
           52 +                else if ((n - m->nmaster) % 2) 
           53 +                        lfacts += c->cfact;
           54 +                else
           55 +                        rfacts += c->cfact;
           56 +        }
           57 +        if (n == 0)
           58 +                return;
           59 +        if(n == 1){
           60 +                c = nexttiled(m->clients);
           61 +                resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0);
           62 +                return;
           63 +        }
           64 +
           65 +        /* initialize areas */
           66 +        mw = m->ww;
           67 +        mx = 0;
           68 +        my = 0;
           69 +        tw = mw;
           70 +
           71 +        if (n > m->nmaster) {
           72 +                /* go mfact box in the center if more than nmaster clients */
           73 +                mw = m->nmaster ? m->ww * m->mfact : 0;
           74 +                tw = m->ww - mw;
           75 +
           76 +                if (n - m->nmaster > 1) {
           77 +                        /* only one client */
           78 +                        mx = (m->ww - mw) / 2;
           79 +                        tw = (m->ww - mw) / 2;
           80 +                }
           81 +        }
           82 +
           83 +        oty = 0;
           84 +        ety = 0;
           85 +        for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
           86 +        if (i < m->nmaster) {
           87 +                /* nmaster clients are stacked vertically, in the center
           88 +                 * of the screen */
           89 +                h = (m->wh - my) * (c->cfact / mfacts);
           90 +                resize(c, m->wx + mx, m->wy + my, mw - 2*c->bw,
           91 +                      h - 2*c->bw, 0);
           92 +                if(my + HEIGHT(c) < m->mh)
           93 +                        my += HEIGHT(c);
           94 +                mfacts -= c->cfact;
           95 +        } else {
           96 +                /* stack clients are stacked vertically */
           97 +                if ((i - m->nmaster) % 2) {
           98 +                        h = (m->wh - ety) * (c->cfact / lfacts);
           99 +                        if(m->nmaster == 0)
          100 +                                resize(c, m->wx, m->wy + ety, tw - 2*c->bw,
          101 +                               h - 2*c->bw, 0);
          102 +                        else
          103 +                                resize(c, m->wx, m->wy + ety, tw - 2*c->bw,
          104 +                               h - 2*c->bw, 0);
          105 +                        if(ety + HEIGHT(c) < m->mh)
          106 +                                ety += HEIGHT(c);
          107 +                        lfacts -= c->cfact;
          108 +                } else {
          109 +                        h = (m->wh - oty) * (c->cfact / rfacts);
          110 +                        resize(c, m->wx + mx + mw, m->wy + oty,
          111 +                               tw - 2*c->bw, h - 2*c->bw, 0);
          112 +                        if(oty + HEIGHT(c) < m->mh)
          113 +                                oty += HEIGHT(c);
          114 +                        rfacts -= c->cfact;
          115 +                }
          116 +        }
          117 +}
          118 +
          119 +void
          120 +centeredfloatingmaster(Monitor *m)
          121 +{
          122 +        unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx;
          123 +        float mfacts = 0, sfacts = 0;
          124 +        Client *c;
          125 +
          126 +        /* count number of clients in the selected monitor */
          127 +        for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
          128 +                if (n < m->nmaster)
          129 +                        mfacts += c->cfact;
          130 +                else
          131 +                        sfacts += c->cfact;
          132 +        }
          133 +        if (n == 0)
          134 +                return;
          135 +        if(n == 1){
          136 +                c = nexttiled(m->clients);
          137 +                resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0);
          138 +                return;
          139 +        }
          140 +
          141 +        /* initialize nmaster area */
          142 +        if (n > m->nmaster) {
          143 +                /* go mfact box in the center if more than nmaster clients */
          144 +                if (m->ww > m->wh) {
          145 +                        mw = m->nmaster ? m->ww * m->mfact : 0;
          146 +                        mh = m->nmaster ? m->wh * 0.9 : 0;
          147 +                } else {
          148 +                        mh = m->nmaster ? m->wh * m->mfact : 0;
          149 +                        mw = m->nmaster ? m->ww * 0.9 : 0;
          150 +                }
          151 +                mx = mxo = (m->ww - mw) / 2;
          152 +                my = myo = (m->wh - mh) / 2;
          153 +        } else {
          154 +                /* go fullscreen if all clients are in the master area */
          155 +                mh = m->wh;
          156 +                mw = m->ww;
          157 +                mx = mxo = 0;
          158 +                my = myo = 0;
          159 +        }
          160 +
          161 +        for(i = tx = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
          162 +        if (i < m->nmaster) {
          163 +                /* nmaster clients are stacked horizontally, in the center
          164 +                 * of the screen */
          165 +                w = (mw + mxo - mx) * (c->cfact / mfacts);
          166 +                resize(c, m->wx + mx, m->wy + my, w - 2*c->bw,
          167 +                       mh - 2*c->bw, 0);
          168 +                if(mx + WIDTH(c) < m->mw)
          169 +                        mx += WIDTH(c);
          170 +                mfacts -= c->cfact; 
          171 +        } else {
          172 +                /* stack clients are stacked horizontally */
          173 +                w = (m->ww - tx) * (c->cfact / sfacts);
          174 +                resize(c, m->wx + tx, m->wy, w - 2*c->bw,
          175 +                       m->wh - 2*c->bw, 0);
          176 +                if(tx + WIDTH(c) < m->mw)
          177 +                        tx += WIDTH(c);
          178 +                sfacts -= c->cfact; 
          179 +        }
          180 +}