git: 9front

Download patch

ref: aab506c9903a54bb77d7978ef09c1307d9aacabc
parent: ccbeff91e1abb205033015ca6602f94908d97556
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Thu Aug 9 00:02:10 EDT 2012

libdraw: improve handling of screen clipr

--- a/sys/src/libdraw/eenter.c
+++ b/sys/src/libdraw/eenter.c
@@ -23,9 +23,6 @@
 	while(ecankbd())
 		ekbd();
 
-	sc = screen->clipr;
-	replclipr(screen, 0, screen->r);
-
 	if(m) o = m->xy;
 
 	if(buf && len > 0)
@@ -37,7 +34,6 @@
 	}
 
 	k = -1;
-	b = screen;
 	tick = n;
 	save = nil;
 	done = down = 0;
@@ -46,6 +42,10 @@
 	h = p.y;
 	w = p.x;
 
+	b = screen;
+	sc = b->clipr;
+	replclipr(b, 0, b->r);
+
 	while(!done){
 		p = stringsize(font, buf ? buf : "");
 		if(ask && ask[0]){
@@ -98,7 +98,20 @@
 		i = Ekeyboard;
 		if(m != nil)
 			i |= Emouse;
-		switch(eread(i, &ev)){
+
+		replclipr(b, 0, sc);
+		i = eread(i, &ev);
+
+		/* screen might have been resized */
+		if(b != screen || !eqrect(screen->clipr, sc)){
+			freeimage(save);
+			save = nil;
+		}
+		b = screen;
+		sc = b->clipr;
+		replclipr(b, 0, b->r);
+
+		switch(i){
 		default:
 			done = 1;
 			n = -1;
@@ -183,13 +196,14 @@
 			done = down;
 			break;
 		}
-
-		draw(b, save->r, save, nil, save->r.min);
-		freeimage(save);
-		save = nil;
+		if(save){
+			draw(b, save->r, save, nil, save->r.min);
+			freeimage(save);
+			save = nil;
+		}
 	}
 
-	replclipr(screen, 0, sc);
+	replclipr(b, 0, sc);
 
 	freeimage(backcol);
 	freeimage(bordcol);
--