sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

dwm-pertag-6.0.diff (5955B)


      1 Author: Jan Christoph Ebersbach <jceb@e-jc.de>
      2 URL: http://dwm.suckless.org/patches/pertag
      3 This patch keeps layout, mwfact, barpos and nmaster per tag.
      4 
      5 diff -r ec4baab78314 dwm.c
      6 --- a/dwm.c	Mon Dec 19 15:38:30 2011 +0100
      7 +++ b/dwm.c	Fri Apr 06 08:23:29 2012 +0200
      8 @@ -124,6 +124,7 @@
      9  	void (*arrange)(Monitor *);
     10  } Layout;
     11  
     12 +typedef struct Pertag Pertag;
     13  struct Monitor {
     14  	char ltsymbol[16];
     15  	float mfact;
     16 @@ -143,6 +144,7 @@
     17  	Monitor *next;
     18  	Window barwin;
     19  	const Layout *lt[2];
     20 +	Pertag *pertag;
     21  };
     22  
     23  typedef struct {
     24 @@ -287,6 +289,15 @@
     25  /* configuration, allows nested code to access above variables */
     26  #include "config.h"
     27  
     28 +struct Pertag {
     29 +	unsigned int curtag, prevtag; /* current and previous tag */
     30 +	int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */
     31 +	float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */
     32 +	unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
     33 +	const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes  */
     34 +	Bool showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
     35 +};
     36 +
     37  /* compile-time check if all tags fit into an unsigned int bit array. */
     38  struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
     39  
     40 @@ -646,6 +657,7 @@
     41  Monitor *
     42  createmon(void) {
     43  	Monitor *m;
     44 +	int i;
     45  
     46  	if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
     47  		die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
     48 @@ -657,6 +669,24 @@
     49  	m->lt[0] = &layouts[0];
     50  	m->lt[1] = &layouts[1 % LENGTH(layouts)];
     51  	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
     52 +	if(!(m->pertag = (Pertag *)calloc(1, sizeof(Pertag))))
     53 +		die("fatal: could not malloc() %u bytes\n", sizeof(Pertag));
     54 +	m->pertag->curtag = m->pertag->prevtag = 1;
     55 +	for(i=0; i <= LENGTH(tags); i++) {
     56 +		/* init nmaster */
     57 +		m->pertag->nmasters[i] = m->nmaster;
     58 +
     59 +		/* init mfacts */
     60 +		m->pertag->mfacts[i] = m->mfact;
     61 +
     62 +		/* init layouts */
     63 +		m->pertag->ltidxs[i][0] = m->lt[0];
     64 +		m->pertag->ltidxs[i][1] = m->lt[1];
     65 +		m->pertag->sellts[i] = m->sellt;
     66 +
     67 +		/* init showbar */
     68 +		m->pertag->showbars[i] = m->showbar;
     69 +	}
     70  	return m;
     71  }
     72  
     73 @@ -1028,7 +1058,7 @@
     74  
     75  void
     76  incnmaster(const Arg *arg) {
     77 -	selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
     78 +	selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0);
     79  	arrange(selmon);
     80  }
     81  
     82 @@ -1555,10 +1585,13 @@
     83  
     84  void
     85  setlayout(const Arg *arg) {
     86 -	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
     87 -		selmon->sellt ^= 1;
     88 +	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) {
     89 +		selmon->pertag->sellts[selmon->pertag->curtag] ^= 1;
     90 +		selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
     91 +	}
     92  	if(arg && arg->v)
     93 -		selmon->lt[selmon->sellt] = (Layout *)arg->v;
     94 +		selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v;
     95 +	selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
     96  	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
     97  	if(selmon->sel)
     98  		arrange(selmon);
     99 @@ -1576,7 +1609,7 @@
    100  	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
    101  	if(f < 0.1 || f > 0.9)
    102  		return;
    103 -	selmon->mfact = f;
    104 +	selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f;
    105  	arrange(selmon);
    106  }
    107  
    108 @@ -1729,7 +1762,7 @@
    109  
    110  void
    111  togglebar(const Arg *arg) {
    112 -	selmon->showbar = !selmon->showbar;
    113 +	selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar;
    114  	updatebarpos(selmon);
    115  	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
    116  	arrange(selmon);
    117 @@ -1763,9 +1796,29 @@
    118  void
    119  toggleview(const Arg *arg) {
    120  	unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
    121 +	int i;
    122  
    123  	if(newtagset) {
    124 +		if(newtagset == ~0) {
    125 +			selmon->pertag->prevtag = selmon->pertag->curtag;
    126 +			selmon->pertag->curtag = 0;
    127 +		}
    128 +		/* test if the user did not select the same tag */
    129 +		if(!(newtagset & 1 << (selmon->pertag->curtag - 1))) {
    130 +			selmon->pertag->prevtag = selmon->pertag->curtag;
    131 +			for (i=0; !(newtagset & 1 << i); i++) ;
    132 +			selmon->pertag->curtag = i + 1;
    133 +		}
    134  		selmon->tagset[selmon->seltags] = newtagset;
    135 +
    136 +		/* apply settings for this view */
    137 +		selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
    138 +		selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
    139 +		selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
    140 +		selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
    141 +		selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
    142 +		if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
    143 +			togglebar(NULL);
    144  		focus(NULL);
    145  		arrange(selmon);
    146  	}
    147 @@ -2043,11 +2096,33 @@
    148  
    149  void
    150  view(const Arg *arg) {
    151 +	int i;
    152 +	unsigned int tmptag;
    153 +
    154  	if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
    155  		return;
    156  	selmon->seltags ^= 1; /* toggle sel tagset */
    157 -	if(arg->ui & TAGMASK)
    158 +	if(arg->ui & TAGMASK) {
    159 +		selmon->pertag->prevtag = selmon->pertag->curtag;
    160  		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
    161 +		if(arg->ui == ~0)
    162 +			selmon->pertag->curtag = 0;
    163 +		else {
    164 +			for (i=0; !(arg->ui & 1 << i); i++) ;
    165 +			selmon->pertag->curtag = i + 1;
    166 +		}
    167 +	} else {
    168 +		tmptag = selmon->pertag->prevtag;
    169 +		selmon->pertag->prevtag = selmon->pertag->curtag;
    170 +		selmon->pertag->curtag = tmptag;
    171 +	}
    172 +	selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
    173 +	selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
    174 +	selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
    175 +	selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
    176 +	selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
    177 +	if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
    178 +		togglebar(NULL);
    179  	focus(NULL);
    180  	arrange(selmon);
    181  }