add -a flag for acme.

This commit is contained in:
rsc 2003-12-04 00:11:33 +00:00
parent b0be3b8826
commit d3acba9559
2 changed files with 112 additions and 72 deletions

View file

@ -16,6 +16,7 @@ Channel* hostc;
Readbuf rcbuf[2]; Readbuf rcbuf[2];
int mainpid; int mainpid;
int plumbfd; int plumbfd;
int button2exec;
int label(Rune*, int); int label(Rune*, int);
char wdir[1024]; char wdir[1024];
char childwdir[1024]; char childwdir[1024];
@ -34,6 +35,7 @@ char *menu2str[] = {
Image* cols[NCOL]; Image* cols[NCOL];
Image* hcols[NCOL]; Image* hcols[NCOL];
Image *plumbcolor; Image *plumbcolor;
Image *execcolor;
Menu menu2 = Menu menu2 =
{ {
@ -54,6 +56,13 @@ Cursor whitearrow = {
0xD3, 0xB8, 0xF1, 0xF0, 0xE0, 0xE0, 0xC0, 0x40, } 0xD3, 0xB8, 0xF1, 0xF0, 0xE0, 0xE0, 0xC0, 0x40, }
}; };
void
usage(void)
{
fprint(2, "usage: 9term [-a] [-s] [cmd ...]\n");
threadexitsall("usage");
}
void void
threadmain(int argc, char *argv[]) threadmain(int argc, char *argv[])
{ {
@ -62,11 +71,10 @@ threadmain(int argc, char *argv[])
rfork(RFNOTEG); rfork(RFNOTEG);
mainpid = getpid(); mainpid = getpid();
ARGBEGIN{ ARGBEGIN{
case 'T': default:
p = ARGF(); usage();
if(p == 0) case 'a': /* acme mode */
break; button2exec++;
maxtab = strtoul(p, 0, 0);
break; break;
case 's': case 's':
scrolling++; scrolling++;
@ -86,7 +94,7 @@ threadmain(int argc, char *argv[])
mc = initmouse(nil, screen); mc = initmouse(nil, screen);
kc = initkeyboard(nil); kc = initkeyboard(nil);
rcstart(rcfd); rcstart(rcfd, argc, argv);
hoststart(); hoststart();
plumbstart(); plumbstart();
@ -105,6 +113,7 @@ threadmain(int argc, char *argv[])
hcols[HTEXT] = hcols[TEXT]; hcols[HTEXT] = hcols[TEXT];
plumbcolor = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x006600FF); plumbcolor = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x006600FF);
execcolor = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xAA0000FF);
draw(screen, screen->r, cols[BACK], nil, ZP); draw(screen, screen->r, cols[BACK], nil, ZP);
geom(); geom();
@ -253,39 +262,27 @@ drawhold(int holdon)
scrdraw(); scrdraw();
} }
void void
mouse(void) wordclick(uint *q0, uint *q1)
{ {
int cancel, but; while(*q1<t.nr && !isspace(t.r[*q1]))
uint oldq0, oldq1, newq0, newq1; (*q1)++;
while(*q0>0 && !isspace(t.r[*q0-1]))
but = t.m.buttons; (*q0)--;
if(but != 1 && but != 2 && but != 4)
return;
if (ptinrect(t.m.xy, scrollr)) {
scroll(but);
if(t.qh<=t.org+t.f->nchars)
consread();;
return;
} }
switch(but) { int
case 1: aselect(uint *q0, uint *q1, Image *color)
mselect(); {
break; int cancel;
case 2: uint oldq0, oldq1, newq0, newq1;
domenu2(2);
break;
case 4:
/* save old selection */ /* save old selection */
oldq0 = t.q0; oldq0 = t.q0;
oldq1 = t.q1; oldq1 = t.q1;
/* sweep out plumb area and record it */ /* sweep out area and record it */
t.f->cols[HIGH] = plumbcolor; t.f->cols[HIGH] = color;
t.f->cols[HTEXT] = display->white; t.f->cols[HTEXT] = display->white;
mselect(); mselect();
newq0 = t.q0; newq0 = t.q0;
@ -308,15 +305,70 @@ mouse(void)
updatesel(); updatesel();
if(cancel) if(cancel)
break; return -1;
/* process plumb area */ /* selected a region */
if(newq0 < newq1) if(newq0 < newq1){
plumb(newq0, newq1); *q0 = newq0;
else if(oldq0 <= newq0 && newq0 < oldq1) *q1 = newq1;
plumb(oldq0, oldq1); return 0;
else }
plumb(newq0, newq0);
/* clicked inside previous selection */
if(oldq0 <= newq0 && newq0 < oldq1){
*q0 = oldq0;
*q1 = oldq1;
return 0;
}
/* just a click */
*q0 = newq0;
*q1 = newq1;
return 0;
}
static Rune Lnl[1] = { '\n' };
void
mouse(void)
{
int but;
uint q0, q1;
but = t.m.buttons;
if(but != 1 && but != 2 && but != 4)
return;
if (ptinrect(t.m.xy, scrollr)) {
scroll(but);
if(t.qh<=t.org+t.f->nchars)
consread();;
return;
}
switch(but) {
case 1:
mselect();
break;
case 2:
if(button2exec){
if(aselect(&q0, &q1, execcolor) >= 0){
if(q0 == q1)
wordclick(&q0, &q1);
if(q0 == q1)
break;
paste(t.r+q0, q1-q0, 1);
if(t.r[q1-1] != '\n')
paste(Lnl, 1, 1);
}
break;
}
domenu2(2);
break;
case 4:
if(aselect(&q0, &q1, plumbcolor) >= 0)
plumb(q0, q1);
break; break;
} }
} }
@ -436,7 +488,6 @@ domenu2(int but)
void void
key(Rune r) key(Rune r)
{ {
char buf[1];
uint sig; uint sig;
if(r == 0) if(r == 0)
@ -556,10 +607,7 @@ consready(void)
for(i=t.qh; i<t.nr; i++){ for(i=t.qh; i<t.nr; i++){
c = t.r[i]; c = t.r[i];
if(c=='\n' || c=='\004') if(c=='\n' || c=='\004')
{
fprint(2, "ready %d\n", c);
return 1; return 1;
}
} }
return 0; return 0;
} }
@ -593,11 +641,6 @@ consread(void)
} }
/* take out control-d when not doing a zero length write */ /* take out control-d when not doing a zero length write */
n = p-buf; n = p-buf;
if(n > 1 && c == '\004')
{
fprint(2, "remove 004\n");
n--;
}
if(write(rcfd[1], buf, n) < 0) if(write(rcfd[1], buf, n) < 0)
exits(0); exits(0);
/* mallocstats(); */ /* mallocstats(); */
@ -802,6 +845,8 @@ snarfupdate(void)
Rune *p; Rune *p;
pp = getsnarf(); pp = getsnarf();
if(pp == nil)
return;
n = strlen(pp); n = strlen(pp);
if(n <= 0) { if(n <= 0) {
/*t.nsnarf = 0;*/ /*t.nsnarf = 0;*/
@ -1026,7 +1071,6 @@ backnl(uint p, uint n)
return 0; /* alef bug */ return 0; /* alef bug */
} }
void void
addraw(Rune *r, int nr) addraw(Rune *r, int nr)
{ {
@ -1105,15 +1149,6 @@ doubleclick(uint *q0, uint *q1)
(*q0)--; (*q0)--;
} }
void
plumbclick(uint *q0, uint *q1)
{
while(*q1<t.nr && !isspace(t.r[*q1]))
(*q1)++;
while(*q0>0 && !isspace(t.r[*q0-1]))
(*q0)--;
}
int int
clickmatch(int cl, int cr, int dir, uint *q) clickmatch(int cl, int cr, int dir, uint *q)
{ {
@ -1143,16 +1178,22 @@ clickmatch(int cl, int cr, int dir, uint *q)
} }
void void
rcstart(int fd[2]) rcstart(int fd[2], int argc, char **argv)
{ {
int pid; int pid;
char *argv[3]; char *xargv[3];
char slave[256]; char slave[256];
int sfd; int sfd;
if(argc == 0){
argc = 2;
argv = xargv;
argv[0] = getenv("SHELL");
if(argv[0] == 0)
argv[0] = "rc"; argv[0] = "rc";
argv[1] = "-i"; argv[1] = "-i";
argv[2] = 0; argv[2] = 0;
}
/* /*
* fd0 is slave (tty), fd1 is master (pty) * fd0 is slave (tty), fd1 is master (pty)
@ -1168,7 +1209,6 @@ rcstart(int fd[2])
setsid(); setsid();
// tcsetpgrp(0, pid); // tcsetpgrp(0, pid);
sfd = open(slave, ORDWR); sfd = open(slave, ORDWR);
fprint(2, "slave %s\n", slave);
if(sfd < 0) if(sfd < 0)
fprint(2, "open %s: %r\n", slave); fprint(2, "open %s: %r\n", slave);
if(ioctl(sfd, TIOCSCTTY, 0) < 0) if(ioctl(sfd, TIOCSCTTY, 0) < 0)
@ -1357,7 +1397,7 @@ plumb(uint q0, uint q1)
pm->attr = nil; pm->attr = nil;
else{ else{
p0 = q0; p0 = q0;
plumbclick(&q0, &q1); wordclick(&q0, &q1);
sprint(cbuf, "click=%d", p0-q0); sprint(cbuf, "click=%d", p0-q0);
pm->attr = plumbunpackattr(cbuf); pm->attr = plumbunpackattr(cbuf);
} }

View file

@ -82,7 +82,7 @@ void fill(void);
void tcheck(void); void tcheck(void);
void updatesel(void); void updatesel(void);
void doreshape(void); void doreshape(void);
void rcstart(int fd[2]); void rcstart(int fd[2], int, char**);
void runewrite(Rune*, int); void runewrite(Rune*, int);
void consread(void); void consread(void);
void conswrite(char*, int); void conswrite(char*, int);