I modified my local copy of sam to start the plumber AND the name pipe. I've been using this for almost a week and it seems to work like a charm.

This is with sam from plan9port.

The relevant change as a pseudo-diff: (I've been playing with a number of other changes that showed up in the diff so I just copied this small part.)

In samterm/io.c

        if(protodebug) print("hoststart\n");
        hoststart();
        if(protodebug) print("plumbstart\n");
+       /*
        if(plumbstart() < 0){
                if(protodebug) print("extstart\n");
                extstart();
        }
+       */
+       plumbstart();
+       extstart();
        if(protodebug) print("initio done\n");
 }

All the best,

Mark

On Fri, 27 May 2016, 19:14 , <trebol55555@yandex.ru> wrote:
flselect() must be changed in samterm/flayer.c to get the double click
selection working ok.


Anyone has hacked sam to use both the plumber and the pipe?

trebol.


diff -rpuN src/cmd/sam/cmd.c sam/cmd.c
--- src/cmd/sam/cmd.c   2016-04-18 19:07:22.000000000 +0100
+++ sam/cmd.c   2016-05-25 23:56:34.040909362 +0100
@@ -35,6 +35,8 @@ struct cmdtab cmdtab[]={
        '>',    0,      0,      0,      0,      aDot,   0,      linex,  plan9_cmd,
        '<',    0,      0,      0,      0,      aDot,   0,      linex,  plan9_cmd,
        '|',    0,      0,      0,      0,      aDot,   0,      linex,  plan9_cmd,
+       '^',    0,      0,      0,      0,      aDot,   0,      linex,  plan9_cmd,
+       '_',    0,      0,      0,      0,      aDot,   0,      linex,  plan9_cmd,
        '=',    0,      0,      0,      0,      aDot,   0,      linex,  eq_cmd,
        'c'|0x100,0,    0,      0,      0,      aNo,    0,      wordx,  cd_cmd,
        0,      0,      0,      0,      0,      0,      0,      0
@@ -76,7 +78,13 @@ inputc(void)

     Again:
        nbuf = 0;
-       if(downloaded){
+       if(cmdbufpos > cmdbuf.nc && cmdbuf.nc > 0){
+               cmdbufpos = 0;
+               bufreset(&cmdbuf);
+       }
+       if(cmdbufpos < cmdbuf.nc && cmdbuf.nc > 0)
+               bufread(&cmdbuf, cmdbufpos++, &r, 1);
+       else if(downloaded){
                while(termoutp == terminp){
                        cmdupdate();
                        if(patset)
diff -rpuN src/cmd/sam/sam.h sam/sam.h
--- src/cmd/sam/sam.h   2016-04-18 19:07:22.000000000 +0100
+++ sam/sam.h   2016-05-25 23:45:05.652931784 +0100
@@ -369,6 +369,8 @@ extern int  quitok;
 extern Address addr;
 extern Buffer  snarfbuf;
 extern Buffer  plan9buf;
+extern Buffer  cmdbuf;
+extern int     cmdbufpos;
 extern List    file;
 extern List    tempfile;
 extern File    *cmd;
diff -rpuN src/cmd/sam/shell.c sam/shell.c
--- src/cmd/sam/shell.c 2016-04-18 19:07:22.000000000 +0100
+++ sam/shell.c 2016-05-25 23:46:25.262692361 +0100
@@ -6,6 +6,8 @@ extern  jmp_buf mainloop;
 char   errfile[64];
 String plan9cmd;       /* null terminated */
 Buffer plan9buf;
+Buffer cmdbuf;
+int    cmdbufpos;
 void   checkerrs(void);

 void
@@ -40,7 +42,7 @@ plan9(File *f, int type, String *s, int
        }
        if(type!='!' && pipe(pipe1)==-1)
                error(Epipe);
-       if(type=='|')
+       if(type=='|' || type=='_')
                snarf(f, addr.r.p1, addr.r.p2, &plan9buf, 1);
        if((pid=fork()) == 0){
                setname(f);
@@ -61,14 +63,14 @@ plan9(File *f, int type, String *s, int
                        }
                }
                if(type != '!') {
-                       if(type=='<' || type=='|')
-                               dup(pipe1[1], 1);
-                       else if(type == '>')
+                       if(type == '>')
                                dup(pipe1[0], 0);
+                       else
+                               dup(pipe1[1], 1);
                        close(pipe1[0]);
                        close(pipe1[1]);
                }
-               if(type == '|'){
+               if(type == '|' || type == '_'){
                        if(pipe(pipe2) == -1)
                                exits("pipe");
                        if((pid = fork())==0){
@@ -100,7 +102,7 @@ plan9(File *f, int type, String *s, int
                        close(pipe2[0]);
                        close(pipe2[1]);
                }
-               if(type=='<'){
+               if(type=='<' || type=='^'){
                        close(0);       /* so it won't read from terminal */
                        open("/dev/null", 0);
                }
@@ -128,9 +130,14 @@ plan9(File *f, int type, String *s, int
                writeio(f);
                bpipeok = 0;
                closeio((Posn)-1);
+       }else if(type == '^' || type == '_'){
+               int nulls;
+               close(pipe1[1]);
+               bufload(&cmdbuf, cmdbufpos, pipe1[0], &nulls);
+               close(pipe1[0]);
        }
        retcode = waitfor(pid);
-       if(type=='|' || type=='<')
+       if(type=='|' || type=='<' || type=='_' || type=='^')
                if(retcode!=0)
                        warn(Wbadstatus);
        if(downloaded)
diff -rpuN src/cmd/samterm/main.c samterm/main.c
--- src/cmd/samterm/main.c      2016-04-18 19:07:22.000000000 +0100
+++ samterm/main.c      2016-05-26 16:12:12.452556184 +0100
@@ -23,11 +23,8 @@ long modified = 0;           /* strange lookahead
 char   hostlock = 1;
 char   hasunlocked = 0;
 int    maxtab = 8;
-int    chord;
 int    autoindent;

-#define chording 0     /* code here for reference but it causes deadlocks */
-
 void
 notifyf(void *a, char *msg)
 {
@@ -39,7 +36,7 @@ notifyf(void *a, char *msg)
 void
 threadmain(int argc, char *argv[])
 {
-       int i, got, scr, w;
+       int i, got, scr, chord, w;
        Text *t;
        Rectangle r;
        Flayer *nwhich;
@@ -85,6 +82,7 @@ threadmain(int argc, char *argv[])

        got = 0;
        if(protodebug) print("loop\n");
+       chord = 0;
        for(;;got = waitforio()){
                if(hasunlocked && RESIZED())
                        resize();
@@ -108,19 +106,32 @@ threadmain(int argc, char *argv[])
                                continue;
                        }
                        nwhich = flwhich(mousep->xy);
-                       scr = which && ptinrect(mousep->xy, which->scroll);
+                       scr = which && (ptinrect(mousep->xy, which->scroll) ||
+                               mousep->buttons&(8|16));
                        if(mousep->buttons)
                                flushtyping(1);
-                       if(chording && chord==1 && !mousep->buttons)
+                       if((mousep->buttons&1)==0)
                                chord = 0;
-                       if(chording && chord)
+                       if(chord && which && which==nwhich){
                                chord |= mousep->buttons;
-                       else if(mousep->buttons&1){
+                               t = (Text *)which->user1;
+                               if(!t->lock){
+                                       w = which-t->l;
+                                       if(chord&2){
+                                               cut(t, w, 1, 1);
+                                               chord &= ~2;
+                                       }
+                                       if(chord&4){
+                                               paste(t, w);
+                                               chord &= ~4;
+                                       }
+                               }
+                       }else if(mousep->buttons&(1|8)){
                                if(nwhich){
                                        if(nwhich!=which)
                                                current(nwhich);
                                        else if(scr)
-                                               scroll(which, 1);
+                                               scroll(which, (mousep->buttons&8) ? 4 : 1);
                                        else{
                                                t=(Text *)which->user1;
                                                if(flselect(which)){
@@ -137,27 +148,14 @@ threadmain(int argc, char *argv[])
                                        scroll(which, 2);
                                else
                                        menu2hit();
-                       }else if((mousep->buttons&4)){
+                       }else if(mousep->buttons&(4|16)){
                                if(scr)
-                                       scroll(which, 3);
+                                       scroll(which, (mousep->buttons&16) ? 5 : 3);
                                else
                                        menu3hit();
                        }
                        mouseunblock();
                }
-               if(chording && chord){
-                       t = (Text*)which->user1;
-                       if(!t->lock && !hostlock){
-                               w = which-t->l;
-                               if(chord&2){
-                                       cut(t, w, 1, 1);
-                                       chord &= ~2;
-                               }else if(chord&4){
-                                       paste(t, w);
-                                       chord &= ~4;
-                               }
-                       }
-               }
        }
 }

@@ -497,6 +495,7 @@ flushtyping(int clearesc)
 #define        CUT     (Kcmd+'x')
 #define        COPY    (Kcmd+'c')
 #define        PASTE   (Kcmd+'v')
+#define        Kstx    0x02

 int
 nontypingkey(int c)
@@ -512,6 +511,7 @@ nontypingkey(int c)
        case PAGEUP:
        case RIGHTARROW:
        case SCROLLKEY:
+       case Kstx:
                return 1;
        }
        if(c >= Kcmd)
@@ -669,6 +669,15 @@ type(Flayer *l, int res)   /* what a blood
                                }
                        }
                }
+       }else if(c == Kstx){
+               t = &cmd;
+               for(l=t->l; l->textfn==0; l++)
+                       ;
+               current(l);
+               flushtyping(0);
+               a = t->rasp.nrunes;
+               flsetselect(l, a, a);
+               center(l, a);
        }else{
                if(c==ESC && typeesc>=0){
                        l->p0 = typeesc;
diff -rpuN src/cmd/samterm/scroll.c samterm/scroll.c
--- src/cmd/samterm/scroll.c    2016-04-18 19:07:22.000000000 +0100
+++ samterm/scroll.c    2016-05-26 02:07:31.922977720 +0100
@@ -115,7 +115,7 @@ scroll(Flayer *l, int but)
        draw(scrback, Rect(0,0,Dx(l->scroll), Dy(l->scroll)), l->f.b, nil, l->scroll.min);
        do{
                oin = in;
-               in = abs(x-mousep->xy.x)<=FLSCROLLWID(l)/2;
+               in = (but > 3) || (but == 2) || abs(x-mousep->xy.x)<=FLSCROLLWID(l)/2;
                if(oin && !in)
                        scrunmark(l, r);
                if(in){
@@ -126,9 +126,7 @@ scroll(Flayer *l, int but)
                                my = s.min.y;
                        if(my >= s.max.y)
                                my = s.max.y;
-                       if(!eqpt(mousep->xy, Pt(x, my)))
-                               moveto(mousectl, Pt(x, my));
-                       if(but == 1){
+                       if(but == 1 || but == 4){
                                p0 = l->origin-frcharofpt(&l->f, Pt(s.max.x, my));
                                rt = scrpos(l->scroll, p0, p0+l->f.nchars, tot);
                                y = rt.min.y;
@@ -136,7 +134,7 @@ scroll(Flayer *l, int but)
                                y = my;
                                if(y > s.max.y-2)
                                        y = s.max.y-2;
-                       }else if(but == 3){
+                       }else if(but == 3 || but == 5){
                                p0 = l->origin+frcharofpt(&l->f, Pt(s.max.x, my));
                                rt = scrpos(l->scroll, p0, p0+l->f.nchars, tot);
                                y = rt.min.y;
@@ -147,19 +145,21 @@ scroll(Flayer *l, int but)
                                scrmark(l, r);
                        }
                }
-       }while(button(but));
+       }while(but <= 3 && button(but));
        if(in){
                h = s.max.y-s.min.y;
                scrunmark(l, r);
                p0 = 0;
-               if(but == 1)
+               if(but == 1 || but == 4){
+                       but = 1;
                        p0 = (long)(my-s.min.y)/l->f.font->height+1;
-               else if(but == 2){
+               }else if(but == 2){
                        if(tot > 1024L*1024L)
                                p0 = ((tot>>10)*(y-s.min.y)/h)<<10;
                        else
                                p0 = tot*(y-s.min.y)/h;
-               }else if(but == 3){
+               }else if(but == 3 || but == 5){
+                       but = 3;
                        p0 = l->origin+frcharofpt(&l->f, Pt(s.max.x, my));
                        if(p0 > tot)
                                p0 = tot;
diff -rpuN src/cmd/samterm/flayer.c samterm/flayer.c
--- src/cmd/samterm/flayer.c    2016-05-27 17:46:30.431425669 +0100
+++ samterm/flayer.c    2016-04-18 19:07:22.000000000 +0100
@@ -254,21 +254,18 @@ fldelete(Flayer *l, long p0, long p1)
 int
 flselect(Flayer *l)
 {
-       int ret;
        if(l->visible!=All)
                flupfront(l);
-       frselect(&l->f, mousectl);
-       ret = 0;
-       if(l->f.p0==l->f.p1){
-               if(mousep->msec-l->click<Clicktime && l->f.p0+l->origin==l->p0){
-                       ret = 1;
+       if(l->f.p0==l->f.p1)
+               if(mousep->msec-l->click<Clicktime && l->f.p0+l->origin==l->p0 &&
+                       l->f.p0==frcharofpt(&l->f, mousep->xy)){
                        l->click = 0;
-               }else
-                       l->click = mousep->msec;
-       }else
-               l->click = 0;
+                       return 1;
+               }
+       l->click = mousep->msec;
+       frselect(&l->f, mousectl);
        l->p0 = l->f.p0+l->origin, l->p1 = l->f.p1+l->origin;
-       return ret;
+       return 0;
 }

 void