summary refs log tree commit diff
path: root/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'client.c')
-rw-r--r--client.c91
1 files changed, 50 insertions, 41 deletions
diff --git a/client.c b/client.c
index a18ffcc..a55bd42 100644
--- a/client.c
+++ b/client.c
@@ -137,7 +137,7 @@ client_new(Window win, struct screen_ctx *sc, int mapped)
 	return (cc);
 }
 
-int
+void
 client_delete(struct client_ctx *cc)
 {
 	struct screen_ctx	*sc = cc->sc;
@@ -189,8 +189,6 @@ client_delete(struct client_ctx *cc)
 
 	client_freehints(cc);
 	xfree(cc);
-
-	return (0);
 }
 
 void
@@ -285,6 +283,8 @@ client_maximize(struct client_ctx *cc)
 
 	if (cc->flags & CLIENT_MAXIMIZED) {
 		cc->geom = cc->savegeom;
+		cc->bwidth = Conf.bwidth;
+		cc->flags &= ~CLIENT_MAXIMIZED;
 	} else {
 		if (!(cc->flags & (CLIENT_VMAXIMIZED | CLIENT_HMAXIMIZED)))
 			cc->savegeom = cc->geom;
@@ -310,7 +310,8 @@ calc:
 		cc->geom.y = y_org + sc->gap.top;
 		cc->geom.height = ymax - (sc->gap.top + sc->gap.bottom);
 		cc->geom.width = xmax - (sc->gap.left + sc->gap.right);
-		cc->flags |= CLIENT_DOMAXIMIZE;
+		cc->bwidth = 0;
+		cc->flags |= CLIENT_MAXIMIZED;
 	}
 
 	client_resize(cc);
@@ -326,7 +327,10 @@ client_vertmaximize(struct client_ctx *cc)
 		return;
 
 	if (cc->flags & CLIENT_VMAXIMIZED) {
-		cc->geom = cc->savegeom;
+		cc->geom.y = cc->savegeom.y;
+		cc->geom.height = cc->savegeom.height;
+		cc->bwidth = Conf.bwidth;
+		cc->flags &= ~CLIENT_VMAXIMIZED;
 	} else {
 		if (!(cc->flags & (CLIENT_MAXIMIZED | CLIENT_HMAXIMIZED)))
 			cc->savegeom = cc->geom;
@@ -344,7 +348,7 @@ calc:
 		cc->geom.y = y_org + sc->gap.top;
 		cc->geom.height = ymax - (cc->bwidth * 2) - (sc->gap.top +
 		    sc->gap.bottom);
-		cc->flags |= CLIENT_DOVMAXIMIZE;
+		cc->flags |= CLIENT_VMAXIMIZED;
 	}
 
 	client_resize(cc);
@@ -360,7 +364,10 @@ client_horizmaximize(struct client_ctx *cc)
 		return;
 
 	if (cc->flags & CLIENT_HMAXIMIZED) {
-		cc->geom = cc->savegeom;
+		cc->geom.x = cc->savegeom.x;
+		cc->geom.width = cc->savegeom.width;
+		cc->bwidth = Conf.bwidth;
+		cc->flags &= ~CLIENT_HMAXIMIZED;
 	} else {
 		if (!(cc->flags & (CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED)))
 			cc->savegeom = cc->geom;
@@ -378,7 +385,7 @@ calc:
 		cc->geom.x = x_org + sc->gap.left;
 		cc->geom.width = xmax - (cc->bwidth * 2) - (sc->gap.left +
 		    sc->gap.right);
-		cc->flags |= CLIENT_DOHMAXIMIZE;
+		cc->flags |= CLIENT_HMAXIMIZED;
 	}
 
 	client_resize(cc);
@@ -387,23 +394,6 @@ calc:
 void
 client_resize(struct client_ctx *cc)
 {
-	cc->flags &= ~(CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED |
-	    CLIENT_HMAXIMIZED);
-
-	if (cc->flags & CLIENT_DOMAXIMIZE) {
-		cc->bwidth = 0;
-		cc->flags &= ~CLIENT_DOMAXIMIZE;
-		cc->flags |= CLIENT_MAXIMIZED;
-	} else if (cc->flags & CLIENT_DOVMAXIMIZE) {
-		cc->flags &= ~CLIENT_DOVMAXIMIZE;
-		cc->flags |= CLIENT_VMAXIMIZED;
-	} else if (cc->flags & CLIENT_DOHMAXIMIZE) {
-		cc->flags &= ~CLIENT_DOHMAXIMIZE;
-		cc->flags |= CLIENT_HMAXIMIZED;
-	} else {
-		cc->bwidth = Conf.bwidth;
-	}
-
 	client_draw_border(cc);
 
 	XMoveResizeWindow(X_Dpy, cc->win, cc->geom.x,
@@ -414,11 +404,6 @@ client_resize(struct client_ctx *cc)
 void
 client_move(struct client_ctx *cc)
 {
-	if (cc->flags & CLIENT_VMAXIMIZED)
-		cc->savegeom.x = cc->geom.x;
-	if (cc->flags & CLIENT_HMAXIMIZED)
-		cc->savegeom.y = cc->geom.y;
-
 	XMoveWindow(X_Dpy, cc->win, cc->geom.x, cc->geom.y);
 	xu_configure(cc);
 }
@@ -504,7 +489,7 @@ client_draw_border(struct client_ctx *cc)
 			pixel = sc->color[CWM_COLOR_BORDER_UNGROUP].pixel;
 			break;
 		default:
-			pixel = sc->color[CWM_COLOR_BORDOR_ACTIVE].pixel;
+			pixel = sc->color[CWM_COLOR_BORDER_ACTIVE].pixel;
 			break;
 		}
 	else
@@ -550,9 +535,8 @@ client_setname(struct client_ctx *cc)
 	char		*newname;
 
 	if (!xu_getstrprop(cc->win, _NET_WM_NAME, &newname))
-		xu_getstrprop(cc->win, XA_WM_NAME, &newname);
-	if (newname == NULL)
-		newname = emptystring;
+		if (!xu_getstrprop(cc->win, XA_WM_NAME, &newname))
+			newname = emptystring;
 
 	TAILQ_FOREACH(wn, &cc->nameq, entry)
 		if (strcmp(wn->name, newname) == 0) {
@@ -580,11 +564,9 @@ match:
 		xfree(wn);
 		cc->nameqlen--;
 	}
-
-	return;
 }
 
-struct client_ctx *
+void
 client_cycle(struct screen_ctx *sc, int reverse)
 {
 	struct client_ctx	*oldcc, *newcc;
@@ -594,7 +576,7 @@ client_cycle(struct screen_ctx *sc, int reverse)
 
 	/* If no windows then you cant cycle */
 	if (TAILQ_EMPTY(&sc->mruq))
-		return (NULL);
+		return;
 
 	if (oldcc == NULL)
 		oldcc = (reverse ? TAILQ_LAST(&sc->mruq, cycle_entry_q) :
@@ -614,7 +596,7 @@ client_cycle(struct screen_ctx *sc, int reverse)
 		/* Is oldcc the only non-hidden window? */
 		if (newcc == oldcc) {
 			if (again)
-				return (NULL);	/* No windows visible. */
+				return;	/* No windows visible. */
 
 			break;
 		}
@@ -624,8 +606,6 @@ client_cycle(struct screen_ctx *sc, int reverse)
 	sc->altpersist = 1;
 	client_ptrsave(oldcc);
 	client_ptrwarp(newcc);
-
-	return (newcc);
 }
 
 static struct client_ctx *
@@ -862,3 +842,32 @@ client_inbound(struct client_ctx *cc, int x, int y)
 	return (x < cc->geom.width && x >= 0 &&
 	    y < cc->geom.height && y >= 0);
 }
+
+int
+client_snapcalc(int n, int dn, int nmax, int bwidth, int snapdist)
+{
+	int	 n0, n1, s0, s1;
+
+	s0 = s1 = 0;
+	n0 = n;
+	n1 = n + dn + (bwidth * 2);
+
+	if (abs(n0) <= snapdist)
+		s0 = -n0;
+
+	if (nmax - snapdist <= n1 && n1 <= nmax + snapdist)
+		s1 = nmax - n1;
+
+	/* possible to snap in both directions */
+	if (s0 != 0 && s1 != 0)
+		if (abs(s0) < abs(s1))
+			return s0;
+		else
+			return s1;
+	else if (s0 != 0)
+		return s0;
+	else if (s1 != 0)
+		return s1;
+	else
+		return 0;
+}