9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
From: Mark Lee Smith <netytan@gmail.com>
To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net>
Subject: Re: [9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam
Date: Fri, 27 May 2016 17:46:48 +0000	[thread overview]
Message-ID: <CAK-yzPMSBoC=-5iq9MJiqiDwkP7J1jZEbYmFKh23K5MrkGt_Eg@mail.gmail.com> (raw)
In-Reply-To: <e70dc798e53e8f98510f5ced3d1558b1@debpi>

[-- Attachment #1: Type: text/plain, Size: 15189 bytes --]

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
>
>
>

[-- Attachment #2: Type: text/html, Size: 20619 bytes --]

  reply	other threads:[~2016-05-27 17:46 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-27 17:11 trebol55555
2016-05-27 17:46 ` Mark Lee Smith [this message]
2016-05-27 18:04   ` trebol55555
2016-05-28 10:04     ` Mark Lee Smith
  -- strict thread matches above, loose matches on Subject: below --
2016-05-31  1:34 trebol55555
2016-05-30 16:35 trebol55555
2016-05-26 22:03 trebol55555
2016-05-27 20:57 ` Mark Lee Smith
2016-05-27 21:42   ` Tobias Kreisel
2016-05-27 22:16   ` Ethan Grammatikidis
2016-05-27 22:37     ` stanley lieber
2016-05-28 15:25       ` Ethan Grammatikidis
2016-05-27 23:09     ` Kurt H Maier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAK-yzPMSBoC=-5iq9MJiqiDwkP7J1jZEbYmFKh23K5MrkGt_Eg@mail.gmail.com' \
    --to=netytan@gmail.com \
    --cc=9fans@9fans.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).