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