summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--client.c24
-rw-r--r--kbfunc.c4
2 files changed, 17 insertions, 11 deletions
diff --git a/client.c b/client.c
index 377abdb..208c101 100644
--- a/client.c
+++ b/client.c
@@ -736,17 +736,19 @@ client_placecalc(struct client_ctx *cc)
 	int			 xslack, yslack;
 
 	if (cc->hint.flags & (USPosition | PPosition)) {
-		/*
-		 * Ignore XINERAMA screens, just make sure it's somewhere
-		 * in the virtual desktop. else it stops people putting xterms
-		 * at startup in the screen the mouse doesn't start in *sigh*.
-		 * XRandR bits mean that {x,y}max shouldn't be outside what's
-		 * currently there.
-		 */
-		xslack = sc->view.w - cc->geom.w - cc->bwidth * 2;
-		yslack = sc->view.h - cc->geom.h - cc->bwidth * 2;
-		cc->geom.x = MIN(cc->geom.x, xslack);
-		cc->geom.y = MIN(cc->geom.y, yslack);
+		int			 wmax, hmax;
+
+		wmax = DisplayWidth(X_Dpy, sc->which);
+		hmax = DisplayHeight(X_Dpy, sc->which);
+
+		if (cc->geom.x + ((int)cc->bwidth * 2) >= wmax)
+			cc->geom.x = wmax - (cc->bwidth * 2);
+		if (cc->geom.x + cc->geom.w - ((int)cc->bwidth * 2) < 0)
+			cc->geom.x = -cc->geom.w;
+		if (cc->geom.y + ((int)cc->bwidth * 2) >= hmax)
+			cc->geom.y = hmax - (cc->bwidth * 2);
+		if (cc->geom.y + cc->geom.h - ((int)cc->bwidth * 2) < 0)
+			cc->geom.y = -cc->geom.h;
 	} else {
 		struct geom		 area;
 		int			 xmouse, ymouse;
diff --git a/kbfunc.c b/kbfunc.c
index f105e6b..58b3e18 100644
--- a/kbfunc.c
+++ b/kbfunc.c
@@ -156,6 +156,10 @@ kbfunc_client_resize(void *ctx, union arg *arg, enum xev xev)
 		cc->geom.w = cc->hint.minw;
 	if ((cc->geom.h += my * cc->hint.inch) < cc->hint.minh)
 		cc->geom.h = cc->hint.minh;
+	if (cc->geom.x + cc->geom.w < 0)
+		cc->geom.x = -cc->geom.w;
+	if (cc->geom.y + cc->geom.h < 0)
+		cc->geom.y = -cc->geom.h;
 	client_resize(cc, 1);
 
 	/* Make sure the pointer stays within the window. */