From: trebol55555@yandex.ru
To: 9fans@9fans.net
Subject: [9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam
Date: Fri, 27 May 2016 18:11:26 +0100 [thread overview]
Message-ID: <e70dc798e53e8f98510f5ced3d1558b1@debpi> (raw)
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
next reply other threads:[~2016-05-27 17:11 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-27 17:11 trebol55555 [this message]
2016-05-27 17:46 ` Mark Lee Smith
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=e70dc798e53e8f98510f5ced3d1558b1@debpi \
--to=trebol55555@yandex.ru \
--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).