[hackers] [tabbed][PATCH 2/2] Remove Urgency from tabbed window in rare cases

From: Mikau <mikau_AT_aaathats3as.com>
Date: Sun, 30 Aug 2020 23:43:16 +0200

in some rare cases it is better to remove an existing urgency hint from
the tabbed window. these cases are:
- A client deleting its WM_HINTS property
- A client being unmanaged (except during cleanign up, since that
  doesn't matter)
---
 tabbed.c | 74 +++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 47 insertions(+), 27 deletions(-)
diff --git a/tabbed.c b/tabbed.c
index e62aef4..1f92ecf 100644
--- a/tabbed.c
+++ b/tabbed.c
_AT_@ -131,6 +131,7 @@ static int textnw(const char *text, unsigned int len);
 static void toggle(const Arg *arg);
 static void unmanage(int c);
 static void unmapnotify(const XEvent *e);
+static void unurgent(int c);
 static void updatenumlockmask(void);
 static void updatetitle(int c);
 static int xerror(Display *dpy, XErrorEvent *ee);
_AT_@ -305,8 +306,10 @@ destroynotify(const XEvent *e)
 	const XDestroyWindowEvent *ev = &e->xdestroywindow;
 	int c;
 
-	if ((c = getclient(ev->window)) > -1)
+	if ((c = getclient(ev->window)) > -1) {
+		unurgent(c);
 		unmanage(c);
+	}
 }
 
 void
_AT_@ -820,7 +823,6 @@ propertynotify(const XEvent *e)
 	int c;
 	char* selection = NULL;
 	Arg arg;
-	Bool urgent;
 
 	if (ev->state == PropertyNewValue && ev->atom == wmatom[WMSelectTab]) {
 		selection = getatom(WMSelectTab);
_AT_@ -832,10 +834,10 @@ propertynotify(const XEvent *e)
 			arg.v = cmd;
 			spawn(&arg);
 		}
-	} else if (ev->state == PropertyNewValue && ev->atom == XA_WM_HINTS &&
-	           (c = getclient(ev->window)) > -1 &&
-	           (wmh = XGetWMHints(dpy, clients[c]->win))) {
-		if (wmh->flags & XUrgencyHint) {
+	} else if (ev->atom == XA_WM_HINTS && (c = getclient(ev->window)) > -1) {
+		if (ev->state == PropertyNewValue &&
+		    (wmh = XGetWMHints(dpy, clients[c]->win)) &&
+		    (wmh->flags & XUrgencyHint)) {
 			XFree(wmh);
 			/* mark tab as urgent regardles of whether it is selected
 			 * or not. sel has priorityover urg in drawbar() anyway,
_AT_@ -845,7 +847,7 @@ propertynotify(const XEvent *e)
 			wmh = XGetWMHints(dpy, win);
 			if (c != sel) {
 				if (urgentswitch && wmh &&
-				    !(wmh->flags & XUrgencyHint)) {
+					!(wmh->flags & XUrgencyHint)) {
 					/* only switch, if tabbed was focused
 					 * since last urgency hint if WMHints
 					 * could not be received,
_AT_@ -864,26 +866,13 @@ propertynotify(const XEvent *e)
 				wmh->flags |= XUrgencyHint;
 				XSetWMHints(dpy, win, wmh);
 			}
-		} else if (clients[c]->urgent) {
-			clients[c]->urgent = False;
-			/* this client has lost its urgency but another
-			 * might still be urgent*/
-			for (urgent = False, c = 0; c < nclients; c++) {
-				if (clients[c]->urgent) {
-					urgent = True;
-					break;
-				}
-			}
-			if (!urgent && (XFree(wmh), wmh = XGetWMHints(dpy, win)) &&
-			    (wmh->flags & XUrgencyHint)) {
-				/* if no other tabs are urgent, we can
-				 * remove the urgency hint on the tabbed
-				 * window, should one exist */
-				wmh->flags &= ~XUrgencyHint;
-				XSetWMHints(dpy, win, wmh);
-			}
+			XFree(wmh);
+		} else {
+			/* client has either unset its urgency hint or
+			 * deleted the WM_HINTS property. treat either as
+			 * a loss of urgency */
+			unurgent(c);
 		}
-		XFree(wmh);
 	} else if (ev->state != PropertyDelete && ev->atom == XA_WM_NAME &&
 	           (c = getclient(ev->window)) > -1) {
 		updatetitle(c);
_AT_@ -1204,8 +1193,39 @@ unmapnotify(const XEvent *e)
 	const XUnmapEvent *ev = &e->xunmap;
 	int c;
 
-	if ((c = getclient(ev->window)) > -1)
+	if ((c = getclient(ev->window)) > -1) {
+		unurgent(c);
 		unmanage(c);
+	}
+}
+
+void
+unurgent(int c)
+{
+	XWMHints *wmh;
+	Bool urgent = False;
+
+	if (clients[c]->urgent) {
+		clients[c]->urgent = False;
+		/* this client has lost its urgency but another
+		 * might still be urgent*/
+		for (c = 0; c < nclients; c++) {
+			if (clients[c]->urgent) {
+				urgent = True;
+				break;
+			}
+		}
+		if (!urgent && (wmh = XGetWMHints(dpy, win))) {
+			if (wmh->flags & XUrgencyHint) {
+				/* if no other tabs are urgent, we can
+				 * remove the urgency hint on the tabbed
+				 * window, should one exist */
+				wmh->flags &= ~XUrgencyHint;
+				XSetWMHints(dpy, win, wmh);
+			}
+			XFree(wmh);
+		}
+	}
 }
 
 void
-- 
2.28.0
Received on Sun Aug 30 2020 - 23:43:16 CEST

This archive was generated by hypermail 2.3.0 : Sun Aug 30 2020 - 23:48:33 CEST