sites

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

dwm-layoutmonitorrules-20211216-a786211d6cb7.diff (2609B)


      1 diff --git config.def.h config.def.h
      2 index a2ac963..9af5393 100644
      3 --- config.def.h
      4 +++ config.def.h
      5 @@ -37,6 +37,11 @@ static const int nmaster     = 1;    /* number of clients in master area */
      6  static const int resizehints = 1;    /* 1 means respect size hints in tiled resizals */
      7  static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
      8  
      9 +static const LayoutMonitorRule lm_rules[] = {
     10 +	/* >=w, >=h, req'd layout, new nmaster, new mfact */
     11 +	{ 3000, 0,   0,            2,           0.66 },
     12 +};
     13 +
     14  static const Layout layouts[] = {
     15  	/* symbol     arrange function */
     16  	{ "[]=",      tile },    /* first entry is default */
     17 diff --git dwm.c dwm.c
     18 index 5e4d494..d462775 100644
     19 --- dwm.c
     20 +++ dwm.c
     21 @@ -111,6 +111,13 @@ typedef struct {
     22  	void (*arrange)(Monitor *);
     23  } Layout;
     24  
     25 +typedef struct {
     26 +	int mw, mh;    /* >= matching */
     27 +	int layout;    /* only apply if this is the current layout, <0 for no matching */
     28 +	int nmaster;   /* the new nmaster to apply */
     29 +	float mfact;   /* the new mfact to apply */
     30 +} LayoutMonitorRule;
     31 +
     32  struct Monitor {
     33  	char ltsymbol[16];
     34  	float mfact;
     35 @@ -142,6 +149,7 @@ typedef struct {
     36  } Rule;
     37  
     38  /* function declarations */
     39 +static void applylmrules(void);
     40  static void applyrules(Client *c);
     41  static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact);
     42  static void arrange(Monitor *m);
     43 @@ -276,6 +284,31 @@ static Window root, wmcheckwin;
     44  struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
     45  
     46  /* function implementations */
     47 +void
     48 +applylmrules(void)
     49 +{
     50 +	float new_mfact = mfact;
     51 +	int new_nmaster = nmaster;
     52 +	size_t i;
     53 +
     54 +	for (i = 0; i < LENGTH(lm_rules); i++) {
     55 +		const LayoutMonitorRule *lmr = &lm_rules[i];
     56 +
     57 +		if (selmon->mw >= lmr->mw &&
     58 +		    selmon->mh >= lmr->mh &&
     59 +		    selmon->sellt == lmr->layout)
     60 +		{
     61 +			new_mfact = lmr->mfact;
     62 +			new_nmaster = lmr->nmaster;
     63 +			break;
     64 +		}
     65 +	}
     66 +
     67 +	selmon->mfact = new_mfact;
     68 +	selmon->nmaster = new_nmaster;
     69 +	arrange(selmon);
     70 +}
     71 +
     72  void
     73  applyrules(Client *c)
     74  {
     75 @@ -572,6 +605,7 @@ configurenotify(XEvent *e)
     76  			}
     77  			focus(NULL);
     78  			arrange(NULL);
     79 +			applylmrules();
     80  		}
     81  	}
     82  }
     83 @@ -1506,9 +1540,8 @@ setlayout(const Arg *arg)
     84  	if (arg && arg->v)
     85  		selmon->lt[selmon->sellt] = (Layout *)arg->v;
     86  	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
     87 -	if (selmon->sel)
     88 -		arrange(selmon);
     89 -	else
     90 +	applylmrules();
     91 +	if (!selmon->sel)
     92  		drawbar(selmon);
     93  }
     94  
     95 @@ -1595,6 +1628,7 @@ setup(void)
     96  	XSelectInput(dpy, root, wa.event_mask);
     97  	grabkeys();
     98  	focus(NULL);
     99 +	applylmrules();
    100  }
    101  
    102