|
|
1.1 root 1: #include "jerq.h"
2:
3: #define UP 0
4: #define DOWN 1
5:
6: static short boxcurs_bits[] = {
7: 0x43FF, 0xE001, 0x7001, 0x3801, 0x1D01, 0x0F01, 0x8701, 0x8F01,
8: 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0xFFFF,
9: };
10: static Cursor boxcurs;
11: static int firstime = 1;
12:
13: Rectangle
14: getrect (n)
15: int n;
16: {
17: return getrectb(8>>n, 1);
18: }
19:
20: /*
21: ngetrect: ultimate getrect routine
22: optional clipping rectangle
23: optional blocking for mouse routines
24: optional minimum width and height
25: returns 1 if minimum rectangle is swept
26: */
27: int
28: ngetrect (r, clip, but, block, minw, minh)
29: register Rectangle *r; /* rectangle */
30: register Rectangle *clip; /* clipping rectangle, can be 0 */
31: register int but; /* button 1, 2, or 3, defaults to 1 */
32: register int block; /* blocking flag 0 or 1 */
33: register int minw; /* minimum width, can be 0 */
34: register int minh; /* minimum height, can be 0 */
35: {
36: if(but == 0)
37: but = 1;
38: *r = getrectb(8>>but, block);
39: if(r->origin.x == 0 &&
40: r->origin.y == 0 &&
41: r->corner.x == 0 &&
42: r->corner.y == 0)
43: return 0;
44: if(r->corner.x - r->origin.x < minw ||
45: r->corner.y - r->origin.y < minh)
46: return 0;
47: if(clip && !rectclip(r, *clip))
48: return 0;
49: return 1;
50: }
51:
52: Rectangle
53: getrectb (n, block)
54: int n, block;
55: {
56: Rectangle r, canon();
57: Point p1, p2;
58: Cursor *prev;
59:
60: if (firstime) {
61: boxcurs = ToCursor(boxcurs_bits, boxcurs_bits, 8, 8);
62: firstime = 0;
63: }
64: prev = cursswitch(&boxcurs);
65: Jscreengrab();
66: if(block){
67: buttons(UP);
68: buttons(DOWN);
69: }
70: if(!(mouse.buttons&n)){
71: r.origin.x=r.origin.y=r.corner.x=r.corner.y=0;
72: buttons(UP);
73: goto Return;
74: }
75: p1 = add(mouse.xy, Joffset);
76: p2 = p1;
77: r = canon(p1, p2);
78: outline(r);
79: for(; mouse.buttons&n; nap(2)){
80: outline(r);
81: p2 = add(mouse.xy, Joffset);
82: r = canon(p1, p2);
83: outline(r);
84: }
85: outline(r); /* undraw for the last time */
86: Return:
87: Jscreenrelease();
88: cursswitch(prev);
89: r = rsubp(r, Joffset);
90: if(!rectclip(&r, Rpt(Drect.org,Drect.cor)))
91: r.origin.x = r.origin.y = r.corner.x = r.corner.y = 0;
92: return r;
93: }
94:
95: buttons (updown)
96: {
97: while((button123()!=0) != updown)
98: nap(2);
99: }
100:
101: Rectangle
102: canon (p1, p2)
103: Point p1, p2;
104: {
105: Rectangle r;
106: r.origin.x = min(p1.x, p2.x);
107: r.origin.y = min(p1.y, p2.y);
108: r.corner.x = max(p1.x, p2.x);
109: r.corner.y = max(p1.y, p2.y);
110: return(r);
111: }
112:
113: static outline(r)
114: Rectangle r;
115: {
116: segment(&Jfscreen, r.org, Pt(r.cor.x, r.org.y), F_XOR);
117: segment(&Jfscreen, Pt(r.cor.x, r.org.y), r.cor, F_XOR);
118: segment(&Jfscreen, r.cor, Pt(r.org.x, r.cor.y), F_XOR);
119: segment(&Jfscreen, Pt(r.org.x, r.cor.y), r.org, F_XOR);
120: }
121:
122: Cursor *
123: cursswitch (cp)
124: Cursor *cp;
125: {
126: Cursor *rc;
127: #ifdef SUNTOOLS
128: extern struct pixrectops mem_ops;
129: static struct mpr_data d =
130: {mpr_linebytes(16,1), (short *)0, {0, 0}, 0, 0};
131: static struct pixrect curs = {&mem_ops, 16, 16, 1, (caddr_t)&d};
132: static struct cursor cursor = {7, 7, F_XOR, &curs};
133: #endif SUNTOOLS
134:
135: if (cp == (Cursor *)0)
136: cp = &normalcursor;
137: #ifdef X11
138: XDefineCursor(dpy, display.dr, *cp);
139: #endif X11
140: #ifdef SUNTOOLS
141: cursor.cur_xhot = cp->hotx;
142: cursor.cur_yhot = cp->hoty;
143: d.md_image = cp->bits;
144: win_setcursor(displayfd, &cursor);
145: #endif SUNTOOLS
146: rc = P->cursor;
147: P->cursor = cp;
148: return rc;
149: }
150:
151: cursset (p)
152: Point p;
153: {
154: #ifdef X11
155: XWarpPointer(dpy, display.dr, display.dr, mouse.xy.x, mouse.xy.y,
156: display.rect.corner.x, display.rect.corner.y, p.x, p.y);
157: #endif X11
158: #ifdef SUNTOOLS
159: win_setmouseposition(displayfd, p.x, p.y);
160: #endif SUNTOOLS
161: mouse.xy.x = p.x;
162: mouse.xy.y = p.y;
163: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.