dwm-autoswitch-20240921-c282f865.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-autoswitch-20240921-c282f865.diff (5015B)
       ---
            1 From c282f86559f3c7858e34888c1fa0204c22ede89c Mon Sep 17 00:00:00 2001
            2 From: elbachir-one <bachiralfa@gmail.com>
            3 Date: Sat, 21 Sep 2024 22:59:53 +0100
            4 Subject: [PATCH] Allowing manual switch of monocle mode.
            5 
            6 ---
            7  config.def.h |  7 ++---
            8  dwm.c        | 72 +++++++++++++++++++++++++++++++++++++++-------------
            9  2 files changed, 59 insertions(+), 20 deletions(-)
           10 
           11 diff --git a/config.def.h b/config.def.h
           12 index 9efa774..32fafc9 100644
           13 --- a/config.def.h
           14 +++ b/config.def.h
           15 @@ -5,6 +5,7 @@ static const unsigned int borderpx  = 1;        /* border pixel of windows */
           16  static const unsigned int snap      = 32;       /* snap pixel */
           17  static const int showbar            = 1;        /* 0 means no bar */
           18  static const int topbar             = 1;        /* 0 means bottom bar */
           19 +static const int monoclemode        = 4;        /* automatically switch to monocle mode after opening 4 windows */
           20  static const char *fonts[]          = { "monospace:size=10" };
           21  static const char dmenufont[]       = "monospace:size=10";
           22  static const char col_gray1[]       = "#222222";
           23 @@ -40,8 +41,8 @@ static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen win
           24  static const Layout layouts[] = {
           25          /* symbol     arrange function */
           26          { "[]=",      tile },    /* first entry is default */
           27 -        { "><>",      NULL },    /* no layout function means floating behavior */
           28          { "[M]",      monocle },
           29 +        { "><>",      NULL },    /* no layout function means floating behavior */
           30  };
           31  
           32  /* key definitions */
           33 @@ -75,8 +76,8 @@ static const Key keys[] = {
           34          { MODKEY,                       XK_Tab,    view,           {0} },
           35          { MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
           36          { MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
           37 -        { MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
           38 -        { MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
           39 +        { MODKEY,                       XK_m,      setlayout,      {.v = &layouts[1]} },
           40 +        { MODKEY,                       XK_f,      setlayout,      {.v = &layouts[2]} },
           41          { MODKEY,                       XK_space,  setlayout,      {0} },
           42          { MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
           43          { MODKEY,                       XK_0,      view,           {.ui = ~0 } },
           44 diff --git a/dwm.c b/dwm.c
           45 index 67c6b2b..9561896 100644
           46 --- a/dwm.c
           47 +++ b/dwm.c
           48 @@ -130,6 +130,7 @@ struct Monitor {
           49          Monitor *next;
           50          Window barwin;
           51          const Layout *lt[2];
           52 +        int manualswitch;
           53  };
           54  
           55  typedef struct {
           56 @@ -227,6 +228,7 @@ static void updatetitle(Client *c);
           57  static void updatewindowtype(Client *c);
           58  static void updatewmhints(Client *c);
           59  static void view(const Arg *arg);
           60 +static int visibleclientcount(Monitor *m);
           61  static Client *wintoclient(Window w);
           62  static Monitor *wintomon(Window w);
           63  static int xerror(Display *dpy, XErrorEvent *ee);
           64 @@ -382,15 +384,31 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
           65  void
           66  arrange(Monitor *m)
           67  {
           68 -        if (m)
           69 -                showhide(m->stack);
           70 -        else for (m = mons; m; m = m->next)
           71 +        if (!m)
           72 +                for (m = mons; m; m = m->next)
           73 +                        showhide(m->stack);
           74 +        else
           75                  showhide(m->stack);
           76 -        if (m) {
           77 -                arrangemon(m);
           78 -                restack(m);
           79 -        } else for (m = mons; m; m = m->next)
           80 -                arrangemon(m);
           81 +
           82 +        for (Monitor *mon = (m ? m : mons); mon; mon = (m ? NULL : mon->next)) {
           83 +                unsigned int n = visibleclientcount(mon);
           84 +
           85 +                if (!mon->manualswitch) {
           86 +                        if (n >= monoclemode && mon->lt[mon->sellt]->arrange != monocle) {
           87 +                                setlayout(&(Arg) {.v = &layouts[1]});
           88 +                        } else if (n < monoclemode && mon->lt[mon->sellt]->arrange == monocle) {
           89 +                                setlayout(&(Arg) {.v = &layouts[0]});
           90 +                        }
           91 +                }
           92 +
           93 +                if (mon->manualswitch && (n < monoclemode || n >= monoclemode)) {
           94 +                        mon->manualswitch = 0;
           95 +                }
           96 +
           97 +                arrangemon(mon);
           98 +                if (!m)
           99 +                        restack(mon);
          100 +        }
          101  }
          102  
          103  void
          104 @@ -1510,15 +1528,22 @@ setfullscreen(Client *c, int fullscreen)
          105  void
          106  setlayout(const Arg *arg)
          107  {
          108 -        if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
          109 -                selmon->sellt ^= 1;
          110 -        if (arg && arg->v)
          111 -                selmon->lt[selmon->sellt] = (Layout *)arg->v;
          112 -        strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
          113 -        if (selmon->sel)
          114 -                arrange(selmon);
          115 -        else
          116 -                drawbar(selmon);
          117 +        if (!arg || !arg->v)
          118 +                return;
          119 +
          120 +        Layout *newlayout = (Layout *)arg->v;
          121 +        if (newlayout != selmon->lt[selmon->sellt]) {
          122 +                selmon->lt[selmon->sellt] = newlayout;
          123 +                strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof(selmon->ltsymbol));
          124 +                selmon->ltsymbol[sizeof(selmon->ltsymbol) - 1] = '\0';
          125 +
          126 +                selmon->manualswitch = 1;
          127 +
          128 +                if (selmon->sel)
          129 +                        arrange(selmon);
          130 +                else
          131 +                        drawbar(selmon);
          132 +        }
          133  }
          134  
          135  /* arg > 1.0 will set mfact absolutely */
          136 @@ -2062,6 +2087,19 @@ view(const Arg *arg)
          137          arrange(selmon);
          138  }
          139  
          140 +int
          141 +visibleclientcount(Monitor *m)
          142 +{
          143 +        unsigned int count = 0;
          144 +        Client *c;
          145 +        for (c = m->clients; c; c = c->next) {
          146 +                if (ISVISIBLE(c)) {
          147 +                        count++;
          148 +                }
          149 +        }
          150 +        return count;
          151 +}
          152 +
          153  Client *
          154  wintoclient(Window w)
          155  {
          156 -- 
          157 2.46.0
          158