dwm

my fork of dwm
Index Commits Files Refs README LICENSE
patches/dwm-smartborders-6.2.diff (7570B)
   1 diff --git a/dwm.c b/dwm.c
   2 index 4465af1..3c94e4b 100644
   3 --- a/dwm.c
   4 +++ b/dwm.c
   5 @@ -143,7 +143,7 @@ typedef struct {
   6  
   7  /* function declarations */
   8  static void applyrules(Client *c);
   9 -static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact);
  10 +static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int *bw, int interact);
  11  static void arrange(Monitor *m);
  12  static void arrangemon(Monitor *m);
  13  static void attach(Client *c);
  14 @@ -188,8 +188,8 @@ static void pop(Client *);
  15  static void propertynotify(XEvent *e);
  16  static void quit(const Arg *arg);
  17  static Monitor *recttomon(int x, int y, int w, int h);
  18 -static void resize(Client *c, int x, int y, int w, int h, int interact);
  19 -static void resizeclient(Client *c, int x, int y, int w, int h);
  20 +static void resize(Client *c, int x, int y, int w, int h, int bw, int interact);
  21 +static void resizeclient(Client *c, int x, int y, int w, int h, int bw);
  22  static void resizemouse(const Arg *arg);
  23  static void restack(Monitor *m);
  24  static void run(void);
  25 @@ -312,7 +312,7 @@ applyrules(Client *c)
  26  }
  27  
  28  int
  29 -applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
  30 +applysizehints(Client *c, int *x, int *y, int *w, int *h, int *bw, int interact)
  31  {
  32      int baseismin;
  33      Monitor *m = c->mon;
  34 @@ -325,18 +325,18 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
  35              *x = sw - WIDTH(c);
  36          if (*y > sh)
  37              *y = sh - HEIGHT(c);
  38 -        if (*x + *w + 2 * c->bw < 0)
  39 +        if (*x + *w + 2 * *bw < 0)
  40              *x = 0;
  41 -        if (*y + *h + 2 * c->bw < 0)
  42 +        if (*y + *h + 2 * *bw < 0)
  43              *y = 0;
  44      } else {
  45          if (*x >= m->wx + m->ww)
  46              *x = m->wx + m->ww - WIDTH(c);
  47          if (*y >= m->wy + m->wh)
  48              *y = m->wy + m->wh - HEIGHT(c);
  49 -        if (*x + *w + 2 * c->bw <= m->wx)
  50 +        if (*x + *w + 2 * *bw <= m->wx)
  51              *x = m->wx;
  52 -        if (*y + *h + 2 * c->bw <= m->wy)
  53 +        if (*y + *h + 2 * *bw <= m->wy)
  54              *y = m->wy;
  55      }
  56      if (*h < bh)
  57 @@ -374,7 +374,7 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
  58          if (c->maxh)
  59              *h = MIN(*h, c->maxh);
  60      }
  61 -    return *x != c->x || *y != c->y || *w != c->w || *h != c->h;
  62 +    return *x != c->x || *y != c->y || *w != c->w || *h != c->h || *bw != c->bw;
  63  }
  64  
  65  void
  66 @@ -394,9 +394,16 @@ arrange(Monitor *m)
  67  void
  68  arrangemon(Monitor *m)
  69  {
  70 +    Client *c;
  71 +
  72      strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
  73      if (m->lt[m->sellt]->arrange)
  74          m->lt[m->sellt]->arrange(m);
  75 +    else
  76 +        /* <>< case; rather than providing an arrange function and upsetting other logic that tests for its presence, simply add borders here */
  77 +        for (c = selmon->clients; c; c = c->next)
  78 +            if (ISVISIBLE(c) && c->bw == 0)
  79 +                resize(c, c->x, c->y, c->w - 2*borderpx, c->h - 2*borderpx, borderpx, 0);
  80  }
  81  
  82  void
  83 @@ -566,7 +573,7 @@ configurenotify(XEvent *e)
  84              for (m = mons; m; m = m->next) {
  85                  for (c = m->clients; c; c = c->next)
  86                      if (c->isfullscreen)
  87 -                        resizeclient(c, m->mx, m->my, m->mw, m->mh);
  88 +                        resizeclient(c, m->mx, m->my, m->mw, m->mh, 0);
  89                  XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
  90              }
  91              focus(NULL);
  92 @@ -1112,7 +1119,7 @@ monocle(Monitor *m)
  93      if (n > 0) /* override layout symbol */
  94          snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
  95      for (c = nexttiled(m->clients); c; c = nexttiled(c->next))
  96 -        resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0);
  97 +        resize(c, m->wx, m->wy, m->ww, m->wh, 0, 0);
  98  }
  99  
 100  void
 101 @@ -1180,7 +1187,7 @@ movemouse(const Arg *arg)
 102              && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
 103                  togglefloating(NULL);
 104              if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
 105 -                resize(c, nx, ny, c->w, c->h, 1);
 106 +                resize(c, nx, ny, c->w, c->h, c->bw, 1);
 107              break;
 108          }
 109      } while (ev.type != ButtonRelease);
 110 @@ -1266,14 +1273,14 @@ recttomon(int x, int y, int w, int h)
 111  }
 112  
 113  void
 114 -resize(Client *c, int x, int y, int w, int h, int interact)
 115 +resize(Client *c, int x, int y, int w, int h, int bw, int interact)
 116  {
 117 -    if (applysizehints(c, &x, &y, &w, &h, interact))
 118 -        resizeclient(c, x, y, w, h);
 119 +    if (applysizehints(c, &x, &y, &w, &h, &bw, interact))
 120 +        resizeclient(c, x, y, w, h, bw);
 121  }
 122  
 123  void
 124 -resizeclient(Client *c, int x, int y, int w, int h)
 125 +resizeclient(Client *c, int x, int y, int w, int h, int bw)
 126  {
 127      XWindowChanges wc;
 128  
 129 @@ -1281,7 +1288,7 @@ resizeclient(Client *c, int x, int y, int w, int h)
 130      c->oldy = c->y; c->y = wc.y = y;
 131      c->oldw = c->w; c->w = wc.width = w;
 132      c->oldh = c->h; c->h = wc.height = h;
 133 -    wc.border_width = c->bw;
 134 +    c->oldbw = c->bw; c->bw = wc.border_width = bw;
 135      XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
 136      configure(c);
 137      XSync(dpy, False);
 138 @@ -1330,7 +1337,7 @@ resizemouse(const Arg *arg)
 139                      togglefloating(NULL);
 140              }
 141              if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
 142 -                resize(c, c->x, c->y, nw, nh, 1);
 143 +                resize(c, c->x, c->y, nw, nh, c->bw, 1);
 144              break;
 145          }
 146      } while (ev.type != ButtonRelease);
 147 @@ -1477,22 +1484,20 @@ setfullscreen(Client *c, int fullscreen)
 148              PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1);
 149          c->isfullscreen = 1;
 150          c->oldstate = c->isfloating;
 151 -        c->oldbw = c->bw;
 152 -        c->bw = 0;
 153          c->isfloating = 1;
 154 -        resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh);
 155 +        resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh, 0);
 156          XRaiseWindow(dpy, c->win);
 157      } else if (!fullscreen && c->isfullscreen){
 158          XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
 159              PropModeReplace, (unsigned char*)0, 0);
 160          c->isfullscreen = 0;
 161          c->isfloating = c->oldstate;
 162 -        c->bw = c->oldbw;
 163          c->x = c->oldx;
 164          c->y = c->oldy;
 165          c->w = c->oldw;
 166          c->h = c->oldh;
 167 -        resizeclient(c, c->x, c->y, c->w, c->h);
 168 +        c->bw = c->oldbw;
 169 +        resizeclient(c, c->x, c->y, c->w, c->h, c->bw);
 170          arrange(c->mon);
 171      }
 172  }
 173 @@ -1619,7 +1624,7 @@ showhide(Client *c)
 174          /* show clients top down */
 175          XMoveWindow(dpy, c->win, c->x, c->y);
 176          if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen)
 177 -            resize(c, c->x, c->y, c->w, c->h, 0);
 178 +            resize(c, c->x, c->y, c->w, c->h, c->bw, 0);
 179          showhide(c->snext);
 180      } else {
 181          /* hide clients bottom up */
 182 @@ -1673,13 +1678,17 @@ tagmon(const Arg *arg)
 183  void
 184  tile(Monitor *m)
 185  {
 186 -    unsigned int i, n, h, mw, my, ty;
 187 +    unsigned int i, n, h, mw, my, ty, bw;
 188      Client *c;
 189  
 190      for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
 191      if (n == 0)
 192          return;
 193  
 194 +    if (n == 1)
 195 +        bw = 0;
 196 +    else
 197 +        bw = borderpx;
 198      if (n > m->nmaster)
 199          mw = m->nmaster ? m->ww * m->mfact : 0;
 200      else
 201 @@ -1687,11 +1696,11 @@ tile(Monitor *m)
 202      for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
 203          if (i < m->nmaster) {
 204              h = (m->wh - my) / (MIN(n, m->nmaster) - i);
 205 -            resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
 206 +            resize(c, m->wx, m->wy + my, mw - 2*bw, h - 2*bw, bw, 0);
 207              my += HEIGHT(c);
 208          } else {
 209              h = (m->wh - ty) / (n - i);
 210 -            resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
 211 +            resize(c, m->wx + mw, m->wy + ty, m->ww - mw - 2*bw, h - 2*bw, bw, 0);
 212              ty += HEIGHT(c);
 213          }
 214  }
 215 @@ -1715,7 +1724,9 @@ togglefloating(const Arg *arg)
 216      selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed;
 217      if (selmon->sel->isfloating)
 218          resize(selmon->sel, selmon->sel->x, selmon->sel->y,
 219 -            selmon->sel->w, selmon->sel->h, 0);
 220 +            selmon->sel->w - 2 * (borderpx - selmon->sel->bw),
 221 +            selmon->sel->h - 2 * (borderpx - selmon->sel->bw),
 222 +            borderpx, 0);
 223      arrange(selmon);
 224  }
 225