]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/mothra/mothra.c
mothra: fix alt display resizing, filter control characters in panel entries, use...
[plan9front.git] / sys / src / cmd / mothra / mothra.c
index b872ec6d41f9fe0428c25fa72ac8c3e77dc4868f..32b09ac33d19f04b3b75b915525cd3c8f2d9a5da 100644 (file)
@@ -92,6 +92,7 @@ int logfile;
 int mothmode;
 void docmd(Panel *, char *);
 void doprev(Panel *, int, int);
+char *urlstr(Url *);
 void selurl(char *);
 void setcurrent(int, char *);
 char *genwww(Panel *, int);
@@ -248,6 +249,8 @@ void donecurs(void){
                esetcursor(current->alldone ? 0 : &readingcurs);
 }
 
+void scrollto(char *tag);
+
 void main(int argc, char *argv[]){
        Event e;
        enum { Eplumb = 128 };
@@ -333,6 +336,8 @@ void main(int argc, char *argv[]){
                if(mouse.buttons==0 && current){
                        if(current->finished){
                                updtext(current);
+                               if(current->url->tag[0])
+                                       scrollto(current->url->tag);
                                current->finished=0;
                                current->changed=0;
                                current->alldone=1;
@@ -445,6 +450,7 @@ void eresized(int new){
        plinitlabel(curttl, PACKE|EXPAND, "---");
        plinitlabel(cururl, PACKE|EXPAND, "---");
        plpack(root, r);
+       plpack(alt, r);
        if(current){
                plinitlabel(curttl, PACKE|EXPAND, current->title);
                plinitlabel(cururl, PACKE|EXPAND, current->url->fullname);
@@ -481,14 +487,29 @@ char *genwww(Panel *, int index){
        return buf;
 }
 
+void scrollto(char *tag){
+       Rtext *tp;
+       Action *ap;
+       if(current == nil || text == nil)
+               return;
+       if(tag && tag[0]){
+               for(tp=current->text;tp;tp=tp->next){
+                       ap=tp->user;
+                       if(ap && ap->name && strcmp(ap->name, tag)==0){
+                               current->yoffs=tp->topy;
+                               break;
+                       }
+               }
+       }
+       plsetpostextview(text, current->yoffs);
+       flushimage(display, 1);
+}
+
 /*
  * selected text should be a url.
- * get the document, scroll to the given tag
  */
 void setcurrent(int index, char *tag){
        Www *new;
-       Rtext *tp;
-       Action *ap;
        int i;
        new=www(index);
        if(new==current && (tag==0 || tag[0]==0)) return;
@@ -500,18 +521,8 @@ void setcurrent(int index, char *tag){
        plinitlabel(cururl, PACKE|EXPAND, current->url->fullname);
        if(defdisplay) pldraw(cururl, screen);
        plinittextview(text, PACKE|EXPAND, Pt(0, 0), current->text, dolink);
-       if(tag && tag[0]){
-               for(tp=current->text;tp;tp=tp->next){
-                       ap=tp->user;
-                       if(ap && ap->name && strcmp(ap->name, tag)==0){
-                               current->yoffs=tp->topy;
-                               break;
-                       }
-               }
-       }
-       plsetpostextview(text, current->yoffs);
+       scrollto(tag);
        donecurs();
-       flushimage(display, 1);
 }
 char *arg(char *s){
        do ++s; while(*s==' ' || *s=='\t');
@@ -602,10 +613,8 @@ char *urltofile(Url *url){
        char *name, *slash;
        if(url == nil)
                return nil;
-       if(url->fullname[0])
-               name = url->fullname;
-       else if(url->reltext[0])
-               name = url->reltext;
+       if(url->fullname[0] || url->reltext[0])
+               name = urlstr(url);
        else
                name = "/";
        if(slash = strrchr(name, '/'))
@@ -638,12 +647,13 @@ void docmd(Panel *p, char *s){
        case 'g':
                s = arg(s);
                if(*s=='\0'){
+       case 'r':
                        if(selection)
-                               geturl(selection->fullname, GET, 0, 0, 0);
+                               s = urlstr(selection);
                        else
                                message("no url selected");
                }
-               else geturl(s, GET, 0, 0, 0);
+               geturl(s, GET, 0, 0, 0);
                break;
        case 'j':
                s = arg(s);
@@ -652,11 +662,6 @@ void docmd(Panel *p, char *s){
                else
                        message("Usage: j index");
                break;
-       case 'r':
-               s = arg(s);
-               if(*s=='\0' && selection)
-                       geturl(selection->fullname, GET, 0, 0, 0);
-               break;
        case 'W':
                s = arg(s);
                if(s=='\0'){
@@ -675,15 +680,17 @@ void docmd(Panel *p, char *s){
                break;
        case 's':
                s = arg(s);
-               if(selection){
-                       if(s==0 || *s=='\0')
-                               s = urltofile(selection);
-                       if(s==0 || *s=='\0'){
-                               message("Usage: s file");
-                               break;
-                       }
-                       save(urlopen(selection, GET, 0), s);
+               if(!selection){
+                       message("no url selected");
+                       break;
+               }
+               if(s==0 || *s=='\0')
+                       s = urltofile(selection);
+               if(s==0 || *s=='\0'){
+                       message("Usage: s file");
+                       break;
                }
+               save(urlopen(selection, GET, 0), s);
                break;
        case 'q':
                draw(screen, screen->r, display->white, 0, ZP);
@@ -723,7 +730,6 @@ void dolink(Panel *p, int buttons, Rtext *word){
        Point coord;
        int yoffs;
        Action *a;
-       Url u;
 
        a=word->user;
        if(a == nil || a->image == nil && a->link == nil)
@@ -762,10 +768,6 @@ void gettext(Www *w, int fd, int type){
        switch(rfork(RFFDG|RFPROC|RFNOWAIT|RFMEM)){
        case -1:
                message("Can't fork, please wait");
-               if(type==HTML)
-                       plrdhtml(w->url->fullname, fd, w);
-               else
-                       plrdplain(w->url->fullname, fd, w);
                break;
        case 0:
                if(type==HTML)
@@ -797,27 +799,6 @@ void freetext(Rtext *t){
        plrtfree(tt);
 }
 
-int readstr(char *buf, int nbuf, char *base, char *name)
-{
-       char path[128];
-       int n, fd;
-
-       snprint(path, sizeof path, "%s/%s", base, name);
-       if((fd = open(path, OREAD)) < 0){
-       ErrOut:
-               memset(buf, 0, nbuf);
-               return 0;
-       }
-       n = read(fd, buf, nbuf-1);
-       close(fd);
-       if(n <= 0){
-               close(fd);
-               goto ErrOut;
-       }
-       buf[n] = 0;
-       return n;
-}
-
 int fileurlopen(Url *url){
        char *rel, *base, *x;
        int fd;
@@ -852,6 +833,21 @@ int fileurlopen(Url *url){
        return fd;
 }
 
+int readstr(char *buf, int nbuf, char *base, char *name){
+       char path[128];
+       int n, fd;
+
+       n = 0;
+       snprint(path, sizeof path, "%s/%s", base, name);
+       if((fd = open(path, OREAD)) >= 0){
+               if((n = read(fd, buf, nbuf-1)) < 0)
+                       n = 0;
+               close(fd);
+       }
+       buf[n] = 0;
+       return n;
+}
+
 int urlopen(Url *url, int method, char *body){
        int conn, ctlfd, fd, n;
        char buf[1024+1], *p;
@@ -861,7 +857,6 @@ int urlopen(Url *url, int method, char *body){
        if(method == GET)
                if((fd = fileurlopen(url)) >= 0)
                        return fd;
-
        snprint(buf, sizeof buf, "%s/clone", mtpt);
        if((ctlfd = open(buf, ORDWR)) < 0)
                return -1;
@@ -871,7 +866,6 @@ int urlopen(Url *url, int method, char *body){
        }
        buf[n] = 0;
        conn = atoi(buf);
-
        if(url->basename[0]){
                n = snprint(buf, sizeof buf, "baseurl %s", url->basename);
                write(ctlfd, buf, n);
@@ -882,7 +876,6 @@ int urlopen(Url *url, int method, char *body){
                close(ctlfd);
                return -1;
        }
-
        if(method == POST && body){
                snprint(buf, sizeof buf, "%s/%d/postbody", mtpt, conn);
                if((fd = open(buf, OWRITE)) < 0)
@@ -894,11 +887,9 @@ int urlopen(Url *url, int method, char *body){
                }
                close(fd);
        }
-
        snprint(buf, sizeof buf, "%s/%d/body", mtpt, conn);
        if((fd = open(buf, OREAD)) < 0)
                goto ErrOut;
-
        snprint(buf, sizeof buf, "%s/%d/parsed", mtpt, conn);
        readstr(url->fullname, sizeof(url->fullname), buf, "url");
        readstr(url->tag, sizeof(url->tag), buf, "fragment");
@@ -934,16 +925,21 @@ Err:
        return pfd[1];
 }
 
-/*
- * select the file at the given url
- */
+char*
+urlstr(Url *url){
+       if(url->fullname[0])
+               return url->fullname;
+       if(url->reltext[0])
+               return url->reltext;
+       return nil;
+}
 void selurl(char *urlname){
        static Url url;
        seturl(&url, urlname, current?
                current->url->fullname :
                defurl.fullname);
        selection=&url;
-       message("selected: %s", selection->fullname[0] ? selection->fullname : selection->reltext);
+       message("selected: %s", urlstr(selection));
 }
 void seturl(Url *url, char *urlname, char *base){
        strncpy(url->reltext, urlname, sizeof(url->reltext));
@@ -972,6 +968,11 @@ void geturl(char *urlname, int method, char *body, int plumb, int map){
        int pfd[2];
        Www *w;
 
+       if(*urlname == '#'){
+               scrollto(urlname+1);
+               return;
+       }
+
        selurl(urlname);
        selection->map=map;
 
@@ -1128,7 +1129,7 @@ void snarf(Panel *p){
        int fd;
        fd=create("/dev/snarf", OWRITE, 0666);
        if(fd>=0){
-               fprint(fd, "%s", selection->fullname[0] ? selection->fullname : selection->reltext);
+               fprint(fd, "%s", urlstr(selection));
                close(fd);
        }
 }
@@ -1189,8 +1190,7 @@ void hit3(int button, int item){
                        fprint(fd, "<body><h1>Hit list</h1>\n");
                }
                seek(fd, 0, 2);
-               fprint(fd, "<p><a href=\"%s\">%s</a>\n",
-                       selection->fullname, selection->fullname);
+               fprint(fd, "<p><a href=\"%s\">%s</a>\n", urlstr(selection), urlstr(selection));
                close(fd);
                break;
        case 5: