add -a flag for acme.
This commit is contained in:
parent
b0be3b8826
commit
d3acba9559
2 changed files with 112 additions and 72 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue