Index | Thread | Search

From:
Walter Alejandro Iglesias <wai@roquesor.com>
Subject:
Re: cwm(1) warp pointer to prev when you close a window (PATCH)
To:
tech@openbsd.org
Cc:
Okan Demirmen <okan@demirmen.com>
Date:
Wed, 30 Jul 2025 15:04:55 +0200

Download raw body.

Thread
A tweak and an improvement.

If the previous window in the stack is behind a third window covering
the area where the pointer will warp, the third window will get the
focus.  Raising first the previous window solves the problem.  Also, if
the pointer is already in the window area there's no need to warp it.


Index: client.c
===================================================================
RCS file: /cvs/xenocara/app/cwm/client.c,v
diff -u -p -r1.267 client.c
--- client.c	22 Mar 2023 08:27:36 -0000	1.267
+++ client.c	30 Jul 2025 10:41:07 -0000
@@ -210,6 +210,8 @@ client_remove(struct client_ctx *cc)
 {
 	struct screen_ctx	*sc = cc->sc;
 	struct winname		*wn;
+	struct client_ctx	*prevcc;
+	int			 x, y;
 
 	TAILQ_REMOVE(&sc->clientq, cc, entry);
 
@@ -230,6 +232,26 @@ client_remove(struct client_ctx *cc)
 	free(cc->res_class);
 	free(cc->res_name);
 	free(cc);
+
+	/*
+	 * Raise and warp pointer to previous window in stack when
+	 * a window is closed.
+	 */
+	if (TAILQ_EMPTY(&sc->clientq))
+		return;
+
+	prevcc = TAILQ_FIRST(&sc->clientq);
+
+	/* Avoid windows with skip client flag or from other groups */
+	if ((prevcc->flags & (CLIENT_SKIP_CYCLE)) &&
+	    ! (prevcc->flags & CWM_CYCLE_INGROUP))
+		return;
+
+	client_raise(prevcc);
+	xu_ptr_get(prevcc->win, &x, &y);
+	if (client_inbound(prevcc, x, y))
+		return;
+	client_ptr_warp(prevcc);
 }
 
 void



-- 
Walter