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;
}
}
--
⑨