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;