dwm-layoutmonitorrules-20211216-a786211d6cb7.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) 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