git: 9front

Download patch

ref: 37e3db239a67cf01fb3c7b351121bceafc961c24
parent: 99658a7efac47adfaa9a90627209d62a7e7ef37c
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Thu Aug 16 00:00:32 EDT 2012

rio: add covered (burried) windows to the menu3 hidden window list

--- a/sys/src/cmd/rio/rio.c
+++ b/sys/src/cmd/rio/rio.c
@@ -655,12 +655,56 @@
 	flushimage(display, 1);
 }
 
+static int
+wcovered(Window *w, Rectangle r)
+{
+	Window *t;
+	int i;
+
+	for(i=0; i<nwindow; i++){
+		t = window[i];
+		if(t == w || t->topped <= w->topped || t->deleted)
+			continue;
+		if(Dx(t->screenr) == 0 || Dy(t->screenr) == 0 || rectXrect(r, t->screenr) == 0)
+			continue;
+		if(r.min.y < t->screenr.min.y)
+			if(!wcovered(w, Rect(r.min.x, r.min.y, r.max.x, t->screenr.min.y)))
+				return 0;
+		if(r.min.x < t->screenr.min.x)
+			if(!wcovered(w, Rect(r.min.x, r.min.y, t->screenr.min.x, r.max.y)))
+				return 0;
+		if(r.max.y > t->screenr.max.y)
+			if(!wcovered(w, Rect(r.min.x, t->screenr.max.y, r.max.x, r.max.y)))
+				return 0;
+		if(r.max.x > t->screenr.max.x)
+			if(!wcovered(w, Rect(t->screenr.max.x, r.min.y, r.max.x, r.max.y)))
+				return 0;
+		return 1;
+	}
+	return 0;
+}
+
 void
 button3menu(void)
 {
-	int i;
+	int i, j, n;
 
-	for(i=0; i<nhidden; i++)
+	n = nhidden;
+	for(i=0; i<nwindow; i++){
+		for(j=0; j<n; j++)
+			if(window[i] == hidden[j])
+				break;
+		if(i < n || window[i]->deleted)
+			continue;
+		if(wcovered(window[i], window[i]->screenr)){
+			hidden[n++] = window[i];
+			if(n >= nelem(hidden))
+				break;
+		}
+	}
+	if(n >= nelem(menu3str)-Hidden)
+		n = nelem(menu3str)-Hidden-1;
+	for(i=0; i<n; i++)
 		menu3str[i+Hidden] = hidden[i]->label;
 	menu3str[i+Hidden] = nil;
 
@@ -1090,6 +1134,8 @@
 	for(j=0; j<nhidden; j++)
 		if(hidden[j] == w)	/* already hidden */
 			return -1;
+	if(nhidden >= nelem(hidden))
+		return 0;
 	i = allocimage(display, w->screenr, w->i->chan, 0, DWhite);
 	if(i){
 		hidden[nhidden++] = w;
@@ -1106,6 +1152,14 @@
 	Window *w;
 
 	w = hidden[h];
+	if(w == nil)
+		return 0;
+	if(h >= nhidden){
+		wtopme(w);
+		wcurrent(w);
+		flushimage(display, 1);
+		return 1;
+	}
 	i = allocwindow(wscreen, w->i->r, Refbackup, DWhite);
 	if(i){
 		--nhidden;
@@ -1130,13 +1184,8 @@
 void
 unhide(int h)
 {
-	Window *w;
-
-	h -= Hidden;
-	w = hidden[h];
-	if(w == nil)
-		return;
-	wunhide(h);
+	if(h >= Hidden)
+		wunhide(h - Hidden);
 }
 
 Window*
@@ -1163,6 +1212,8 @@
 	free(mc);	/* wmk copies *mc */
 	window = erealloc(window, ++nwindow*sizeof(Window*));
 	window[nwindow-1] = w;
+	if(nhidden >= nelem(hidden))
+		hideit = 0;
 	if(hideit){
 		hidden[nhidden++] = w;
 		w->screenr = ZR;
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -1313,7 +1313,7 @@
 	if(w!=nil && w->i!=nil && !w->deleted && w->topped!=topped){
 		topwindow(w->i);
 		flushimage(display, 1);
-		w->topped = ++ topped;
+		w->topped = ++topped;
 	}
 }
 
--