[dev] [tabbed] [PATCH] revise drawbar and related mechanisms.

From: Markus Teich <markus.teich_AT_stusta.mhn.de>
Date: Wed, 21 Jan 2015 03:46:38 +0100

This also fixes a bug, where the last tab was hidden and no "after" text was
displayed.
---
Heyho,
I noticed a inconvenient little bug with tabbed. With tabwidth=200, a window
width of around 1280px and 9 tabs when the 8th tab was selected, it was
displayed on the right, but neither the ">" (the after text icon) nor tab 9 were
displayed. I looked at the code and since the problem was not immediately
apparent to me, I decided to overhaul the respective part. This patch saves 10
SLoC and also tries to display every tab at the same width (min. tabwidth still
working). Before this patch every tab had a constant width, only the selected
one took all the remaining space.
--Markus
 tabbed.c | 50 ++++++++++++++++++++------------------------------
 1 file changed, 20 insertions(+), 30 deletions(-)
diff --git a/tabbed.c b/tabbed.c
index cdd6bd3..d24b299 100644
--- a/tabbed.c
+++ b/tabbed.c
_AT_@ -179,15 +179,13 @@ buttonpress(const XEvent *e) {
 	int fc;
 	Arg arg;
 
-	fc = getfirsttab();
-
-	if((fc > 0 && ev->x < TEXTW(before)) || ev->x < 0)
+	if(ev->y < 0 || ev->y > bh)
 		return;
 
-	if(ev->y < 0 || ev-> y > bh)
+	if(((fc = getfirsttab()) > 0 && ev->x < TEXTW(before)) || ev->x < 0)
 		return;
 
-	for(i = (fc > 0) ? fc : 0; i < nclients; i++) {
+	for(i = fc; i < nclients; i++) {
 		if(clients[i]->tabx > ev->x) {
 			switch(ev->button) {
 			case Button1:
_AT_@ -318,7 +316,7 @@ die(const char *errstr, ...) {
 void
 drawbar(void) {
 	unsigned long *col;
-	int c, fc, width, n = 0;
+	int c, cc, fc, width;
 	char *name = NULL;
 
 	if(nclients == 0) {
_AT_@ -333,12 +331,11 @@ drawbar(void) {
 	}
 
 	width = ww;
-	clients[nclients-1]->tabx = -1;
-	fc = getfirsttab();
-	if(fc > -1)
-		n = nclients - fc;
+	cc = ww / tabwidth;
+	if(nclients > cc)
+		cc = (ww - TEXTW(before) - TEXTW(after)) / tabwidth;
 
-	if((n * tabwidth) > width) {
+	if((fc = getfirsttab()) + cc < nclients) {
 		dc.w = TEXTW(after);
 		dc.x = width - dc.w;
 		drawtext(after, dc.sel);
_AT_@ -353,15 +350,12 @@ drawbar(void) {
 		width -= dc.w;
 	}
 
-	for(c = (fc > 0)? fc : 0; c < nclients && dc.x < width; c++) {
-		dc.w = tabwidth;
+	cc = MIN(cc, nclients);
+	for(c = fc; c < fc + cc; c++) {
+		dc.w = width / cc;
 		if(c == sel) {
 			col = dc.sel;
-			if((n * tabwidth) > width) {
-				dc.w += width % tabwidth;
-			} else {
-				dc.w = width - (n - 1) * tabwidth;
-			}
+			dc.w += width % cc;
 		} else {
 			col = clients[c]->urgent ? dc.urg : dc.norm;
 		}
_AT_@ -556,21 +550,17 @@ getcolor(const char *colstr) {
 
 int
 getfirsttab(void) {
-	int c, n, fc;
+	int cc, ret;
 
 	if(sel < 0)
-		return -1;
-
-	c = sel;
-	fc = 0;
-	n = nclients;
-	if((n * tabwidth) > ww) {
-		for(; (c * tabwidth) > (ww / 2)
-				&& (n * tabwidth) > ww;
-				c--, n--, fc++);
-	}
+		return 0;
+
+	cc = ww / tabwidth;
+	if(nclients > cc)
+		cc = (ww - TEXTW(before) - TEXTW(after)) / tabwidth;
 
-	return fc;
+	ret = sel - cc / 2 + (cc + 1) % 2;
+	return ret < 0 ? 0 : (ret + cc > nclients ? MAX(0, nclients - cc) : ret);
 }
 
 Bool
-- 
2.0.5
Received on Wed Jan 21 2015 - 03:46:38 CET

This archive was generated by hypermail 2.3.0 : Wed Jan 21 2015 - 03:48:07 CET