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