summaryrefslogtreecommitdiff
path: root/sys/src/libdraw/eenter.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-08-09 04:02:10 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-08-09 04:02:10 +0200
commit5cbae621a515abe2237c7b7050d494f414ee69ba (patch)
tree46174c4590ce57e31543665aa8de764b97fb11a0 /sys/src/libdraw/eenter.c
parente5ea2d51519ab7d2a9833568f5ca3827e873bb49 (diff)
libdraw: improve handling of screen clipr
Diffstat (limited to 'sys/src/libdraw/eenter.c')
-rw-r--r--sys/src/libdraw/eenter.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/sys/src/libdraw/eenter.c b/sys/src/libdraw/eenter.c
index bd02d063d..40148f0aa 100644
--- a/sys/src/libdraw/eenter.c
+++ b/sys/src/libdraw/eenter.c
@@ -23,9 +23,6 @@ eenter(char *ask, char *buf, int len, Mouse *m)
while(ecankbd())
ekbd();
- sc = screen->clipr;
- replclipr(screen, 0, screen->r);
-
if(m) o = m->xy;
if(buf && len > 0)
@@ -37,7 +34,6 @@ eenter(char *ask, char *buf, int len, Mouse *m)
}
k = -1;
- b = screen;
tick = n;
save = nil;
done = down = 0;
@@ -46,6 +42,10 @@ eenter(char *ask, char *buf, int len, Mouse *m)
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 @@ eenter(char *ask, char *buf, int len, Mouse *m)
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 @@ eenter(char *ask, char *buf, int len, Mouse *m)
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);