|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.