sites

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

dwm-cfacts-6.1.diff (3142B)


      1 diff --git a/config.def.h b/config.def.h
      2 index 7054c06..9878dbf 100644
      3 --- a/config.def.h
      4 +++ b/config.def.h
      5 @@ -68,6 +68,9 @@ static Key keys[] = {
      6  	{ MODKEY,                       XK_d,      incnmaster,     {.i = -1 } },
      7  	{ MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
      8  	{ MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
      9 +	{ MODKEY|ShiftMask,             XK_h,      setcfact,       {.f = +0.25} },
     10 +	{ MODKEY|ShiftMask,             XK_l,      setcfact,       {.f = -0.25} },
     11 +	{ MODKEY|ShiftMask,             XK_o,      setcfact,       {.f =  0.00} },
     12  	{ MODKEY,                       XK_Return, zoom,           {0} },
     13  	{ MODKEY,                       XK_Tab,    view,           {0} },
     14  	{ MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
     15 diff --git a/dwm.c b/dwm.c
     16 index 0362114..881afe6 100644
     17 --- a/dwm.c
     18 +++ b/dwm.c
     19 @@ -87,6 +87,7 @@ typedef struct Client Client;
     20  struct Client {
     21  	char name[256];
     22  	float mina, maxa;
     23 +	float cfact;
     24  	int x, y, w, h;
     25  	int oldx, oldy, oldw, oldh;
     26  	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
     27 @@ -201,6 +202,7 @@ static void setclientstate(Client *c, long state);
     28  static void setfocus(Client *c);
     29  static void setfullscreen(Client *c, int fullscreen);
     30  static void setlayout(const Arg *arg);
     31 +static void setcfact(const Arg *arg);
     32  static void setmfact(const Arg *arg);
     33  static void setup(void);
     34  static void showhide(Client *c);
     35 @@ -1052,6 +1054,7 @@ manage(Window w, XWindowAttributes *wa)
     36  	c->w = c->oldw = wa->width;
     37  	c->h = c->oldh = wa->height;
     38  	c->oldbw = wa->border_width;
     39 +	c->cfact = 1.0;
     40  
     41  	if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw)
     42  		c->x = c->mon->mx + c->mon->mw - WIDTH(c);
     43 @@ -1528,6 +1531,23 @@ setlayout(const Arg *arg)
     44  		drawbar(selmon);
     45  }
     46  
     47 +void setcfact(const Arg *arg) {
     48 +	float f;
     49 +	Client *c;
     50 +
     51 +	c = selmon->sel;
     52 +
     53 +	if(!arg || !c || !selmon->lt[selmon->sellt]->arrange)
     54 +		return;
     55 +	f = arg->f + c->cfact;
     56 +	if(arg->f == 0.0)
     57 +		f = 1.0;
     58 +	else if(f < 0.25 || f > 4.0)
     59 +		return;
     60 +	c->cfact = f;
     61 +	arrange(selmon);
     62 +}
     63 +
     64  /* arg > 1.0 will set mfact absolutly */
     65  void
     66  setmfact(const Arg *arg)
     67 @@ -1667,9 +1687,15 @@ void
     68  tile(Monitor *m)
     69  {
     70  	unsigned int i, n, h, mw, my, ty;
     71 +	float mfacts = 0, sfacts = 0;
     72  	Client *c;
     73  
     74 -	for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
     75 +	for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
     76 +		if (n < m->nmaster)
     77 +			mfacts += c->cfact;
     78 +		else
     79 +			sfacts += c->cfact;
     80 +	}
     81  	if (n == 0)
     82  		return;
     83  
     84 @@ -1679,13 +1705,15 @@ tile(Monitor *m)
     85  		mw = m->ww;
     86  	for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
     87  		if (i < m->nmaster) {
     88 -			h = (m->wh - my) / (MIN(n, m->nmaster) - i);
     89 +			h = (m->wh - my) * (c->cfact / mfacts);
     90  			resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
     91  			my += HEIGHT(c);
     92 +			mfacts -= c->cfact;
     93  		} else {
     94 -			h = (m->wh - ty) / (n - i);
     95 +			h = (m->wh - ty) * (c->cfact / sfacts);
     96  			resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
     97  			ty += HEIGHT(c);
     98 +			sfacts -= c->cfact;
     99  		}
    100  }
    101