tadd -a flag for acme. - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit d3acba955943b0e42baab0a07976c93446777b21
parent b0be3b88261ddf09aaeca5c287f1b9ca26ccb558
Author: rsc 
Date:   Thu,  4 Dec 2003 00:11:33 +0000

add -a flag for acme.

Diffstat:
  M src/cmd/9term/9term.c               |     182 +++++++++++++++++++------------
  M src/cmd/9term/9term.h               |       2 +-

2 files changed, 112 insertions(+), 72 deletions(-)
---
diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c
t@@ -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];
t@@ -34,6 +35,7 @@ char *menu2str[] = {
 Image* cols[NCOL];
 Image* hcols[NCOL];
 Image *plumbcolor;
+Image *execcolor;
 
 Menu menu2 =
 {
t@@ -55,6 +57,13 @@ Cursor whitearrow = {
 };
 
 void
+usage(void)
+{
+        fprint(2, "usage: 9term [-a] [-s] [cmd ...]\n");
+        threadexitsall("usage");
+}
+
+void
 threadmain(int argc, char *argv[])
 {
         char *p;
t@@ -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++;
t@@ -86,7 +94,7 @@ threadmain(int argc, char *argv[])
 
         mc = initmouse(nil, screen);
         kc = initkeyboard(nil);
-        rcstart(rcfd);
+        rcstart(rcfd, argc, argv);
         hoststart();
         plumbstart();
 
t@@ -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();
t@@ -253,12 +262,78 @@ drawhold(int holdon)
         scrdraw();
 }
 
+void
+wordclick(uint *q0, uint *q1)
+{
+        while(*q10 && !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;
 
t@@ -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;
         }
 }
t@@ -436,7 +488,6 @@ domenu2(int but)
 void
 key(Rune r)
 {
-        char buf[1];
         uint sig;
 
         if(r == 0)
t@@ -556,10 +607,7 @@ consready(void)
         for(i=t.qh; i 1 && c == '\004')
-{
-fprint(2, "remove 004\n");
-                        n--;
-}
                 if(write(rcfd[1], buf, n) < 0)
                         exits(0);
 /*                mallocstats(); */
t@@ -802,6 +845,8 @@ snarfupdate(void)
         Rune *p;
 
         pp = getsnarf();
+        if(pp == nil)
+                return;
         n = strlen(pp);
         if(n <= 0) {
                  /*t.nsnarf = 0;*/
t@@ -1026,7 +1071,6 @@ backnl(uint p, uint n)
         return 0; /* alef bug */
 }
 
-
 void
 addraw(Rune *r, int nr)
 {
t@@ -1105,15 +1149,6 @@ doubleclick(uint *q0, uint *q1)
                 (*q0)--;
 }
 
-void
-plumbclick(uint *q0, uint *q1)
-{
-        while(*q10 && !isspace(t.r[*q0-1]))
-                (*q0)--;
-}
-
 int
 clickmatch(int cl, int cr, int dir, uint *q)
 {
t@@ -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)
t@@ -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)
t@@ -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);
         }
diff --git a/src/cmd/9term/9term.h b/src/cmd/9term/9term.h
t@@ -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);