Annotation of researchv9/jerq/src/mux/term/control.c, revision 1.1.1.1

1.1       root        1: #include <jerq.h>
                      2: #include <font.h>
                      3: #include <layer.h>
                      4: #include <queue.h>
                      5: #include <jerqproc.h>
                      6: #include <setup.h>
                      7: #include "../msgs.h"
                      8: #include "pconfig.h"
                      9: #include "proto.h"
                     10: #include "packets.h"
                     11: 
                     12: struct Pchannel pconvs[16];    /* Should be NPROC!!! */
                     13: extern struct Proc *debugger;
                     14: extern int recvchars(), sendpkt();
                     15: extern boot();
                     16: short  usermouse=0;    /* kbdproc (a USER proc) has the mouse under its paw */
                     17: extern short second;
                     18: #define        crecvchars      recvchars
                     19: 
                     20: struct Pconfig pconfig={
                     21:        sendpkt,
                     22:        recvchars,
                     23:        (void(*)())crecvchars
                     24: };
                     25: 
                     26: Texture cup = {
                     27:        0x0100, 0x00E0, 0x0010, 0x03E0, 0x0400, 0x0FE0, 0x123C, 0x1FE2,
                     28:        0x101A, 0x101A, 0x1002, 0x103C, 0x1810, 0x6FEC, 0x4004, 0x3FF8,
                     29: };
                     30: Texture deadmouse = {
                     31:        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000C, 0x0082, 0x0441,
                     32:        0xFFE1, 0x5FF1, 0x3FFE, 0x17F0, 0x03E0, 0x0000, 0x0000, 0x0000,
                     33: };
                     34: Texture bullseye = {
                     35:        0x07E0, 0x1FF8, 0x399C, 0x63C6, 0x6FF6, 0xCDB3, 0xD99B, 0xFFFF,
                     36:        0xFFFF, 0xD99B, 0xCDB3, 0x6FF6, 0x63C6, 0x399C, 0x1FF8, 0x07E0,
                     37: };
                     38: Texture boxcurs = {
                     39:        0x43FF, 0xE001, 0x7001, 0x3801, 0x1D01, 0x0F01, 0x8701, 0x8F01,
                     40:        0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0xFFFF,
                     41: };
                     42: Texture eightball = {
                     43:        0x07E0, 0x1FF8, 0x21FC, 0x4CFE, 0x52FE, 0xCCFF, 0xD2FF, 0xCCFF,
                     44:        0xE1FF, 0xFFFF, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x07E0,
                     45: };
                     46: 
                     47: #define        INSET   3
                     48: Layer *whichlayer();
                     49: struct Proc *kbdproc=0;
                     50: #define        DEMUX   0
                     51: #define        CONTROL 1
                     52: #define        UP      0
                     53: #define        DOWN    1
                     54: int control(), windowproc(), demux();
                     55: struct Mouse mouse;
                     56: main(){
                     57:        register struct Proc *p;
                     58:        *DADDR=0;
                     59:        BonW();
                     60:        qinit();
                     61:        aciainit(baud_speeds[VALBAUD]);
                     62:        binit();
                     63:        kbdinit();
                     64:        cursinit();
                     65:        if(VALMAXADDR){ /* 1024Kb */
                     66:                NPROC=16;
                     67:                p=proctab+NPROC;
                     68:                allocinit(((char *)p), ((char *)p)+256*1024L);
                     69:        }else{          /*  256Kb */
                     70:                NPROC=7;
                     71:                p=proctab+NPROC;
                     72:                allocinit(((char *)p), ((char *)p)+25*1024L);
                     73:        }
                     74:        gcinit();
                     75:        bufinit();
                     76:        if(pinit(NPROC)==-1)
                     77:                error("pinit", "-1");
                     78:        Lgrey(&display);
                     79:        spl0();
                     80:        swinit();
                     81:        P=newproc(demux);               /* process 0 */
                     82:        setrun(newproc(control));       /* process 1 */
                     83:        /*
                     84:         * sw(0) will switch out of our local stack onto the control stack.
                     85:         * we will never return to this stack
                     86:         */
                     87:        sw(0);
                     88:        /*NOTREACHED*/
                     89: }
                     90: buttons(updown)
                     91: {
                     92:        do; while((button123()!=0) != updown);
                     93: }
                     94: Sw()
                     95: {
                     96:        if(second){
                     97:                second=0;
                     98:                if(Ptflag)
                     99:                        ptimeout();
                    100:        }
                    101:        sw(P!=&proctab[CONTROL]);       /* if control, clock will restart us */
                    102: }
                    103: control(){
                    104:        register Layer *lp;
                    105:        register struct Proc *p, *pp;
                    106:        for(;;){
                    107:                pp=0;
                    108:                lp=whichlayer();
                    109:                for(p=&proctab[CONTROL+1]; p<&proctab[NPROC]; p++){
                    110:                        if(p->state&WAKEUP){
                    111:                                p->state&=~WAKEUP;
                    112:                                setrun(p);
                    113:                        }
                    114:                        if((p->state&KBDLOCAL)==0 && p->kbdqueue.c_cc>0
                    115:                           && p->text!=(char *)boot){
                    116:                                register c=qpeekc(&p->kbdqueue);
                    117:                                if(c==0x80){    /* BREAKKEY */
                    118:                                        if(muxkill(2, p)!=-1)
                    119:                                                (void)qgetc(&p->kbdqueue);
                    120:                                }else if(muxsendchar(c, p)!=-1)
                    121:                                        (void)qgetc(&p->kbdqueue);
                    122:                        }
                    123:                        if(lp && p->layer==lp)
                    124:                                pp=p;           /* pp pointed at by mouse */
                    125:                }
                    126:                if(usermouse && (pp!=kbdproc || (pp->state&GOTMOUSE)==0)){
                    127:                        usermouse=0;
                    128:                        cursswitch((Texture *)0);
                    129:                        cursallow();
                    130:                }else if(!usermouse && pp){
                    131:        Check_mouse:    if(pp==kbdproc && (pp->state&GOTMOUSE)){
                    132:                                usermouse=1;
                    133:                                cursswitch(pp->cursor);
                    134:                                if(pp->inhibited)
                    135:                                        cursinhibit();
                    136:                        }
                    137:                }
                    138:                if(button123()){
                    139:                        if(lp==0 || (pp->state&GOTMOUSE)==0){
                    140:                                dobutton(whichbutton());
                    141:                                /* make sure kbdproc doesn't think
                    142:                                   buttons are down */
                    143:                                if(kbdproc){
                    144:                                        givemouse(kbdproc);
                    145:                                        goto Check_mouse;       /* usermouse==0 */
                    146:                                }
                    147:                        }
                    148:                        if(pp && pp->state&GOTMOUSE)
                    149:                                givemouse(pp);
                    150:                }
                    151:                if(RCVQUEUE.c_cc)
                    152:                        setrun(&proctab[DEMUX]);
                    153:                Sw();
                    154:        }
                    155: }
                    156: New(){
                    157:        newwindow(windowproc);
                    158: }
                    159: Psend(a, b, c, d)
                    160:        char *b;
                    161: {
                    162:        while(psend(a, b, c, d)==-1)
                    163:                Sw();
                    164: }
                    165: Delete(){
                    166:        delete(whichlayer());
                    167: }
                    168: delete(l)
                    169:        register Layer *l;
                    170: {
                    171:        register struct Proc *p;
                    172:        register w;
                    173:        if(l){
                    174:                w=whichproc(l);
                    175:                p= &proctab[w];
                    176:                muxmesg(w, C_DELETE);
                    177:                delproc(p);
                    178:                dellayer(l);
                    179:                if(kbdproc==p)
                    180:                        kbdproc=0;
                    181:        }
                    182: }
                    183: delproc(p)
                    184:        register struct Proc *p;
                    185: {
                    186:        p->state=0;             /* exit(w) */
                    187:        p->nticks=0;
                    188:        p->inhibited=0;
                    189:        qclear(&p->kbdqueue);
                    190:        freemem(p);
                    191:        p->layer=0;             /* sigh */
                    192: }
                    193: Top(){
                    194:        upfront(whichlayer());
                    195: }
                    196: Bottom(){
                    197:        downback(whichlayer());
                    198: }
                    199: Current(){
                    200:        register Layer *l;
                    201:        l=whichlayer();
                    202:        if(l)
                    203:                tolayer(l);
                    204: }
                    205: Rectangle
                    206: canon(p1, p2)
                    207:        Point p1, p2;
                    208: {
                    209:        Rectangle r;
                    210:        r.origin.x = min(p1.x, p2.x);
                    211:        r.origin.y = min(p1.y, p2.y);
                    212:        r.corner.x = max(p1.x, p2.x);
                    213:        r.corner.y = max(p1.y, p2.y);
                    214:        return(r);
                    215: }
                    216: Rectangle
                    217: getrectb(n)
                    218:        int n;
                    219: {
                    220:        Rectangle r;
                    221:        Point p1, p2;
                    222:        cursswitch(&boxcurs);
                    223:        buttons(UP);
                    224:        buttons(DOWN);
                    225:        if(!(mouse.buttons&n)){
                    226:                r.origin.x=r.origin.y=r.corner.x=r.corner.y=0;
                    227:                buttons(UP);
                    228:                goto Return;
                    229:        }
                    230:        p1=mouse.xy;
                    231:        p2=p1;
                    232:        r=canon(p1, p2);
                    233:        outline(r);
                    234:        for(; mouse.buttons&n; nap(2)){
                    235:                outline(r);
                    236:                p2=mouse.xy;
                    237:                r=canon(p1, p2);
                    238:                outline(r);
                    239:        }
                    240:        outline(r);     /* undraw for the last time */
                    241:     Return:
                    242:        cursswitch((P->state&USER)? P->cursor : (Texture *)0);
                    243:        return r;
                    244: }
                    245: Rectangle
                    246: getrect(n)
                    247: {
                    248:        return getrectb(8>>n);
                    249: }
                    250: Reshape(){
                    251:        register Layer *l;
                    252:        register struct Proc *p;
                    253:        Rectangle r;
                    254:        Point save;     /*SFBOTCH*/
                    255:        l=whichlayer();
                    256:        if(l==0)
                    257:                return;
                    258:        p= &proctab[whichproc(l)];
                    259:        r=getrect3();
                    260:        if(r.corner.x-r.origin.x>100 && r.corner.y-r.origin.y>40){
                    261:                /*SFBOTCHPoint save;*/
                    262:                save=l->rect.origin;
                    263:                dellayer(l);
                    264:                p->state&=~MOVED;
                    265:                p->state|=RESHAPED;
                    266:                l=newlayer(r);
                    267:                if(l==0){
                    268:                        r.origin=save;
                    269:                        r.corner=add(save, Pt(100, 50));
                    270:                        l=newlayer(r);
                    271:                        if(l==0){       /* oh shit */
                    272:                                delproc(p);
                    273:                                muxmesg((int)(p-proctab), C_DELETE);
                    274:                                return;
                    275:                        }
                    276:                }
                    277:                p->layer=l;
                    278:                p->rect=inset(r, INSET);
                    279:                setborder(p);
                    280:        }
                    281:        if(p->state&USER)
                    282:                setdata(p);
                    283:        muxnewwind(p, C_RESHAPE);
                    284: }
                    285: Move(){
                    286:        register Layer *l, *nl;
                    287:        register struct Proc *procp;
                    288:        Point p, op, dp;
                    289:        l=whichlayer();
                    290:        if(l==0)
                    291:                return;
                    292:        procp= &proctab[whichproc(l)];
                    293:        dp=sub(l->rect.corner, l->rect.origin);
                    294:        cursset(l->rect.origin);
                    295:        cursswitch(&boxcurs);
                    296:        p=l->rect.origin;
                    297:        while(button3()){
                    298:                if(button12())
                    299:                        goto Return;
                    300:                outline(Rpt(p, add(p, dp)));
                    301:                nap(2);
                    302:                op=p;
                    303:                p=mouse.xy;
                    304:                /* using boxcurs, can't get off top or left! */
                    305:                if(p.x+dp.x >= XMAX-9)
                    306:                        p.x=XMAX-9-dp.x;
                    307:                if(p.y+dp.y >= YMAX-9)
                    308:                        p.y=YMAX-9-dp.y;
                    309:                outline(Rpt(op, add(op, dp)));
                    310:                cursset(p);
                    311:        }
                    312:        cursswitch(&deadmouse);
                    313:        nl=newlayer(Rpt(p, add(p, dp)));
                    314:        if(nl==0)
                    315:                goto Return;
                    316:        Ubitblt(l, l->rect, nl, p, F_STORE);
                    317:        procp->layer=nl;
                    318:        procp->rect=inset(nl->rect, INSET);
                    319:        dellayer(l);
                    320:        if(procp->state&USER)
                    321:                setdata(procp);
                    322:        if((procp->state&RESHAPED) == 0)
                    323:                procp->state|=MOVED|RESHAPED;   /* turn on RESHAPED for old progs */
                    324:        l=nl;
                    325:        setborder(procp);
                    326:    Return:
                    327:        cursset(div(add(l->rect.origin, l->rect.corner), 2));
                    328:        cursswitch((Texture *)0);
                    329:        /* No C_RESHAPE required */
                    330: }
                    331: 
                    332: /* button hit to indicate which process, invoked by debugger */
                    333: struct Proc *
                    334: debug(){
                    335:        debugger=P;
                    336: }
                    337: struct Proc *
                    338: getproc(){
                    339:        register Layer *l;
                    340:        struct Proc *z=0;
                    341:        cursswitch(&bullseye);
                    342:        buttons(DOWN);
                    343:        if(button3() && (l=whichlayer()))
                    344:                z=&proctab[whichproc(l)];
                    345:        buttons(UP);
                    346:        return z;
                    347: }
                    348: struct Proc *
                    349: getproctab(){
                    350:        return proctab;
                    351: }
                    352: char *menutext[]={
                    353:        "New", "Reshape", "Move", "Top", "Bottom", "Current",
                    354:        "Delete",  0
                    355: };
                    356: int (*menufn[])()={
                    357:        New,    Reshape,Move,   Top,    Bottom, Current,
                    358:        Delete, 0,
                    359: };
                    360: Menu windowmenu={ menutext };
                    361: dobutton(b)
                    362: {
                    363:        register hit;
                    364:        register Layer *l;
                    365:        switch(b){
                    366:        case 1:
                    367:                if(l=whichlayer()){
                    368:                        upfront(l);
                    369:                        tolayer(l);
                    370:                }
                    371:                break;
                    372:        case 2:
                    373:                break;  /* dunno... */
                    374:        case 3:
                    375:                if((hit=menuhit(&windowmenu, 3))>=0){
                    376:                        if(hit==0)      /* a little different because of getrect */
                    377:                                New();
                    378:                        else{
                    379:                                cursswitch(&bullseye);
                    380:                                buttons(DOWN);
                    381:                                if(button3())
                    382:                                        (*menufn[hit])();
                    383:                                cursswitch((Texture *)0);
                    384:                        }
                    385:                }
                    386:                break;
                    387:        default:
                    388:                break;
                    389:        }
                    390:        buttons(UP);
                    391: }
                    392: whichproc(l)
                    393:        register Layer *l;
                    394: {
                    395:        register struct Proc *p;
                    396:        for(p=proctab+CONTROL+1; p<proctab+NPROC; p++)
                    397:                if(p->layer==l && (p->state&BUSY))
                    398:                        return((int)(p-proctab));
                    399:        return(CONTROL+1);      /* HELP?? */
                    400: }
                    401: whichbutton()
                    402: {
                    403:        static int which[]={0, 3, 2, 2, 1, 1, 2, 2, };
                    404:        return which[mouse.buttons&7];
                    405: }
                    406: newwindow(fn)
                    407:        int (*fn)();
                    408: {
                    409:        register struct Proc *p;
                    410:        Rectangle r;
                    411: 
                    412:        r=getrect3();
                    413:        cursswitch(&deadmouse);
                    414:        if(r.corner.x-r.origin.x>100 && r.corner.y-r.origin.y>40){
                    415:                if(p=newproc(fn)){      /* Assignment = */
                    416:                        p->rect=inset(r, INSET);
                    417:                        if(p->layer=newlayer(r)){
                    418:                                muxnewwind(p, C_NEW);
                    419:                                tolayer(p->layer);
                    420:                                setrun(p);
                    421:                        }else
                    422:                                p->state=0;
                    423:                }
                    424:        }
                    425:        cursswitch((Texture *)0);
                    426: }
                    427: 
                    428: void
                    429: sendnchars(n, p)
                    430:        int n; char * p;
                    431: {
                    432:        register int    cc;
                    433: 
                    434:        do{
                    435:                if((cc=n)>MAXPKTDSIZE-1)
                    436:                        cc=MAXPKTDSIZE-1;
                    437:                Psend((int)(P-proctab), p, cc, C_SENDNCHARS);
                    438:        }while(p+=cc, (n-=cc)>0);
                    439: }
                    440: void
                    441: sendwithdelim(n, p)
                    442:        int n; char * p;
                    443: {
                    444:        register int    cc;
                    445:        sendnchars(n, p);
                    446:        delim();
                    447: }
                    448: delim(){
                    449:        Psend((int)(P-proctab), (char *)0, 0, C_DELIM);
                    450: }
                    451: short  sendbusy;
                    452: 
                    453: int
                    454: sendpkt(p, n)
                    455:        register char * p;
                    456:        register int    n;
                    457: {
                    458:        register int    sr;
                    459: 
                    460:        static Rectangle r={0, 0, 50, 50};
                    461: 
                    462:        while(sendbusy)
                    463:                sw(1);
                    464:        sendbusy=1;
                    465:        while(OUTQUEUE.c_cc>CBSIZE/2)
                    466:                sw(1);
                    467:        if (*p & P_CNTL)
                    468:                OUTQUEUE.state |= QPRIORITY;
                    469:        do
                    470:                if (!qputc(&OUTQUEUE, *(unsigned char *)p++)) {
                    471:                        rectf(&display, r, F_XOR);
                    472:                        if ((r.origin.y += 50) >= 1000)
                    473:                                r.origin.y = 0;
                    474:                        r.corner.y = r.origin.y + 50;
                    475:                }
                    476:        while(--n);
                    477:        OUTQUEUE.state &= ~QPRIORITY;
                    478:        sendbusy=0;
                    479:        aciatrint();
                    480:        return 0;
                    481: }
                    482: 
                    483: muxnewwind(p, c)
                    484:        register struct Proc *p;
                    485:        char c;
                    486: {
                    487:        char    mesg[6];
                    488:        register int    dx, dy;
                    489:        register char * cp = mesg;
                    490: 
                    491:        dx=p->rect.corner.x-p->rect.origin.x;
                    492:        dy=p->rect.corner.y-p->rect.origin.y;
                    493:        *cp++=(dx-6)/p->defaultfont->info['0'].width;
                    494:        *cp++=(dy-6)/p->defaultfont->height;
                    495:        *cp++=dx;
                    496:        *cp++=(dx>>8);
                    497:        *cp++=dy;
                    498:        *cp++=(dy>>8);
                    499:        Psend((int)(p-proctab), mesg, sizeof mesg, c);
                    500: }
                    501: int
                    502: muxsendchar(c, p)
                    503:        char c;
                    504:        struct Proc *p;
                    505: {
                    506:        if(sendbusy || (OUTQUEUE.c_cc >= (CBSIZE/2)))
                    507:                return -1;      /* avoid "sw" in "sendpkt" */
                    508:        return psend((int)(p-proctab), &c, 1, C_SENDCHAR);
                    509: }
                    510: int
                    511: muxkill(s, p)
                    512:        char s;
                    513:        struct Proc *p;
                    514: {
                    515:        Psend((int)(p-proctab), &s, 1, C_KILL);
                    516: }
                    517: muxmesg(w, m){
                    518:        Psend(w, (char *)0, 0, m);
                    519: }
                    520: muxublk(p)
                    521:        register struct Proc *p;
                    522: {
                    523:        register int l = p-proctab;
                    524: 
                    525:        while(pconvs[l].user > 0){
                    526:                pconvs[l].user--;
                    527:                Psend(l, (char *)0, 0, C_UNBLK);
                    528:        }
                    529: }
                    530: Point
                    531: jline(p, dp)
                    532:        Point p, dp;
                    533: {
                    534:        dp.x+=p.x;
                    535:        dp.y+=p.y;
                    536:        segment(&display, p, dp, F_XOR);
                    537:        return dp;
                    538: }
                    539: outline(r)
                    540:        Rectangle  r;
                    541: {
                    542:        register dx=r.corner.x-r.origin.x-1, dy=r.corner.y-r.origin.y-1;
                    543:        Point p;
                    544:        p=jline(r.origin, Pt(dx, 0));
                    545:        p=jline(p, Pt(0, dy));
                    546:        p=jline(p, Pt(-dx,0));
                    547:        (void)jline(p, Pt(0,-dy));
                    548: }
                    549: min(a, b){
                    550:        return(a<b? a : b);
                    551: }
                    552: max(a, b){
                    553:        return(a>b? a : b);
                    554: }
                    555: Layer *
                    556: whichlayer()
                    557: {
                    558:        register Layer *lp;
                    559:        for(lp=lfront; lp; lp=lp->back)
                    560:                if(ptinrect(mouse.xy, lp->rect))
                    561:                        return(lp);
                    562:        return(0);
                    563: }
                    564: tolayer(l)
                    565:        register Layer *l;
                    566: {
                    567:        register struct Proc *p, *okbdproc;
                    568:        for(p=proctab; p<&proctab[NPROC]; p++)
                    569:                if((p->state&BUSY) && l==p->layer){
                    570:                        if(kbdproc!=p){
                    571:                                okbdproc=kbdproc;
                    572:                                kbdproc=p;
                    573:                                if(okbdproc){
                    574:                                        setborder(okbdproc);
                    575:                                        okbdproc->state&=~GOTMOUSE;
                    576:                                }
                    577:                                setborder(p);
                    578:                        }
                    579:                        if(p->state&MOUSELOCAL){
                    580:                                p->state|=GOTMOUSE;
                    581:                                setrun(p);
                    582:                        }
                    583:                        break;
                    584:                }
                    585: }
                    586: clear(r, inh)
                    587:        Rectangle r;
                    588: {
                    589:        if(inh)
                    590:                cursinhibit();
                    591:        lrectf(P->layer, r, F_CLR);
                    592:        if(inh)
                    593:                cursallow();
                    594: }
                    595: border(l, r, i, c)     /* no flashing! */
                    596:        register Layer *l;
                    597:        Rectangle r;
                    598:        register i;
                    599:        Code c;
                    600: {
                    601:        Urectf(l, Rect(r.origin.x, r.origin.y, r.corner.x, r.origin.y+i), c);
                    602:        Urectf(l, Rect(r.origin.x, r.corner.y-i, r.corner.x, r.corner.y), c);
                    603:        Urectf(l, Rect(r.origin.x, r.origin.y+i, r.origin.x+i, r.corner.y-i), c);
                    604:        Urectf(l, Rect(r.corner.x-i, r.origin.y+i, r.corner.x, r.corner.y-i), c);
                    605: }
                    606: setborder(p)
                    607:        register struct Proc *p;
                    608: {
                    609:        border(p->layer, p->layer->rect, INSET, F_OR);
                    610:        if(p!=kbdproc)
                    611:                border(p->layer, inset(p->layer->rect, 1), INSET-1, F_XOR);
                    612: }
                    613: cansend(channel)
                    614: {
                    615:        register i;
                    616:        register Pch_p pcp=&pconvs[channel];
                    617:        register Pks_p psp;
                    618:        for(psp=pcp->nextpkt,i=NPCBUFS; i--;){
                    619:                if(psp->state!=PX_WAIT)
                    620:                        return SEND;
                    621:                if(++psp>=&pcp->pkts[NPCBUFS])
                    622:                        psp=pcp->pkts;
                    623:        }
                    624:        return 0;
                    625: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.