Annotation of researchv9/jerq/src/lib/sys/cursor.c, revision 1.1.1.1

1.1       root        1: #include <jerq.h>
                      2: struct Mouse mouse;
                      3: void nap();
                      4: static short c_ul[]={
                      5:        0xFF80, 0xFE00, 0xF800, 0xFC00,
                      6:        0xFE00, 0xDF00, 0xCF80, 0x87C0,
                      7:        0x83E0, 0x01F0, 0x00F8, 0x007C,
                      8:        0x003E, 0x001F, 0x000E, 0x0004,
                      9: };
                     10: static short c_ll[]={
                     11:        0x0004, 0x000E, 0x001F, 0x003E,
                     12:        0x007C, 0x00F8, 0x01F0, 0x83E0,
                     13:        0x87C0, 0xCF80, 0xDF00, 0xFE00,
                     14:        0xFC00, 0xF800, 0xFE00, 0xFF80,
                     15: };
                     16: static short c_ur[]={
                     17:        0x01FF, 0x007F, 0x001F, 0x003F,
                     18:        0x007F, 0x00FB, 0x01F3, 0x03E1,
                     19:        0x07C1, 0x0F80, 0x1F00, 0x3E00,
                     20:        0x7C00, 0xF800, 0x7000, 0x2000,
                     21: };
                     22: static short c_lr[]={
                     23:        0x2000, 0x7000, 0xF800, 0x7C00,
                     24:        0x3E00, 0x1F00, 0x0F80, 0x07C1,
                     25:        0x03E1, 0x01F3, 0x00FB, 0x007F,
                     26:        0x003F, 0x001F, 0x007F, 0x01FF,
                     27: };
                     28: static setxy(),        flipcursor();
                     29: struct curtab{
                     30:        short   *map;
                     31:        short   dx;
                     32:        short   dy;
                     33: }stdcurtab[4]={                /* 4 quadrants */
                     34:        c_ur,   -16,    0,
                     35:        c_ul,   0,      0,
                     36:        c_lr,   -16,    -16,
                     37:        c_ll,   0,      -16,
                     38: }, usercurtab[4];
                     39: struct curtab *curtabp;
                     40: struct cursor{
                     41:        unsigned x, y;
                     42:        unsigned oldx, oldy;
                     43:        char    quad, oldquad;
                     44:        short   inhibit;
                     45:        short   up;
                     46: }cursor;
                     47: static int     ud, lr;
                     48: #define        QRL_MASK        01
                     49: #define        QUD_MASK        02
                     50: #define        QRIGHT          0
                     51: #define        QLEFT           01
                     52: #define        QUP             0
                     53: #define        QDOWN           02
                     54: #define        QLEFT_MARGIN    XMAX/3
                     55: #define        QRIGHT_MARGIN   XMAX*2/3
                     56: #define        QUP_MARGIN      YMAX/3
                     57: #define        QDOWN_MARGIN    YMAX*2/3
                     58: 
                     59: newquad(x, y, quad)
                     60:        register x, y, quad;
                     61: {
                     62:        ud=quad&QUD_MASK;
                     63:        lr=quad&QRL_MASK;
                     64:        if(x < QLEFT_MARGIN)
                     65:                lr=QLEFT;
                     66:        if(x > QRIGHT_MARGIN)
                     67:                lr=QRIGHT;
                     68:        if(y < QUP_MARGIN)
                     69:                ud=QUP;
                     70:        if(y > QDOWN_MARGIN)
                     71:                ud=QDOWN;
                     72:        return ud|lr;
                     73: }
                     74: cursinhibit(){
                     75:        register sr=spl1();
                     76:        if(cursor.inhibit++==0 && cursor.up)
                     77:                flipcursor(cursor.x, cursor.y, cursor.quad);
                     78:        splx(sr);
                     79: }
                     80: cursallow(){
                     81:        if(cursor.inhibit>0)
                     82:                cursor.inhibit--;
                     83: }
                     84: #define        MOUSEMAX        2048    /* 1/2 resolution of mouse registers */
                     85: /*static*/ struct data {
                     86:        int     last;
                     87:        int     zero;
                     88: }xdata,        ydata;
                     89: static int
                     90: update(var, datap, max)
                     91:        register var, max;
                     92:        register struct data *datap;
                     93: {
                     94:        register d;
                     95:        d=var-datap->last;
                     96:        if(d>MOUSEMAX)
                     97:                datap->zero+=MOUSEMAX*2;
                     98:        else if(d<-MOUSEMAX)
                     99:                datap->zero-=MOUSEMAX*2;
                    100:        datap->last=var;
                    101:        d=var-datap->zero;      /* re-use of d */
                    102:        if(d<0){
                    103:                datap->zero=var;
                    104:                d=0;
                    105:        }else if(d>=max){
                    106:                datap->zero=var-max;
                    107:                d=max-1;
                    108:        }
                    109:        return d;
                    110: }
                    111: static
                    112: setxy(){
                    113:        register struct curtab *qp;
                    114:        register x, y, quad;
                    115:        x=  *XMOUSE & 0xfff;    /* coordinates go the wrong way, so negate */
                    116:        y= -(*YMOUSE & 0xfff);
                    117:        cursor.oldx=cursor.x;
                    118:        cursor.oldy=cursor.y;
                    119:        cursor.oldquad=cursor.quad;
                    120:        x=update(x, &xdata, XMAX);
                    121:        y=update(y, &ydata, YMAX);
                    122:        quad=newquad(x, y, cursor.quad);
                    123:        qp= &curtabp[quad];
                    124:        if(x< -qp->dx)
                    125:                x= -qp->dx;
                    126:        if(x+(16+qp->dx)>=XMAX)
                    127:                x=XMAX-(16+qp->dx)-1;
                    128:        if(y< -qp->dy)
                    129:                y= -qp->dy;
                    130:        if(y+(16+qp->dy)>=YMAX)
                    131:                y=YMAX-(16+qp->dy)-1;
                    132:        if(x==cursor.oldx && y==cursor.oldy && cursor.up)
                    133:                return(0);
                    134:        cursor.x=x;
                    135:        cursor.y=y;
                    136:        cursor.quad=quad;
                    137:        mouse.xy.x=x;
                    138:        mouse.xy.y=y;
                    139:        return(1);
                    140: }
                    141: cursset(p)
                    142:        Point p;
                    143: {
                    144:        xdata.zero=xdata.last-p.x;
                    145:        ydata.zero=ydata.last-p.y;
                    146:        nap(1);
                    147: }
                    148: Bitmap cursbm;
                    149: static
                    150: flipcursor(x, y, q)
                    151: {
                    152:        register struct curtab *qp;
                    153:        register s;
                    154:        qp= &curtabp[q];
                    155:        cursbm.base=(Word *) qp->map;
                    156:        cursblt(&display, qp->map, Pt(x+qp->dx, y+qp->dy));
                    157:                /* almost equal to
                    158:                /* bitblt(&cursbm, cursbm.rect, &display,
                    159:                /*              Pt(x+qp->dx, y+qp->dy), F_XOR);   */
                    160:        cursor.up=1-cursor.up;
                    161: }
                    162: short interrupt;
                    163: cursinit(){
                    164:        curtabp=stdcurtab;
                    165:        cursbm.width=1;
                    166:        cursbm.rect.corner.x=cursbm.rect.corner.y=16;
                    167:        cursor.inhibit = 0;
                    168: }
                    169: auto1(){
                    170:        if(setxy() && cursor.inhibit==0){
                    171:                if(cursor.up)
                    172:                        flipcursor(cursor.oldx, cursor.oldy, cursor.oldquad);
                    173:                flipcursor(cursor.x, cursor.y, cursor.quad);
                    174:        }
                    175:        interrupt++;
                    176: }
                    177: void nap(n){
                    178:        if(n<=0)
                    179:                return;
                    180:        interrupt=0;
                    181:        do; while(interrupt<n);
                    182: }
                    183: 
                    184: /* static*/ Texture *old;
                    185: Texture        *
                    186: cursswitch(p)
                    187:        register Texture *p;
                    188: {
                    189:        register struct curtab *ctp;
                    190:        register Texture *t=old;
                    191:        old=p;
                    192:        cursinhibit();
                    193:        if(p==0)
                    194:                curtabp=stdcurtab;
                    195:        else{
                    196:                curtabp=usercurtab;
                    197:                for(ctp=usercurtab; ctp<&usercurtab[4]; ctp++){
                    198:                        ctp->map=(short *)p;
                    199:                        ctp->dx=ctp->dy= -8;
                    200:                }
                    201:        }
                    202:        cursallow();
                    203:        return t;
                    204: }

unix.superglobalmegacorp.com

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