Guest User

Untitled

a guest
Jul 16th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 7.17 KB | None | 0 0
  1. --- a/dwm.c 2012-01-12 08:36:05.000000000 +0200
  2. +++ b/dwm.c 2012-01-17 01:52:11.397102176 +0200
  3. @@ -126,8 +126,6 @@ typedef struct {
  4.  
  5.  struct Monitor {
  6.     char ltsymbol[16];
  7. -   float mfact;
  8. -   int nmaster;
  9.     int num;
  10.     int by;               /* bar geometry */
  11.     int mx, my, mw, mh;   /* screen size */
  12. @@ -143,9 +141,21 @@ struct Monitor {
  13.     Monitor *next;
  14.     Window barwin;
  15.     const Layout *lt[2];
  16. +   int curtag;
  17. +   int prevtag;
  18. +   const Layout **lts;
  19. +   double *mfacts;
  20. +   int *nmasters;
  21.  };
  22.  
  23.  typedef struct {
  24. +   const char *name;
  25. +   const Layout *layout;
  26. +   float mfact;
  27. +   int nmaster;
  28. +} Tag;
  29. +
  30. +typedef struct {
  31.     const char *class;
  32.     const char *instance;
  33.     const char *title;
  34. @@ -251,6 +261,7 @@ static int xerror(Display *dpy, XErrorEv
  35.  static int xerrordummy(Display *dpy, XErrorEvent *ee);
  36.  static int xerrorstart(Display *dpy, XErrorEvent *ee);
  37.  static void zoom(const Arg *arg);
  38. +static void bstack(Monitor *m);
  39.  
  40.  /* variables */
  41.  static const char broken[] = "broken";
  42. @@ -441,7 +452,7 @@ buttonpress(XEvent *e) {
  43.     if(ev->window == selmon->barwin) {
  44.         i = x = 0;
  45.         do
  46. -           x += TEXTW(tags[i]);
  47. +           x += TEXTW(tags[i].name);
  48.         while(ev->x >= x && ++i < LENGTH(tags));
  49.         if(i < LENGTH(tags)) {
  50.             click = ClkTagBar;
  51. @@ -513,6 +524,9 @@ cleanupmon(Monitor *mon) {
  52.     }
  53.     XUnmapWindow(dpy, mon->barwin);
  54.     XDestroyWindow(dpy, mon->barwin);
  55. +   free(mon->mfacts);
  56. +   free(mon->nmasters);
  57. +   free(mon->lts);
  58.     free(mon);
  59.  }
  60.  
  61. @@ -646,17 +660,31 @@ configurerequest(XEvent *e) {
  62.  Monitor *
  63.  createmon(void) {
  64.     Monitor *m;
  65. +   int i, numtags = LENGTH(tags) + 1;
  66.  
  67.     if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
  68.         die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
  69. +   if(!(m->mfacts = calloc(numtags, sizeof(double))))
  70. +       die("fatal: could not malloc() %u bytes\n", sizeof(double) * numtags);
  71. +   if(!(m->nmasters = calloc(numtags, sizeof(int))))
  72. +       die("fatal: could not malloc() %u bytes\n", sizeof(int) * numtags);
  73. +   if(!(m->lts = calloc(numtags, sizeof(Layout *))))
  74. +       die("fatal: could not malloc() %u bytes\n", sizeof(Layout *) * numtags);
  75.     m->tagset[0] = m->tagset[1] = 1;
  76. -   m->mfact = mfact;
  77. -   m->nmaster = nmaster;
  78. +   m->mfacts[0] = mfact;
  79. +   m->nmasters[0] = nmaster;
  80. +   m->lts[0] = &layouts[0];
  81.     m->showbar = showbar;
  82.     m->topbar = topbar;
  83. -   m->lt[0] = &layouts[0];
  84. +   m->curtag = m->prevtag = 1;
  85. +   for(i = 1; i < numtags; i++) {
  86. +       m->mfacts[i] = tags[i - 1].mfact < 0 ? mfact : tags[i - 1].mfact;
  87. +       m->nmasters[i] = tags[i - 1].nmaster < 0 ? nmaster : tags[i - 1].nmaster;
  88. +       m->lts[i] = tags[i - 1].layout;
  89. +   }
  90. +   m->lt[0] = m->lts[m->curtag];
  91.     m->lt[1] = &layouts[1 % LENGTH(layouts)];
  92. -   strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
  93. +   strncpy(m->ltsymbol, m->lt[0]->symbol, sizeof m->ltsymbol);
  94.     return m;
  95.  }
  96.  
  97. @@ -729,9 +757,9 @@ drawbar(Monitor *m) {
  98.     }
  99.     dc.x = 0;
  100.     for(i = 0; i < LENGTH(tags); i++) {
  101. -       dc.w = TEXTW(tags[i]);
  102. +       dc.w = TEXTW(tags[i].name);
  103.         col = m->tagset[m->seltags] & 1 << i ? dc.sel : dc.norm;
  104. -       drawtext(tags[i], col, urg & 1 << i);
  105. +       drawtext(tags[i].name, col, urg & 1 << i);
  106.         drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
  107.                    occ & 1 << i, urg & 1 << i, col);
  108.         dc.x += dc.w;
  109. @@ -1028,7 +1056,7 @@ grabkeys(void) {
  110.  
  111.  void
  112.  incnmaster(const Arg *arg) {
  113. -   selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
  114. +   selmon->nmasters[selmon->curtag] = MAX(selmon->nmasters[selmon->curtag] + arg->i, 0);
  115.     arrange(selmon);
  116.  }
  117.  
  118. @@ -1556,7 +1584,7 @@ setlayout(const Arg *arg) {
  119.     if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
  120.         selmon->sellt ^= 1;
  121.     if(arg && arg->v)
  122. -       selmon->lt[selmon->sellt] = (Layout *)arg->v;
  123. +       selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
  124.     strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
  125.     if(selmon->sel)
  126.         arrange(selmon);
  127. @@ -1571,10 +1599,10 @@ setmfact(const Arg *arg) {
  128.  
  129.     if(!arg || !selmon->lt[selmon->sellt]->arrange)
  130.         return;
  131. -   f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
  132. +   f = arg->f < 1.0 ? arg->f + selmon->mfacts[selmon->curtag] : arg->f - 1.0;
  133.     if(f < 0.1 || f > 0.9)
  134.         return;
  135. -   selmon->mfact = f;
  136. +   selmon->mfacts[selmon->curtag] = f;
  137.     arrange(selmon);
  138.  }
  139.  
  140. @@ -1708,13 +1736,13 @@ tile(Monitor *m) {
  141.     if(n == 0)
  142.         return;
  143.  
  144. -   if(n > m->nmaster)
  145. -       mw = m->nmaster ? m->ww * m->mfact : 0;
  146. +   if(n > m->nmasters[m->curtag])
  147. +       mw = m->nmasters[m->curtag] ? m->ww * m->mfacts[m->curtag] : 0;
  148.     else
  149.         mw = m->ww;
  150.     for(i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
  151. -       if(i < m->nmaster) {
  152. -           h = (m->wh - my) / (MIN(n, m->nmaster) - i);
  153. +       if(i < m->nmasters[m->curtag]) {
  154. +           h = (m->wh - my) / (MIN(n, m->nmasters[m->curtag]) - i);
  155.             resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), False);
  156.             my += HEIGHT(c);
  157.         }
  158. @@ -1746,13 +1774,24 @@ togglefloating(const Arg *arg) {
  159.  
  160.  void
  161.  toggletag(const Arg *arg) {
  162. -   unsigned int newtags;
  163. +   unsigned int i, newtags;
  164.  
  165.     if(!selmon->sel)
  166.         return;
  167.     newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
  168.     if(newtags) {
  169.         selmon->sel->tags = newtags;
  170. +       if(newtags == ~0) {
  171. +           selmon->prevtag = selmon->curtag;
  172. +           selmon->curtag = 0;
  173. +       }
  174. +       if(!(newtags & 1 << (selmon->curtag - 1))) {
  175. +           selmon->prevtag = selmon->curtag;
  176. +           for (i=0; !(newtags & 1 << i); i++);
  177. +           selmon->curtag = i + 1;
  178. +       }
  179. +       selmon->sel->tags = newtags;
  180. +       selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
  181.         focus(NULL);
  182.         arrange(selmon);
  183.     }
  184. @@ -2043,11 +2082,26 @@ updatewmhints(Client *c) {
  185.  
  186.  void
  187.  view(const Arg *arg) {
  188. +   unsigned int i;
  189. +
  190.     if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
  191.         return;
  192.     selmon->seltags ^= 1; /* toggle sel tagset */
  193. -   if(arg->ui & TAGMASK)
  194. +   if(arg->ui & TAGMASK) {
  195.         selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
  196. +       selmon->prevtag = selmon->curtag;
  197. +       if(arg->ui == ~0)
  198. +           selmon->curtag = 0;
  199. +       else {
  200. +           for (i=0; !(arg->ui & 1 << i); i++);
  201. +           selmon->curtag = i + 1;
  202. +       }
  203. +   } else {
  204. +       selmon->prevtag= selmon->curtag ^ selmon->prevtag;
  205. +       selmon->curtag^= selmon->prevtag;
  206. +       selmon->prevtag= selmon->curtag ^ selmon->prevtag;
  207. +   }
  208. +   selmon->lt[selmon->sellt]= selmon->lts[selmon->curtag];
  209.     focus(NULL);
  210.     arrange(selmon);
  211.  }
  212. @@ -2126,6 +2180,32 @@ zoom(const Arg *arg) {
  213.     pop(c);
  214.  }
  215.  
  216. +void
  217. +bstack(Monitor *m) {
  218. +   unsigned int i, n, w, mh, mx, tx;
  219. +   Client *c;
  220. +
  221. +   for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
  222. +   if(n == 0)
  223. +       return;
  224. +
  225. +   if(n > m->nmasters[m->curtag])
  226. +       mh = m->nmasters[m->curtag] ? m->wh * m->mfacts[m->curtag] : 0;
  227. +   else
  228. +       mh = m->wh;
  229. +   for(i = mx = tx = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
  230. +       if(i < m->nmasters[m->curtag]) {
  231. +           w = (m->ww - mx) / (MIN(n, m->nmasters[m->curtag]) - i);
  232. +           resize(c, m->wx + mx, m->wy, w - (2*c->bw), mh - (2*c->bw), False);
  233. +           mx += WIDTH(c);
  234. +       }
  235. +       else {
  236. +           w = (m->ww - tx) / (n - i);
  237. +           resize(c, m->wx + tx, m->wy + mh, w - (2*c->bw), m->wh - mh - (2*c->bw), False);
  238. +           tx += WIDTH(c);
  239. +       }
  240. +}
  241. +
  242.  int
  243.  main(int argc, char *argv[]) {
  244.     if(argc == 2 && !strcmp("-v", argv[1]))
Add Comment
Please, Sign In to add comment