]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/libdraw/eenter.c
?a: getc() needs to increment lineno if it gets \n from peekc
[plan9front.git] / sys / src / libdraw / eenter.c
index bd02d063da53a18be94f40c455ef6a1edba8cd23..6d5d70239d3cffbf4a9b27374e4e328653f89a86 100644 (file)
@@ -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]){
@@ -95,10 +95,24 @@ eenter(char *ask, char *buf, int len, Mouse *m)
                }
                flushimage(display, 1);
 
+nodraw:
                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;
@@ -137,6 +151,16 @@ eenter(char *ask, char *buf, int len, Mouse *m)
                                }
                                continue;
                        }
+                       if(k == Ketb){
+                               while(tick > 0){
+                                       tick--;
+                                       if(tick == 0 ||
+                                          strchr(" !\"#$%&'()*+,-./:;<=>?@`[\\]^{|}~", buf[tick-1]))
+                                               break;
+                               }
+                               buf[n = tick] = 0;
+                               break;
+                       }
                        if(k == Kbs){
                                if(tick <= 0)
                                        continue;
@@ -164,7 +188,7 @@ eenter(char *ask, char *buf, int len, Mouse *m)
                        *m = ev.mouse;
                        if(!ptinrect(m->xy, r)){
                                down = 0;
-                               continue;
+                               goto nodraw;
                        }
                        if(m->buttons & 7){
                                down = 1;
@@ -183,13 +207,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);