dwm-winview-gaplessgrid-gridall-6.5.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-winview-gaplessgrid-gridall-6.5.diff (4397B)
       ---
            1 diff -upN _dwm-6.5/config.def.h dwm-6.5_gridall/config.def.h
            2 --- _dwm-6.5/config.def.h        2024-03-19 08:24:52.000000000 -0300
            3 +++ dwm-6.5_gridall/config.def.h        2025-06-13 08:50:53.706890303 -0300
            4 @@ -1,4 +1,5 @@
            5  /* See LICENSE file for copyright and license details. */
            6 +#include "gaplessgrid.c"
            7  
            8  /* appearance */
            9  static const unsigned int borderpx  = 1;        /* border pixel of windows */
           10 @@ -42,6 +43,7 @@ static const Layout layouts[] = {
           11          { "[]=",      tile },    /* first entry is default */
           12          { "><>",      NULL },    /* no layout function means floating behavior */
           13          { "[M]",      monocle },
           14 +        { "HHH",      gaplessgrid },
           15  };
           16  
           17  /* key definitions */
           18 @@ -95,6 +97,9 @@ static const Key keys[] = {
           19          TAGKEYS(                        XK_8,                      7)
           20          TAGKEYS(                        XK_9,                      8)
           21          { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
           22 +        { MODKEY,                       XK_o,      winview,        {0} },
           23 +        { MODKEY,                       XK_g,      gridall,        {} },
           24 +        { MODKEY,                       XK_r,      winviewmono,    {} },
           25  };
           26  
           27  /* button definitions */
           28 diff -upN _dwm-6.5/dwm.1 dwm-6.5_gridall/dwm.1
           29 --- _dwm-6.5/dwm.1        2024-03-19 08:24:52.000000000 -0300
           30 +++ dwm-6.5_gridall/dwm.1        2025-06-13 08:47:30.480858739 -0300
           31 @@ -110,6 +110,9 @@ Increase master area size.
           32  .B Mod1\-h
           33  Decrease master area size.
           34  .TP
           35 +.B Mod1\-o
           36 +Select view of the window in focus. The list of tags to be displayed is matched to the window tag list.
           37 +.TP
           38  .B Mod1\-Return
           39  Zooms/cycles focused window to/from master area (tiled layouts only).
           40  .TP
           41 diff -upN _dwm-6.5/dwm.c dwm-6.5_gridall/dwm.c
           42 --- _dwm-6.5/dwm.c        2024-03-19 08:24:52.000000000 -0300
           43 +++ dwm-6.5_gridall/dwm.c        2025-06-13 08:49:14.708874297 -0300
           44 @@ -229,10 +229,13 @@ static void updatewmhints(Client *c);
           45  static void view(const Arg *arg);
           46  static Client *wintoclient(Window w);
           47  static Monitor *wintomon(Window w);
           48 +static void winview(const Arg* arg);
           49  static int xerror(Display *dpy, XErrorEvent *ee);
           50  static int xerrordummy(Display *dpy, XErrorEvent *ee);
           51  static int xerrorstart(Display *dpy, XErrorEvent *ee);
           52  static void zoom(const Arg *arg);
           53 +static void gridall(const Arg *arg);
           54 +static void winviewmono(const Arg *arg);
           55  
           56  /* variables */
           57  static const char broken[] = "broken";
           58 @@ -2092,6 +2095,41 @@ wintomon(Window w)
           59          return selmon;
           60  }
           61  
           62 +/* Selects for the view of the focused window. The list of tags */
           63 +/* to be displayed is matched to the focused window tag list. */
           64 +void
           65 +winview(const Arg* arg){
           66 +        Window win, win_r, win_p, *win_c;
           67 +        unsigned nc;
           68 +        int unused;
           69 +        Client* c;
           70 +        Arg a;
           71 +
           72 +        if (!XGetInputFocus(dpy, &win, &unused)) return;
           73 +        while(XQueryTree(dpy, win, &win_r, &win_p, &win_c, &nc)
           74 +              && win_p != win_r) win = win_p;
           75 +
           76 +        if (!(c = wintoclient(win))) return;
           77 +
           78 +        a.ui = c->tags;
           79 +        view(&a);
           80 +}
           81 +
           82 +/* by desgua */
           83 +void
           84 +gridall(const Arg *arg)
           85 +{
           86 +        setlayout(&(Arg){.v = &layouts[3]});
           87 +        view(&(Arg){.ui = ~0});
           88 +}
           89 +
           90 +void
           91 +winviewmono(const Arg *arg)
           92 +{
           93 +        winview(&(Arg){0});
           94 +        setlayout(&(Arg){.v = &layouts[2]});
           95 +}
           96 +
           97  /* There's no way to check accesses to destroyed windows, thus those cases are
           98   * ignored (especially on UnmapNotify's). Other types of errors call Xlibs
           99   * default error handler, which may call exit. */
          100 diff -upN _dwm-6.5/gaplessgrid.c dwm-6.5_gridall/gaplessgrid.c
          101 --- _dwm-6.5/gaplessgrid.c        1969-12-31 21:00:00.000000000 -0300
          102 +++ dwm-6.5_gridall/gaplessgrid.c        2025-06-13 08:47:30.480858739 -0300
          103 @@ -0,0 +1,35 @@
          104 +void
          105 +gaplessgrid(Monitor *m) {
          106 +        unsigned int n, cols, rows, cn, rn, i, cx, cy, cw, ch;
          107 +        Client *c;
          108 +
          109 +        for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) ;
          110 +        if(n == 0)
          111 +                return;
          112 +
          113 +        /* grid dimensions */
          114 +        for(cols = 0; cols <= n/2; cols++)
          115 +                if(cols*cols >= n)
          116 +                        break;
          117 +        if(n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
          118 +                cols = 2;
          119 +        rows = n/cols;
          120 +
          121 +        /* window geometries */
          122 +        cw = cols ? m->ww / cols : m->ww;
          123 +        cn = 0; /* current column number */
          124 +        rn = 0; /* current row number */
          125 +        for(i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c->next)) {
          126 +                if(i/rows + 1 > cols - n%cols)
          127 +                        rows = n/cols + 1;
          128 +                ch = rows ? m->wh / rows : m->wh;
          129 +                cx = m->wx + cn*cw;
          130 +                cy = m->wy + rn*ch;
          131 +                resize(c, cx, cy, cw - 2 * c->bw, ch - 2 * c->bw, False);
          132 +                rn++;
          133 +                if(rn >= rows) {
          134 +                        rn = 0;
          135 +                        cn++;
          136 +                }
          137 +        }
          138 +}