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