Extended the snapcalc function to respect the user set gaps.

diff --git a/calmwm.h b/calmwm.h
index 16e52b2..d3978ea 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -335,7 +335,7 @@ void                         client_resize(struct 
client_ctx *);
 void                    client_send_delete(struct client_ctx *);
 void                    client_setactive(struct client_ctx *, int);
 void                    client_setname(struct client_ctx *);
-int                     client_snapcalc(int, int, int, int, int);
+int                     client_snapcalc(const int, const int, const int, const 
int,
const int, const int, const int);
 void                    client_unhide(struct client_ctx *);
 void                    client_vertmaximize(struct client_ctx *);
 void                    client_warp(struct client_ctx *);
diff --git a/client.c b/client.c
index a55bd42..72d8cd9 100644
--- a/client.c
+++ b/client.c
@@ -844,30 +844,30 @@ client_inbound(struct client_ctx *cc, int x, int y)
 }

 int
-client_snapcalc(int n, int dn, int nmax, int bwidth, int snapdist)
+client_snapcalc(const int cur_position, const int window_width,
+               const int screen_width, const int border_width, const int 
snapdist,
+               const int gap0, const int gap1)
 {
-       int      n0, n1, s0, s1;
+       int snap0 = 0;
+       int snap1 = 0;
+       const int window0 = cur_position;
+       const int window1 = cur_position + window_width + (border_width * 2);
+       const int snap_to0 = gap0;
+       const int snap_to1 = screen_width - gap1;

-       s0 = s1 = 0;
-       n0 = n;
-       n1 = n + dn + (bwidth * 2);
+       if (abs(snap_to0 - window0) <= snapdist)
+               snap0 = snap_to0 - window0;

-       if (abs(n0) <= snapdist)
-               s0 = -n0;
-
-       if (nmax - snapdist <= n1 && n1 <= nmax + snapdist)
-               s1 = nmax - n1;
+       if (abs(snap_to1 - window1) <= snapdist)
+               snap1 = snap_to1 - window1;

+       if (snap0 != 0)
+       {
        /* possible to snap in both directions */
-       if (s0 != 0 && s1 != 0)
-               if (abs(s0) < abs(s1))
-                       return s0;
+               if ((snap1 != 0) && (abs(snap0) > abs(snap1)))
+                       return snap1;
                else
-                       return s1;
-       else if (s0 != 0)
-               return s0;
-       else if (s1 != 0)
-               return s1;
-       else
-               return 0;
+                       return snap0;
+       }
+       return snap1;
 }
diff --git a/kbfunc.c b/kbfunc.c
index 59a648a..5b105d4 100644
--- a/kbfunc.c
+++ b/kbfunc.c
@@ -102,11 +102,13 @@ kbfunc_moveresize(struct client_ctx *cc, union arg *arg)
                        cc->geom.x = cc->sc->xmax - 1;

                cc->geom.x += client_snapcalc(cc->geom.x,
-                   cc->geom.width, cc->sc->xmax,
-                   cc->bwidth, Conf.snapdist);
+                   cc->geom.width, sc->xmax,
+                   cc->bwidth, Conf.snapdist,
+                               sc->gap.left, sc->gap.right);
                cc->geom.y += client_snapcalc(cc->geom.y,
-                   cc->geom.height, cc->sc->ymax,
-                   cc->bwidth, Conf.snapdist);
+                   cc->geom.height, sc->ymax,
+                   cc->bwidth, Conf.snapdist,
+                               sc->gap.top, sc->gap.bottom);

                client_move(cc);
                xu_ptr_getpos(cc->win, &x, &y);
diff --git a/mousefunc.c b/mousefunc.c
index 6e697de..980eac0 100644
--- a/mousefunc.c
+++ b/mousefunc.c
@@ -162,11 +162,13 @@ mousefunc_window_move(struct client_ctx *cc, void *arg)

                        cc->geom.x += client_snapcalc(cc->geom.x,
                            cc->geom.width, cc->sc->xmax,
-                           cc->bwidth, Conf.snapdist);
+                           cc->bwidth, Conf.snapdist,
+                                       cc->sc->gap.left, cc->sc->gap.right);
                        cc->geom.y += client_snapcalc(cc->geom.y,
                            cc->geom.height, cc->sc->ymax,
-                           cc->bwidth, Conf.snapdist);
-
+                           cc->bwidth, Conf.snapdist,
+                                       cc->sc->gap.top, cc->sc->gap.bottom);
+                       
                        /* don't move more than 60 times / second */
                        if ((ev.xmotion.time - time) > (1000 / 60)) {
                                time = ev.xmotion.time;

Reply via email to